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 | |
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')
-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 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_mesh_types.h | 1 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 69 |
6 files changed, 80 insertions, 56 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) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index cb50fce8c4e..10c58904c3e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2090,7 +2090,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) mesh->bb= NULL; mesh->oc= 0; mesh->dface= NULL; - mesh->orco= NULL; mesh->decimated= NULL; mesh->derived= NULL; diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 4f401d55231..2c09f93c5f4 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -80,7 +80,6 @@ typedef struct Mesh { struct MCol *mcol; struct MSticky *msticky; struct Mesh *texcomesh; - float *orco; /* not written in file, caches derived mesh */ struct DerivedMesh *derived; diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 144b54817fb..ed02a080860 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -52,6 +52,7 @@ #include "BLI_blenlib.h" #include "BLI_rand.h" #include "BLI_memarena.h" +#include "BLI_GHash.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" @@ -789,11 +790,11 @@ static void autosmooth(int startvert, int startvlak, int degr) /* End of autosmoothing: */ /* ------------------------------------------------------------------------- */ -static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, Material *ma, float *extverts) +static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, Material *ma, float *extverts, float *orco) { HaloRen *har; float xn, yn, zn, nor[3], view[3]; - float *orco, vec[3], hasize, mat[4][4], imat[3][3]; + float vec[3], hasize, mat[4][4], imat[3][3]; int start, end, a, ok, seed= ma->seed1; MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat); @@ -801,8 +802,6 @@ static void make_render_halos(Object *ob, Mesh *me, int totvert, MVert *mvert, M R.flag |= R_HALO; - orco= me->orco; - start= 0; end= totvert; set_buildvars(ob, &start, &end); @@ -1283,6 +1282,32 @@ static void init_render_mball(Object *ob) } /* ------------------------------------------------------------------------- */ /* convert */ + +static GHash *g_orco_hash = NULL; + +static float *get_mesh_orco(Object *ob) +{ + Mesh *me = ob->data; + float *orco; + + if (!g_orco_hash) + g_orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + + orco = BLI_ghash_lookup(g_orco_hash, me); + + if (!orco) { + orco = mesh_create_orco_render(ob); + + BLI_ghash_insert(g_orco_hash, me, orco); + } + + return orco; +} +static void free_mesh_orco_hash(void) +{ + BLI_ghash_free(g_orco_hash, NULL, MEM_freeN); +} + static void init_render_mesh(Object *ob) { Mesh *me; @@ -1295,7 +1320,7 @@ static void init_render_mesh(Object *ob) PartEff *paf; unsigned int *vertcol; float xn, yn, zn, imat[3][3], mat[4][4]; //nor[3], - float *extverts=0, *orco; + float *extverts=0, *orco=0, *orcoData=0; int a, a1, ok, do_puno=0, need_orco=0, totvlako, totverto, vertofs; int start, end, do_autosmooth=0, totvert = 0; DispListMesh *dlm = NULL; @@ -1323,25 +1348,20 @@ static void init_render_mesh(Object *ob) if(me->key) do_puno= 1; - if(me->orco==0) { - need_orco= 0; - for(a=1; a<=ob->totcol; a++) { - ma= give_render_material(ob, a); - if(ma) { - if(ma->texco & TEXCO_ORCO) { - need_orco= 1; - break; - } + need_orco= 0; + for(a=1; a<=ob->totcol; a++) { + ma= give_render_material(ob, a); + if(ma) { + if(ma->texco & TEXCO_ORCO) { + need_orco= 1; + break; } } } /* we do this before deform */ if(need_orco) { - if ((me->flag&ME_SUBSURF) && me->subdivr) - make_orco_displist_mesh(ob, me->subdivr); - else - make_orco_mesh(me); + orco = get_mesh_orco(ob); } { @@ -1358,12 +1378,10 @@ static void init_render_mesh(Object *ob) ms = (totvert==me->totvert)?me->msticky:NULL; } - orco= me->orco; - ma= give_render_material(ob, 1); if(ma->mode & MA_HALO) { - make_render_halos(ob, me, totvert, mvert, ma, extverts); + make_render_halos(ob, me, totvert, mvert, ma, extverts, orco); } else { @@ -2705,13 +2723,6 @@ void RE_freeRotateBlenderScene(void) cu->orco= 0; } } - else if(ob->type==OB_MESH) { - Mesh *me= ob->data; - if(me->orco) { - MEM_freeN(me->orco); - me->orco= 0; - } - } else if(ob->type==OB_MBALL) { if(ob->disp.first && ob->disp.first!=ob->disp.last) { DispList *dl= ob->disp.first; @@ -2723,6 +2734,8 @@ void RE_freeRotateBlenderScene(void) ob= ob->id.next; } + free_mesh_orco_hash(); + end_render_textures(); end_render_materials(); end_radio_render(); |