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/blenkernel
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/blenkernel')
-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
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)