- work-in-progress: subsurf level 0 now just acts like a regular mesh,

before it would follow subsurf code path by creating fake displistmesh,
   etc... kinda fun for testing but just annoying now.
 - change to creasing behavior, to make sure that with full creasing effect
   is just simple subdivision.
This commit is contained in:
2005-04-04 03:38:21 +00:00
parent 5c85bb9cd2
commit 0b02d592b8
8 changed files with 28 additions and 58 deletions

View File

@@ -39,9 +39,6 @@ struct EditMesh;
struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, short type, struct DerivedMesh *oldDerived); struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, short type, struct DerivedMesh *oldDerived);
struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels); struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels);
struct DerivedMesh *subsurf_ccg_make_derived_from_editmesh(struct EditMesh *em, int useFlatSubdiv, int subdivLevels, struct DerivedMesh *oldDerived);
struct DerivedMesh *subsurf_ccg_make_derived_from_mesh(struct Mesh *me, int useFlatSubdiv, int subdivLevels);
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]); void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
#endif #endif

View File

@@ -1131,7 +1131,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
CCGVert *v = effectedV[ptrIdx]; CCGVert *v = effectedV[ptrIdx];
void *co = VERT_getCo(v, curLvl); void *co = VERT_getCo(v, curLvl);
void *nCo = VERT_getCo(v, nextLvl); void *nCo = VERT_getCo(v, nextLvl);
int sharpCount = 0; int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0; float avgSharpness = 0.0;
for (i=0; i<v->numEdges; i++) { for (i=0; i<v->numEdges; i++) {
@@ -1141,6 +1141,8 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
if (sharpness!=0.0f) { if (sharpness!=0.0f) {
sharpCount++; sharpCount++;
avgSharpness += sharpness; avgSharpness += sharpness;
} else {
allSharp = 0;
} }
} }
@@ -1206,7 +1208,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount); ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount);
if (sharpCount!=2) { if (sharpCount!=2 || allSharp) {
// q = q + (co-q)*avgSharpness // q = q + (co-q)*avgSharpness
ss->meshIFC.vertDataCopy(ss->meshData, r, co); ss->meshIFC.vertDataCopy(ss->meshData, r, co);
ss->meshIFC.vertDataSub(ss->meshData, r, q); ss->meshIFC.vertDataSub(ss->meshData, r, q);
@@ -1409,7 +1411,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
CCGVert *v = (CCGVert*) effectedV[ptrIdx]; CCGVert *v = (CCGVert*) effectedV[ptrIdx];
void *co = VERT_getCo(v, curLvl); void *co = VERT_getCo(v, curLvl);
void *nCo = VERT_getCo(v, nextLvl); void *nCo = VERT_getCo(v, nextLvl);
int sharpCount = 0; int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0; float avgSharpness = 0.0;
for (i=0; i<v->numEdges; i++) { for (i=0; i<v->numEdges; i++) {
@@ -1419,6 +1421,8 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
if (sharpness!=0.0f) { if (sharpness!=0.0f) {
sharpCount++; sharpCount++;
avgSharpness += sharpness; avgSharpness += sharpness;
} else {
allSharp = 0;
} }
} }
@@ -1485,7 +1489,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount); ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount);
if (sharpCount!=2) { if (sharpCount!=2 || allSharp) {
// q = q + (co-q)*avgSharpness // q = q + (co-q)*avgSharpness
ss->meshIFC.vertDataCopy(ss->meshData, r, co); ss->meshIFC.vertDataCopy(ss->meshData, r, co);
ss->meshIFC.vertDataSub(ss->meshData, r, q); ss->meshIFC.vertDataSub(ss->meshData, r, q);

View File

@@ -969,7 +969,7 @@ static void build_mesh_data(Object *ob, int inEditMode)
if(eff->type==EFF_WAVE) makeDispList(ob); if(eff->type==EFF_WAVE) makeDispList(ob);
} }
} }
if(mesh_uses_displist(me)) { if(me->flag&ME_SUBSURF) {
if(inEditMode && !G.editMesh->derived) { if(inEditMode && !G.editMesh->derived) {
makeDispList(ob); makeDispList(ob);
} else if (!inEditMode && !me->derived) { } else if (!inEditMode && !me->derived) {
@@ -986,8 +986,7 @@ DerivedMesh *mesh_get_derived(Object *ob)
{ {
Mesh *me= ob->data; Mesh *me= ob->data;
if (mesh_uses_displist(me)) { if ((me->flag&ME_SUBSURF) && me->subdiv) {
if(G.obedit && me==G.obedit->data) { if(G.obedit && me==G.obedit->data) {
build_mesh_data(ob, 1); build_mesh_data(ob, 1);
return G.editMesh->derived; return G.editMesh->derived;
@@ -1004,8 +1003,7 @@ DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree)
{ {
Mesh *me= ob->data; Mesh *me= ob->data;
if (mesh_uses_displist(me)) { if ((me->flag&ME_SUBSURF) && me->subdivr) {
// XXX, assumes was created earlier... is this for sure?
if (me->subdiv==me->subdivr) { if (me->subdiv==me->subdivr) {
*needsFree = 0; *needsFree = 0;
if(G.obedit && me==G.obedit->data) { if(G.obedit && me==G.obedit->data) {
@@ -1013,13 +1011,13 @@ DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree)
} else { } else {
return me->derived; return me->derived;
} }
}
*needsFree = 1;
if(G.obedit && me==G.obedit->data) {
return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->subsurftype, NULL);
} else { } else {
*needsFree = 1; return subsurf_make_derived_from_mesh(me, me->subdivr);
if(G.obedit && me==G.obedit->data) {
return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->subsurftype, NULL);
} else {
return subsurf_make_derived_from_mesh(me, me->subdivr);
}
} }
} }

View File

@@ -1203,7 +1203,7 @@ void mcol_to_tface(Mesh *me, int freedata)
} }
int mesh_uses_displist(Mesh *me) { int mesh_uses_displist(Mesh *me) {
return (me->flag&ME_SUBSURF); return (me->flag&ME_SUBSURF) && me->subdiv;
} }
void mesh_calculate_vertex_normals(Mesh *me) void mesh_calculate_vertex_normals(Mesh *me)

View File

@@ -1082,37 +1082,6 @@ static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short sub
return dlm; return dlm;
} }
DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, short type, DerivedMesh *oldDerived) {
if (subdivLevels<1) {
if (oldDerived) {
oldDerived->release(oldDerived);
}
return derivedmesh_from_displistmesh(em, displistmesh_from_editmesh(em));
} else if (type==ME_CCG_SUBSURF || type==ME_SIMPLE_SUBSURF) {
return subsurf_ccg_make_derived_from_editmesh(em, type==ME_SIMPLE_SUBSURF, subdivLevels, oldDerived);
} else {
HyperMesh *hme= hypermesh_from_editmesh(em, subdivLevels);
if (oldDerived) {
oldDerived->release(oldDerived);
}
return derivedmesh_from_displistmesh(em, subsurf_subdivide_to_displistmesh(hme, subdivLevels, type));
}
}
DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels) {
if (subdivLevels<1) {
return derivedmesh_from_displistmesh(NULL, displistmesh_from_mesh(me, NULL));
} else if (me->subsurftype==ME_CCG_SUBSURF || me->subsurftype==ME_SIMPLE_SUBSURF) {
return subsurf_ccg_make_derived_from_mesh(me, me->subsurftype==ME_SIMPLE_SUBSURF, subdivLevels);
} else {
HyperMesh *hme= hypermesh_from_mesh(me, subdivLevels);
return derivedmesh_from_displistmesh(NULL, subsurf_subdivide_to_displistmesh(hme, subdivLevels, me->subsurftype));
}
}
// editarmature.c // editarmature.c
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
{ {

View File

@@ -988,7 +988,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(SubSurf *ss) {
/***/ /***/
DerivedMesh *subsurf_ccg_make_derived_from_editmesh(EditMesh *em, int useFlatSubdiv, int subdivLevels, DerivedMesh *oldDerived) { DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, short type, DerivedMesh *oldDerived) {
CCGDerivedMesh *ccgdm; CCGDerivedMesh *ccgdm;
if (oldDerived) { if (oldDerived) {
@@ -998,12 +998,13 @@ DerivedMesh *subsurf_ccg_make_derived_from_editmesh(EditMesh *em, int useFlatSub
ccgdm = getCCGDerivedMesh(ss); ccgdm = getCCGDerivedMesh(ss);
} }
subSurf_sync(ccgdm->ss, useFlatSubdiv); subSurf_sync(ccgdm->ss, type==ME_SIMPLE_SUBSURF);
return (DerivedMesh*) ccgdm; return (DerivedMesh*) ccgdm;
} }
DerivedMesh *subsurf_ccg_make_derived_from_mesh(Mesh *me, int useFlatSubdiv, int subdivLevels) { DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels) {
int useFlatSubdiv = me->subsurftype==ME_SIMPLE_SUBSURF;
SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels); SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels);
DispListMesh *dlm; DispListMesh *dlm;
@@ -1015,3 +1016,4 @@ DerivedMesh *subsurf_ccg_make_derived_from_mesh(Mesh *me, int useFlatSubdiv, int
return derivedmesh_from_displistmesh(NULL, dlm); return derivedmesh_from_displistmesh(NULL, dlm);
} }

View File

@@ -2164,7 +2164,7 @@ static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args )
Mesh *me = ( Mesh * ) ob->data; Mesh *me = ( Mesh * ) ob->data;
DispList *dl; DispList *dl;
if( mesh_uses_displist( me ) ) { if( mesh_uses_displist( me )) {
DerivedMesh *dm = mesh_get_derived(ob); DerivedMesh *dm = mesh_get_derived(ob);
DispListMesh *dlm = dm->convertToDispListMesh(dm); DispListMesh *dlm = dm->convertToDispListMesh(dm);
nmesh = new_NMesh_internal( me, dlm, NULL ); nmesh = new_NMesh_internal( me, dlm, NULL );

View File

@@ -1344,7 +1344,7 @@ static void init_render_mesh(Object *ob)
/* we do this before deform */ /* we do this before deform */
if(need_orco) { if(need_orco) {
if (mesh_uses_displist(me)) if ((me->flag&ME_SUBSURF) && me->subdivr)
make_orco_displist_mesh(ob, me->subdivr); make_orco_displist_mesh(ob, me->subdivr);
else else
make_orco_mesh(me); make_orco_mesh(me);
@@ -1353,7 +1353,7 @@ static void init_render_mesh(Object *ob)
/* after orco, because this changes mesh vertices (too) */ /* after orco, because this changes mesh vertices (too) */
do_puno= mesh_modifier(ob, 's'); do_puno= mesh_modifier(ob, 's');
if (mesh_uses_displist(me)) { if ((me->flag&ME_SUBSURF) && me->subdivr) {
int needsFree; int needsFree;
DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree); DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
dlm = dm->convertToDispListMesh(dm); dlm = dm->convertToDispListMesh(dm);
@@ -2734,7 +2734,7 @@ void RE_freeRotateBlenderScene(void)
MEM_freeN(me->orco); MEM_freeN(me->orco);
me->orco= 0; me->orco= 0;
} }
if (mesh_uses_displist(me) && ((me->subdiv!=me->subdivr) || (ob->effect.first != NULL) || ob==G.obedit) ) { if ((me->flag&ME_SUBSURF) && ((me->subdiv!=me->subdivr) || (ob->effect.first != NULL) || ob==G.obedit) ) {
/* Need to recalc for effects since they are time dependant */ /* Need to recalc for effects since they are time dependant */
makeDispList(ob); /* XXX this should be replaced with proper caching */ makeDispList(ob); /* XXX this should be replaced with proper caching */
} }
@@ -2956,7 +2956,7 @@ void RE_rotateBlenderScene(void)
else if(ob->parent && ob->parent->type==OB_LATTICE) makeDispList(ob); else if(ob->parent && ob->parent->type==OB_LATTICE) makeDispList(ob);
else if(ob->hooks.first) makeDispList(ob); else if(ob->hooks.first) makeDispList(ob);
else if(ob->softflag & 0x01) makeDispList(ob); else if(ob->softflag & 0x01) makeDispList(ob);
else if(me->disp.first==NULL && mesh_uses_displist(me)) makeDispList(ob); else if(me->disp.first==NULL && (me->flag&ME_SUBSURF)) makeDispList(ob);
else if(ob->effect.first) { // as last check else if(ob->effect.first) { // as last check
Effect *eff= ob->effect.first; Effect *eff= ob->effect.first;
if(eff->type==EFF_WAVE) makeDispList(ob); if(eff->type==EFF_WAVE) makeDispList(ob);