Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/multires.c
| Show First 20 Lines • Show All 741 Lines • ▼ Show 20 Lines | void multiresModifier_del_levels(MultiresModifierData *mmd, | ||||
| multires_set_tot_level(ob, mmd, lvl); | multires_set_tot_level(ob, mmd, lvl); | ||||
| } | } | ||||
| static DerivedMesh *multires_dm_create_local(Scene *scene, | static DerivedMesh *multires_dm_create_local(Scene *scene, | ||||
| Object *ob, | Object *ob, | ||||
| DerivedMesh *dm, | DerivedMesh *dm, | ||||
| int lvl, | int lvl, | ||||
| int totlvl, | int totlvl, | ||||
| int simple, | |||||
| bool alloc_paint_mask, | bool alloc_paint_mask, | ||||
| int flags) | int flags) | ||||
| { | { | ||||
| MultiresModifierData mmd = {{NULL}}; | MultiresModifierData mmd = {{NULL}}; | ||||
| mmd.lvl = lvl; | mmd.lvl = lvl; | ||||
| mmd.sculptlvl = lvl; | mmd.sculptlvl = lvl; | ||||
| mmd.renderlvl = lvl; | mmd.renderlvl = lvl; | ||||
| mmd.totlvl = totlvl; | mmd.totlvl = totlvl; | ||||
| mmd.simple = simple; | |||||
| flags |= MULTIRES_USE_LOCAL_MMD; | flags |= MULTIRES_USE_LOCAL_MMD; | ||||
| if (alloc_paint_mask) { | if (alloc_paint_mask) { | ||||
| flags |= MULTIRES_ALLOC_PAINT_MASK; | flags |= MULTIRES_ALLOC_PAINT_MASK; | ||||
| } | } | ||||
| return multires_make_derived_from_derived(dm, &mmd, scene, ob, flags); | return multires_make_derived_from_derived(dm, &mmd, scene, ob, flags); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 307 Lines • ▼ Show 20 Lines | if (lvl < totlvl) { | ||||
| /* TODO: use mesh_deform_eval when sculpting on deformed mesh. */ | /* TODO: use mesh_deform_eval when sculpting on deformed mesh. */ | ||||
| cddm = CDDM_from_mesh(me); | cddm = CDDM_from_mesh(me); | ||||
| DM_set_only_copy(cddm, &CD_MASK_BAREMESH); | DM_set_only_copy(cddm, &CD_MASK_BAREMESH); | ||||
| highdm = subsurf_dm_create_local(scene, | highdm = subsurf_dm_create_local(scene, | ||||
| ob, | ob, | ||||
| cddm, | cddm, | ||||
| totlvl, | totlvl, | ||||
| mmd->simple, | false, | ||||
| 0, | 0, | ||||
| mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | ||||
| has_mask, | has_mask, | ||||
| false, | false, | ||||
| SUBSURF_IGNORE_SIMPLIFY); | SUBSURF_IGNORE_SIMPLIFY); | ||||
| ss = ((CCGDerivedMesh *)highdm)->ss; | ss = ((CCGDerivedMesh *)highdm)->ss; | ||||
| /* create multires DM from original mesh and displacements */ | /* create multires DM from original mesh and displacements */ | ||||
| lowdm = multires_dm_create_local( | lowdm = multires_dm_create_local( | ||||
| scene, ob, cddm, lvl, totlvl, mmd->simple, has_mask, MULTIRES_IGNORE_SIMPLIFY); | scene, ob, cddm, lvl, totlvl, has_mask, MULTIRES_IGNORE_SIMPLIFY); | ||||
| cddm->release(cddm); | cddm->release(cddm); | ||||
| /* gather grid data */ | /* gather grid data */ | ||||
| numGrids = highdm->getNumGrids(highdm); | numGrids = highdm->getNumGrids(highdm); | ||||
| highGridSize = highdm->getGridSize(highdm); | highGridSize = highdm->getGridSize(highdm); | ||||
| highGridData = highdm->getGridData(highdm); | highGridData = highdm->getGridData(highdm); | ||||
| highdm->getGridKey(highdm, &highGridKey); | highdm->getGridKey(highdm, &highGridKey); | ||||
| lowGridSize = lowdm->getGridSize(lowdm); | lowGridSize = lowdm->getGridSize(lowdm); | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | else { | ||||
| /* TODO: use mesh_deform_eval when sculpting on deformed mesh. */ | /* TODO: use mesh_deform_eval when sculpting on deformed mesh. */ | ||||
| cddm = CDDM_from_mesh(me); | cddm = CDDM_from_mesh(me); | ||||
| DM_set_only_copy(cddm, &CD_MASK_BAREMESH); | DM_set_only_copy(cddm, &CD_MASK_BAREMESH); | ||||
| subdm = subsurf_dm_create_local(scene, | subdm = subsurf_dm_create_local(scene, | ||||
| ob, | ob, | ||||
| cddm, | cddm, | ||||
| mmd->totlvl, | mmd->totlvl, | ||||
| mmd->simple, | false, | ||||
| 0, | 0, | ||||
| mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | ||||
| has_mask, | has_mask, | ||||
| false, | false, | ||||
| SUBSURF_IGNORE_SIMPLIFY); | SUBSURF_IGNORE_SIMPLIFY); | ||||
| cddm->release(cddm); | cddm->release(cddm); | ||||
| multiresModifier_disp_run( | multiresModifier_disp_run( | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | DerivedMesh *multires_make_derived_from_derived( | ||||
| } | } | ||||
| const int subsurf_flags = ignore_simplify ? SUBSURF_IGNORE_SIMPLIFY : 0; | const int subsurf_flags = ignore_simplify ? SUBSURF_IGNORE_SIMPLIFY : 0; | ||||
| result = subsurf_dm_create_local(scene, | result = subsurf_dm_create_local(scene, | ||||
| ob, | ob, | ||||
| dm, | dm, | ||||
| lvl, | lvl, | ||||
| mmd->simple, | false, | ||||
| mmd->flags & eMultiresModifierFlag_ControlEdges, | mmd->flags & eMultiresModifierFlag_ControlEdges, | ||||
| mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, | ||||
| flags & MULTIRES_ALLOC_PAINT_MASK, | flags & MULTIRES_ALLOC_PAINT_MASK, | ||||
| render, | render, | ||||
| subsurf_flags); | subsurf_flags); | ||||
| if (!(flags & MULTIRES_USE_LOCAL_MMD)) { | if (!(flags & MULTIRES_USE_LOCAL_MMD)) { | ||||
| ccgdm = (CCGDerivedMesh *)result; | ccgdm = (CCGDerivedMesh *)result; | ||||
| ▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | void multiresModifier_sync_levels_ex(Object *ob_dst, | ||||
| MultiresModifierData *mmd_src, | MultiresModifierData *mmd_src, | ||||
| MultiresModifierData *mmd_dst) | MultiresModifierData *mmd_dst) | ||||
| { | { | ||||
| if (mmd_src->totlvl == mmd_dst->totlvl) { | if (mmd_src->totlvl == mmd_dst->totlvl) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (mmd_src->totlvl > mmd_dst->totlvl) { | if (mmd_src->totlvl > mmd_dst->totlvl) { | ||||
| if (mmd_dst->simple) { | |||||
| multiresModifier_subdivide_to_level( | |||||
| ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_SIMPLE); | |||||
| } | |||||
| else { | |||||
| multiresModifier_subdivide_to_level( | multiresModifier_subdivide_to_level( | ||||
| ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_CATMULL_CLARK); | ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_CATMULL_CLARK); | ||||
| } | } | ||||
| } | |||||
| else { | else { | ||||
| multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl); | multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl); | ||||
| } | } | ||||
| } | } | ||||
| static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst) | static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst) | ||||
| { | { | ||||
| MultiresModifierData *mmd_src = get_multires_modifier(scene, ob_src, true); | MultiresModifierData *mmd_src = get_multires_modifier(scene, ob_src, true); | ||||
| ▲ Show 20 Lines • Show All 272 Lines • Show Last 20 Lines | |||||