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-18 22:28:16 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-18 22:28:16 +0400
commit37fe347a596fad3b32afd74ed58de913f9636812 (patch)
tree4de7cee178d23b879971e00ac7379238b533d184 /source/blender
parent2e2f62f6eed39f7a5bbf0a1f154836afc0760c4d (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.h4
-rw-r--r--source/blender/blenkernel/intern/displist.c13
-rw-r--r--source/blender/blenkernel/intern/mesh.c48
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h1
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c69
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();