Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-07-14 22:04:27 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-14 22:04:27 +0400
commitb22e3414cafdc0fe0cf151665b753f817513375d (patch)
tree157bc5803f6e2c8b40ee50193397f5c77a461937
parent3f769ff371547af297498feb6d282cdc2f08c92f (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)
-rw-r--r--source/blender/blenkernel/BKE_mesh.h3
-rw-r--r--source/blender/blenkernel/intern/displist.c12
-rw-r--r--source/blender/blenkernel/intern/mesh.c9
-rw-r--r--source/blender/blenkernel/intern/object.c8
-rw-r--r--source/blender/python/api2_2x/Object.c4
-rw-r--r--source/blender/src/drawobject.c17
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;