diff options
author | Ton Roosendaal <ton@blender.org> | 2003-11-21 15:30:15 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2003-11-21 15:30:15 +0300 |
commit | 71500a2df1bc309a5d011c39f8af462cf977f64f (patch) | |
tree | 6a621cb917d6ee8288ae7ccc24048ff91efefcd0 /source/blender | |
parent | 94496ca80f22ffbbc72b5ff0ec8af1e5f04a4db0 (diff) |
- fixed another oldie... displaylists for MBall was generated FAR too often.
even for each redraw! Now its all smooth & fast again.
introduced new kernel API call: int is_basis_mball(ob), this provides a
quick check of the object is the actual basis for the displaylist and
polygonization.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_mball.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 9 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 37 |
4 files changed, 32 insertions, 18 deletions
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index b722e84a550..4bb49828553 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -52,6 +52,7 @@ void make_local_mball(struct MetaBall *mb); void tex_space_mball( struct Object *ob); void make_orco_mball( struct Object *ob); struct Object *find_basis_mball( struct Object *ob); +int is_basis_mball(struct Object *ob); void metaball_polygonize(struct Object *ob); void calc_mballco(struct MetaElem *ml, float *vec); float densfunc(struct MetaElem *ball, float x, float y, float z); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 70eb7ad7430..3a42d708f28 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1488,8 +1488,9 @@ void makeDispList(Object *ob) } } else if(ob->type==OB_MBALL) { - ob= find_basis_mball(ob); + ob= find_basis_mball(ob); + metaball_polygonize(ob); tex_space_mball(ob); diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index eedfa8f9667..09dfbd0d4cc 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -265,6 +265,15 @@ void make_orco_mball(Object *ob) } } +int is_basis_mball(Object *ob) +{ + int len; + + /* just a quick test */ + len= strlen(ob->id.name); + if( isdigit(ob->id.name[len-1]) ) return 0; + return 1; +} Object *find_basis_mball(Object *basis) { diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index aa6c9a1a858..8fa67dbded7 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -77,6 +77,7 @@ #include "BKE_global.h" #include "BKE_displist.h" #include "BKE_material.h" +#include "BKE_mball.h" #include "BKE_ipo.h" #include "BKE_mesh.h" #include "BKE_effect.h" @@ -2195,25 +2196,27 @@ static void drawDispList(Object *ob, int dt) } break; case OB_MBALL: - - lb= &ob->disp; - if(lb->first==0) makeDispList(ob); - - if(solid) { - - if(dt==OB_SHADED) { - dl= lb->first; - if(dl && dl->col1==0) shadeDispList(ob); - drawDispListshaded(lb, ob); - } - else { - init_gl_materials(ob); - two_sided(0); - - drawDispListsolid(lb, ob); + + if( is_basis_mball(ob)) { + lb= &ob->disp; + if(lb->first==0) makeDispList(ob); + + if(solid) { + + if(dt==OB_SHADED) { + dl= lb->first; + if(dl && dl->col1==0) shadeDispList(ob); + drawDispListshaded(lb, ob); + } + else { + init_gl_materials(ob); + two_sided(0); + + drawDispListsolid(lb, ob); + } } + else drawDispListwire(lb); } - else drawDispListwire(lb); break; } |