diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-07-24 22:05:33 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-07-24 22:05:33 +0400 |
commit | a2a1c111a5b6084e365519394eaf08ccf39436d8 (patch) | |
tree | 1c921f2c688d05a0f9bfce3ff18b28202c39e3c4 | |
parent | ac212f1cd0860bbf28758ae71427d9f52a1515ab (diff) |
== Multires ==
Some refactoring to support vpaint
* For multires_mark_as_modified, make sure the DM is a CCGDM first
* Make the gridkey a parameter to various functions, rather than using the same one everywhere.
** Most important, when doing a multires update, enforces use of the same gridkey as the DM its updating from.
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 68 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_multires.c | 2 |
3 files changed, 46 insertions, 28 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index f31427ead77..84efb4e321f 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -31,6 +31,7 @@ #define BKE_MULTIRES_H struct DerivedMesh; +struct GridKey; struct Mesh; struct MFace; struct Multires; @@ -44,8 +45,9 @@ void multires_force_update(struct Object *ob); void multires_force_render_update(struct Object *ob); void multires_force_external_reload(struct Object *ob); +/* note: gridkey can be NULL, will provide a context-sensitive default */ struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, - int local_mmd, struct DerivedMesh*, struct Object *, int, int); + int local_mmd, struct DerivedMesh*, struct Object *, struct GridKey *, int, int); struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene, struct ModifierData *lastmd); diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 8acdd289b87..56b9b1b2c81 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -124,8 +124,10 @@ static void multires_dm_mark_as_modified(DerivedMesh *dm) void multires_mark_as_modified(Object *ob) { - if(ob && ob->derivedFinal) - multires_dm_mark_as_modified(ob->derivedFinal); + DerivedMesh *dm = ob->derivedFinal; + + if(ob && dm && dm->type == DM_TYPE_CCGDM) + multires_dm_mark_as_modified(dm); } void multires_force_update(Object *ob) @@ -447,7 +449,9 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire multires_set_tot_level(ob, mmd, lvl); } -static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple) +static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, + GridKey *gridkey, int lvl, + int totlvl, int simple) { MultiresModifierData mmd; @@ -458,13 +462,15 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv mmd.totlvl = totlvl; mmd.simple = simple; - return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0); + return multires_dm_create_from_derived(&mmd, 1, dm, ob, gridkey, 0, 0); } -static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal) +static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, + GridKey *gridkey, int lvl, + int simple, int optimal) { SubsurfModifierData smd; - GridKey gridkey; + GridKey default_gridkey; int color_totlayer; int pmask_totlayer; @@ -476,14 +482,17 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl if(optimal) smd.flags |= eSubsurfModifierFlag_ControlEdges; - /* TODO: enable/disable element types */ - color_totlayer = CustomData_number_of_layers(&get_mesh(ob)->fdata, - CD_MCOL); - pmask_totlayer = CustomData_number_of_layers(&get_mesh(ob)->vdata, - CD_PAINTMASK); - GRIDELEM_KEY_INIT(&gridkey, 1, color_totlayer, pmask_totlayer, 1); + if(!gridkey) { + /* TODO: enable/disable element types */ + color_totlayer = CustomData_number_of_layers(&get_mesh(ob)->fdata, + CD_MCOL); + pmask_totlayer = CustomData_number_of_layers(&get_mesh(ob)->vdata, + CD_PAINTMASK); + GRIDELEM_KEY_INIT(&default_gridkey, 1, color_totlayer, pmask_totlayer, 1); + gridkey = &default_gridkey; + } - return subsurf_make_derived_from_derived(dm, &smd, &gridkey, 0, NULL, 0, 0); + return subsurf_make_derived_from_derived(dm, &smd, gridkey, 0, NULL, 0, 0); } /* assumes no is normalized; return value's sign is negative if v is on @@ -498,6 +507,7 @@ static float v3_dist_from_plane(float v[3], float center[3], float no[3]) void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) { DerivedMesh *cddm, *dispdm, *origdm; + GridKey gridkey; Mesh *me; ListBase *fmap; float (*origco)[3]; @@ -508,12 +518,15 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) me = get_mesh(ob); totlvl = mmd->totlvl; + /* only need vert/norm grid data */ + GRIDELEM_KEY_INIT(&gridkey, 1, 0, 0, 1); + /* XXX - probably not necessary to regenerate the cddm so much? */ /* generate highest level with displacements */ cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0); + dispdm = multires_dm_create_local(ob, cddm, &gridkey, totlvl, totlvl, 0); cddm->release(cddm); /* copy the new locations of the base verts into the mesh */ @@ -591,7 +604,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) /* subdivide the mesh to highest level without displacements */ cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0); + origdm = subsurf_dm_create_local(ob, cddm, &gridkey, totlvl, 0, 0); cddm->release(cddm); multiresModifier_disp_run(dispdm, me, CALC_DISPS, origdm->getGridData(origdm), totlvl); @@ -640,11 +653,11 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updat /* create subsurf DM from original mesh at high level */ cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0); + highdm = subsurf_dm_create_local(ob, cddm, NULL, totlvl, simple, 0); gridkey = highdm->getGridKey(highdm); /* create multires DM from original mesh at low level */ - lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple); + lowdm = multires_dm_create_local(ob, cddm, NULL, lvl, lvl, simple); cddm->release(cddm); /* copy subsurf grids and replace them with low displaced grids */ @@ -881,6 +894,7 @@ static void multiresModifier_update(DerivedMesh *dm) Mesh *me; MDisps *mdisps; MultiresModifierData *mmd; + GridKey *gridkey; ob = ccgdm->multires.ob; me = ccgdm->multires.ob->data; @@ -889,6 +903,10 @@ static void multiresModifier_update(DerivedMesh *dm) CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS); + /* use the same gridkey as the dm so that we don't try + to update layers that didn't exist before */ + gridkey = dm->getGridKey(dm); + if(mdisps) { int lvl = ccgdm->multires.lvl; int totlvl = ccgdm->multires.totlvl; @@ -899,18 +917,16 @@ static void multiresModifier_update(DerivedMesh *dm) DMGridData **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid; CCGSubSurf *ss; int i, j, numGrids, highGridSize, lowGridSize; - GridKey *gridkey; /* create subsurf DM from original mesh at high level */ if (ob->derivedDeform) cddm = CDDM_copy(ob->derivedDeform); else cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0); - gridkey = highdm->getGridKey(highdm); + highdm = subsurf_dm_create_local(ob, cddm, gridkey, totlvl, mmd->simple, 0); /* create multires DM from original mesh and displacements */ - lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple); + lowdm = multires_dm_create_local(ob, cddm, gridkey, lvl, totlvl, mmd->simple); cddm->release(cddm); /* gather grid data */ @@ -962,7 +978,7 @@ static void multiresModifier_update(DerivedMesh *dm) else cddm = CDDM_from_mesh(me, NULL); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0); + subdm = subsurf_dm_create_local(ob, cddm, gridkey, mmd->totlvl, mmd->simple, 0); cddm->release(cddm); multiresModifier_disp_run(dm, me, CALC_DISPS, subdm->getGridData(subdm), mmd->totlvl); @@ -992,7 +1008,7 @@ void multires_stitch_grids(Object *ob) } DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob, - int useRenderParams, int isFinalCalc) + GridKey *gridkey, int useRenderParams, int isFinalCalc) { Mesh *me= ob->data; DerivedMesh *result; @@ -1000,12 +1016,11 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca DMGridData **gridData, **subGridData; int lvl= multires_get_level(ob, mmd, useRenderParams); int i, gridSize, numGrids; - GridKey *gridkey; if(lvl == 0) return dm; - result = subsurf_dm_create_local(ob, dm, lvl, + result = subsurf_dm_create_local(ob, dm, gridkey, lvl, mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges); if(!local_mmd) { @@ -1023,6 +1038,7 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca numGrids = result->getNumGrids(result); gridSize = result->getGridSize(result); gridData = result->getGridData(result); + /* null gridkey can be passed in, so update it here */ gridkey = result->getGridKey(result); subGridData = MEM_callocN(sizeof(DMGridData*)*numGrids, "subGridData*"); @@ -1578,7 +1594,7 @@ void multires_load_old(Object *ob, Mesh *me) mmd->lvl = mmd->totlvl; orig = CDDM_from_mesh(me, NULL); - dm = multires_dm_create_from_derived(mmd, 0, orig, ob, 0, 0); + dm = multires_dm_create_from_derived(mmd, 0, orig, ob, NULL, 0, 0); multires_load_old_dm(dm, me, mmd->totlvl+1); diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index 80e91c2dfd8..463d8890c19 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -76,7 +76,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, } } - result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc); + result = multires_dm_create_from_derived(mmd, 0, dm, ob, NULL, useRenderParams, isFinalCalc); if(result == dm) return dm; |