diff options
author | Ton Roosendaal <ton@blender.org> | 2006-11-29 15:44:48 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-11-29 15:44:48 +0300 |
commit | 3b23677425b98193fe520c3c00539c984470974b (patch) | |
tree | 0f7ccb24b59a9948a5e23262aec65851630526ce /source/blender | |
parent | eb03a578a30622ae3dea4f56201934bd0efa093b (diff) |
Duplicator feature:
Vertex/Face/Frame duplication now draws using OpenGL display lists. Makes
drawing go much faster (2-5 times, depending on size of duplicated object).
This system uses boundbox checks too, so outside of view it draws faster.
Note for face duplication: I've fixe a bug for incorrect alignment when
the parent was rotated when a parenting happened, the 'inverse parent
correction matrix' then messed up alignment. For face duplication it now
works OK, but for vertex-dupli not... need a way to fix this backwards
compatible.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 10 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 4 | ||||
-rw-r--r-- | source/blender/src/drawview.c | 48 | ||||
-rw-r--r-- | source/blender/src/view.c | 3 |
6 files changed, 66 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index fde33723cc4..9ad20b6a586 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -109,6 +109,7 @@ void what_does_parent(struct Object *ob); struct BoundBox *unit_boundbox(void); void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]); struct BoundBox *object_get_boundbox(struct Object *ob); +void object_boundbox_flag(struct Object *ob, int flag, int set); void minmax_object(struct Object *ob, float *min, float *max); void solve_tracking (struct Object *ob, float targetmat[][4]); void solve_constraints (struct Object *ob, short obtype, void *obdata, float ctime); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 11099ac0d72..ad97128bb37 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -464,7 +464,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par) DerivedMesh *dm; MFace *mface; MVert *mvert; - float pmat[4][4]; + float pmat[4][4], imat[3][3]; int lay, totface, a; Mat4CpyMat4(pmat, par->obmat); @@ -499,6 +499,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par) if(ob==par) { ob= base->object; + Mat3CpyMat4(imat, ob->parentinv); /* mballs have a different dupli handling */ if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */ @@ -508,7 +509,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par) float *v2= mvert[ mface[a].v2 ].co; float *v3= mvert[ mface[a].v3 ].co; float *v4= mface[a].v4?mvert[ mface[a].v4 ].co:NULL; - float cent[3], quat[4], mat[3][3], tmat[4][4], obmat[4][4]; + float cent[3], quat[4], mat[3][3], mat3[3][3], tmat[4][4], obmat[4][4]; /* translation */ if(v4) @@ -534,6 +535,9 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par) Mat3MulFloat(mat[0], size); } + Mat3CpyMat3(mat3, mat); + Mat3MulMat3(mat, imat, mat3); + Mat4CpyMat4(tmat, obmat); Mat4MulMat43(obmat, tmat, mat); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index c75c2a0238c..abe7cd4d38d 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1890,6 +1890,16 @@ BoundBox *object_get_boundbox(Object *ob) return bb; } +/* used to temporally disable/enable boundbox */ +void object_boundbox_flag(Object *ob, int flag, int set) +{ + BoundBox *bb= object_get_boundbox(ob); + if(bb) { + if(set) bb->flag |= flag; + else bb->flag &= ~flag; + } +} + void minmax_object(Object *ob, float *min, float *max) { BoundBox bb; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index dd79835b033..e58e6d7aa79 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -63,8 +63,12 @@ typedef struct bDeformGroup { typedef struct BoundBox { float vec[8][3]; + int flag, pad; } BoundBox; +/* boundbox flag */ +#define OB_BB_DISABLED 1 + /* OcInfo and LBuf structs are for the Enji gameengine */ typedef struct OcInfo { diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 47da7dfb07b..279f2de6277 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -2650,8 +2650,10 @@ static void draw_dupli_objects(View3D *v3d, Base *base) ListBase *lb; DupliObject *dob; Base tbase; + BoundBox *bb= NULL; + GLuint displist=0; int color= (base->flag & SELECT)?TH_SELECT:TH_WIRE; - short transflag; + short transflag, use_displist= G.rt; /* -1 is initialize */ char dt, dtx; if (base->object->restrictflag & OB_RESTRICT_VIEW) return; @@ -2660,6 +2662,10 @@ static void draw_dupli_objects(View3D *v3d, Base *base) if(base->object->dup_group && base->object->dup_group->id.us<1) color= TH_REDALERT; + /* test if we can do a displist */ + if(base->object->transflag & OB_DUPLIGROUP) + use_displist= 0; + tbase.flag= OB_FROMDUPLI|base->flag; lb= object_duplilist(G.scene, base->object); @@ -2668,8 +2674,6 @@ static void draw_dupli_objects(View3D *v3d, Base *base) else { tbase.object= dob->ob; - Mat4CpyMat4(dob->ob->obmat, dob->mat); - /* extra service: draw the duplicator in drawtype of parent */ dt= tbase.object->dt; tbase.object->dt= base->object->dt; dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; @@ -2680,7 +2684,39 @@ static void draw_dupli_objects(View3D *v3d, Base *base) tbase.object->transflag ^= OB_NEG_SCALE; BIF_ThemeColorBlend(color, TH_BACK, 0.5); - draw_object(&tbase, DRAW_CONSTCOLOR); + + /* generate displist, test for new object */ + if(use_displist==1 && dob->prev && dob->prev->ob!=dob->ob) { + use_displist= -1; + glDeleteLists(displist, 1); + } + /* generate displist */ + if(use_displist == -1) { + /* disable boundbox check for list creation */ + object_boundbox_flag(dob->ob, OB_BB_DISABLED, 1); + /* need this for next part of code */ + bb= object_get_boundbox(dob->ob); + + Mat4One(dob->ob->obmat); /* obmat gets restored */ + + displist= glGenLists(1); + glNewList(displist, GL_COMPILE); + draw_object(&tbase, DRAW_CONSTCOLOR); + glEndList(); + + use_displist= 1; + object_boundbox_flag(dob->ob, OB_BB_DISABLED, 0); + } + if(use_displist) { + mymultmatrix(dob->mat); + if(boundbox_clip(dob->mat, bb)) + glCallList(displist); + myloadmatrix(G.vd->viewmat); + } + else { + Mat4CpyMat4(dob->ob->obmat, dob->mat); + draw_object(&tbase, DRAW_CONSTCOLOR); + } tbase.object->dt= dt; tbase.object->dtx= dtx; @@ -2691,7 +2727,9 @@ static void draw_dupli_objects(View3D *v3d, Base *base) /* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */ free_object_duplilist(lb); /* does restore */ - + + if(use_displist) + glDeleteLists(displist, 1); } void view3d_update_depths(View3D *v3d) diff --git a/source/blender/src/view.c b/source/blender/src/view.c index 51ef76e1f44..1cd40951509 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -362,7 +362,8 @@ int boundbox_clip(float obmat[][4], BoundBox *bb) float vec[4], min, max; int a, flag= -1, fl; - if(bb==0) return 1; + if(bb==NULL) return 1; + if(bb->flag & OB_BB_DISABLED) return 1; Mat4MulMat4(mat, obmat, G.vd->persmat); |