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
path: root/source
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2004-01-07 13:17:37 +0300
committerDaniel Dunbar <daniel@zuster.org>2004-01-07 13:17:37 +0300
commitecd620a5aad00c21a67301c5a029785bf6667e3a (patch)
tree54fe3fed77e477e3fc64b5a4817874048c8c41eb /source
parent38e88310b04736abfdc24150cd880204472328ed (diff)
- removed some old cruft from init_render_displist_mesh (for smeshes-RIP)
- reduced main subsurf interface to two functions to make DispListMesh structures from an editmesh or a regular mesh. for the most part this means that to implement a geometry modifier you only need to write these two functions (not very plugable yet however). - added displistmesh_from_mesh and displistmesh_from_editmesh functions which allow simple support of subdivLevel(0) subsurfs, somewhat handy for testing things (like why orco doesn't work for subsurf).
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_displist.h7
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h9
-rw-r--r--source/blender/blenkernel/intern/displist.c148
-rw-r--r--source/blender/blenkernel/intern/mesh.c15
-rw-r--r--source/blender/blenkernel/intern/subsurf.c100
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c250
-rw-r--r--source/blender/src/editobject.c8
7 files changed, 274 insertions, 263 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index f38fd894ea9..c140e6bc15b 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -55,6 +55,7 @@ struct Curve;
struct ListBase;
struct Material;
struct Bone;
+struct Mesh;
struct TFace;
typedef struct DispListMesh DispListMesh;
@@ -67,8 +68,14 @@ struct DispListMesh {
int flag;
};
+void displistmesh_free(DispListMesh *dlm);
void displistmesh_calc_vert_normals(DispListMesh *dlm);
+void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me);
+
+DispListMesh *displistmesh_from_editmesh(struct ListBase *verts, struct ListBase *edges, struct ListBase *faces);
+DispListMesh *displistmesh_from_mesh(struct Mesh *mesh, float *extverts);
+
/*
* All the different DispList.type's use the
* data in the displist structure in fairly
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 8025c89dc0e..1d65015448a 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -34,11 +34,12 @@
struct Mesh;
struct Object;
struct Displist;
+struct DispListMesh;
+struct ListBase;
+
+struct DispListMesh *subsurf_make_dispListMesh_from_editmesh(struct ListBase *verts, struct ListBase *edges, struct ListBase *faces, int subdivLevels, int flags);
+struct DispListMesh *subsurf_make_dispListMesh_from_mesh(struct Mesh *me, float *extverts, int subdivLevels, int flags);
-void subsurf_to_mesh(struct Object *oldob, struct Mesh *newme);
-void subsurf_make_mesh(struct Object *ob, short subdiv);
-void subsurf_make_editmesh(struct Object *ob);
-struct DispList* subsurf_mesh_to_displist(struct Mesh *me, struct DispList *dl, short subdiv);
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
#endif
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index ecb12386da4..53f94a5e6c6 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -106,7 +106,101 @@ struct _FastLamp {
static FastLamp *fastlamplist= NULL;
static float fviewmat[4][4];
-static void displistmesh_free(DispListMesh *dlm) {
+DispListMesh *displistmesh_from_editmesh(ListBase *verts, ListBase *edges, ListBase *faces) {
+ DispListMesh *dlm= MEM_callocN(sizeof(*dlm),"dlm");
+ int i;
+ EditVert *eve, *evePrev;
+ EditEdge *eed;
+ EditVlak *evl;
+
+ dlm->flag= 0;
+ dlm->totvert= BLI_countlist(verts);
+ dlm->totface= BLI_countlist(edges)+BLI_countlist(faces);
+ dlm->mvert= MEM_callocN(sizeof(*dlm->mface)*dlm->totvert, "dlm->mvert");
+ dlm->mcol= NULL;
+ dlm->tface= NULL;
+ dlm->mface= MEM_mallocN(sizeof(*dlm->mface)*dlm->totface, "dlm->mface");
+
+ i=0;
+ for (eve= verts->first; eve; eve= eve->next, i++) {
+ MVert *mvNew= &dlm->mvert[i];
+ VECCOPY(mvNew->co, eve->co);
+ eve->prev= (void*) i; /* hack to fetch indices */
+ }
+
+ i=0;
+ for (evl= faces->first; evl; evl= evl->next, i++) {
+ MFaceInt *mfNew= &dlm->mface[i];
+
+ mfNew->v1= (int) evl->v1->prev;
+ mfNew->v2= (int) evl->v2->prev;
+ mfNew->v3= (int) evl->v3->prev;
+ mfNew->v4= evl->v4?(int) evl->v4->prev:0;
+ mfNew->flag= evl->flag;
+ mfNew->mat_nr= evl->mat_nr;
+ mfNew->puno= 0;
+ mfNew->edcode= 0;
+
+ if (evl->v4 && !mfNew->v4) {
+ mfNew->v1^= mfNew->v3^= mfNew->v1^= mfNew->v3;
+ mfNew->v2^= mfNew->v4^= mfNew->v2^= mfNew->v4;
+ }
+ }
+ for (eed= edges->first; eed; eed= eed->next, i++) {
+ MFaceInt *mfNew= &dlm->mface[i];
+
+ mfNew->v1= (int) eed->v1->prev;
+ mfNew->v2= (int) eed->v2->prev;
+ mfNew->v3= 0;
+ mfNew->v4= 0;
+ mfNew->flag= 0;
+ mfNew->mat_nr= 0;
+ mfNew->puno= 0;
+ mfNew->edcode= 0;
+ }
+
+ /* restore prev links */
+ for (evePrev=NULL, eve= verts->first; eve; evePrev=eve, eve= eve->next)
+ eve->prev= evePrev;
+
+ displistmesh_calc_vert_normals(dlm);
+
+ return dlm;
+}
+DispListMesh *displistmesh_from_mesh(Mesh *me, float *extverts) {
+ DispListMesh *dlm= MEM_callocN(sizeof(*dlm),"dlm");
+ int i;
+ dlm->flag= 0;
+ dlm->totvert= me->totvert;
+ dlm->totface= me->totface;
+ dlm->mvert= MEM_dupallocN(me->mvert);
+ dlm->mcol= me->mcol?MEM_dupallocN(me->mcol):NULL;
+ dlm->tface= me->tface?MEM_dupallocN(me->tface):NULL;
+ dlm->mface= MEM_mallocN(sizeof(*dlm->mface)*dlm->totface, "dlm->mface");
+
+ if (extverts) {
+ for (i=0; i<dlm->totvert; i++) {
+ VECCOPY(dlm->mvert[i].co, &extverts[i*3]);
+ }
+ }
+ for (i=0; i<dlm->totface; i++) {
+ MFace *mfOld= &((MFace*) me->mface)[i];
+ MFaceInt *mfNew= &dlm->mface[i];
+
+ mfNew->v1= mfOld->v1;
+ mfNew->v2= mfOld->v2;
+ mfNew->v3= mfOld->v3;
+ mfNew->v4= mfOld->v4;
+ mfNew->flag= mfOld->flag;
+ mfNew->mat_nr= mfOld->mat_nr;
+ mfNew->puno= 0;
+ mfNew->edcode= 0;
+ }
+
+ return dlm;
+}
+
+void displistmesh_free(DispListMesh *dlm) {
// also check on mvert and mface, can be NULL after decimator (ton)
if( dlm->mvert) MEM_freeN(dlm->mvert);
if (dlm->mface) MEM_freeN(dlm->mface);
@@ -164,6 +258,37 @@ void displistmesh_calc_vert_normals(DispListMesh *dlm) {
MEM_freeN(tnorms);
}
+void displistmesh_to_mesh(DispListMesh *dlm, Mesh *me) {
+ MFace *mfaces;
+ int i;
+
+ if (dlm->totvert>65000) {
+ error("Too many vertices");
+ } else {
+ me->totface= dlm->totface;
+ me->totvert= dlm->totvert;
+
+ me->mvert= MEM_dupallocN(dlm->mvert);
+ me->mface= mfaces= MEM_mallocN(sizeof(*mfaces)*me->totface, "me->mface");
+ me->tface= MEM_dupallocN(dlm->tface);
+ me->mcol= MEM_dupallocN(dlm->mcol);
+
+ for (i=0; i<me->totface; i++) {
+ MFace *mf= &mfaces[i];
+ MFaceInt *oldmf= &dlm->mface[i];
+
+ mf->v1= oldmf->v1;
+ mf->v2= oldmf->v2;
+ mf->v3= oldmf->v3;
+ mf->v4= oldmf->v4;
+ mf->flag= oldmf->flag;
+ mf->mat_nr= oldmf->mat_nr;
+ mf->puno= 0;
+ mf->edcode= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
+ }
+ }
+}
+
void free_disp_elem(DispList *dl)
{
if(dl) {
@@ -1521,11 +1646,22 @@ void makeDispList(Object *ob)
if(ob->effect.first) object_wave(ob);
- if ((me->flag & ME_SUBSURF) && me->subdiv>0) {
- if (ob==G.obedit)
- subsurf_make_editmesh(ob);
- else
- subsurf_make_mesh(ob, me->subdiv);
+ if (me->flag & ME_SUBSURF) {
+ DispListMesh *dlm;
+
+ if (ob==G.obedit) {
+ dlm= subsurf_make_dispListMesh_from_editmesh(&G.edve, &G.eded, &G.edvl, me->subdiv, me->flag);
+ } else {
+ DispList *dlVerts= find_displist(&ob->disp, DL_VERTS);
+ dlm= subsurf_make_dispListMesh_from_mesh(me, dlVerts?dlVerts->verts:NULL, me->subdiv, me->flag);
+ }
+
+ dl= MEM_callocN(sizeof(*dl), "dl");
+ dl->type= DL_MESH;
+ dl->mesh= dlm;
+
+ free_displist_by_type(&me->disp, DL_MESH);
+ BLI_addtail(&me->disp, dl);
}
}
else if(ob->type==OB_MBALL) {
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3b843dae048..66025473fde 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -442,7 +442,6 @@ void tex_space_mesh(Mesh *me)
void make_orco_displist_mesh(Object *ob, int subdivlvl)
{
Mesh *me;
- DispList *dl;
DispListMesh *dlm;
int i;
@@ -453,20 +452,14 @@ void make_orco_displist_mesh(Object *ob, int subdivlvl)
cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0);
}
- /* Rebuild the displist */
- dl= subsurf_mesh_to_displist(me, NULL, (short)subdivlvl);
+ dlm= subsurf_make_dispListMesh_from_mesh(me, NULL, subdivlvl, me->flag);
/* Restore correct key */
do_ob_key(ob);
- /* XXX Assume dl is a DL_MESH (it is),
- * should be explicit -zr
- */
- dlm= dl->mesh;
-
if (me->orco) MEM_freeN(me->orco);
me->orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco");
-
+
for(i=0; i<dlm->totvert; i++) {
float *fp= &me->orco[i*3];
@@ -477,7 +470,7 @@ void make_orco_displist_mesh(Object *ob, int subdivlvl)
fp[2]= (fp[2]-me->loc[2])/me->size[2];
}
- free_disp_elem(dl);
+ displistmesh_free(dlm);
}
void make_orco_mesh(Mesh *me)
@@ -1115,7 +1108,7 @@ void mcol_to_tface(Mesh *me, int freedata)
}
int mesh_uses_displist(Mesh *me) {
- return (me->flag&ME_SUBSURF && (me->subdiv>0));
+ return (me->flag&ME_SUBSURF);
}
int rendermesh_uses_displist(Mesh *me) {
diff --git a/source/blender/blenkernel/intern/subsurf.c b/source/blender/blenkernel/intern/subsurf.c
index 9e4d189e935..4aab0fb6d8f 100644
--- a/source/blender/blenkernel/intern/subsurf.c
+++ b/source/blender/blenkernel/intern/subsurf.c
@@ -330,7 +330,7 @@ static HyperMesh *hypermesh_new(void) {
return hme;
}
-static HyperMesh *hypermesh_from_mesh(Mesh *me, DispList *dlverts) {
+static HyperMesh *hypermesh_from_mesh(Mesh *me, float *extverts) {
HyperMesh *hme= hypermesh_new();
HyperVert **vert_tbl;
MFace *mface= me->mface;
@@ -345,8 +345,8 @@ static HyperMesh *hypermesh_from_mesh(Mesh *me, DispList *dlverts) {
vert_tbl= MEM_mallocN(sizeof(*vert_tbl)*me->totvert, "vert_tbl");
for (i= 0; i<me->totvert; i++) {
- if (dlverts)
- vert_tbl[i]= hypermesh_add_vert(hme, &dlverts->verts[i*3], NULL);
+ if (extverts)
+ vert_tbl[i]= hypermesh_add_vert(hme, &extverts[i*3], NULL);
else
vert_tbl[i]= hypermesh_add_vert(hme, me->mvert[i].co, NULL);
}
@@ -759,10 +759,9 @@ static int hypermesh_get_nlines(HyperMesh *hme) {
}
/* flag is me->flag, for handles and 'optim' */
-static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) {
+static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
int nverts= hypermesh_get_nverts(hme);
int nfaces= hypermesh_get_nfaces(hme) + hypermesh_get_nlines(hme);
- DispList *dl= MEM_callocN(sizeof(*dl), "dl");
DispListMesh *dlm= MEM_callocN(sizeof(*dlm), "dlmesh");
HyperFace *f;
HyperVert *v;
@@ -785,9 +784,6 @@ static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) {
if (hme->orig_me==NULL && (flag & ME_OPT_EDGES)) {
handles= hypermesh_get_nverts_handles(hme);
}
-
- dl->type= DL_MESH;
- dl->mesh= dlm;
dlm->totvert= nverts+handles;
dlm->totface= nfaces+handles;
@@ -919,12 +915,12 @@ static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) {
displistmesh_calc_vert_normals(dlm);
- return dl;
+ return dlm;
}
/* flag is me->flag, for handles and 'optim' */
-static DispList *subsurf_subdivide_to_displist(HyperMesh *hme, short subdiv, short flag) {
- DispList *dl;
+static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short subdiv, short flag) {
+ DispListMesh *dlm;
int i;
for (i= 0; i<subdiv; i++) {
@@ -940,82 +936,32 @@ static DispList *subsurf_subdivide_to_displist(HyperMesh *hme, short subdiv, sho
hme= tmp;
}
- dl= hypermesh_to_displist(hme, flag);
+ dlm= hypermesh_to_displistmesh(hme, flag);
hypermesh_free(hme);
- return dl;
+ return dlm;
}
-void subsurf_make_editmesh(Object *ob) {
- if (G.eded.first) {
- Mesh *me= ob->data;
- HyperMesh *hme= hypermesh_from_editmesh(G.edve.first, G.eded.first, G.edvl.first);
-
- free_displist_by_type(&me->disp, DL_MESH);
- BLI_addtail(&me->disp, subsurf_subdivide_to_displist(hme, me->subdiv, me->flag));
- }
-}
-
-void subsurf_make_mesh(Object *ob, short subdiv) {
- Mesh *me= ob->data;
-
- if (me->totface) {
- HyperMesh *hme= hypermesh_from_mesh(me, find_displist(&ob->disp, DL_VERTS));
-
- free_displist_by_type(&me->disp, DL_MESH);
- BLI_addtail(&me->disp, subsurf_subdivide_to_displist(hme, subdiv, me->flag));
- }
-}
-
-void subsurf_to_mesh(Object *oldob, Mesh *me) {
- Mesh *oldme= oldob->data;
-
- if (oldme->totface && oldme->subdiv) {
- HyperMesh *hme= hypermesh_from_mesh(oldme, NULL);
- DispList *dl= subsurf_subdivide_to_displist(hme, oldme->subdiv, oldme->flag);
- DispListMesh *dlm= dl->mesh;
- MFace *mfaces;
- int i;
-
- if (dlm->totvert>65000)
- error("Too many vertices");
- else {
- me->totface= dlm->totface;
- me->totvert= dlm->totvert;
-
- me->mvert= MEM_dupallocN(dlm->mvert);
- me->mface= mfaces= MEM_mallocN(sizeof(*mfaces)*me->totface, "me->mface");
- me->tface= MEM_dupallocN(dlm->tface);
- me->mcol= MEM_dupallocN(dlm->mcol);
+DispListMesh *subsurf_make_dispListMesh_from_editmesh(ListBase *verts, ListBase *edges, ListBase *faces, int subdivLevels, int flags) {
+ if (subdivLevels<1) {
+ return displistmesh_from_editmesh(verts, edges, faces);
+ } else {
+ HyperMesh *hme= hypermesh_from_editmesh(verts->first, edges->first, faces->first);
- for (i=0; i<me->totface; i++) {
- MFace *mf= &mfaces[i];
- MFaceInt *oldmf= &dlm->mface[i];
-
- mf->v1= oldmf->v1;
- mf->v2= oldmf->v2;
- mf->v3= oldmf->v3;
- mf->v4= oldmf->v4;
- mf->flag= oldmf->flag;
- mf->mat_nr= oldmf->mat_nr;
- mf->puno= 0;
- mf->edcode= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
- }
- }
-
- free_disp_elem(dl);
+ return subsurf_subdivide_to_displistmesh(hme, subdivLevels, flags);
}
}
+DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, float *extverts, int subdivLevels, int flags) {
+ if (subdivLevels<1) {
+ return displistmesh_from_mesh(me, extverts);
+ } else {
+ HyperMesh *hme= hypermesh_from_mesh(me, extverts);
-DispList* subsurf_mesh_to_displist(Mesh *me, DispList *dl, short subdiv)
-{
- HyperMesh *hme;
-
- hme= hypermesh_from_mesh(me, dl);
-
- return subsurf_subdivide_to_displist(hme, subdiv, me->flag);
+ return subsurf_subdivide_to_displistmesh(hme, subdivLevels, flags);
+ }
}
+ // editarmature.c
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
{
/* Finds the subsurf limit positions for the verts in a mesh
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 1935a799e4a..c76ca2fc582 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -1099,6 +1099,7 @@ static void init_render_displist_mesh(Object *ob)
{
Mesh *me;
DispList *dl;
+ DispListMesh *dlm;
VlakRen *vlr;
Material *matar[32];
VertRen *ver, *v1, *v2, *v3, *v4;
@@ -1107,6 +1108,7 @@ static void init_render_displist_mesh(Object *ob)
int a, b, flipnorm= -1, need_orco=0, startvert, p1, p2, p3, p4;
int old_totvert= R.totvert;
int old_totvlak= R.totvlak;
+ int i;
me= ob->data;
@@ -1135,187 +1137,109 @@ static void init_render_displist_mesh(Object *ob)
if((dl==0) || ((me->subdiv != me->subdivr))) {
/* prevent subsurf called again for duplicate use of mesh, tface pointers change */
- if(me->subdivdone!=me->subdivr) {
+ if((me->subdivdone-1)!=me->subdivr) {
+ DispList *dlVerts;
+
object_deform(ob);
- subsurf_make_mesh(ob, me->subdivr);
- me->subdivdone= me->subdivr;
- dl = me->disp.first;
+
+ dlVerts= find_displist(&ob->disp, DL_VERTS);
+ dlm= subsurf_make_dispListMesh_from_mesh(me, dlVerts?dlVerts->verts:NULL, me->subdivr, me->flag);
+ dl= MEM_callocN(sizeof(*dl), "dl");
+ dl->type= DL_MESH;
+ dl->mesh= dlm;
+
+ free_displist_by_type(&me->disp, DL_MESH);
+ BLI_addtail(&me->disp, dl);
+
+ me->subdivdone= me->subdivr+1; /* stupid hack, add one because otherwise old files will get
+ * subdivdone==0, so me->subdivr==0 won't work. proper caching
+ * will remove this hack.
+ */
}
}
- if(dl==0) return;
+ if(dl==0 || dl->type!=DL_MESH) return;
+ dlm= dl->mesh;
if(need_orco) {
make_orco_displist_mesh(ob, me->subdivr);
orco= me->orco;
}
- while(dl) {
- if(dl->type==DL_SURF) {
- startvert= R.totvert;
- a = dl->nr*dl->parts;
- data= dl->verts;
- nors= dl->nors;
-
- while(a--) {
- ver= RE_findOrAddVert(R.totvert++);
- VECCOPY(ver->co, data);
- if(orco) {
- ver->orco= orco;
- orco+= 3;
- }
- else {
- ver->orco= data;
- }
-
- MTC_Mat4MulVecfl(mat, ver->co);
-
- xn= nors[0];
- yn= nors[1];
- zn= nors[2];
+ startvert= R.totvert;
+
+ for (i=0; i<dlm->totvert; i++) {
+ MVert *mv= &dlm->mvert[i];
- /* transpose ! */
- ver->n[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- ver->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- ver->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
-
- Normalise(ver->n);
-
- data+= 3;
- nors+= 3;
- }
-
- for(a=0; a<dl->parts; a++) {
-
- DL_SURFINDEX(dl->flag & DL_CYCLIC_V, dl->flag & DL_CYCLIC_U, dl->nr, dl->parts);
- p1+= startvert;
- p2+= startvert;
- p3+= startvert;
- p4+= startvert;
-
- for(; b<dl->nr; b++) {
- v1= RE_findOrAddVert(p1);
- v2= RE_findOrAddVert(p2);
- v3= RE_findOrAddVert(p3);
- v4= RE_findOrAddVert(p4);
+ ver= RE_findOrAddVert(R.totvert++);
+ VECCOPY(ver->co, mv->co);
+ MTC_Mat4MulVecfl(mat, ver->co);
+
+ xn= mv->no[0];
+ yn= mv->no[1];
+ zn= mv->no[2];
- flen= CalcNormFloat4(v1->co, v3->co, v4->co, v2->co, n1);
- if(flen!=0.0) {
- vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
- vlr->v1= v1;
- vlr->v2= v3;
- vlr->v3= v4;
- vlr->v4= v2;
- VECCOPY(vlr->n, n1);
- vlr->len= flen;
- vlr->lay= ob->lay;
-
- vlr->mat= matar[ dl->col];
- vlr->ec= ME_V1V2+ME_V2V3;
- vlr->flag= ME_SMOOTH;
-
- if(flipnorm== -1) flipnorm= mesh_test_flipnorm(ob, me->mface, vlr, imat);
-
- if(flipnorm) {
- vlr->n[0]= -vlr->n[0];
- vlr->n[1]= -vlr->n[1];
- vlr->n[2]= -vlr->n[2];
- }
+ /* transpose ! */
+ ver->n[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+ ver->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+ ver->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
- /* vlr->flag |= R_NOPUNOFLIP; */
- /* vlr->puno= 15; */
- vlr->puno= 0;
- }
+ Normalise(ver->n);
+
+ if (orco)
+ ver->orco= &orco[i*3];
+ }
- p4= p3;
- p3++;
- p2= p1;
- p1++;
- }
- }
- } else if (dl->type==DL_MESH) {
- DispListMesh *dlm= dl->mesh;
- int i;
-
- startvert= R.totvert;
+ for (i=0; i<dlm->totface; i++) {
+ MFaceInt *mf= &dlm->mface[i];
+
+ if (!mf->v3)
+ continue;
- for (i=0; i<dlm->totvert; i++) {
- MVert *mv= &dlm->mvert[i];
-
- ver= RE_findOrAddVert(R.totvert++);
- VECCOPY(ver->co, mv->co);
- MTC_Mat4MulVecfl(mat, ver->co);
-
- xn= mv->no[0];
- yn= mv->no[1];
- zn= mv->no[2];
-
- /* transpose ! */
- ver->n[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- ver->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- ver->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
-
- Normalise(ver->n);
-
- if (orco)
- ver->orco= &orco[i*3];
- }
+ v1= RE_findOrAddVert(startvert+mf->v1);
+ v2= RE_findOrAddVert(startvert+mf->v2);
+ v3= RE_findOrAddVert(startvert+mf->v3);
+
+ if (mf->v4) {
+ v4= RE_findOrAddVert(startvert+mf->v4);
+ flen= CalcNormFloat4(v1->co, v2->co, v3->co, v4->co, n1);
+ } else {
+ v4= 0;
+ flen= CalcNormFloat(v1->co, v2->co, v3->co, n1);
+ }
- for (i=0; i<dlm->totface; i++) {
- MFaceInt *mf= &dlm->mface[i];
+ if(flen!=0.0) {
+ vlr= RE_findOrAddVlak(R.totvlak++);
+ vlr->ob= ob;
+ vlr->v1= v1;
+ vlr->v2= v2;
+ vlr->v3= v3;
+ vlr->v4= v4;
+
+ VECCOPY(vlr->n, n1);
+ vlr->len= flen;
+ vlr->lay= ob->lay;
- if (!mf->v3)
- continue;
-
- v1= RE_findOrAddVert(startvert+mf->v1);
- v2= RE_findOrAddVert(startvert+mf->v2);
- v3= RE_findOrAddVert(startvert+mf->v3);
-
- if (mf->v4) {
- v4= RE_findOrAddVert(startvert+mf->v4);
- flen= CalcNormFloat4(v1->co, v2->co, v3->co, v4->co, n1);
- } else {
- v4= 0;
- flen= CalcNormFloat(v1->co, v2->co, v3->co, n1);
- }
-
- if(flen!=0.0) {
- vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
- vlr->v1= v1;
- vlr->v2= v2;
- vlr->v3= v3;
- vlr->v4= v4;
-
- VECCOPY(vlr->n, n1);
- vlr->len= flen;
- vlr->lay= ob->lay;
-
- vlr->mat= matar[mf->mat_nr];
- vlr->flag= mf->flag;
- if(dlm->flag & ME_OPT_EDGES) vlr->ec= mf->edcode;
- else vlr->ec= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
- vlr->puno= mf->puno;
-
- if(flipnorm== -1) flipnorm= test_flipnorm(v1->co, v2->co, v3->co, vlr, imat);
+ vlr->mat= matar[mf->mat_nr];
+ vlr->flag= mf->flag;
+ if(dlm->flag & ME_OPT_EDGES) vlr->ec= mf->edcode;
+ else vlr->ec= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
+ vlr->puno= mf->puno;
+
+ if(flipnorm== -1) flipnorm= test_flipnorm(v1->co, v2->co, v3->co, vlr, imat);
- if(flipnorm) {
- vlr->n[0]= -vlr->n[0];
- vlr->n[1]= -vlr->n[1];
- vlr->n[2]= -vlr->n[2];
- }
-
- if (dlm->tface) {
- vlr->tface= &dlm->tface[i];
- vlr->vcol= vlr->tface->col;
- } else if (dlm->mcol)
- vlr->vcol= (unsigned int *) &dlm->mcol[i*4];
- }
+ if(flipnorm) {
+ vlr->n[0]= -vlr->n[0];
+ vlr->n[1]= -vlr->n[1];
+ vlr->n[2]= -vlr->n[2];
}
+
+ if (dlm->tface) {
+ vlr->tface= &dlm->tface[i];
+ vlr->vcol= vlr->tface->col;
+ } else if (dlm->mcol)
+ vlr->vcol= (unsigned int *) &dlm->mcol[i*4];
}
-
- dl= dl->next;
}
}
@@ -1515,7 +1439,7 @@ static void init_render_mesh(Object *ob)
int start, end, flipnorm, do_autosmooth=0;
me= ob->data;
- if (rendermesh_uses_displist(me) && me->subdivr>0) {
+ if (rendermesh_uses_displist(me)) {
init_render_displist_mesh(ob);
return;
}
@@ -2817,7 +2741,7 @@ void RE_freeRotateBlenderScene(void)
me->orco= 0;
}
if (rendermesh_uses_displist(me) && (me->subdiv!=me->subdivr)) {
- makeDispList(ob);
+ makeDispList(ob); /* XXX this should be replaced with proper caching */
me->subdivdone= 0; /* needed to prevent multiple used meshes being recalculated */
}
}
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 398ae297a4a..65435e68b6c 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -1701,6 +1701,8 @@ void convertmenu(void)
error("No subdivision Mesh to convert available");
}
else if (oldme->flag&ME_SUBSURF) {
+ DispListMesh *dlm;
+
ob->flag |= OB_DONE;
ob1= copy_object(ob);
@@ -1725,8 +1727,10 @@ void convertmenu(void)
for(a=0; a<ob1->totcol; a++) id_us_plus((ID *)me->mat[a]);
}
- subsurf_to_mesh(ob, ob1->data);
-
+ dlm= subsurf_make_dispListMesh_from_mesh(oldme, NULL, oldme->subdiv, oldme->flag);
+ displistmesh_to_mesh(dlm, ob1->data);
+ displistmesh_free(dlm);
+
tex_space_mesh(me);
}
}