diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-18 22:28:16 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-18 22:28:16 +0400 |
commit | 37fe347a596fad3b32afd74ed58de913f9636812 (patch) | |
tree | 4de7cee178d23b879971e00ac7379238b533d184 /source/blender/blenkernel | |
parent | 2e2f62f6eed39f7a5bbf0a1f154836afc0760c4d (diff) |
- removed orco pointer from struct Mesh
- switch renderer to store orco's in a hash table instead of
caching in mesh (I don't like the renderer caching data
in the actual mesh structure)
- added mesh_create_orco[_render] function
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 13 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 48 |
3 files changed, 39 insertions, 26 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 8fd66a16531..4859c611156 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -59,8 +59,8 @@ void make_local_tface(struct Mesh *me); void make_local_mesh(struct Mesh *me); void boundbox_mesh(struct Mesh *me, float *loc, float *size); void tex_space_mesh(struct Mesh *me); -void make_orco_displist_mesh(struct Object *ob, int subdivlvl); -void make_orco_mesh(struct Mesh *me); +float *mesh_create_orco_render(struct Object *ob); +float *mesh_create_orco(struct Object *ob); void test_index_mface(struct MFace *mface, int nr); void test_index_face(struct MFace *mface, struct TFace *tface, int nr); void flipnorm_mesh(struct Mesh *me); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 69242481fd7..ca4822f0dd3 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -766,13 +766,7 @@ void shadeDispList(Object *ob) MVert *mvert; if (need_orco) { - if ((me->flag&ME_SUBSURF) && me->subdiv) - make_orco_displist_mesh(ob, me->subdiv); - else - make_orco_mesh(me); - orco= me->orco; - } else { - orco= NULL; + orco = mesh_create_orco(ob); } dlm= dm->convertToDispListMesh(dm); @@ -867,9 +861,8 @@ void shadeDispList(Object *ob) } displistmesh_free(dlm); - if (need_orco && orco) { - MEM_freeN(me->orco); - me->orco= NULL; + if (orco) { + MEM_freeN(orco); } if (dmNeedsFree) dm->release(dm); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index ad183f2aead..61c75ef79e8 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -149,8 +149,7 @@ void free_mesh(Mesh *me) if(me->msticky) MEM_freeN(me->msticky); if(me->mat) MEM_freeN(me->mat); - if(me->orco) MEM_freeN(me->orco); - + if(me->bb) MEM_freeN(me->bb); if(me->disp.first) freedisplist(&me->disp); if(me->derived) me->derived->release(me->derived); @@ -235,7 +234,6 @@ Mesh *copy_mesh(Mesh *me) men->mcol= MEM_dupallocN(me->mcol); men->msticky= MEM_dupallocN(me->msticky); men->texcomesh= NULL; - men->orco= NULL; men->bb= MEM_dupallocN(men->bb); men->disp.first= men->disp.last= NULL; // dont copy, editmode version has pointers in it @@ -430,12 +428,12 @@ void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r) if (size_r) VECCOPY(size_r, me->size); } -void make_orco_displist_mesh(Object *ob, int subdivlvl) +static float *make_orco_displist_mesh(Object *ob, int subdivlvl) { Mesh *me= ob->data; DerivedMesh *dm; DispListMesh *dlm; - float loc[3], size[3]; + float *orco, *fp, loc[3], size[3]; int i; if (G.obedit && G.obedit->data==me) { @@ -456,32 +454,30 @@ void make_orco_displist_mesh(Object *ob, int subdivlvl) do_ob_key(ob); } - if (me->orco) MEM_freeN(me->orco); - me->orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco"); + fp= orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco"); mesh_get_texspace(me, loc, NULL, size); - for(i=0; i<dlm->totvert; i++) { - float *fp= &me->orco[i*3]; - + for(i=0; i<dlm->totvert; i++,fp+=3) { fp[0]= (dlm->mvert[i].co[0] - loc[0])/size[0]; fp[1]= (dlm->mvert[i].co[1] - loc[1])/size[1]; fp[2]= (dlm->mvert[i].co[2] - loc[2])/size[2]; } displistmesh_free(dlm); + + return orco; } -void make_orco_mesh(Mesh *me) +static float *make_orco_mesh(Mesh *me) { MVert *mvert; KeyBlock *kb; - float *orco, *fp; + float *orcoData, *orco, *fp; int a, totvert; float loc[3], size[3]; totvert= me->totvert; - if(totvert==0) return; - orco= me->orco= MEM_mallocN(sizeof(float)*3*totvert, "orco mesh"); + orco= orcoData= MEM_mallocN(sizeof(float)*3*totvert, "orco mesh"); mesh_get_texspace(me, loc, NULL, size); if(me->key && me->texcomesh==0) { @@ -514,6 +510,30 @@ void make_orco_mesh(Mesh *me) if(a<me->totvert) mvert++; } } + + return orcoData; +} + +float *mesh_create_orco_render(Object *ob) +{ + Mesh *me = ob->data; + + if ((me->flag&ME_SUBSURF) && me->subdivr) { + return make_orco_displist_mesh(ob, me->subdivr); + } else { + return make_orco_mesh(me); + } +} + +float *mesh_create_orco(Object *ob) +{ + Mesh *me = ob->data; + + if ((me->flag&ME_SUBSURF) && me->subdiv) { + return make_orco_displist_mesh(ob, me->subdiv); + } else { + return make_orco_mesh(me); + } } /** rotates the vertices of a face in case v[2] or v[3] (vertex index) |