diff options
author | Ton Roosendaal <ton@blender.org> | 2004-05-29 20:17:46 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-05-29 20:17:46 +0400 |
commit | 6b51c684f1de22b8ff633649654457d531e30429 (patch) | |
tree | 3ba51aba5b05aed05fe5990b8f47b74f769cebd9 /source/blender | |
parent | 59dad6aefc950443cbe18c39b662de912b6fb3e0 (diff) |
NEW! Blender now displays flipped (negative scaled) Objects correctly in
OpenGL draw.
(BTW: the previous commit also solves raytrace errors with negative scaled
objects...)
Further a cleanup of displaylist flags and object/base flags. The #define
ACTIVE is moved to filesel.c (only used here).
The GONNA_MOVE #define got a OB_ added in front.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 7 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 13 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 13 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 22 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 20 | ||||
-rw-r--r-- | source/blender/src/filesel.c | 3 |
8 files changed, 56 insertions, 47 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 7b487bfca1e..18b421f1780 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -35,6 +35,7 @@ #ifndef BKE_DISPLIST_H #define BKE_DISPLIST_H +/* dl->type */ #define DL_POLY 0 #define DL_SEGM 1 #define DL_SURF 2 @@ -46,7 +47,9 @@ #define DL_NORS 8 #define DL_MESH 9 -/* EVIL: #define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev) */ +/* dl->flag */ +#define DL_CYCL_U 1 +#define DL_CYCL_V 2 /* prototypes */ diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 3a7a73508f7..84167694741 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -790,7 +790,7 @@ void addnormalsDispList(Object *ob, ListBase *lb) for(a=0; a<dl->parts; a++) { - DL_SURFINDEX(dl->flag & 1, dl->flag & 2, dl->nr, dl->parts); + DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); v1= vdata+ 3*p1; n1= ndata+ 3*p1; @@ -850,6 +850,7 @@ void shadeDispList(Object *ob) Mat4Invert(tmat, mat); Mat3CpyMat4(imat, tmat); + if(ob->transflag & OB_NEG_SCALE) Mat3MulFloat((float *)imat, -1.0); /* we extract dl_verts, deform info */ dldeform= find_displist(&ob->disp, DL_VERTS); @@ -1543,7 +1544,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dl= dispbase->first; while(dl) { if(dl->type==DL_SURF) { - if(dl->flag==2) { + if(dl->flag == DL_CYCL_V) { if(cu->flag & CU_BACK) { dlnew= MEM_callocN(sizeof(DispList), "filldisp"); BLI_addtail(&front, dlnew); @@ -1644,7 +1645,7 @@ void makeDispList(Object *ob) if(ob==0) return; if(ob->flag & OB_FROMDUPLI) return; freedisplist(&(ob->disp)); - + if(ob->type==OB_MESH) { me= ob->data; @@ -1736,14 +1737,14 @@ void makeDispList(Object *ob) if(draw==0) { dl->parts= nu->pntsv; dl->nr= nu->pntsu; - if(nu->flagu & 1) dl->flag|= 1; - if(nu->flagv & 1) dl->flag|= 2; + if(nu->flagu & 1) dl->flag|= DL_CYCL_U; + if(nu->flagv & 1) dl->flag|= DL_CYCL_V; } else { dl->parts= nu->resolu; /* in reverse, because makeNurbfaces works that way */ dl->nr= nu->resolv; - if(nu->flagv & 1) dl->flag|= 1; /* reverse too! */ - if(nu->flagu & 1) dl->flag|= 2; + if(nu->flagv & 1) dl->flag|= DL_CYCL_U; /* reverse too! */ + if(nu->flagu & 1) dl->flag|= DL_CYCL_V; } dl->col= nu->mat_nr; @@ -1837,8 +1838,8 @@ void makeDispList(Object *ob) dl->type= DL_SURF; dl->flag= 0; - if(dlb->type==DL_POLY) dl->flag++; - if(bl->poly>=0) dl->flag+=2; + if(dlb->type==DL_POLY) dl->flag |= DL_CYCL_U; + if(bl->poly>=0) dl->flag |= DL_CYCL_V; dl->parts= bl->nr; dl->nr= dlb->nr; @@ -1897,6 +1898,7 @@ void makeDispList(Object *ob) tex_space_curve(cu); } + } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 55e939e0d6d..9e6691f5525 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1178,7 +1178,7 @@ void where_is_object_time(Object *ob, float ctime) { Object *par; float *fp1, *fp2, slowmat[4][4] = MAT4_UNITY; - float stime, fac1, fac2; + float stime, fac1, fac2, vec[3]; int a; int pop; @@ -1258,6 +1258,11 @@ void where_is_object_time(Object *ob, float ctime) if(ob->scriptlink.totscript && !during_script()) { BPY_do_pyscript((ID *)ob, SCRIPT_REDRAW); } + + /* set negative scale flag in object */ + Crossf(vec, ob->obmat[0], ob->obmat[1]); + if( Inpf(vec, ob->obmat[2]) < 0.0 ) ob->transflag |= OB_NEG_SCALE; + else ob->transflag &= ~OB_NEG_SCALE; } static void solve_parenting (Object *ob, Object *par, float slowmat[][4], int simul) diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 45536964351..a3298529472 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -193,14 +193,8 @@ extern Object workob; /* **************** OBJECT ********************* */ -/* used many places... should be specialized */ +/* used many places... should be specialized */ #define SELECT 1 -#define ACTIVE 2 -#define GONNA_MOVE 32 /* temporary, for figuring what stuff needs - * updating during transform due to parenting - * or constraints... do not rely on this value - * unless you are me (CW). - */ /* type */ #define OB_EMPTY 0 @@ -235,6 +229,7 @@ extern Object workob; /* char! transflag */ #define OB_OFFS_LOCAL 1 #define OB_QUAT 2 +#define OB_NEG_SCALE 4 #define OB_DUPLI (8+16) #define OB_DUPLIFRAMES 8 #define OB_DUPLIVERTS 16 @@ -291,12 +286,14 @@ extern Object workob; #define OB_BOUND_POLYH 4 /* also needed for base!!!!! or rather, thy interfere....*/ -/* base->flag en ob->flag */ +/* base->flag and ob->flag */ #define BA_WASSEL 2 #define BA_PARSEL 4 #define BA_WHERE_UPDATE 8 #define BA_DISP_UPDATE 16 #define BA_DO_IPO 32 +#define OB_GONNA_MOVE 32 + #define BA_FROMSET 128 #define OB_DO_IMAT 256 #define OB_FROMDUPLI 512 diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index f1f374fe182..4cd39879698 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -360,18 +360,7 @@ typedef struct Scene { #define RAD_PHASE_PATCHES 1 #define RAD_PHASE_FACES 2 -/* base->flag and ob->flag */ -#define BA_WASSEL 2 -#define BA_PARSEL 4 -#define BA_WHERE_UPDATE 8 -#define BA_DISP_UPDATE 16 -#define BA_DO_IPO 32 -#define BA_FROMSET 128 -#define OB_DO_IMAT 256 -#define OB_FROMDUPLI 512 -#define OB_DONE 1024 -#define OB_RADIO 2048 -#define OB_FROMGROUP 4096 +/* base->flag is in DNA_object_types.h */ /* sce->flag */ #define SCE_ADDSCENAME 1 diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 60233a3cef3..48c02654fe1 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1297,7 +1297,7 @@ static void drawDispListwire(ListBase *dlbase) parts= dl->parts; while(parts--) { nr= dl->nr; - if(dl->flag & 1) glBegin(GL_LINE_LOOP); + if(dl->flag & DL_CYCL_U) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); while(nr--) { @@ -1311,7 +1311,7 @@ static void drawDispListwire(ListBase *dlbase) while(nr--) { data= ( dl->verts )+3*nr; parts= dl->parts; - if(dl->flag & 2) glBegin(GL_LINE_LOOP); + if(dl->flag & DL_CYCL_V) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); while(parts--) { @@ -1374,9 +1374,14 @@ static void drawDispListsolid(ListBase *lb, Object *ob) int drawsmooth= !(G.f & G_BACKBUFSEL); if(lb==0) return; + + /* drawsmooth abused here, except for Mesh this draws with smooth default */ if (drawsmooth) { glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); + + if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW); + else glFrontFace(GL_CCW); } dl= lb->first; @@ -1389,7 +1394,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob) if(!drawsmooth) { for(a=0; a<dl->parts; a++) { - DL_SURFINDEX(dl->flag & 1, dl->flag & 2, dl->nr, dl->parts); + DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); v1= data+ 3*p1; v2= data+ 3*p2; @@ -1420,7 +1425,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob) for(a=0; a<dl->parts; a++) { - DL_SURFINDEX(dl->flag & 1, dl->flag & 2, dl->nr, dl->parts); + DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); v1= data+ 3*p1; v2= data+ 3*p2; @@ -1560,6 +1565,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob) if(drawsmooth) { glShadeModel(GL_FLAT); glDisable(GL_LIGHTING); + glFrontFace(GL_CCW); } } @@ -1588,7 +1594,7 @@ static void drawDispListshaded(ListBase *lb, Object *ob) for(a=0; a<dl->parts; a++) { - DL_SURFINDEX(dl->flag & 1, dl->flag & 2, dl->nr, dl->parts); + DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); v1= data+ 3*p1; v2= data+ 3*p2; @@ -1714,7 +1720,11 @@ static void drawmeshsolid(Object *ob, float *nors) if( (G.f & G_BACKBUFSEL)==0 ) { glEnable(GL_LIGHTING); init_gl_materials(ob); + two_sided( me->flag & ME_TWOSIDED ); + + if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW); + else glFrontFace(GL_CCW); } mface= me->mface; @@ -1917,7 +1927,7 @@ static void drawmeshsolid(Object *ob, float *nors) glDisable(GL_CULL_FACE); } glDisable(GL_LIGHTING); - + glFrontFace(GL_CCW); } static void drawmeshshaded(Object *ob, unsigned int *col1, unsigned int *col2) diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index eec31290391..e28c43cb948 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -2913,13 +2913,13 @@ void clear_gonna_move(void) { /* clear the gonna move flag */ for (base= FIRSTBASE; base; base= base->next) { - base->object->flag &= ~GONNA_MOVE; + base->object->flag &= ~OB_GONNA_MOVE; } } int is_parent_gonna_move(Object *ob) { if ( (ob->parent) && - (ob->parent->flag & GONNA_MOVE) ) { + (ob->parent->flag & OB_GONNA_MOVE) ) { return 1; } return 0; @@ -2932,7 +2932,7 @@ int is_constraint_target_gonna_move(Object *ob) { for (con = ob->constraints.first; con; con=con->next) { if ( (tarOb = get_con_target(con)) ) { - if (tarOb->flag & GONNA_MOVE ) + if (tarOb->flag & OB_GONNA_MOVE ) return 1; } } @@ -2941,7 +2941,7 @@ int is_constraint_target_gonna_move(Object *ob) { for (chan = ob->pose->chanbase.first; chan; chan=chan->next){ for (con = chan->constraints.first; con; con=con->next) { if ( (tarOb = get_con_target(con)) ) { - if (tarOb->flag & GONNA_MOVE ) + if (tarOb->flag & OB_GONNA_MOVE ) return 1; } } @@ -2963,19 +2963,19 @@ void flag_moving_objects(void) { oldnumgonnamove = numgonnamove; numgonnamove = 0; for (base= FIRSTBASE; base; base= base->next) { - if (base->object->flag & GONNA_MOVE) { + if (base->object->flag & OB_GONNA_MOVE) { ++numgonnamove; } else if (base->flag & SELECT) { - base->object->flag |= GONNA_MOVE; + base->object->flag |= OB_GONNA_MOVE; ++numgonnamove; } else if (is_parent_gonna_move(base->object)) { - base->object->flag |= GONNA_MOVE; + base->object->flag |= OB_GONNA_MOVE; ++numgonnamove; } else if (is_constraint_target_gonna_move(base->object)) { - base->object->flag |= GONNA_MOVE; + base->object->flag |= OB_GONNA_MOVE; ++numgonnamove; } } @@ -3007,8 +3007,8 @@ static int pose_do_update_flag(Object *ob) { for (base= FIRSTBASE; base; base= base->next) { if (is_ob_constraint_target(base->object, &chan->constraints)) { - if( (base->object->flag & GONNA_MOVE) || - (ob->flag & GONNA_MOVE)) { + if( (base->object->flag & OB_GONNA_MOVE) || + (ob->flag & OB_GONNA_MOVE)) { Bone *bone; /* If this armature is selected, or if the * object that is the target of a constraint diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c index ae7a8e66d9c..9597af86250 100644 --- a/source/blender/src/filesel.c +++ b/source/blender/src/filesel.c @@ -118,9 +118,12 @@ #define FILESELHEAD 60 #define FILESEL_DY 16 +/* for events */ #define NOTACTIVE 0 #define ACTIVATE 1 #define INACTIVATE 2 +/* for state of file */ +#define ACTIVE 2 #define STARTSWITH(x, y) (strncmp(x, y, sizeof(x) - 1) == 0) |