http://www.loria.fr/~levy/Galleries/LSCM/index.html http://www.loria.fr/~levy/Papers/2002/s2002_lscm.pdf Implementation Least Squares Conformal Maps parameterization, based on chapter 2 of: Bruno Levy, Sylvain Petitjean, Nicolas Ray, Jerome Maillot. Least Squares Conformal Maps for Automatic Texture Atlas Generation. In Siggraph 2002, July 2002. Seams: Stored as a flag (ME_SEAM) in the new MEdge struct, these seams define where a mesh will be cut when executing LSCM unwrapping. Seams can be marked and cleared in Edit Mode. Ctrl+EKEY will pop up a menu allowing to Clear or Mark the selected edges as seams. Select Linked in Face Select Mode now only selects linked faces if no seams separate them. So if seams are defined, this will now select the 'face group' defined by the seams. Hotkey is still LKEY. LSCM Unwrap: unwrap UV's by calculating a conformal mapping (preserving local angles). Based on seams, the selected faces will be 'cut'. If multiple 'face groups' are selected, they will be unwrapped separately and packed in the image rectangle in the UV Editor. Packing uses a simple and fast algorithm, only designed to avoid having overlapping faces. LSCM can be found in the Unwrap menu (UKEY), and the UV Calculation panel. Pinning: UV's can be pinned in the UV Editor. When LSCM Unwrap is then executed, these UV's will stay in place, allowing to tweak the solution. PKEY and ALT+PKEY will respectively pin and unpin selected UV's. Face Select Mode Drawing Changes: - Draw Seams option to enable disable drawing of seams - Draw Faces option to enable drawing of selected faces in transparent purple - Draw Hidden Edges option to enable drawing of edges of hidden faces - Draw Edges option to enable drawing of edges of visible faces The colors for these seams, faces and edges are themeable.
307 lines
9.2 KiB
C++
307 lines
9.2 KiB
C++
/* util defines -- might go away ?*/
|
|
|
|
/*
|
|
$Id$
|
|
|
|
*
|
|
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version. The Blender
|
|
* Foundation also sells licenses for use in proprietary software under
|
|
* the Blender License. See http://www.blender.org/BL/ for information
|
|
* about this.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
* All rights reserved.
|
|
*
|
|
* The Original Code is: all of this file.
|
|
*
|
|
* Contributor(s): none yet.
|
|
*
|
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
|
*/
|
|
|
|
#ifndef BKE_UTILDEFINES_H
|
|
#define BKE_UTILDEFINES_H
|
|
|
|
#ifndef FALSE
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
#ifndef TRUE
|
|
#define TRUE 1
|
|
#endif
|
|
|
|
#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
|
|
#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
|
|
#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
|
|
#define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
|
|
#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
|
|
#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
|
|
#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
|
|
|
|
|
|
/* string compare */
|
|
#define STREQ(str, a) ( strcmp((str), (a))==0 )
|
|
#define STREQ2(str, a, b) ( STREQ(str, a) || STREQ(str, b) )
|
|
#define STREQ3(str, a, b, c) ( STREQ2(str, a, b) || STREQ(str, c) )
|
|
|
|
/* min/max */
|
|
#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
|
|
#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
|
|
#define MIN4(x,y,z,a) MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
|
|
|
|
#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
|
|
#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
|
|
#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
|
|
|
|
#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
|
|
|
|
#define ABS(a) ( (a)<0 ? (-a) : (a) )
|
|
|
|
#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
|
|
#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
|
|
|
|
#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
|
|
#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
|
|
|
|
#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
|
|
|
|
#define INIT_MINMAX(min, max) (min)[0]= (min)[1]= (min)[2]= 1.0e30; (max)[0]= (max)[1]= (max)[2]= -1.0e30;
|
|
|
|
#define INIT_MINMAX2(min, max) (min)[0]= (min)[1]= 1.0e30; (max)[0]= (max)[1]= -1.0e30;
|
|
|
|
#define DO_MINMAX(vec, min, max) if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
|
|
if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
|
|
if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
|
|
if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
|
|
if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
|
|
if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; \
|
|
|
|
#define DO_MINMAX2(vec, min, max) if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
|
|
if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
|
|
if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
|
|
if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];
|
|
|
|
/* interferes elsewhere */
|
|
/* also fill in structs itself, dna cannot handle defines */
|
|
#define FILE_MAXDIR 160
|
|
#define FILE_MAXFILE 80
|
|
|
|
|
|
/* some misc stuff.... */
|
|
#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
|
|
|
|
#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & 1) )
|
|
#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & 1) )
|
|
|
|
/* this weirdo pops up in two places ... */
|
|
#if !defined(WIN32) && !defined(__BeOS)
|
|
#define O_BINARY 0
|
|
#endif
|
|
|
|
/* INTEGER CODES */
|
|
#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
|
|
/* Big Endian */
|
|
#define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
|
|
#else
|
|
/* Little Endian */
|
|
#define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
|
|
#endif
|
|
|
|
#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
|
|
|
|
#define FORM MAKE_ID('F','O','R','M')
|
|
#define DDG1 MAKE_ID('3','D','G','1')
|
|
#define DDG2 MAKE_ID('3','D','G','2')
|
|
#define DDG3 MAKE_ID('3','D','G','3')
|
|
#define DDG4 MAKE_ID('3','D','G','4')
|
|
|
|
#define GOUR MAKE_ID('G','O','U','R')
|
|
|
|
#define BLEN MAKE_ID('B','L','E','N')
|
|
#define DER_ MAKE_ID('D','E','R','_')
|
|
#define V100 MAKE_ID('V','1','0','0')
|
|
|
|
#define DATA MAKE_ID('D','A','T','A')
|
|
#define GLOB MAKE_ID('G','L','O','B')
|
|
#define IMAG MAKE_ID('I','M','A','G')
|
|
|
|
#define DNA1 MAKE_ID('D','N','A','1')
|
|
#define TEST MAKE_ID('T','E','S','T')
|
|
#define REND MAKE_ID('R','E','N','D')
|
|
#define USER MAKE_ID('U','S','E','R')
|
|
|
|
#define ENDB MAKE_ID('E','N','D','B')
|
|
|
|
/* This should, of course, become a function */
|
|
#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) \
|
|
\
|
|
if( (cyclv)==0 && a==(sizev)-1) break; \
|
|
if(cyclu) { \
|
|
p1= sizeu*a; \
|
|
p2= p1+ sizeu-1; \
|
|
p3= p1+ sizeu; \
|
|
p4= p2+ sizeu; \
|
|
b= 0; \
|
|
} \
|
|
else { \
|
|
p2= sizeu*a; \
|
|
p1= p2+1; \
|
|
p4= p2+ sizeu; \
|
|
p3= p1+ sizeu; \
|
|
b= 1; \
|
|
} \
|
|
if( (cyclv) && a==sizev-1) { \
|
|
p3-= sizeu*sizev; \
|
|
p4-= sizeu*sizev; \
|
|
}
|
|
|
|
/* This one rotates the bytes in an int */
|
|
#define SWITCH_INT(a) { \
|
|
char s_i, *p_i; \
|
|
p_i= (char *)&(a); \
|
|
s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
|
|
s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
|
|
|
|
/* More brain damage. Only really used by packedFile.c */
|
|
// return values
|
|
#define RET_OK 0
|
|
#define RET_ERROR 1
|
|
/* and these aren't used at all */
|
|
/* #define RET_CANCEL 2 */
|
|
/* #define RET_YES (1 == 1) */
|
|
/* #define RET_NO (1 == 0) */
|
|
|
|
/* sequence related defines */
|
|
#define WHILE_SEQ(base) { \
|
|
int totseq_, seq_; Sequence **seqar; \
|
|
build_seqar( base, &seqar, &totseq_); \
|
|
for(seq_ = 0; seq_ < totseq_; seq_++) { \
|
|
seq= seqar[seq_];
|
|
|
|
|
|
#define END_SEQ } \
|
|
if(seqar) MEM_freeN(seqar); \
|
|
}
|
|
|
|
|
|
/* not really sure about these... some kind of event codes ?*/
|
|
/* INFO: 300 */
|
|
/* pas op: ook in filesel.c en editobject.c */
|
|
#define B_INFOSCR 301
|
|
#define B_INFODELSCR 302
|
|
#define B_INFOSCE 304
|
|
#define B_INFODELSCE 305
|
|
#define B_FILEMENU 306
|
|
#define B_PACKFILE 307
|
|
|
|
/* From iff.h, but seemingly detached from anything else... To which
|
|
* encoding scheme do they belong? */
|
|
#define AMI (1 << 31)
|
|
#define CDI (1 << 30)
|
|
#define Anim (1 << 29)
|
|
#define TGA (1 << 28)
|
|
#define JPG (1 << 27)
|
|
#define TIM (1 << 26)
|
|
|
|
#define TIM_CLUT (010)
|
|
#define TIM_4 (TIM | TIM_CLUT | 0)
|
|
#define TIM_8 (TIM | TIM_CLUT | 1)
|
|
#define TIM_16 (TIM | 2)
|
|
#define TIM_24 (TIM | 3)
|
|
|
|
#define RAWTGA (TGA | 1)
|
|
|
|
#define JPG_STD (JPG | (0 << 8))
|
|
#define JPG_VID (JPG | (1 << 8))
|
|
#define JPG_JST (JPG | (2 << 8))
|
|
#define JPG_MAX (JPG | (3 << 8))
|
|
#define JPG_MSK (0xffffff00)
|
|
|
|
#define AM_ham (0x0800 | AMI)
|
|
#define AM_hbrite (0x0080 | AMI)
|
|
#define AM_lace (0x0004 | AMI)
|
|
#define AM_hires (0x8000 | AMI)
|
|
#define AM_hblace (AM_hbrite | AM_lace)
|
|
#define AM_hilace (AM_hires | AM_lace)
|
|
#define AM_hamlace (AM_ham | AM_lace)
|
|
|
|
#define RGB888 1
|
|
#define RGB555 2
|
|
#define DYUV 3
|
|
#define CLUT8 4
|
|
#define CLUT7 5
|
|
#define CLUT4 6
|
|
#define CLUT3 7
|
|
#define RL7 8
|
|
#define RL3 9
|
|
#define MPLTE 10
|
|
|
|
#define DYUV1 0
|
|
#define DYUVE 1
|
|
|
|
#define CD_rgb8 (RGB888 | CDI)
|
|
#define CD_rgb5 (RGB555 | CDI)
|
|
#define CD_dyuv (DYUV | CDI)
|
|
#define CD_clut8 (CLUT8 | CDI)
|
|
#define CD_clut7 (CLUT7 | CDI)
|
|
#define CD_clut4 (CLUT4 | CDI)
|
|
#define CD_clut3 (CLUT3 | CDI)
|
|
#define CD_rl7 (RL7 | CDI)
|
|
#define CD_rl3 (RL3 | CDI)
|
|
#define CD_mplte (MPLTE | CDI)
|
|
|
|
#define C233 1
|
|
#define YUVX 2
|
|
#define HAMX 3
|
|
#define TANX 4
|
|
|
|
#define AN_c233 (Anim | C233)
|
|
#define AN_yuvx (Anim | YUVX)
|
|
#define AN_hamx (Anim | HAMX)
|
|
#define AN_tanx (Anim | TANX)
|
|
|
|
#define IMAGIC 0732
|
|
|
|
/* This used to reside in render.h. It does some texturing. */
|
|
#define BRICON Tin= (Tin-0.5)*tex->contrast+tex->bright-0.5; \
|
|
if(Tin<0.0) Tin= 0.0; else if(Tin>1.0) Tin= 1.0;
|
|
|
|
#define BRICONRGB Tr= tex->rfac*((Tr-0.5)*tex->contrast+tex->bright-0.5); \
|
|
if(Tr<0.0) Tr= 0.0; \
|
|
Tg= tex->gfac*((Tg-0.5)*tex->contrast+tex->bright-0.5); \
|
|
if(Tg<0.0) Tg= 0.0; \
|
|
Tb= tex->bfac*((Tb-0.5)*tex->contrast+tex->bright-0.5); \
|
|
if(Tb<0.0) Tb= 0.0;
|
|
|
|
/* mystifying stuff from blendef... */
|
|
#define SELECT 1
|
|
#define ACTIVE 2
|
|
#define NOT_YET 0
|
|
|
|
/* ???? */
|
|
#define BTST(a,b) ( ( (a) & 1<<(b) )!=0 )
|
|
#define BSET(a,b) ( (a) | 1<<(b) )
|
|
|
|
/* needed for material.c*/
|
|
#define REDRAWBUTSMAT 0x4015
|
|
|
|
/* useless game shit */
|
|
#define MA_FH_NOR 2
|
|
|
|
#endif
|
|
|