diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 34 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_subsurf.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 135 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 136 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 451 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_editVert.h | 5 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 69 | ||||
-rw-r--r-- | source/blender/include/butspace.h | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 4 | ||||
-rw-r--r-- | source/blender/src/butspace.c | 5 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 7 | ||||
-rw-r--r-- | source/blender/src/buttons_object.c | 49 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 28 | ||||
-rw-r--r-- | source/blender/src/edit.c | 13 | ||||
-rw-r--r-- | source/blender/src/editmesh.c | 20 |
19 files changed, 544 insertions, 450 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 406060dfb53..da7c053bb9c 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -156,9 +156,8 @@ DerivedMesh *mesh_create_derived_render(struct Object *ob); DerivedMesh *mesh_create_derived_no_deform(struct Object *ob, float (*vertCos)[3]); DerivedMesh *mesh_create_derived_no_deform_render(struct Object *ob, float (*vertCos)[3]); -DerivedMesh *editmesh_get_derived(void); -DerivedMesh *editmesh_get_derived_proxy(void); DerivedMesh *editmesh_get_derived_cage(int *needsFree_r); +DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cageNeedsFree_r, int *finalNeedsFree_r); #endif diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index b0736a1ab72..a09ee20b385 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -61,15 +61,33 @@ typedef enum { } ModifierTypeFlag; typedef struct ModifierTypeInfo { - char name[32], structName[32]; + /* The user visible name for this modifier */ + char name[32]; + + /* The DNA struct name for the modifier data type, used to + * write the DNA data out. + */ + char structName[32]; + + /* The size of the modifier data type, used by allocation. */ + int structSize; + ModifierTypeType type; ModifierTypeFlag flags; - /* Create new instance data for this modifier type. + /* Initialize new instance data for this modifier type, this function + * should set modifier variables to their default values. * - * This function must be present. + * This function is optional. */ - struct ModifierData *(*allocData)(void); + void (*initData)(struct ModifierData *md); + + /* Free internal modifier data variables, this function should + * not free the _md_ variable itself. + * + * This function is optional. + */ + void (*freeData)(struct ModifierData *md); /* Return a boolean value indicating if this modifier is able to be calculated * based on the modifier data. This is *not* regarding the md->flag, that is @@ -120,7 +138,13 @@ typedef struct ModifierTypeInfo { ModifierTypeInfo *modifierType_get_info(ModifierType type); -int modifier_dependsOnTime(struct ModifierData *md); + /* Modifier utility calls, do call through type pointer and return + * default values if pointer is optional. + */ +struct ModifierData* modifier_new (int type); +void modifier_free (struct ModifierData *md); + +int modifier_dependsOnTime (struct ModifierData *md); #endif diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 5443ab72760..a5200276159 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -35,10 +35,10 @@ struct Mesh; struct Object; struct DerivedMesh; struct EditMesh; +struct SubsurfModifierData; -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 subdivType, int subdivLevels, float (*vertCos)[3]); -struct DerivedMesh *subsurf_make_derived_from_dlm(struct DispListMesh *dlm, int subdivType, int subdivLevels); +struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, struct SubsurfModifierData *smd); +struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, struct DispListMesh *dlm, struct SubsurfModifierData *smd, int useRenderParams, float (*vertCos)[3]); void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]); diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index bd935505ea9..6bfc431a209 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -289,8 +289,7 @@ struct _CCGSubSurf { EHash *fMap; /* map of CCGFaceHDL -> Face */ CCGMeshIFC meshIFC; - void *meshData; - + CCGAllocatorIFC allocatorIFC; CCGAllocatorHDL allocator; @@ -611,7 +610,7 @@ static void _face_unlinkMarkAndFree(CCGFace *f, CCGSubSurf *ss) { /***/ -CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, CCGMeshHDL meshData, int subdivLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator) { +CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator) { if (!allocatorIFC) { allocatorIFC = _getStandardAllocatorIFC(); allocator = NULL; @@ -630,8 +629,7 @@ CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, CCGMeshHDL meshData, int subdivLevel ss->fMap = _ehash_new(0, &ss->allocatorIFC, ss->allocator); ss->meshIFC = *ifc; - ss->meshData = meshData; - + ss->subdivLevels = subdivLevels; ss->numGrids = 0; ss->allowEdgeCreation = 0; @@ -710,6 +708,15 @@ CCGError ccgSubSurf_setSubdivisionLevels(CCGSubSurf *ss, int subdivisionLevels) return eCCGError_None; } +void ccgSubSurf_getUseAgeCounts(CCGSubSurf *ss, int *useAgeCounts_r, int *vertUserOffset_r, int *edgeUserOffset_r, int *faceUserOffset_r) +{ + *useAgeCounts_r = ss->useAgeCounts; + + if (vertUserOffset_r) *vertUserOffset_r = ss->vertUserAgeOffset; + if (edgeUserOffset_r) *edgeUserOffset_r = ss->edgeUserAgeOffset; + if (faceUserOffset_r) *faceUserOffset_r = ss->faceUserAgeOffset; +} + CCGError ccgSubSurf_setUseAgeCounts(CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset) { if (useAgeCounts) { if ( (vertUserOffset+4>ss->meshIFC.vertUserSize) || diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h index 4f0594a28eb..4c522b1a827 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.h +++ b/source/blender/blenkernel/intern/CCGSubSurf.h @@ -37,7 +37,7 @@ typedef enum { typedef struct _CCGSubSurf CCGSubSurf; -CCGSubSurf* ccgSubSurf_new (CCGMeshIFC *ifc, CCGMeshHDL meshData, int subdivisionLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator); +CCGSubSurf* ccgSubSurf_new (CCGMeshIFC *ifc, int subdivisionLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator); void ccgSubSurf_free (CCGSubSurf *ss); CCGError ccgSubSurf_sync (CCGSubSurf *ss); @@ -56,7 +56,9 @@ CCGError ccgSubSurf_syncFaceDel (CCGSubSurf *ss, CCGFaceHDL fHDL); CCGError ccgSubSurf_processSync (CCGSubSurf *ss); CCGError ccgSubSurf_setSubdivisionLevels (CCGSubSurf *ss, int subdivisionLevels); + CCGError ccgSubSurf_setAllowEdgeCreation (CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue); +void ccgSubSurf_getUseAgeCounts (CCGSubSurf *ss, int *useAgeCounts_r, int *vertUserOffset_r, int *edgeUserOffset_r, int *faceUserOffset_r); CCGError ccgSubSurf_setUseAgeCounts (CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset); CCGError ccgSubSurf_setCalcVertexNormals (CCGSubSurf *ss, int useVertNormals, int normalDataOffset); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index f54b152578a..399f2afb6d4 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1005,11 +1005,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM if (deform_r) *deform_r = NULL; *final_r = NULL; - /* Note: useDeform==1 implies ob must be non-NULL */ - if (useDeform) { mesh_modifier(ob, &deformedVerts); + // XXX this copy should be done on demand if (!deformedVerts) { deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*numVerts, "vertexcos1"); for (a=0; a<numVerts; a++) { @@ -1092,29 +1091,6 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM } } - /* Fake the subsurf modifier */ - { - int level = useRenderParams?me->subdivr:me->subdiv; - - if ((me->flag&ME_SUBSURF) && level) { - ModifierTypeInfo *mti = modifierType_get_info(eModifierType_Subsurf); - SubsurfModifierData smd; - - smd.levels = me->subdiv; - smd.renderLevels = me->subdivr; - smd.subdivType = me->subsurftype; - - dm = mti->applyModifier(&smd.modifier, ob, dm, deformedVerts, useRenderParams); - - if (deformedVerts) { - if (deformedVerts!=inputVertexCos) { - MEM_freeN(deformedVerts); - } - deformedVerts = 0; - } - } - } - /* Yay, we are done. If we have a DerivedMesh and deformed vertices need to apply * these back onto the DerivedMesh. If we have no DerivedMesh then we need to build * one. @@ -1152,13 +1128,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM /***/ -static void clear_and_build_mesh_data(Object *ob, int mustBuildForMesh) +static void clear_mesh_caches(Object *ob) { - float min[3], max[3]; Mesh *me= ob->data; - if(ob->flag&OB_FROMDUPLI) return; - /* also serves as signal to remake texspace */ if (me->bb) { MEM_freeN(me->bb); @@ -1175,27 +1148,70 @@ static void clear_and_build_mesh_data(Object *ob, int mustBuildForMesh) ob->derivedDeform->release(ob->derivedDeform); ob->derivedDeform= NULL; } +} - if (ob==G.obedit) { - G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); - } - - if (ob!=G.obedit || mustBuildForMesh) { - mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1); +static void mesh_build_data(Object *ob) +{ + float min[3], max[3]; + Mesh *me= ob->data; + + if(ob->flag&OB_FROMDUPLI) return; + + clear_mesh_caches(ob); + + mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1); - INIT_MINMAX(min, max); + INIT_MINMAX(min, max); - ob->derivedFinal->getMinMax(ob->derivedFinal, min, max); + ob->derivedFinal->getMinMax(ob->derivedFinal, min, max); - boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max); + boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max); - build_particle_system(ob); + build_particle_system(ob); +} + +static void editmesh_build_data(void) +{ + Mesh *me = G.obedit->data; + EditMesh *em = G.editMesh; + + clear_mesh_caches(G.obedit); + + if (em->derivedFinal) { + if (em->derivedFinal!=em->derivedCage) { + em->derivedFinal->release(em->derivedFinal); + } + em->derivedFinal = NULL; + } + if (em->derivedCage) { + em->derivedCage->release(em->derivedCage); + em->derivedCage = NULL; + } + +/* + if ((me->flag&ME_SUBSURF) && me->subdiv) { + em->derivedFinal = subsurf_make_derived_from_editmesh(em, me->subdiv, me->subsurftype, NULL); + + if (me->flag&ME_OPT_EDGES) { + em->derivedCage = em->derivedFinal; + } else { + em->derivedCage = getEditMeshDerivedMesh(em); + } + } else { +*/ + em->derivedFinal = em->derivedCage = getEditMeshDerivedMesh(em); +/* } +*/ } void makeDispListMesh(Object *ob) { - clear_and_build_mesh_data(ob, 0); + if (ob==G.obedit) { + editmesh_build_data(); + } else { + mesh_build_data(ob); + } } /***/ @@ -1205,7 +1221,7 @@ DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r) Mesh *me = ob->data; if (!ob->derivedFinal) { - clear_and_build_mesh_data(ob, 1); + mesh_build_data(ob); } *needsFree_r = 0; @@ -1215,7 +1231,7 @@ DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r) DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r) { if (!ob->derivedDeform) { - clear_and_build_mesh_data(ob, 1); + mesh_build_data(ob); } *needsFree_r = 0; @@ -1251,40 +1267,23 @@ DerivedMesh *mesh_create_derived_no_deform_render(Object *ob, float (*vertCos)[3 /***/ -DerivedMesh *editmesh_get_derived_proxy(void) +DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cageNeedsFree_r, int *finalNeedsFree_r) { - return getEditMeshDerivedMesh(G.editMesh); -} + *cageNeedsFree_r = *finalNeedsFree_r = 0; -DerivedMesh *editmesh_get_derived(void) -{ - Mesh *me= G.obedit->data; + if (!G.editMesh->derivedCage) + editmesh_build_data(); - if ((me->flag&ME_SUBSURF) && me->subdiv) { - if (!G.editMesh->derived) { - makeDispListMesh(G.obedit); - } - - return G.editMesh->derived; - } - - return NULL; + *final_r = G.editMesh->derivedFinal; + return G.editMesh->derivedCage; } DerivedMesh *editmesh_get_derived_cage(int *needsFree_r) { - Mesh *me= G.obedit->data; - DerivedMesh *dm = NULL; - *needsFree_r = 0; - if (me->flag&ME_OPT_EDGES) { - dm = editmesh_get_derived(); - } - if (!dm) { - *needsFree_r = 1; - dm = editmesh_get_derived_proxy(); - } + if (!G.editMesh->derivedCage) + editmesh_build_data(); - return dm; + return G.editMesh->derivedCage; } diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 709d6f0cd40..044c79711f8 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -21,21 +21,9 @@ #include "BKE_mesh.h" #include "depsgraph_private.h" -/***/ +#include "CCGSubSurf.h" -static void *allocModifierData(int type, int size) -{ - ModifierData *md = MEM_callocN(size, "md"); - md->type = type; - md->mode = eModifierMode_RealtimeAndRender; - - return md; -} - -static ModifierData *noneModifier_allocData(void) -{ - return allocModifierData(eModifierType_None, sizeof(ModifierData)); -} +/***/ static int noneModifier_isDisabled(ModifierData *md) { @@ -44,11 +32,6 @@ static int noneModifier_isDisabled(ModifierData *md) /* Curve */ -static ModifierData *curveModifier_allocData(void) -{ - return allocModifierData(eModifierType_Curve, sizeof(CurveModifierData)); -} - static int curveModifier_isDisabled(ModifierData *md) { CurveModifierData *cmd = (CurveModifierData*) md; @@ -76,11 +59,6 @@ static void curveModifier_deformVerts(ModifierData *md, Object *ob, float (*vert /* Lattice */ -static ModifierData *latticeModifier_allocData(void) -{ - return allocModifierData(eModifierType_Lattice, sizeof(LatticeModifierData)); -} - static int latticeModifier_isDisabled(ModifierData *md) { LatticeModifierData *lmd = (LatticeModifierData*) md; @@ -108,20 +86,26 @@ static void latticeModifier_deformVerts(ModifierData *md, Object *ob, float (*ve /* Subsurf */ -static ModifierData *subsurfModifier_allocData(void) +static void subsurfModifier_initData(ModifierData *md) { - SubsurfModifierData *smd = allocModifierData(eModifierType_Subsurf, sizeof(SubsurfModifierData)); - + SubsurfModifierData *smd = (SubsurfModifierData*) md; + smd->levels = 1; smd->renderLevels = 2; - - return (ModifierData*) smd; } +static void subsurfModifier_freeData(ModifierData *md) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + + if (smd->mCache) { + ccgSubSurf_free(smd->mCache); + } +} + static void *subsurfModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int useRenderParams) { SubsurfModifierData *smd = (SubsurfModifierData*) md; - int levels = useRenderParams?smd->renderLevels:smd->levels; Mesh *me = ob->data; if (dm) { @@ -137,25 +121,23 @@ static void *subsurfModifier_applyModifier(ModifierData *md, Object *ob, Derived } dm->release(dm); - dm = subsurf_make_derived_from_dlm(dlm, smd->subdivType, levels); + dm = subsurf_make_derived_from_mesh(me, dlm, smd, useRenderParams, NULL); displistmesh_free(dlm); return dm; } else { - return subsurf_make_derived_from_mesh(me, smd->subdivType, levels, vertexCos); + return subsurf_make_derived_from_mesh(me, NULL, smd, useRenderParams, vertexCos); } } /* Build */ -static ModifierData *buildModifier_allocData(void) +static void buildModifier_initData(ModifierData *md) { - BuildModifierData *bmd = allocModifierData(eModifierType_Build, sizeof(BuildModifierData)); + BuildModifierData *bmd = (BuildModifierData*) md; bmd->start = 1.0; bmd->length = 100.0; - - return (ModifierData*) bmd; } static int buildModifier_dependsOnTime(ModifierData *md) @@ -354,8 +336,14 @@ static void *buildModifier_applyModifier(ModifierData *md, Object *ob, DerivedMe } else { ndlm->totvert = totvert*frac; - ndlm->mvert = MEM_mallocN(sizeof(*ndlm->mvert)*ndlm->totvert, "build_mvert"); - memcpy(ndlm->mvert, mvert, sizeof(*mvert)*ndlm->totvert); + if (bmd->randomize) { + ndlm->mvert = MEM_dupallocN(mvert); + BLI_array_randomize(ndlm->mvert, sizeof(*mvert), totvert, bmd->seed); + } else { + ndlm->mvert = MEM_mallocN(sizeof(*ndlm->mvert)*ndlm->totvert, "build_mvert"); + memcpy(ndlm->mvert, mvert, sizeof(*mvert)*ndlm->totvert); + } + if (vertexCos) { for (i=0; i<ndlm->totvert; i++) { VECCOPY(ndlm->mvert[i].co, vertexCos[i]); @@ -373,14 +361,11 @@ static void *buildModifier_applyModifier(ModifierData *md, Object *ob, DerivedMe /* Mirror */ -static ModifierData *mirrorModifier_allocData(void) +static void mirrorModifier_initData(ModifierData *md) { - MirrorModifierData *mmd = allocModifierData(eModifierType_Mirror, sizeof(MirrorModifierData)); + MirrorModifierData *mmd = (MirrorModifierData*) md; - mmd->axis = 0; mmd->tolerance = 0.001; - - return (ModifierData*) mmd; } static void *mirrorModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int useRenderParams) @@ -602,60 +587,61 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type) memset(typeArr, 0, sizeof(typeArr)); + /* Initialize and return the appropriate type info structure, + * assumes that modifier has: + * name == typeName, + * structName == typeName + 'ModifierData' + */ +#define INIT_TYPE(typeName) \ + ( strcpy(typeArr[eModifierType_##typeName].name, #typeName), \ + strcpy(typeArr[eModifierType_##typeName].structName, #typeName "ModifierData"), \ + typeArr[eModifierType_##typeName].structSize = sizeof(typeName##ModifierData), \ + &typeArr[eModifierType_##typeName]) + mti = &typeArr[eModifierType_None]; strcpy(mti->name, "None"); strcpy(mti->structName, "ModifierData"); + mti->structSize = sizeof(ModifierData); mti->type = eModifierType_None; mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_AcceptsCVs; - mti->allocData = noneModifier_allocData; mti->isDisabled = noneModifier_isDisabled; - mti = &typeArr[eModifierType_Curve]; - strcpy(mti->name, "Curve"); - strcpy(mti->structName, "CurveModifierData"); + mti = INIT_TYPE(Curve); mti->type = eModifierTypeType_OnlyDeform; mti->flags = eModifierTypeFlag_AcceptsCVs; - mti->allocData = curveModifier_allocData; mti->isDisabled = curveModifier_isDisabled; mti->updateDepgraph = curveModifier_updateDepgraph; mti->deformVerts = curveModifier_deformVerts; - mti = &typeArr[eModifierType_Lattice]; - strcpy(mti->name, "Lattice"); - strcpy(mti->structName, "LatticeModifierData"); + mti = INIT_TYPE(Lattice); mti->type = eModifierTypeType_OnlyDeform; mti->flags = eModifierTypeFlag_AcceptsCVs; - mti->allocData = latticeModifier_allocData; mti->isDisabled = latticeModifier_isDisabled; mti->updateDepgraph = latticeModifier_updateDepgraph; mti->deformVerts = latticeModifier_deformVerts; - mti = &typeArr[eModifierType_Subsurf]; - strcpy(mti->name, "Subsurf"); - strcpy(mti->structName, "SubsurfModifierData"); + mti = INIT_TYPE(Subsurf); mti->type = eModifierTypeType_Constructive; mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_SupportsMapping; - mti->allocData = subsurfModifier_allocData; + mti->initData = subsurfModifier_initData; + mti->freeData = subsurfModifier_freeData; mti->applyModifier = subsurfModifier_applyModifier; - mti = &typeArr[eModifierType_Build]; - strcpy(mti->name, "Build"); - strcpy(mti->structName, "BuildModifierData"); + mti = INIT_TYPE(Build); mti->type = eModifierTypeType_Nonconstructive; mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->allocData = buildModifier_allocData; + mti->initData = buildModifier_initData; mti->dependsOnTime = buildModifier_dependsOnTime; mti->applyModifier = buildModifier_applyModifier; - mti = &typeArr[eModifierType_Mirror]; - strcpy(mti->name, "Mirror"); - strcpy(mti->structName, "MirrorModifierData"); + mti = INIT_TYPE(Mirror); mti->type = eModifierTypeType_Constructive; mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->allocData = mirrorModifier_allocData; + mti->initData = mirrorModifier_initData; mti->applyModifier = mirrorModifier_applyModifier; typeArrInit = 0; +#undef INIT_TYPE } if (type>=0 && type<NUM_MODIFIER_TYPES && typeArr[type].name[0]!='\0') { @@ -665,6 +651,28 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type) } } +ModifierData *modifier_new(int type) +{ + ModifierTypeInfo *mti = modifierType_get_info(type); + ModifierData *md = MEM_callocN(mti->structSize, mti->structName); + + md->type = type; + md->mode = eModifierMode_RealtimeAndRender; + + if (mti->initData) mti->initData(md); + + return md; +} + +void modifier_free(ModifierData *md) +{ + ModifierTypeInfo *mti = modifierType_get_info(md->type); + + if (mti->freeData) mti->freeData(md); + + MEM_freeN(md); +} + int modifier_dependsOnTime(ModifierData *md) { ModifierTypeInfo *mti = modifierType_get_info(md->type); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 9b70f2923f7..05a09e8c039 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -95,6 +95,7 @@ #include "BKE_library.h" #include "BKE_mesh.h" #include "BKE_mball.h" +#include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_property.h" #include "BKE_sca.h" @@ -177,7 +178,8 @@ static void free_modifiers(ListBase *lb) while (md=lb->first) { BLI_remlink(lb, md); - MEM_freeN(md); + + modifier_free(md); } } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 39a451094bb..4212efa5af2 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -38,6 +38,7 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "BKE_bad_level_calls.h" @@ -58,24 +59,6 @@ #include "CCGSubSurf.h" -typedef struct _SubSurf { - CCGSubSurf *subSurf; - - int useAging; - int controlType; -#define SUBSURF_CONTROLTYPE_MESH 1 -#define SUBSURF_CONTROLTYPE_EDITMESH 2 - - /* used by editmesh control type */ - EditMesh *em; - - /* used by mesh control type */ - Mesh *me; - - float (*vertCos)[3]; - DispListMesh *dlm; -} SubSurf; - typedef struct _VertData { float co[3]; float no[3]; @@ -99,13 +82,25 @@ static void arena_release(CCGAllocatorHDL a) { BLI_memarena_free(a); } -static CCGSubSurf *_getSubSurf(SubSurf *ss, int subdivLevels, int useArena) { +static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAging, int useArena, int useEdgeCreation, int useFlatSubdiv) { CCGMeshIFC ifc; CCGSubSurf *ccgSS; - CCGAllocatorIFC allocatorIFC, *allocatorIFCp; - CCGAllocatorHDL allocator; - if (ss->useAging) { + if (prevSS) { + int oldUseAging; + + ccgSubSurf_getUseAgeCounts(prevSS, &oldUseAging, NULL, NULL, NULL); + + if (oldUseAging!=useAging) { + ccgSubSurf_free(prevSS); + } else { + ccgSubSurf_setSubdivisionLevels(prevSS, subdivLevels); + + return prevSS; + } + } + + if (useAging) { ifc.vertUserSize = ifc.edgeUserSize = ifc.faceUserSize = 8; } else { ifc.vertUserSize = ifc.edgeUserSize = ifc.faceUserSize = 4; @@ -113,58 +108,31 @@ static CCGSubSurf *_getSubSurf(SubSurf *ss, int subdivLevels, int useArena) { ifc.vertDataSize = sizeof(VertData); if (useArena) { + CCGAllocatorIFC allocatorIFC; + CCGAllocatorHDL allocator = BLI_memarena_new((1<<16)); + allocatorIFC.alloc = arena_alloc; allocatorIFC.realloc = arena_realloc; allocatorIFC.free = arena_free; allocatorIFC.release = arena_release; - allocatorIFCp = &allocatorIFC; - allocator = BLI_memarena_new((1<<16)); - ccgSS = ccgSubSurf_new(&ifc, ss, subdivLevels, allocatorIFCp, allocator); + ccgSS = ccgSubSurf_new(&ifc, subdivLevels, &allocatorIFC, allocator); } else { - ccgSS = ccgSubSurf_new(&ifc, ss, subdivLevels, NULL, NULL); + ccgSS = ccgSubSurf_new(&ifc, subdivLevels, NULL, NULL); } - if (ss->useAging) { + if (useAging) { ccgSubSurf_setUseAgeCounts(ccgSS, 1, 4, 4, 4); } + if (useEdgeCreation) { + ccgSubSurf_setAllowEdgeCreation(ccgSS, 1, useFlatSubdiv?subdivLevels:0.0f); + } ccgSubSurf_setCalcVertexNormals(ccgSS, 1, BLI_STRUCT_OFFSET(VertData, no)); return ccgSS; } -static SubSurf *subSurf_fromEditmesh(EditMesh *em, int subdivLevels, int useAging, int useArena) { - SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_em"); - - ss->useAging = useAging; - ss->controlType = SUBSURF_CONTROLTYPE_EDITMESH; - ss->subSurf = _getSubSurf(ss, subdivLevels, useArena); - ss->em = em; - - return ss; -} - -static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, float (*vertCos)[3], DispListMesh *dlm) { - SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_m"); - - ss->controlType = SUBSURF_CONTROLTYPE_MESH; - ss->useAging=0; - ss->subSurf = _getSubSurf(ss, subdivLevels, 1); - ss->me = me; - ss->dlm = dlm; - ss->vertCos = vertCos; - - ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f); - - return ss; -} - -static void subSurf_free(SubSurf *ss) { - ccgSubSurf_free(ss->subSurf); - MEM_freeN(ss); -} - static int getEdgeIndex(CCGSubSurf *ss, CCGEdge *e, int x, int edgeSize) { CCGVert *v0 = ccgSubSurf_getEdgeVert0(ss, e); CCGVert *v1 = ccgSubSurf_getEdgeVert1(ss, e); @@ -216,23 +184,35 @@ static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edg return faceBase + 1 + (gridSize-2)*numVerts + S*(gridSize-2)*(gridSize-2) + (y-1)*(gridSize-2) + (x-1); } } -static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { - CCGSubSurf *ss = ssm->subSurf; +static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, int ssFromEditmesh, Mesh *inMe, DispListMesh *inDLM) { DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm"); - TFace *tface = ssm->dlm?ssm->dlm->tface:ssm->me->tface; - MEdge *medge = ssm->dlm?ssm->dlm->medge:ssm->me->medge; - MFace *mface = ssm->dlm?ssm->dlm->mface:ssm->me->mface; - MCol *mcol = ssm->dlm?ssm->dlm->mcol:ssm->me->mcol; int edgeSize = ccgSubSurf_getEdgeSize(ss); int gridSize = ccgSubSurf_getGridSize(ss); int edgeIndexBase, edgeBase, faceIndexBase, faceBase; int i, j, k, S, x, y; int vertBase = 0; - MFace *mf; + TFace *tface = NULL; + MEdge *medge = NULL; + MFace *mface = NULL; + MCol *mcol = NULL; CCGVertIterator *vi; CCGEdgeIterator *ei; CCGFaceIterator *fi; + if (!ssFromEditmesh) { + if (inDLM) { + tface = inDLM->tface; + medge = inDLM->medge; + mface = inDLM->mface; + mcol = inDLM->mcol; + } else if (inMe) { + tface = inMe->tface; + medge = inMe->medge; + mface = inMe->mface; + mcol = inMe->mcol; + } + } + dlm->totvert = ccgSubSurf_getNumFinalVerts(ss); dlm->totedge = ccgSubSurf_getNumFinalEdges(ss); dlm->totface = ccgSubSurf_getNumFinalFaces(ss); @@ -240,10 +220,10 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { dlm->mvert = MEM_callocN(dlm->totvert*sizeof(*dlm->mvert), "dlm->mvert"); dlm->medge = MEM_callocN(dlm->totedge*sizeof(*dlm->medge), "dlm->medge"); dlm->mface = MEM_callocN(dlm->totface*sizeof(*dlm->mface), "dlm->mface"); - if ((ssm->controlType==SUBSURF_CONTROLTYPE_MESH) && tface) { + if (!ssFromEditmesh && tface) { dlm->tface = MEM_callocN(dlm->totface*sizeof(*dlm->tface), "dlm->tface"); dlm->mcol = NULL; - } else if ((ssm->controlType==SUBSURF_CONTROLTYPE_MESH) && mcol) { + } else if (!ssFromEditmesh && mcol) { dlm->tface = NULL; dlm->mcol = MEM_mallocN(dlm->totface*4*sizeof(*dlm->mcol), "dlm->mcol"); } else { @@ -316,7 +296,7 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { med->v2 = getEdgeIndex(ss, e, x+1, edgeSize); med->flag = ME_EDGEDRAW; - if (ssm->controlType==SUBSURF_CONTROLTYPE_EDITMESH) { + if (ssFromEditmesh) { EditEdge *ee = ccgSubSurf_getEdgeEdgeHandle(ss, e); if (ee->seam) { @@ -380,19 +360,41 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { float edge_data[4][6]; float corner_data[4][6]; float center_data[6] = {0}; - int numDataComponents; + int numDataComponents = 0; TFace *origTFace = NULL; - MCol *origMCol = NULL; int mat_nr; int flag; - if (ssm->controlType==SUBSURF_CONTROLTYPE_MESH) { + if (!ssFromEditmesh) { int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f); - MFace *origMFace = &((MFace*) mface)[origIdx]; - if (tface) - origTFace = &((TFace*)tface)[origIdx]; - if (mcol) - origMCol = &mcol[origIdx*4]; + MFace *origMFace = &mface[origIdx]; + + if (tface) { + origTFace = &tface[origIdx]; + + for (S=0; S<numVerts; S++) { + unsigned char *col = (unsigned char*) &origTFace->col[S]; + corner_data[S][0] = col[0]/255.0f; + corner_data[S][1] = col[1]/255.0f; + corner_data[S][2] = col[2]/255.0f; + corner_data[S][3] = col[3]/255.0f; + corner_data[S][4] = origTFace->uv[S][0]; + corner_data[S][5] = origTFace->uv[S][1]; + } + numDataComponents = 6; + } else if (mcol) { + MCol *origMCol = &mcol[origIdx*4]; + + for (S=0; S<numVerts; S++) { + unsigned char *col = (unsigned char*) &origMCol[S]; + corner_data[S][0] = col[0]/255.0f; + corner_data[S][1] = col[1]/255.0f; + corner_data[S][2] = col[2]/255.0f; + corner_data[S][3] = col[3]/255.0f; + } + numDataComponents = 4; + } + mat_nr = origMFace->mat_nr; flag = origMFace->flag; } else { @@ -401,30 +403,6 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { flag = ef->flag; } - if (origTFace) { - for (S=0; S<numVerts; S++) { - unsigned char *col = (unsigned char*) &origTFace->col[S]; - corner_data[S][0] = col[0]/255.0f; - corner_data[S][1] = col[1]/255.0f; - corner_data[S][2] = col[2]/255.0f; - corner_data[S][3] = col[3]/255.0f; - corner_data[S][4] = origTFace->uv[S][0]; - corner_data[S][5] = origTFace->uv[S][1]; - } - numDataComponents = 6; - } else if (origMCol) { - for (S=0; S<numVerts; S++) { - unsigned char *col = (unsigned char*) &origMCol[S]; - corner_data[S][0] = col[0]/255.0f; - corner_data[S][1] = col[1]/255.0f; - corner_data[S][2] = col[2]/255.0f; - corner_data[S][3] = col[3]/255.0f; - } - numDataComponents = 4; - } else { - numDataComponents = 0; - } - for (S=0; S<numVerts; S++) { for (k=0; k<numDataComponents; k++) { edge_data[S][k] = (corner_data[S][k] + corner_data[(S+1)%numVerts][k])*0.5f; @@ -439,7 +417,7 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { int prevS= (S-1+numVerts)%numVerts; for (y=0; y<gridSize-1; y++) { for (x=0; x<gridSize-1; x++) { - mf = &dlm->mface[i]; + MFace *mf = &dlm->mface[i]; mf->v1 = getFaceIndex(ss, f, S, x+0, y+1, edgeSize, gridSize); mf->v2 = getFaceIndex(ss, f, S, x+1, y+1, edgeSize, gridSize); mf->v3 = getFaceIndex(ss, f, S, x+1, y+0, edgeSize, gridSize); @@ -504,84 +482,89 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) { return dlm; } -static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) { - float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss->subSurf); +static void ss_sync_from_mesh(CCGSubSurf *ss, Mesh *me, DispListMesh *dlm, float (*vertexCos)[3], int useFlatSubdiv) { + float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss); + CCGVertHDL fVerts[4]; + MVert *mvert = dlm?dlm->mvert:me->mvert; + MEdge *medge = dlm?dlm->medge:me->medge; + MFace *mface = dlm?dlm->mface:me->mface; + int totvert = dlm?dlm->totvert:me->totvert; + int totedge = dlm?dlm->totedge:me->totedge; + int totface = dlm?dlm->totface:me->totface; + int i; + + ccgSubSurf_initFullSync(ss); + + if (vertexCos) { + for (i=0; i<totvert; i++) { + ccgSubSurf_syncVert(ss, (CCGVertHDL) i, vertexCos[i]); + } + } else { + for (i=0; i<totvert; i++) { + ccgSubSurf_syncVert(ss, (CCGVertHDL) i, mvert[i].co); + } + } - ccgSubSurf_initFullSync(ss->subSurf); + if (medge) { + for (i=0; i<totedge; i++) { + MEdge *med = &medge[i]; + float crease = useFlatSubdiv?creaseFactor:med->crease*creaseFactor/255.0f; - if (ss->controlType==SUBSURF_CONTROLTYPE_MESH) { - CCGVertHDL fVerts[4]; - MVert *mvert = ss->dlm?ss->dlm->mvert:ss->me->mvert; - MEdge *medge = ss->dlm?ss->dlm->medge:ss->me->medge; - MFace *mface = ss->dlm?ss->dlm->mface:ss->me->mface; - int totvert = ss->dlm?ss->dlm->totvert:ss->me->totvert; - int totedge = ss->dlm?ss->dlm->totedge:ss->me->totedge; - int totface = ss->dlm?ss->dlm->totface:ss->me->totface; - int i; + ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) med->v1, (CCGVertHDL) med->v2, crease); + } + } else { + for (i=0; i<totface; i++) { + MFace *mf = &((MFace*) mface)[i]; - if (ss->vertCos) { - for (i=0; i<totvert; i++) { - ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->vertCos[i]); - } - } else { - for (i=0; i<totvert; i++) { - ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, mvert[i].co); + if (!mf->v3) { + ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) mf->v1, (CCGVertHDL) mf->v2, useFlatSubdiv?creaseFactor:0.0); } } + } - if (medge) { - for (i=0; i<totedge; i++) { - MEdge *med = &medge[i]; - float crease = useFlatSubdiv?creaseFactor:med->crease*creaseFactor/255.0f; + for (i=0; i<totface; i++) { + MFace *mf = &((MFace*) mface)[i]; - ccgSubSurf_syncEdge(ss->subSurf, (CCGEdgeHDL) i, (CCGVertHDL) med->v1, (CCGVertHDL) med->v2, crease); - } - } else { - for (i=0; i<totface; i++) { - MFace *mf = &((MFace*) mface)[i]; + if (mf->v3) { + fVerts[0] = (CCGVertHDL) mf->v1; + fVerts[1] = (CCGVertHDL) mf->v2; + fVerts[2] = (CCGVertHDL) mf->v3; + fVerts[3] = (CCGVertHDL) mf->v4; - if (!mf->v3) { - ccgSubSurf_syncEdge(ss->subSurf, (CCGEdgeHDL) i, (CCGVertHDL) mf->v1, (CCGVertHDL) mf->v2, useFlatSubdiv?creaseFactor:0.0); - } - } + ccgSubSurf_syncFace(ss, (CCGFaceHDL) i, fVerts[3]?4:3, fVerts); } + } - for (i=0; i<totface; i++) { - MFace *mf = &((MFace*) mface)[i]; + ccgSubSurf_processSync(ss); +} - if (mf->v3) { - fVerts[0] = (CCGVertHDL) mf->v1; - fVerts[1] = (CCGVertHDL) mf->v2; - fVerts[2] = (CCGVertHDL) mf->v3; - fVerts[3] = (CCGVertHDL) mf->v4; +void ss_sync_from_editmesh(CCGSubSurf *ss, EditMesh *em, int useFlatSubdiv) +{ + float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss); + EditVert *ev, *fVerts[4]; + EditEdge *ee; + EditFace *ef; - ccgSubSurf_syncFace(ss->subSurf, (CCGFaceHDL) i, fVerts[3]?4:3, fVerts); - } - } - } else { - EditVert *ev, *fVerts[4]; - EditEdge *ee; - EditFace *ef; + ccgSubSurf_initFullSync(ss); - for (ev=ss->em->verts.first; ev; ev=ev->next) { - ccgSubSurf_syncVert(ss->subSurf, ev, ev->co); - } + for (ev=em->verts.first; ev; ev=ev->next) { + ccgSubSurf_syncVert(ss, ev, ev->co); + } - for (ee=ss->em->edges.first; ee; ee=ee->next) { - ccgSubSurf_syncEdge(ss->subSurf, ee, ee->v1, ee->v2, useFlatSubdiv?creaseFactor:ee->crease*creaseFactor); - } + for (ee=em->edges.first; ee; ee=ee->next) { + ccgSubSurf_syncEdge(ss, ee, ee->v1, ee->v2, useFlatSubdiv?creaseFactor:ee->crease*creaseFactor); + } - for (ef=ss->em->faces.first; ef; ef=ef->next) { - fVerts[0] = ef->v1; - fVerts[1] = ef->v2; - fVerts[2] = ef->v3; - fVerts[3] = ef->v4; + for (ef=em->faces.first; ef; ef=ef->next) { + fVerts[0] = ef->v1; + fVerts[1] = ef->v2; + fVerts[2] = ef->v3; + fVerts[3] = ef->v4; - ccgSubSurf_syncFace(ss->subSurf, ef, ef->v4?4:3, (CCGVertHDL*) fVerts); - } + ccgSubSurf_syncFace(ss, ef, ef->v4?4:3, (CCGVertHDL*) fVerts); } - ccgSubSurf_processSync(ss->subSurf); + ccgSubSurf_processSync(ss); } /***/ @@ -589,12 +572,12 @@ static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) { typedef struct { DerivedMesh dm; - SubSurf *ss; + CCGSubSurf *ss; } CCGDerivedMesh; static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss); CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); @@ -641,17 +624,17 @@ static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) { static int ccgDM_getNumVerts(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - return ccgSubSurf_getNumFinalVerts(ccgdm->ss->subSurf); + return ccgSubSurf_getNumFinalVerts(ccgdm->ss); } static int ccgDM_getNumFaces(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - return ccgSubSurf_getNumFinalFaces(ccgdm->ss->subSurf); + return ccgSubSurf_getNumFinalFaces(ccgdm->ss); } static void ccgDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3]) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGVert *v = ccgSubSurf_getVert(ccgdm->ss->subSurf, vert); - float *co = ccgSubSurf_getVertData(ccgdm->ss->subSurf, v); + CCGVert *v = ccgSubSurf_getVert(ccgdm->ss, vert); + float *co = ccgSubSurf_getVertData(ccgdm->ss, v); co_r[0] = co[0]; co_r[1] = co[1]; @@ -660,7 +643,7 @@ static void ccgDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3]) static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - return subSurf_createDispListMesh(ccgdm->ss); + return ss_to_displistmesh(ccgdm->ss, 1, NULL, NULL); } static void ccgDM_drawVerts(DerivedMesh *dm) { @@ -668,11 +651,14 @@ static void ccgDM_drawVerts(DerivedMesh *dm) { } static void ccgDM_drawEdges(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); int i, edgeSize = ccgSubSurf_getEdgeSize(ss); int gridSize = ccgSubSurf_getGridSize(ss); + int useAging; + + ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { CCGEdge *e = ccgEdgeIterator_getCurrent(ei); @@ -682,7 +668,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm) { if (eed->h!=0) continue; - if (ccgdm->ss->useAging && !(G.f&G_BACKBUFSEL)) { + if (useAging && !(G.f&G_BACKBUFSEL)) { int ageCol = 255-ccgSubSurf_getEdgeAge(ss, e)*4; glColor3ub(0, ageCol>0?ageCol:0, 0); } @@ -695,7 +681,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm) { glEnd(); } - if (ccgdm->ss->useAging && !(G.f&G_BACKBUFSEL)) { + if (useAging && !(G.f&G_BACKBUFSEL)) { glColor3ub(0, 0, 0); } @@ -734,7 +720,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm) { } static void ccgDM_drawMappedEdges(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); int i, edgeSize = ccgSubSurf_getEdgeSize(ss); @@ -754,7 +740,7 @@ static void ccgDM_drawMappedEdges(DerivedMesh *dm) { } static void ccgDM_drawLooseEdges(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); int i, edgeSize = ccgSubSurf_getEdgeSize(ss); @@ -778,7 +764,7 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm) { static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); int gridSize = ccgSubSurf_getGridSize(ss); @@ -851,7 +837,7 @@ static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, static void ccgDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditVert *vert), void *userData) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss); bglBegin(GL_POINTS); @@ -869,7 +855,7 @@ static void ccgDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void } static void ccgDM_drawMappedEdgeEM(DerivedMesh *dm, void *edge) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); CCGEdge *e = ccgSubSurf_getEdge(ss, edge); VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); @@ -884,9 +870,11 @@ static void ccgDM_drawMappedEdgeEM(DerivedMesh *dm, void *edge) { } static void ccgDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void *userData) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); - int i, edgeSize = ccgSubSurf_getEdgeSize(ss); + int i, useAging, edgeSize = ccgSubSurf_getEdgeSize(ss); + + ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { CCGEdge *e = ccgEdgeIterator_getCurrent(ei); @@ -895,7 +883,7 @@ static void ccgDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void glBegin(GL_LINE_STRIP); if (!setDrawOptions || setDrawOptions(userData, edge)) { - if (ccgdm->ss->useAging && !(G.f&G_BACKBUFSEL)) { + if (useAging && !(G.f&G_BACKBUFSEL)) { int ageCol = 255-ccgSubSurf_getEdgeAge(ss, e)*4; glColor3ub(0, ageCol>0?ageCol:0, 0); } @@ -912,9 +900,11 @@ static void ccgDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void } static void ccgDM_drawMappedEdgesInterpEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void (*setDrawInterpOptions)(void *userData, EditEdge *edge, float t), void *userData) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); - int i, edgeSize = ccgSubSurf_getEdgeSize(ss); + int i, useAging, edgeSize = ccgSubSurf_getEdgeSize(ss); + + ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { CCGEdge *e = ccgEdgeIterator_getCurrent(ei); @@ -926,7 +916,7 @@ static void ccgDM_drawMappedEdgesInterpEM(DerivedMesh *dm, int (*setDrawOptions) for (i=0; i<edgeSize; i++) { setDrawInterpOptions(userData, edge, (float) i/(edgeSize-1)); - if (ccgdm->ss->useAging && !(G.f&G_BACKBUFSEL)) { + if (useAging && !(G.f&G_BACKBUFSEL)) { int ageCol = 255-ccgSubSurf_getEdgeAge(ss, e)*4; glColor3ub(0, ageCol>0?ageCol:0, 0); } @@ -939,7 +929,7 @@ static void ccgDM_drawMappedEdgesInterpEM(DerivedMesh *dm, int (*setDrawOptions) } static void ccgDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditFace *face), void *userData) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = ccgdm->ss->subSurf; + CCGSubSurf *ss = ccgdm->ss; CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); int gridSize = ccgSubSurf_getGridSize(ss); @@ -970,12 +960,12 @@ static void ccgDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void static void ccgDM_release(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; - subSurf_free(ccgdm->ss); + ccgSubSurf_free(ccgdm->ss); MEM_freeN(ccgdm); } -static CCGDerivedMesh *getCCGDerivedMesh(SubSurf *ss) { +static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss) { CCGDerivedMesh *ccgdm = MEM_mallocN(sizeof(*ccgdm), "ccgdm"); ccgdm->dm.getMinMax = ccgDM_getMinMax; @@ -1007,44 +997,53 @@ static CCGDerivedMesh *getCCGDerivedMesh(SubSurf *ss) { /***/ -DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, short type, DerivedMesh *oldDerived) { - CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) oldDerived; +DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, SubsurfModifierData *smd) { + int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF; + CCGSubSurf *ss = _getSubSurf(NULL, smd->levels, G.rt==52, 0, 0, useSimple); - if (!ccgdm || ccgSubSurf_getSubdivisionLevels(ccgdm->ss->subSurf)!=subdivLevels) { - if (ccgdm) { - oldDerived->release(oldDerived); - } + ss_sync_from_editmesh(ss, em, useSimple); - ccgdm = getCCGDerivedMesh(subSurf_fromEditmesh(em, subdivLevels, G.rt==52, 0)); - } + return (DerivedMesh*) getCCGDerivedMesh(ss); +} - subSurf_sync(ccgdm->ss, type==ME_SIMPLE_SUBSURF); +DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, SubsurfModifierData *smd, int useRenderParams, float (*vertCos)[3]) { + int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF; - return (DerivedMesh*) ccgdm; -} + /* Do not use cache in render mode. */ + if (useRenderParams) { + CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, 1, useSimple); -DerivedMesh *subsurf_make_derived_from_dlm(DispListMesh *dlm, int subdivType, int subdivLevels) { - SubSurf *ss = subSurf_fromMesh(NULL, subdivType==ME_SIMPLE_SUBSURF, subdivLevels, NULL, dlm); + ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple); - subSurf_sync(ss, subdivType==ME_SIMPLE_SUBSURF); + dlm = ss_to_displistmesh(ss, 0, me, dlm); - dlm = subSurf_createDispListMesh(ss); - - subSurf_free(ss); - - return derivedmesh_from_displistmesh(dlm); -} -DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivType, int subdivLevels, float (*vertCos)[3]) { - SubSurf *ss = subSurf_fromMesh(me, subdivType==ME_SIMPLE_SUBSURF, subdivLevels, vertCos, NULL); - DispListMesh *dlm; + ccgSubSurf_free(ss); + + return derivedmesh_from_displistmesh(dlm); + } else { + int useEdgeCreation = !(dlm?dlm->medge:me->medge); + int useIncremental = useEdgeCreation?0:smd->useIncrementalMesh; + CCGSubSurf *ss; + + if (!useIncremental && smd->mCache) { + ccgSubSurf_free(smd->mCache); + smd->mCache = NULL; + } - subSurf_sync(ss, subdivType==ME_SIMPLE_SUBSURF); + ss = _getSubSurf(smd->mCache, smd->levels, 0, 1, useEdgeCreation, useSimple); - dlm = subSurf_createDispListMesh(ss); - - subSurf_free(ss); - - return derivedmesh_from_displistmesh(dlm); + ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple); + + dlm = ss_to_displistmesh(ss, 0, me, dlm); + + if (useIncremental) { + smd->mCache = ss; + } else { + ccgSubSurf_free(ss); + } + + return derivedmesh_from_displistmesh(dlm); + } } void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) @@ -1054,18 +1053,18 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) * calculated vert positions is incorrect for the verts * on the boundary of the mesh. */ - SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL, NULL); + CCGSubSurf *ss = _getSubSurf(NULL, 1, 0, 1, 0, 0); float edge_sum[3], face_sum[3]; CCGVertIterator *vi; - subSurf_sync(ss, 0); + ss_sync_from_mesh(ss, me, NULL, NULL, 0); - vi = ccgSubSurf_getVertIterator(ss->subSurf); + vi = ccgSubSurf_getVertIterator(ss); for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) { CCGVert *v = ccgVertIterator_getCurrent(vi); - int idx = (int) ccgSubSurf_getVertVertHandle(ss->subSurf, v); - int N = ccgSubSurf_getVertNumEdges(ss->subSurf, v); - int numFaces = ccgSubSurf_getVertNumFaces(ss->subSurf, v); + int idx = (int) ccgSubSurf_getVertVertHandle(ss, v); + int N = ccgSubSurf_getVertNumEdges(ss, v); + int numFaces = ccgSubSurf_getVertNumFaces(ss, v); float *co; int i; @@ -1073,21 +1072,21 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) face_sum[0]= face_sum[1]= face_sum[2]= 0.0; for (i=0; i<N; i++) { - CCGEdge *e = ccgSubSurf_getVertEdge(ss->subSurf, v, i); - VecAddf(edge_sum, edge_sum, ccgSubSurf_getEdgeData(ss->subSurf, e, 1)); + CCGEdge *e = ccgSubSurf_getVertEdge(ss, v, i); + VecAddf(edge_sum, edge_sum, ccgSubSurf_getEdgeData(ss, e, 1)); } for (i=0; i<numFaces; i++) { - CCGFace *f = ccgSubSurf_getVertFace(ss->subSurf, v, i); - VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(ss->subSurf, f)); + CCGFace *f = ccgSubSurf_getVertFace(ss, v, i); + VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(ss, f)); } - co = ccgSubSurf_getVertData(ss->subSurf, v); + co = ccgSubSurf_getVertData(ss, v); positions_r[idx][0] = (co[0]*N*N + edge_sum[0]*4 + face_sum[0])/(N*(N+5)); positions_r[idx][1] = (co[1]*N*N + edge_sum[1]*4 + face_sum[1])/(N*(N+5)); positions_r[idx][2] = (co[2]*N*N + edge_sum[2]*4 + face_sum[2])/(N*(N+5)); } ccgVertIterator_free(vi); - subSurf_free(ss); + ccgSubSurf_free(ss); } diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h index 54d2098ee1a..a5fcf32d76e 100644 --- a/source/blender/blenlib/BLI_editVert.h +++ b/source/blender/blenlib/BLI_editVert.h @@ -100,7 +100,10 @@ typedef struct EditMesh EditEdge *alledges, *curedge; EditFace *allfaces, *curface; - struct DerivedMesh *derived; + /* DerivedMesh caches... note that derived cage can be equivalent + * to derived final, care should be taken on release. + */ + struct DerivedMesh *derivedCage, *derivedFinal; } EditMesh; #endif diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 8385535ed8b..2b2cb8a1a3d 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2112,23 +2112,46 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) /* ************ READ OBJECT ***************** */ -static void lib_link_modifier_data(FileData *fd, Object *ob, ModifierData *md) +static void lib_link_modifiers(FileData *fd, Object *ob) { - if (md->type==eModifierType_Lattice) { - LatticeModifierData *lmd = (LatticeModifierData*) md; - - lmd->object = newlibadr(fd, ob->id.lib, lmd->object); - } - else if (md->type==eModifierType_Curve) { - CurveModifierData *cmd = (CurveModifierData*) md; + ModifierData *md; + + for (md=ob->modifiers.first; md; md=md->next) { + if (md->type==eModifierType_Lattice) { + LatticeModifierData *lmd = (LatticeModifierData*) md; + + lmd->object = newlibadr(fd, ob->id.lib, lmd->object); + } + else if (md->type==eModifierType_Curve) { + CurveModifierData *cmd = (CurveModifierData*) md; + + cmd->object = newlibadr(fd, ob->id.lib, cmd->object); + } + } + + /* Patch subsurf modifier */ + if (ob->type==OB_MESH) { + Mesh *me = ob->data; + + if (me->flag&ME_SUBSURF) { + SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf); + + smd->levels = me->subdiv; + smd->renderLevels = me->subdivr; + smd->subdivType = me->subsurftype; - cmd->object = newlibadr(fd, ob->id.lib, cmd->object); + BLI_addtail(&ob->modifiers, smd); + + /* Turn it off, so it won't get saved again with flag, + * still could be an issue with lib-linked mesh. + */ + me->flag ^= ME_SUBSURF; + } } } static void lib_link_object(FileData *fd, Main *main) { - ModifierData *md; Object *ob; bSensor *sens; bController *cont; @@ -2260,9 +2283,7 @@ static void lib_link_object(FileData *fd, Main *main) hook->parent= newlibadr(fd, ob->id.lib, hook->parent); } - for (md=ob->modifiers.first; md; md= md->next) { - lib_link_modifier_data(fd, ob, md); - } + lib_link_modifiers(fd, ob); } ob= ob->id.next; } @@ -2289,6 +2310,21 @@ static void direct_link_pose(FileData *fd, bPose *pose) { } +static void direct_link_modifiers(FileData *fd, ListBase *lb) +{ + ModifierData *md; + + link_list(fd, lb); + + for (md=lb->first; md; md=md->next) { + if (md->type==eModifierType_Subsurf) { + SubsurfModifierData *smd = (SubsurfModifierData*) md; + + smd->emCache = smd->mCache = 0; + } + } +} + static void direct_link_object(FileData *fd, Object *ob) { PartEff *paf; @@ -2304,7 +2340,6 @@ static void direct_link_object(FileData *fd, Object *ob) ob->pose= newdataadr(fd, ob->pose); direct_link_pose(fd, ob->pose); - link_list(fd, &ob->modifiers); link_list(fd, &ob->defbase); link_list(fd, &ob->nlastrips); link_list(fd, &ob->constraintChannels); @@ -2327,8 +2362,7 @@ static void direct_link_object(FileData *fd, Object *ob) if(paf->type==EFF_BUILD) { BuildEff *baf = (BuildEff*) paf; PartEff *next = paf->next; - ModifierTypeInfo *mti = modifierType_get_info(eModifierType_Build); - BuildModifierData *bmd = (BuildModifierData*) mti->allocData(); + BuildModifierData *bmd = (BuildModifierData*) modifier_new(eModifierType_Build); bmd->start = baf->sfra; bmd->length = baf->len; @@ -2408,6 +2442,8 @@ static void direct_link_object(FileData *fd, Object *ob) } } } + + direct_link_modifiers(fd, &ob->modifiers); ob->bb= NULL; ob->derivedDeform= NULL; @@ -4767,7 +4803,6 @@ static void do_versions(FileData *fd, Main *main) } } } - /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */ diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 5ebdd4d5a1a..6d626a5d6a8 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -601,6 +601,10 @@ enum { #define B_RECALCAL 3411 #define B_RECALC_DEFL 3412 +#define B_MDFR_BUTS 3600 + +#define B_MDFR_INCREMENTAl 3501 + /* *********************** */ /* *********************** */ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 5eb00c4f21b..8efad895e47 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -36,7 +36,9 @@ typedef struct ModifierData { typedef struct SubsurfModifierData { ModifierData modifier; - short subdivType, levels, renderLevels, pad; + short subdivType, levels, renderLevels, useIncrementalMesh; + + void *emCache, *mCache; } SubsurfModifierData; typedef struct LatticeModifierData { diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c index b0917a1123d..5008fc84e9d 100644 --- a/source/blender/src/butspace.c +++ b/source/blender/src/butspace.c @@ -318,9 +318,12 @@ void do_butspace(unsigned short event) do_uvautocalculationbuts(event); } else if(event<=B_EFFECTSBUTS) { - /*here we put the effects buttons do commands*/ do_effects_panels(event); } + else if(event<=B_MDFR_BUTS) { + extern void do_modifier_panels(unsigned short event); + do_modifier_panels(event); + } else if(event==REDRAWVIEW3D) allqueue(event, 1); // 1=do header too else if(event>REDRAWVIEW3D) allqueue(event, 0); } diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index f437752a677..09db99e7bf5 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -656,8 +656,6 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me) { uiBlock *block; float val; - /* Hope to support more than two subsurf algorithms */ - char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|Simple Subdiv.%x1"; block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_type", UI_EMBOSS, UI_HELV, curarea->win); if( uiNewPanel(curarea, block, "Mesh", "Editing", 320, 0, 318, 204)==0) return; @@ -667,12 +665,7 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me) uiDefButS(block, NUM, B_DIFF, "Degr:", 10,160,154,19, &me->smoothresh, 1, 80, 0, 0, "Defines maximum angle between face normals that 'Auto Smooth' will operate on"); uiBlockBeginAlign(block); - uiBlockSetCol(block, TH_BUT_SETTING1); - uiDefButS(block, TOG|BIT|7, B_SUBSURFTYPE, "SubSurf", 10,134,70,19, &me->flag, 0, 0, 0, 0, "Treats the active object as a Subdivision Surface"); - uiDefButS(block, MENU, B_SUBSURFTYPE, subsurfmenu, 80,134,84,19, &(me->subsurftype), 0, 0, 0, 0, "Selects type of Subsurf algorithm."); uiBlockSetCol(block, TH_AUTO); - uiDefButS(block, NUM, B_SUBSURFTYPE, "Subdiv:", 10, 114,110,19, &me->subdiv, 0, 6, 0, 0, "Defines the level of subdivision to display in real time interactively"); - uiDefButS(block, NUM, B_DIFF, "", 120,114, 44, 19, &me->subdivr, 0, 6, 0, 0, "Defines the level of subdivision to apply during rendering"); uiDefButS(block, TOG|BIT|8, B_SUBSURFTYPE, "Optimal", 10, 94,154,19, &me->flag, 0, 0, 0, 0, "Only draws optimal wireframe"); uiBlockBeginAlign(block); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 204f580096e..5333bf1a61d 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1655,23 +1655,46 @@ static void object_softbodies(Object *ob) static int actModifier = 0; -static void modifiers_add(void *ob_v, int type) +void do_modifier_panels(unsigned short event) { - Object *ob = ob_v; - ModifierTypeInfo *mti = modifierType_get_info(type); - - if (mti) { - ModifierData *md = mti->allocData(); - - BLI_addtail(&ob->modifiers, md); + Object *ob = OBACT; + ModifierData *md; + int i; - actModifier = BLI_countlist(&ob->modifiers); + for (i=0, md=ob->modifiers.first; md && i<actModifier-1; i++) + md = md->next; - allqueue(REDRAWBUTSOBJECT, 0); + switch(event) { + case B_MDFR_INCREMENTAl: + if (md && md->type==eModifierType_Subsurf && ((SubsurfModifierData*)md)->useIncrementalMesh) { + if (ob->type==OB_MESH) { + Mesh *me = ob->data; + + if (!me->medge) { + if (okee("Requires mesh edges, create now?")) { + make_edges(me); + } + } + } + } DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */ + break; } } +static void modifiers_add(void *ob_v, int type) +{ + Object *ob = ob_v; + BLI_addtail(&ob->modifiers, modifier_new(type)); + + actModifier = BLI_countlist(&ob->modifiers); + + allqueue(REDRAWBUTSOBJECT, 0); + DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); +} + static uiBlock *modifier_add_menu(void *ob_v) { Object *ob = ob_v; @@ -1707,7 +1730,8 @@ static void modifiers_del(void *ob_v, void *arg2) if (md) { BLI_remlink(&ob->modifiers, md); - MEM_freeN(md); + + modifier_free(md); } allqueue(REDRAWBUTSOBJECT, 0); @@ -1819,7 +1843,8 @@ static void object_panel_modifiers(Object *ob) char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|Simple Subdiv.%x1"; uiDefButS(block, NUM, B_MAKEDISP, "Levels:", 550, 320, 150,19, &smd->levels, 1, 6, 0, 0, "Number subdivisions to perform"); uiDefButS(block, NUM, B_MAKEDISP, "Render Levels:", 550, 300, 150,19, &smd->renderLevels, 1, 6, 0, 0, "Number subdivisions to perform when rendering"); - uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu, 550,280,150,19, &(smd->subdivType), 0, 0, 0, 0, "Selects type of subdivision algorithm."); + uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu, 550,280,150,19, &smd->subdivType, 0, 0, 0, 0, "Selects type of subdivision algorithm."); + uiDefButS(block, TOG, B_MDFR_INCREMENTAl, "Incremental", 550, 260,150,19,&smd->useIncrementalMesh, 0, 0, 1, 0, "Use incremental calculation, even outside of mesh mode"); } else if (md->type==eModifierType_Lattice) { LatticeModifierData *lmd = (LatticeModifierData*) md; uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:", 550, 320, 120,19, &lmd->object, "Lattice object to deform with"); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 4c05139227c..20a6bb1df3a 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1659,16 +1659,9 @@ static void draw_em_measure_stats(Object *ob, EditMesh *em) } } -static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *baseDM, DerivedMesh *realDM, int dt) +static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt) { Mesh *me = ob->data; - DerivedMesh *cageDM; - - if(realDM && (me->flag&ME_OPT_EDGES)) { - cageDM = realDM; - } else { - cageDM = baseDM; - } if(dt>OB_WIRE) { glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED); @@ -1676,11 +1669,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *baseDM, Derived glEnable(GL_LIGHTING); glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); - if (realDM) { - realDM->drawFacesSolid(realDM, set_gl_material); - } else { - baseDM->drawFacesSolid(baseDM, set_gl_material); - } + finalDM->drawFacesSolid(finalDM, set_gl_material); glFrontFace(GL_CCW); glDisable(GL_LIGHTING); @@ -1693,9 +1682,9 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *baseDM, Derived glDepthMask(0); } else { - if (realDM && !(me->flag&ME_OPT_EDGES)) { + if (cageDM!=finalDM) { BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); - realDM->drawEdges(realDM); + finalDM->drawEdges(finalDM); } } @@ -1918,13 +1907,14 @@ static void draw_mesh_object(Base *base, int dt) int has_alpha= 0; if(G.obedit && ob->data==G.obedit->data) { - DerivedMesh *baseDM = editmesh_get_derived_proxy(); - DerivedMesh *realDM = editmesh_get_derived(); + int cageNeedsFree, finalNeedsFree; + DerivedMesh *finalDM, *cageDM = editmesh_get_derived_cage_and_final(&finalDM, &cageNeedsFree, &finalNeedsFree); if(dt>OB_WIRE) init_gl_materials(ob); // no transp in editmode, the fancy draw over goes bad then - draw_em_fancy(ob, G.editMesh, baseDM, realDM, dt); + draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt); - baseDM->release(baseDM); + if (cageNeedsFree) cageDM->release(cageDM); + if (finalNeedsFree) finalDM->release(finalDM); } else { BoundBox *bb = mesh_get_bb(me); diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c index 74437bc771b..8a1d1088834 100644 --- a/source/blender/src/edit.c +++ b/source/blender/src/edit.c @@ -500,16 +500,9 @@ void count_object(Object *ob, int sel) if(me) { int totvert, totface; - /* note; do not make disp or get derived mesh here. spoils dependency order */ - if (me->flag & ME_SUBSURF) { - /* approximate counts, about right for a mesh entirely made - * of quads and that is a closed 2-manifold. - */ - totvert= totface= me->totface*1<<(me->subdiv*2); - } else { - totvert= me->totvert; - totface= me->totface; - } + // XXX fixme for modifier stack + totvert= me->totvert; + totface= me->totface; G.totvert+= totvert; G.totface+= totface; diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index 804b77abb80..2e3ca06a9bb 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -451,9 +451,15 @@ void free_editMesh(EditMesh *em) if(em->edges.first) free_edgelist(&em->edges); if(em->faces.first) free_facelist(&em->faces); - if(em->derived) { - em->derived->release(em->derived); - em->derived= NULL; + if(em->derivedFinal) { + if (em->derivedFinal!=em->derivedCage) { + em->derivedFinal->release(em->derivedFinal); + } + em->derivedFinal= NULL; + } + if(em->derivedCage) { + em->derivedCage->release(em->derivedCage); + em->derivedCage= NULL; } /* DEBUG: hashtabs are slowest part of enter/exit editmode. here a testprint */ @@ -699,7 +705,7 @@ void make_editMesh() } } - + if(actkey && actkey->totelem!=me->totvert); else { unsigned int *mcol; @@ -779,7 +785,7 @@ void make_editMesh() MEM_freeN(evlist); end_editmesh_fastmalloc(); // resets global function pointers - + /* this creates coherent selections. also needed for older files */ EM_selectmode_set(); /* paranoia check to enforce hide rules */ @@ -1388,7 +1394,7 @@ void separate_mesh(void) emcopy.allverts= NULL; emcopy.alledges= NULL; emcopy.allfaces= NULL; - emcopy.derived= NULL; + emcopy.derivedFinal= emcopy.derivedCage= NULL; free_editMesh(&emcopy); em->verts= edve; @@ -1554,7 +1560,7 @@ void separate_mesh_loose(void) emcopy.allverts= NULL; emcopy.alledges= NULL; emcopy.allfaces= NULL; - emcopy.derived= NULL; + emcopy.derivedFinal= emcopy.derivedCage= NULL; free_editMesh(&emcopy); em->verts= edve; |