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_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]);
#endif
CCGVert *v = effectedV[ptrIdx];
void *co = VERT_getCo(v, curLvl);
void *nCo = VERT_getCo(v, nextLvl);
- int sharpCount = 0;
+ int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0;
for (i=0; i<v->numEdges; i++) {
if (sharpness!=0.0f) {
sharpCount++;
avgSharpness += sharpness;
+ } else {
+ allSharp = 0;
}
}
ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount);
- if (sharpCount!=2) {
+ if (sharpCount!=2 || allSharp) {
// q = q + (co-q)*avgSharpness
ss->meshIFC.vertDataCopy(ss->meshData, r, co);
ss->meshIFC.vertDataSub(ss->meshData, r, q);
CCGVert *v = (CCGVert*) effectedV[ptrIdx];
void *co = VERT_getCo(v, curLvl);
void *nCo = VERT_getCo(v, nextLvl);
- int sharpCount = 0;
+ int sharpCount = 0, allSharp = 1;
float avgSharpness = 0.0;
for (i=0; i<v->numEdges; i++) {
if (sharpness!=0.0f) {
sharpCount++;
avgSharpness += sharpness;
+ } else {
+ allSharp = 0;
}
}
ss->meshIFC.vertDataMulN(ss->meshData, q, (float) 1/sharpCount);
- if (sharpCount!=2) {
+ if (sharpCount!=2 || allSharp) {
// q = q + (co-q)*avgSharpness
ss->meshIFC.vertDataCopy(ss->meshData, r, co);
ss->meshIFC.vertDataSub(ss->meshData, r, q);
if(eff->type==EFF_WAVE) makeDispList(ob);
}
}
- if(mesh_uses_displist(me)) {
+ if(me->flag&ME_SUBSURF) {
if(inEditMode && !G.editMesh->derived) {
makeDispList(ob);
} else if (!inEditMode && !me->derived) {
{
Mesh *me= ob->data;
- if (mesh_uses_displist(me)) {
-
+ if ((me->flag&ME_SUBSURF) && me->subdiv) {
if(G.obedit && me==G.obedit->data) {
build_mesh_data(ob, 1);
return G.editMesh->derived;
{
Mesh *me= ob->data;
- if (mesh_uses_displist(me)) {
- // XXX, assumes was created earlier... is this for sure?
+ if ((me->flag&ME_SUBSURF) && me->subdivr) {
if (me->subdiv==me->subdivr) {
*needsFree = 0;
if(G.obedit && me==G.obedit->data) {
} else {
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 {
- *needsFree = 1;
- 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);
- }
+ return subsurf_make_derived_from_mesh(me, me->subdivr);
}
}
}
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)
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
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
{
/***/
-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;
if (oldDerived) {
ccgdm = getCCGDerivedMesh(ss);
}
- subSurf_sync(ccgdm->ss, useFlatSubdiv);
+ subSurf_sync(ccgdm->ss, type==ME_SIMPLE_SUBSURF);
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);
DispListMesh *dlm;
return derivedmesh_from_displistmesh(NULL, dlm);
}
+
Mesh *me = ( Mesh * ) ob->data;
DispList *dl;
- if( mesh_uses_displist( me ) ) {
+ if( mesh_uses_displist( me )) {
DerivedMesh *dm = mesh_get_derived(ob);
DispListMesh *dlm = dm->convertToDispListMesh(dm);
nmesh = new_NMesh_internal( me, dlm, NULL );
/* we do this before deform */
if(need_orco) {
- if (mesh_uses_displist(me))
+ if ((me->flag&ME_SUBSURF) && me->subdivr)
make_orco_displist_mesh(ob, me->subdivr);
else
make_orco_mesh(me);
/* after orco, because this changes mesh vertices (too) */
do_puno= mesh_modifier(ob, 's');
- if (mesh_uses_displist(me)) {
+ if ((me->flag&ME_SUBSURF) && me->subdivr) {
int needsFree;
DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
dlm = dm->convertToDispListMesh(dm);
MEM_freeN(me->orco);
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 */
makeDispList(ob); /* XXX this should be replaced with proper caching */
}
else if(ob->parent && ob->parent->type==OB_LATTICE) makeDispList(ob);
else if(ob->hooks.first) 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
Effect *eff= ob->effect.first;
if(eff->type==EFF_WAVE) makeDispList(ob);