Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r--source/blender/blenkernel/intern/multires.c132
1 files changed, 53 insertions, 79 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index e7c36685c42..55f11604710 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -60,8 +60,6 @@
#include "BKE_object.h"
-#include "DEG_depsgraph.h"
-
#include "CCGSubSurf.h"
#include <math.h>
@@ -338,13 +336,12 @@ MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_f
return mmd;
}
-static int multires_get_level(
- MultiresModifierData *mmd,
- bool render, bool ignore_simplify, eObjectMode object_mode)
+static int multires_get_level(Object *ob, MultiresModifierData *mmd,
+ bool render, bool ignore_simplify)
{
if (render)
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl, true) : mmd->renderlvl;
- else if (object_mode == OB_MODE_SCULPT)
+ else if (ob->mode == OB_MODE_SCULPT)
return mmd->sculptlvl;
else if (ignore_simplify)
return mmd->lvl;
@@ -352,13 +349,12 @@ static int multires_get_level(
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl, false) : mmd->lvl;
}
-void multires_set_tot_level(MultiresModifierData *mmd, int lvl, eObjectMode object_mode)
+void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
{
mmd->totlvl = lvl;
- if (object_mode != OB_MODE_SCULPT) {
+ if (ob->mode != OB_MODE_SCULPT)
mmd->lvl = CLAMPIS(MAX2(mmd->lvl, lvl), 0, mmd->totlvl);
- }
mmd->sculptlvl = CLAMPIS(MAX2(mmd->sculptlvl, lvl), 0, mmd->totlvl);
mmd->renderlvl = CLAMPIS(MAX2(mmd->renderlvl, lvl), 0, mmd->totlvl);
@@ -396,9 +392,9 @@ void multires_force_external_reload(Object *ob)
multires_force_update(ob);
}
-void multires_force_render_update(Object *ob, eObjectMode object_mode)
+void multires_force_render_update(Object *ob)
{
- if (ob && (object_mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires))
+ if (ob && (ob->mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires))
multires_force_update(ob);
}
@@ -438,7 +434,7 @@ int multiresModifier_reshapeFromDeformMod(const struct EvaluationContext *eval_c
int numVerts, result;
float (*deformedVerts)[3];
- if (multires_get_level(mmd, false, true, eval_ctx->object_mode) == 0)
+ if (multires_get_level(ob, mmd, false, true) == 0)
return 0;
/* Create DerivedMesh for deformation modifier */
@@ -618,7 +614,7 @@ static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, int level)
}
}
-static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl, eObjectMode object_mode)
+static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
{
Mesh *me = (Mesh *)ob->data;
int levels = mmd->totlvl - lvl;
@@ -680,14 +676,14 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl,
}
}
- multires_set_tot_level(mmd, lvl, object_mode);
+ multires_set_tot_level(ob, mmd, lvl);
}
/* (direction = 1) for delete higher, (direction = 0) for lower (not implemented yet) */
-void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction, eObjectMode object_mode)
+void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
{
Mesh *me = BKE_mesh_from_object(ob);
- int lvl = multires_get_level(mmd, false, true, object_mode);
+ int lvl = multires_get_level(ob, mmd, false, true);
int levels = mmd->totlvl - lvl;
MDisps *mdisps;
@@ -698,14 +694,13 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire
multires_force_update(ob);
if (mdisps && levels > 0 && direction == 1) {
- multires_del_higher(mmd, ob, lvl, object_mode);
+ multires_del_higher(mmd, ob, lvl);
}
- multires_set_tot_level(mmd, lvl, object_mode);
+ multires_set_tot_level(ob, mmd, lvl);
}
-static DerivedMesh *multires_dm_create_local(
- Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask, eObjectMode object_mode)
+static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask)
{
MultiresModifierData mmd = {{NULL}};
MultiresFlags flags = MULTIRES_USE_LOCAL_MMD;
@@ -719,12 +714,10 @@ static DerivedMesh *multires_dm_create_local(
if (alloc_paint_mask)
flags |= MULTIRES_ALLOC_PAINT_MASK;
- return multires_make_derived_from_derived(dm, &mmd, ob, flags, object_mode);
+ return multires_make_derived_from_derived(dm, &mmd, ob, flags);
}
-static DerivedMesh *subsurf_dm_create_local(
- DerivedMesh *dm, int lvl, int simple,
- int optimal, int plain_uv, int alloc_paint_mask, eObjectMode object_mode)
+static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv, int alloc_paint_mask)
{
SubsurfModifierData smd = {{NULL}};
SubsurfFlags flags = 0;
@@ -737,7 +730,7 @@ static DerivedMesh *subsurf_dm_create_local(
if (optimal)
smd.flags |= eSubsurfModifierFlag_ControlEdges;
- if (object_mode & OB_MODE_EDIT)
+ if (ob->mode & OB_MODE_EDIT)
flags |= SUBSURF_IN_EDIT_MODE;
if (alloc_paint_mask)
@@ -757,7 +750,7 @@ static float v3_dist_from_plane(float v[3], float center[3], float no[3])
return dot_v3v3(s, no);
}
-void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectMode object_mode)
+void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
{
DerivedMesh *cddm, *dispdm, *origdm;
Mesh *me;
@@ -779,7 +772,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
/* generate highest level with displacements */
cddm = CDDM_from_mesh(me);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0, 0, object_mode);
+ dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0, 0);
cddm->release(cddm);
/* copy the new locations of the base verts into the mesh */
@@ -875,9 +868,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
/* subdivide the mesh to highest level without displacements */
cddm = CDDM_from_mesh(me);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- origdm = subsurf_dm_create_local(
- cddm, totlvl, 0,
- 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode);
+ origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
cddm->release(cddm);
/* calc disps */
@@ -887,8 +878,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
dispdm->release(dispdm);
}
-static void multires_subdivide(
- MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple, eObjectMode object_mode)
+static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple)
{
Mesh *me = ob->data;
MDisps *mdisps;
@@ -917,13 +907,11 @@ static void multires_subdivide(
/* create subsurf DM from original mesh at high level */
cddm = CDDM_from_mesh(me);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- highdm = subsurf_dm_create_local(
- cddm, totlvl, simple,
- 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
+ highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
ss = ((CCGDerivedMesh *)highdm)->ss;
/* create multires DM from original mesh at low level */
- lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple, has_mask, object_mode);
+ lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple, has_mask);
BLI_assert(lowdm != cddm);
cddm->release(cddm);
@@ -970,13 +958,12 @@ static void multires_subdivide(
multires_reallocate_mdisps(me->totloop, mdisps, totlvl);
}
- multires_set_tot_level(mmd, totlvl, object_mode);
+ multires_set_tot_level(ob, mmd, totlvl);
}
-void multiresModifier_subdivide(
- MultiresModifierData *mmd, Object *ob, int updateblock, int simple, eObjectMode object_mode)
+void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
{
- multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple, object_mode);
+ multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple);
}
static void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
@@ -1209,7 +1196,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm
}
}
-void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_mode)
+void multires_modifier_update_mdisps(struct DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
Object *ob;
@@ -1241,13 +1228,11 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_
else cddm = CDDM_from_mesh(me);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- highdm = subsurf_dm_create_local(
- cddm, totlvl, mmd->simple,
- 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
+ highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
ss = ((CCGDerivedMesh *)highdm)->ss;
/* create multires DM from original mesh and displacements */
- lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple, has_mask, object_mode);
+ lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple, has_mask);
cddm->release(cddm);
/* gather grid data */
@@ -1305,9 +1290,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_
else cddm = CDDM_from_mesh(me);
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
- subdm = subsurf_dm_create_local(
- cddm, mmd->totlvl, mmd->simple,
- 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
+ subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
cddm->release(cddm);
multiresModifier_disp_run(dm, me, NULL, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl);
@@ -1349,7 +1332,7 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
}
}
-void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to, eObjectMode object_mode)
+void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
{
DerivedMesh *ccgdm = NULL, *subsurf = NULL;
CCGElem **gridData, **subGridData = NULL;
@@ -1370,11 +1353,10 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to, eObjectMo
}
totlvl = mmd->totlvl;
- ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false, object_mode);
+ ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false);
- subsurf = subsurf_dm_create_local(
- dm, totlvl, mmd->simple,
- mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode);
+ subsurf = subsurf_dm_create_local(ob, dm, totlvl,
+ mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
numGrids = subsurf->getNumGrids(subsurf);
gridSize = subsurf->getGridSize(subsurf);
@@ -1489,12 +1471,10 @@ void multires_stitch_grids(Object *ob)
}
}
-DerivedMesh *multires_make_derived_from_derived(
- DerivedMesh *dm,
- MultiresModifierData *mmd,
- Object *ob,
- MultiresFlags flags,
- eObjectMode object_mode)
+DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm,
+ MultiresModifierData *mmd,
+ Object *ob,
+ MultiresFlags flags)
{
Mesh *me = ob->data;
DerivedMesh *result;
@@ -1503,18 +1483,16 @@ DerivedMesh *multires_make_derived_from_derived(
CCGKey key;
const bool render = (flags & MULTIRES_USE_RENDER_PARAMS) != 0;
const bool ignore_simplify = (flags & MULTIRES_IGNORE_SIMPLIFY) != 0;
- int lvl = multires_get_level(mmd, render, ignore_simplify, object_mode);
+ int lvl = multires_get_level(ob, mmd, render, ignore_simplify);
int i, gridSize, numGrids;
if (lvl == 0)
return dm;
- result = subsurf_dm_create_local(
- dm, lvl, mmd->simple,
- mmd->flags & eMultiresModifierFlag_ControlEdges,
- mmd->flags & eMultiresModifierFlag_PlainUv,
- flags & MULTIRES_ALLOC_PAINT_MASK,
- object_mode);
+ result = subsurf_dm_create_local(ob, dm, lvl,
+ mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges,
+ mmd->flags & eMultiresModifierFlag_PlainUv,
+ flags & MULTIRES_ALLOC_PAINT_MASK);
if (!(flags & MULTIRES_USE_LOCAL_MMD)) {
ccgdm = (CCGDerivedMesh *)result;
@@ -2142,7 +2120,6 @@ void multires_load_old(Object *ob, Mesh *me)
DerivedMesh *dm, *orig;
CustomDataLayer *l;
int i;
- const eObjectMode object_mode = OB_MODE_OBJECT;
/* Load original level into the mesh */
lvl = me->mr->levels.first;
@@ -2191,7 +2168,7 @@ void multires_load_old(Object *ob, Mesh *me)
BLI_insertlinkbefore(&ob->modifiers, md, mmd);
for (i = 0; i < me->mr->level_count - 1; ++i)
- multiresModifier_subdivide(mmd, ob, 1, 0, object_mode);
+ multiresModifier_subdivide(mmd, ob, 1, 0);
mmd->lvl = mmd->totlvl;
orig = CDDM_from_mesh(me);
@@ -2200,7 +2177,7 @@ void multires_load_old(Object *ob, Mesh *me)
* reference subsurfed dm with this option, before calling multiresModifier_disp_run(),
* which implicitly expects both subsurfs from its first dm and oldGridData parameters to
* be of the same "format"! */
- dm = multires_make_derived_from_derived(orig, mmd, ob, 0, object_mode);
+ dm = multires_make_derived_from_derived(orig, mmd, ob, 0);
multires_load_old_dm(dm, me, mmd->totlvl + 1);
@@ -2215,22 +2192,21 @@ void multires_load_old(Object *ob, Mesh *me)
/* If 'ob_src' and 'ob_dst' both have multires modifiers, synchronize them
* such that 'ob_dst' has the same total number of levels as 'ob_src'. */
-void multiresModifier_sync_levels_ex(
- Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst, eObjectMode object_mode)
+void multiresModifier_sync_levels_ex(Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst)
{
if (mmd_src->totlvl == mmd_dst->totlvl) {
return;
}
if (mmd_src->totlvl > mmd_dst->totlvl) {
- multires_subdivide(mmd_dst, ob_dst, mmd_src->totlvl, false, mmd_dst->simple, object_mode);
+ multires_subdivide(mmd_dst, ob_dst, mmd_src->totlvl, false, mmd_dst->simple);
}
else {
- multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl, object_mode);
+ multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl);
}
}
-static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst, eObjectMode object_mode)
+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_dst = get_multires_modifier(scene, ob_dst, true);
@@ -2245,7 +2221,7 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst, e
}
if (mmd_src && mmd_dst) {
- multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst, object_mode);
+ multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst);
}
}
@@ -2338,9 +2314,7 @@ static void multires_apply_smat(const struct EvaluationContext *eval_ctx, Scene
MEM_freeN(vertCos);
/* scaled ccgDM for tangent space of object with applied scale */
- dm = subsurf_dm_create_local(
- cddm, high_mmd.totlvl, high_mmd.simple,
- 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, eval_ctx->object_mode);
+ dm = subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
cddm->release(cddm);
gridSize = dm->getGridSize(dm);
@@ -2403,7 +2377,7 @@ void multiresModifier_scale_disp(const struct EvaluationContext *eval_ctx, Scene
void multiresModifier_prepare_join(const struct EvaluationContext *eval_ctx, Scene *scene, Object *ob, Object *to_ob)
{
float smat[3][3], tmat[3][3], mat[3][3];
- multires_sync_levels(scene, to_ob, ob, eval_ctx->object_mode);
+ multires_sync_levels(scene, to_ob, ob);
/* construct scale matrix for displacement */
BKE_object_scale_to_mat3(to_ob, tmat);