diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-14 22:04:27 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-14 22:04:27 +0400 |
commit | b22e3414cafdc0fe0cf151665b753f817513375d (patch) | |
tree | 157bc5803f6e2c8b40ee50193397f5c77a461937 /source/blender | |
parent | 3f769ff371547af297498feb6d282cdc2f08c92f (diff) |
- add mesh_get_bb function to return mesh boundbox and calc if needed
- switch all mesh boundbox access to go through mesh_get_bb
- switch object_handle_update to call mesh_changed instead of making
the displist data immediately (delayed calculation)
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 8 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Object.c | 4 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 17 |
6 files changed, 33 insertions, 20 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index ceeb99f5c20..4e4ce341395 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -36,6 +36,7 @@ /***/ +struct BoundBox; struct DispList; struct ListBase; struct MDeformVert; @@ -77,6 +78,8 @@ int update_realtime_texture(struct TFace *tface, double time); void mesh_delete_material_index(struct Mesh *me, int index); void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth); +struct BoundBox *mesh_get_bb(struct Mesh *me); + void make_edges(struct Mesh *me); /** Generate the mesh vertex normals by averaging over connected faces. diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 96418176a7a..5b9fab8f2a7 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1615,11 +1615,19 @@ void mesh_changed(Object *meshOb) me->derived->release(me->derived); me->derived = NULL; } + + /* This should really be delayed, but there is no simple way + * to signal to rebuild the derived mesh (we can't null it + * because it is used for incremental). Just need to add a + * flag at some point. - zr + */ + if (G.obedit && meshOb->data==G.obedit->data) { + G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); + } } void makeDispListMesh(Object *ob) { - EditMesh *em = G.editMesh; Mesh *me; if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MESH) return; @@ -1639,7 +1647,7 @@ void makeDispListMesh(Object *ob) if (mesh_uses_displist(me)) { /* subsurf */ if (ob==G.obedit) { - G.editMesh->derived= subsurf_make_derived_from_editmesh(em, me->subdiv, me->subsurftype, G.editMesh->derived); + G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); } else { me->derived= subsurf_make_derived_from_mesh(me, me->subdiv); } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 56c97a8f62d..3ab98b550a2 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -425,6 +425,15 @@ void tex_space_mesh(Mesh *me) } +BoundBox *mesh_get_bb(Mesh *me) +{ + if (!me->bb) { + tex_space_mesh(me); + } + + return me->bb; +} + void make_orco_displist_mesh(Object *ob, int subdivlvl) { Mesh *me; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 550a4892f8a..647a5bca76c 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1739,8 +1739,7 @@ void minmax_object(Object *ob, float *min, float *max) me= get_mesh(ob); if(me) { - if(me->bb==0) tex_space_mesh(me); - bb= *(me->bb); + bb = *mesh_get_bb(me); for(a=0; a<8; a++) { Mat4MulVecfl(ob->obmat, bb.vec[a]); @@ -1777,7 +1776,10 @@ void object_handle_update(Object *ob) // printf("recalcdata %s\n", ob->id.name+2); /* includes all keys and modifiers */ - if(ob->type && ob->type<OB_LAMP) { + if(ob->type==OB_MESH) { + mesh_changed(ob); + } + else if(ob->type && ob->type<OB_LAMP) { makeDispList(ob); } else if(ob->type==OB_ARMATURE) { diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index 55ab29d8cac..0a28177edb7 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -1313,9 +1313,7 @@ static PyObject *Object_getBoundBox( BPy_Object * self ) switch ( self->object->type ) { case OB_MESH: me = self->object->data; - if( !me->bb ) - tex_space_mesh( me ); - vec = ( float * ) me->bb->vec; + vec = (float*) mesh_get_bb(me)->vec; break; case OB_CURVE: case OB_FONT: diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index f41dc5d07af..03f730b5016 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1932,8 +1932,9 @@ static void draw_mesh_object(Base *base, int dt) baseDM->release(baseDM); } else { - if(me->bb==NULL) tex_space_mesh(me); - if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) { + BoundBox *bb = mesh_get_bb(me); + + if(me->totface<=4 || boundbox_clip(ob->obmat, bb)) { DerivedMesh *baseDM = mesh_get_base_derived(ob); DerivedMesh *realDM = mesh_get_derived(ob); @@ -3222,11 +3223,7 @@ void get_local_bounds(Object *ob, float *centre, float *size) /* uses boundbox, function used by Ketsji */ if(ob->type==OB_MESH) { - bb= ( (Mesh *)ob->data )->bb; - if(bb==0) { - tex_space_mesh(ob->data); - bb= ( (Mesh *)ob->data )->bb; - } + bb = mesh_get_bb(ob->data); } else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { bb= ( (Curve *)ob->data )->bb; @@ -3295,11 +3292,7 @@ static void draw_bounding_volume(Object *ob) BoundBox *bb=0; if(ob->type==OB_MESH) { - bb= ( (Mesh *)ob->data )->bb; - if(bb==0) { - tex_space_mesh(ob->data); - bb= ( (Mesh *)ob->data )->bb; - } + bb= mesh_get_bb(ob->data); } else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { bb= ( (Curve *)ob->data )->bb; |