From ecd620a5aad00c21a67301c5a029785bf6667e3a Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 7 Jan 2004 10:17:37 +0000 Subject: - 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). --- source/blender/blenkernel/BKE_displist.h | 7 + source/blender/blenkernel/BKE_subsurf.h | 9 +- source/blender/blenkernel/intern/displist.c | 148 +++++++++++- source/blender/blenkernel/intern/mesh.c | 15 +- source/blender/blenkernel/intern/subsurf.c | 100 ++------- .../renderconverter/intern/convertBlenderScene.c | 250 +++++++-------------- source/blender/src/editobject.c | 8 +- 7 files changed, 274 insertions(+), 263 deletions(-) (limited to 'source') 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; itotvert; i++) { + VECCOPY(dlm->mvert[i].co, &extverts[i*3]); + } + } + for (i=0; itotface; 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; itotface; 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; itotvert; 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; itotvert; 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; idata; - 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; itotface; 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; itotvert; 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; aparts; 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(; bnr; 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; itotface; i++) { + MFaceInt *mf= &dlm->mface[i]; + + if (!mf->v3) + continue; - for (i=0; itotvert; 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; itotface; 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; atotcol; 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); } } -- cgit v1.2.3