Cleanup: Move multires.c to C++

This commit is contained in:
Hans Goudey 2022-10-05 20:51:05 -05:00
parent dc93235797
commit 0f224ceedb
5 changed files with 141 additions and 129 deletions

View File

@ -127,6 +127,7 @@ typedef enum ModifierApplyFlag {
* See `OBJECT_OT_modifier_apply` operator. */
MOD_APPLY_TO_BASE_MESH = 1 << 4,
} ModifierApplyFlag;
ENUM_OPERATORS(ModifierApplyFlag, MOD_APPLY_TO_BASE_MESH);
typedef struct ModifierUpdateDepsgraphContext {
struct Scene *scene;

View File

@ -8,7 +8,7 @@
*/
#include "BKE_subsurf.h"
#include "BLI_compiler_compat.h"
#include "BLI_utildefines.h"
#ifdef __cplusplus
extern "C" {
@ -53,12 +53,13 @@ void multires_modifier_update_hidden(struct DerivedMesh *dm);
*/
void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob);
typedef enum {
typedef enum MultiresFlags {
MULTIRES_USE_LOCAL_MMD = 1,
MULTIRES_USE_RENDER_PARAMS = 2,
MULTIRES_ALLOC_PAINT_MASK = 4,
MULTIRES_IGNORE_SIMPLIFY = 8,
} MultiresFlags;
ENUM_OPERATORS(MultiresFlags, MULTIRES_IGNORE_SIMPLIFY);
struct DerivedMesh *multires_make_derived_from_derived(struct DerivedMesh *dm,
struct MultiresModifierData *mmd,

View File

@ -11,6 +11,7 @@
/* Thread sync primitives used directly. */
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#ifdef __cplusplus
extern "C" {
@ -32,7 +33,7 @@ struct SubsurfModifierData;
/**************************** External *****************************/
typedef enum {
typedef enum SubsurfFlags {
SUBSURF_USE_RENDER_PARAMS = 1,
SUBSURF_IS_FINAL_CALC = 2,
SUBSURF_FOR_EDIT_MODE = 4,
@ -41,6 +42,7 @@ typedef enum {
SUBSURF_USE_GPU_BACKEND = 32,
SUBSURF_IGNORE_SIMPLIFY = 64,
} SubsurfFlags;
ENUM_OPERATORS(SubsurfFlags, SUBSURF_IGNORE_SIMPLIFY);
struct DerivedMesh *subsurf_make_derived_from_derived(struct DerivedMesh *dm,
struct SubsurfModifierData *smd,

View File

@ -216,7 +216,7 @@ set(SRC
intern/mesh_wrapper.cc
intern/modifier.cc
intern/movieclip.c
intern/multires.c
intern/multires.cc
intern/multires_reshape.c
intern/multires_reshape_apply_base.c
intern/multires_reshape_ccg.c

View File

@ -43,8 +43,8 @@
#include "multires_reshape.h"
#include <math.h>
#include <string.h>
#include <cmath>
#include <cstring>
/* MULTIRES MODIFIER */
static const int multires_grid_tot[] = {
@ -53,11 +53,11 @@ static const int multires_side_tot[] = {
0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097};
/* See multiresModifier_disp_run for description of each operation */
typedef enum {
enum DispOp {
APPLY_DISPLACEMENTS,
CALC_DISPLACEMENTS,
ADD_DISPLACEMENTS,
} DispOp;
};
static void multiresModifier_disp_run(
DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl);
@ -107,7 +107,7 @@ static BLI_bitmap *multires_mdisps_upsample_hidden(BLI_bitmap *lo_hidden,
/* fast case */
if (lo_level == hi_level) {
return MEM_dupallocN(lo_hidden);
return static_cast<BLI_bitmap *>(MEM_dupallocN(lo_hidden));
}
subd = BLI_BITMAP_NEW(square_i(hi_gridsize), "MDisps.hidden upsample");
@ -184,7 +184,7 @@ static BLI_bitmap *multires_mdisps_downsample_hidden(const BLI_bitmap *old_hidde
static void multires_output_hidden_to_ccgdm(CCGDerivedMesh *ccgdm, Mesh *me, int level)
{
const MPoly *polys = BKE_mesh_polys(me);
const MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
const MDisps *mdisps = static_cast<const MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
BLI_bitmap **grid_hidden = ccgdm->gridHidden;
int *gridOffset;
int i, j;
@ -217,7 +217,7 @@ static void multires_mdisps_subdivide_hidden(MDisps *md, int new_level)
return;
}
subd = multires_mdisps_upsample_hidden(md->hidden, md->level, new_level, NULL);
subd = multires_mdisps_upsample_hidden(md->hidden, md->level, new_level, nullptr);
/* swap in the subdivided data */
MEM_freeN(md->hidden);
@ -232,13 +232,12 @@ Mesh *BKE_multires_create_mesh(struct Depsgraph *depsgraph,
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Mesh *deformed_mesh = mesh_get_eval_deform(
depsgraph, scene_eval, object_eval, &CD_MASK_BAREMESH);
ModifierEvalContext modifier_ctx = {
.depsgraph = depsgraph,
.object = object_eval,
.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY,
};
ModifierEvalContext modifier_ctx{};
modifier_ctx.depsgraph = depsgraph;
modifier_ctx.object = object_eval;
modifier_ctx.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY;
const ModifierTypeInfo *mti = BKE_modifier_get_info(mmd->modifier.type);
const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(mmd->modifier.type));
Mesh *result = mti->modifyMesh(&mmd->modifier, &modifier_ctx, deformed_mesh);
if (result == deformed_mesh) {
@ -255,12 +254,12 @@ float (*BKE_multires_create_deformed_base_mesh_vert_coords(struct Depsgraph *dep
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
Object object_for_eval = *object_eval;
Object object_for_eval = blender::dna::shallow_copy(*object_eval);
object_for_eval.data = object->data;
object_for_eval.sculpt = NULL;
object_for_eval.sculpt = nullptr;
const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
ModifierEvalContext mesh_eval_context = {depsgraph, &object_for_eval, 0};
ModifierEvalContext mesh_eval_context = {depsgraph, &object_for_eval, ModifierApplyFlag(0)};
if (use_render) {
mesh_eval_context.flag |= MOD_APPLY_RENDER;
}
@ -270,13 +269,13 @@ float (*BKE_multires_create_deformed_base_mesh_vert_coords(struct Depsgraph *dep
ModifierData *first_md = BKE_modifiers_get_virtual_modifierlist(&object_for_eval,
&virtual_modifier_data);
Mesh *base_mesh = object->data;
Mesh *base_mesh = static_cast<Mesh *>(object->data);
int num_deformed_verts;
float(*deformed_verts)[3] = BKE_mesh_vert_coords_alloc(base_mesh, &num_deformed_verts);
for (ModifierData *md = first_md; md != NULL; md = md->next) {
const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
for (ModifierData *md = first_md; md != nullptr; md = md->next) {
const ModifierTypeInfo *mti = BKE_modifier_get_info(ModifierType(md->type));
if (md == &mmd->modifier) {
break;
@ -294,7 +293,7 @@ float (*BKE_multires_create_deformed_base_mesh_vert_coords(struct Depsgraph *dep
md, &mesh_eval_context, base_mesh, deformed_verts, num_deformed_verts);
}
if (r_num_deformed_verts != NULL) {
if (r_num_deformed_verts != nullptr) {
*r_num_deformed_verts = num_deformed_verts;
}
return deformed_verts;
@ -312,16 +311,15 @@ MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *
}
}
return NULL;
return nullptr;
}
MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_first)
{
ModifierData *md;
MultiresModifierData *mmd = NULL, *firstmmd = NULL;
MultiresModifierData *mmd = nullptr, *firstmmd = nullptr;
/* find first active multires modifier */
for (md = ob->modifiers.first; md; md = md->next) {
LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
if (md->type == eModifierType_Multires) {
if (!firstmmd) {
firstmmd = (MultiresModifierData *)md;
@ -350,8 +348,8 @@ int multires_get_level(const Scene *scene,
bool ignore_simplify)
{
if (render) {
return (scene != NULL) ? get_render_subsurf_level(&scene->r, mmd->renderlvl, true) :
mmd->renderlvl;
return (scene != nullptr) ? get_render_subsurf_level(&scene->r, mmd->renderlvl, true) :
mmd->renderlvl;
}
if (ob->mode == OB_MODE_SCULPT) {
return mmd->sculptlvl;
@ -360,7 +358,7 @@ int multires_get_level(const Scene *scene,
return mmd->lvl;
}
return (scene != NULL) ? get_render_subsurf_level(&scene->r, mmd->lvl, false) : mmd->lvl;
return (scene != nullptr) ? get_render_subsurf_level(&scene->r, mmd->lvl, false) : mmd->lvl;
}
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
@ -387,7 +385,7 @@ static void multires_ccg_mark_as_modified(SubdivCCG *subdiv_ccg, MultiresModifie
void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, MultiresModifiedFlags flags)
{
if (object == NULL) {
if (object == nullptr) {
return;
}
/* NOTE: CCG live inside of evaluated object.
@ -398,9 +396,9 @@ void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, MultiresMod
*
* In a longer term maybe special dependency graph tag can help sanitizing this a bit. */
Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
Mesh *mesh = object_eval->data;
Mesh *mesh = static_cast<Mesh *>(object_eval->data);
SubdivCCG *subdiv_ccg = mesh->runtime.subdiv_ccg;
if (subdiv_ccg == NULL) {
if (subdiv_ccg == nullptr) {
return;
}
multires_ccg_mark_as_modified(subdiv_ccg, flags);
@ -408,18 +406,18 @@ void multires_mark_as_modified(Depsgraph *depsgraph, Object *object, MultiresMod
void multires_flush_sculpt_updates(Object *object)
{
if (object == NULL || object->sculpt == NULL || object->sculpt->pbvh == NULL) {
if (object == nullptr || object->sculpt == nullptr || object->sculpt->pbvh == nullptr) {
return;
}
SculptSession *sculpt_session = object->sculpt;
if (BKE_pbvh_type(sculpt_session->pbvh) != PBVH_GRIDS || !sculpt_session->multires.active ||
sculpt_session->multires.modifier == NULL) {
sculpt_session->multires.modifier == nullptr) {
return;
}
SubdivCCG *subdiv_ccg = sculpt_session->subdiv_ccg;
if (subdiv_ccg == NULL) {
if (subdiv_ccg == nullptr) {
return;
}
@ -427,7 +425,7 @@ void multires_flush_sculpt_updates(Object *object)
return;
}
Mesh *mesh = object->data;
Mesh *mesh = static_cast<Mesh *>(object->data);
multiresModifier_reshapeFromCCG(
sculpt_session->multires.modifier->totlvl, mesh, sculpt_session->subdiv_ccg);
@ -439,15 +437,15 @@ void multires_force_sculpt_rebuild(Object *object)
{
multires_flush_sculpt_updates(object);
if (object == NULL || object->sculpt == NULL) {
if (object == nullptr || object->sculpt == nullptr) {
return;
}
SculptSession *ss = object->sculpt;
if (ss->pbvh != NULL) {
if (ss->pbvh != nullptr) {
BKE_pbvh_free(ss->pbvh);
object->sculpt->pbvh = NULL;
object->sculpt->pbvh = nullptr;
}
MEM_SAFE_FREE(ss->pmap);
@ -466,15 +464,14 @@ void multires_force_external_reload(Object *object)
/* reset the multires levels to match the number of mdisps */
static int get_levels_from_disps(Object *ob)
{
Mesh *me = ob->data;
Mesh *me = static_cast<Mesh *>(ob->data);
const MPoly *polys = BKE_mesh_polys(me);
MDisps *mdisp, *md;
int i, j, totlvl = 0;
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
const MDisps *mdisp = static_cast<const MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
for (i = 0; i < me->totpoly; i++) {
md = mdisp + polys[i].loopstart;
const MDisps *md = mdisp + polys[i].loopstart;
for (j = 0; j < polys[i].totloop; j++, md++) {
if (md->totdisp == 0) {
@ -504,14 +501,15 @@ static int get_levels_from_disps(Object *ob)
void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
{
Mesh *me = ob->data;
MDisps *mdisp;
Mesh *me = static_cast<Mesh *>(ob->data);
const MDisps *mdisp;
if (me->edit_mesh) {
mdisp = CustomData_get_layer(&me->edit_mesh->bm->ldata, CD_MDISPS);
mdisp = static_cast<const MDisps *>(
CustomData_get_layer(&me->edit_mesh->bm->ldata, CD_MDISPS));
}
else {
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
mdisp = static_cast<const MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
}
if (mdisp) {
@ -524,7 +522,7 @@ void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *o
static void multires_set_tot_mdisps(Mesh *me, int lvl)
{
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
int i;
if (mdisps) {
@ -542,7 +540,8 @@ static void multires_reallocate_mdisps(int totloop, MDisps *mdisps, int lvl)
/* reallocate displacements to be filled in */
for (i = 0; i < totloop; i++) {
int totdisp = multires_grid_tot[lvl];
float(*disps)[3] = MEM_calloc_arrayN(totdisp, sizeof(float[3]), "multires disps");
float(*disps)[3] = static_cast<float(*)[3]>(
MEM_calloc_arrayN(totdisp, sizeof(float[3]), __func__));
if (mdisps[i].disps) {
MEM_freeN(mdisps[i].disps);
@ -616,8 +615,8 @@ static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, int level)
{
if (level < gpm->level) {
int gridsize = BKE_ccg_gridsize(level);
float *data = MEM_calloc_arrayN(
square_i(gridsize), sizeof(float), "multires_grid_paint_mask_downsample");
float *data = static_cast<float *>(
MEM_calloc_arrayN(square_i(gridsize), sizeof(float), __func__));
int x, y;
for (y = 0; y < gridsize; y++) {
@ -642,8 +641,8 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
multires_set_tot_mdisps(me, mmd->totlvl);
multiresModifier_ensure_external_read(me, mmd);
mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
gpm = CustomData_get_layer(&me->ldata, CD_GRID_PAINT_MASK);
mdisps = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
gpm = static_cast<GridPaintMask *>(CustomData_get_layer(&me->ldata, CD_GRID_PAINT_MASK));
multires_force_sculpt_rebuild(ob);
@ -661,9 +660,10 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
float(*disps)[3], (*ndisps)[3], (*hdisps)[3];
int totdisp = multires_grid_tot[lvl];
disps = MEM_calloc_arrayN(totdisp, sizeof(float[3]), "multires disps");
disps = static_cast<float(*)[3]>(
MEM_calloc_arrayN(totdisp, sizeof(float[3]), "multires disps"));
if (mdisp->disps != NULL) {
if (mdisp->disps != nullptr) {
ndisps = disps;
hdisps = mdisp->disps;
@ -703,11 +703,10 @@ void multiresModifier_del_levels(MultiresModifierData *mmd,
Mesh *me = BKE_mesh_from_object(ob);
int lvl = multires_get_level(scene, ob, mmd, false, true);
int levels = mmd->totlvl - lvl;
MDisps *mdisps;
multires_set_tot_mdisps(me, mmd->totlvl);
multiresModifier_ensure_external_read(me, mmd);
mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
multires_force_sculpt_rebuild(ob);
@ -724,9 +723,9 @@ static DerivedMesh *multires_dm_create_local(Scene *scene,
int lvl,
int totlvl,
bool alloc_paint_mask,
int flags)
MultiresFlags flags)
{
MultiresModifierData mmd = {{NULL}};
MultiresModifierData mmd = {{nullptr}};
mmd.lvl = lvl;
mmd.sculptlvl = lvl;
@ -752,7 +751,7 @@ static DerivedMesh *subsurf_dm_create_local(Scene *scene,
bool for_render,
SubsurfFlags flags)
{
SubsurfModifierData smd = {{NULL}};
SubsurfModifierData smd = {{nullptr}};
smd.levels = smd.renderLevels = lvl;
smd.quality = 3;
@ -779,7 +778,7 @@ static DerivedMesh *subsurf_dm_create_local(Scene *scene,
flags |= SUBSURF_USE_RENDER_PARAMS;
}
return subsurf_make_derived_from_derived(dm, &smd, scene, NULL, flags);
return subsurf_make_derived_from_derived(dm, &smd, scene, nullptr, flags);
}
static void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
@ -826,7 +825,7 @@ static void grid_tangent_matrix(float mat[3][3], const CCGKey *key, int x, int y
copy_v3_v3(mat[2], CCG_grid_elem_no(key, grid, x, y));
}
typedef struct MultiresThreadedData {
struct MultiresThreadedData {
DispOp op;
CCGElem **gridData, **subGridData;
CCGKey *key;
@ -837,13 +836,13 @@ typedef struct MultiresThreadedData {
int *gridOffset;
int gridSize, dGridSize, dSkip;
float (*smat)[3];
} MultiresThreadedData;
};
static void multires_disp_run_cb(void *__restrict userdata,
const int pidx,
const TaskParallelTLS *__restrict UNUSED(tls))
const TaskParallelTLS *__restrict /*tls*/)
{
MultiresThreadedData *tdata = userdata;
MultiresThreadedData *tdata = static_cast<MultiresThreadedData *>(userdata);
DispOp op = tdata->op;
CCGElem **gridData = tdata->gridData;
@ -861,11 +860,11 @@ static void multires_disp_run_cb(void *__restrict userdata,
int S, x, y, gIndex = gridOffset[pidx];
for (S = 0; S < numVerts; S++, gIndex++) {
GridPaintMask *gpm = grid_paint_mask ? &grid_paint_mask[gIndex] : NULL;
GridPaintMask *gpm = grid_paint_mask ? &grid_paint_mask[gIndex] : nullptr;
MDisps *mdisp = &mdisps[mpoly[pidx].loopstart + S];
CCGElem *grid = gridData[gIndex];
CCGElem *subgrid = subGridData[gIndex];
float(*dispgrid)[3] = NULL;
float(*dispgrid)[3] = nullptr;
dispgrid = mdisp->disps;
@ -875,7 +874,8 @@ static void multires_disp_run_cb(void *__restrict userdata,
if (gpm->data) {
MEM_freeN(gpm->data);
}
gpm->data = MEM_calloc_arrayN(key->grid_area, sizeof(float), "gpm.data");
gpm->data = static_cast<float *>(
MEM_calloc_arrayN(key->grid_area, sizeof(float), "gpm.data"));
}
for (y = 0; y < gridSize; y++) {
@ -943,16 +943,16 @@ static void multiresModifier_disp_run(
CCGElem **gridData, **subGridData;
CCGKey key;
const MPoly *mpoly = BKE_mesh_polys(me);
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
GridPaintMask *grid_paint_mask = NULL;
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
GridPaintMask *grid_paint_mask = nullptr;
int *gridOffset;
int i, gridSize, dGridSize, dSkip;
int totloop, totpoly;
/* this happens in the dm made by bmesh_mdisps_space_set */
if (dm2 && CustomData_has_layer(&dm2->loopData, CD_MDISPS)) {
mpoly = CustomData_get_layer(&dm2->polyData, CD_MPOLY);
mdisps = CustomData_get_layer(&dm2->loopData, CD_MDISPS);
mpoly = static_cast<const MPoly *>(CustomData_get_layer(&dm2->polyData, CD_MPOLY));
mdisps = static_cast<MDisps *>(CustomData_get_layer(&dm2->loopData, CD_MDISPS));
totloop = dm2->numLoopData;
totpoly = dm2->numPolyData;
}
@ -963,7 +963,8 @@ static void multiresModifier_disp_run(
if (!mdisps) {
if (op == CALC_DISPLACEMENTS) {
mdisps = CustomData_add_layer(&me->ldata, CD_MDISPS, CD_SET_DEFAULT, NULL, me->totloop);
mdisps = static_cast<MDisps *>(
CustomData_add_layer(&me->ldata, CD_MDISPS, CD_SET_DEFAULT, nullptr, me->totloop));
}
else {
return;
@ -982,12 +983,13 @@ static void multiresModifier_disp_run(
/* multires paint masks */
if (key.has_mask) {
grid_paint_mask = CustomData_get_layer(&me->ldata, CD_GRID_PAINT_MASK);
grid_paint_mask = static_cast<GridPaintMask *>(
CustomData_get_layer(&me->ldata, CD_GRID_PAINT_MASK));
}
/* when adding new faces in edit mode, need to allocate disps */
for (i = 0; i < totloop; i++) {
if (mdisps[i].disps == NULL) {
if (mdisps[i].disps == nullptr) {
multires_reallocate_mdisps(totloop, mdisps, totlvl);
break;
}
@ -997,25 +999,24 @@ static void multiresModifier_disp_run(
BLI_parallel_range_settings_defaults(&settings);
settings.min_iter_per_thread = CCG_TASK_LIMIT;
MultiresThreadedData data = {
.op = op,
.gridData = gridData,
.subGridData = subGridData,
.key = &key,
.mpoly = mpoly,
.mdisps = mdisps,
.grid_paint_mask = grid_paint_mask,
.gridOffset = gridOffset,
.gridSize = gridSize,
.dGridSize = dGridSize,
.dSkip = dSkip,
};
MultiresThreadedData data{};
data.op = op;
data.gridData = gridData;
data.subGridData = subGridData;
data.key = &key;
data.mpoly = mpoly;
data.mdisps = mdisps;
data.grid_paint_mask = grid_paint_mask;
data.gridOffset = gridOffset;
data.gridSize = gridSize;
data.dGridSize = dGridSize;
data.dSkip = dSkip;
BLI_task_parallel_range(0, totpoly, &data, multires_disp_run_cb, &settings);
if (op == APPLY_DISPLACEMENTS) {
ccgSubSurf_stitchFaces(ccgdm->ss, 0, NULL, 0);
ccgSubSurf_updateNormals(ccgdm->ss, NULL, 0);
ccgSubSurf_stitchFaces(ccgdm->ss, 0, nullptr, 0);
ccgSubSurf_updateNormals(ccgdm->ss, nullptr, 0);
}
}
@ -1028,11 +1029,11 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene)
MultiresModifierData *mmd;
ob = ccgdm->multires.ob;
me = ccgdm->multires.ob->data;
me = static_cast<Mesh *>(ccgdm->multires.ob->data);
mmd = ccgdm->multires.mmd;
multires_set_tot_mdisps(me, mmd->totlvl);
multiresModifier_ensure_external_read(me, mmd);
mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
mdisps = static_cast<const MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
if (mdisps) {
int lvl = ccgdm->multires.lvl;
@ -1080,13 +1081,15 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene)
BLI_assert(highGridKey.elem_size == lowGridKey.elem_size);
subGridData = MEM_calloc_arrayN(numGrids, sizeof(CCGElem *), "subGridData*");
diffGrid = MEM_calloc_arrayN(lowGridKey.elem_size, lowGridSize * lowGridSize, "diff");
subGridData = static_cast<CCGElem **>(
MEM_calloc_arrayN(numGrids, sizeof(CCGElem *), "subGridData*"));
diffGrid = static_cast<CCGElem *>(
MEM_calloc_arrayN(lowGridKey.elem_size, lowGridSize * lowGridSize, "diff"));
for (i = 0; i < numGrids; i++) {
/* backup subsurf grids */
subGridData[i] = MEM_calloc_arrayN(
highGridKey.elem_size, highGridSize * highGridSize, "subGridData");
subGridData[i] = static_cast<CCGElem *>(
MEM_calloc_arrayN(highGridKey.elem_size, highGridSize * highGridSize, "subGridData"));
memcpy(
subGridData[i], highGridData[i], highGridKey.elem_size * highGridSize * highGridSize);
@ -1105,11 +1108,11 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene)
lowdm->release(lowdm);
/* subsurf higher levels again with difference of coordinates */
ccgSubSurf_updateFromFaces(ss, lvl, NULL, 0);
ccgSubSurf_updateLevels(ss, lvl, NULL, 0);
ccgSubSurf_updateFromFaces(ss, lvl, nullptr, 0);
ccgSubSurf_updateLevels(ss, lvl, nullptr, 0);
/* add to displacements */
multiresModifier_disp_run(highdm, me, NULL, ADD_DISPLACEMENTS, subGridData, mmd->totlvl);
multiresModifier_disp_run(highdm, me, nullptr, ADD_DISPLACEMENTS, subGridData, mmd->totlvl);
/* free */
highdm->release(highdm);
@ -1139,7 +1142,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene)
cddm->release(cddm);
multiresModifier_disp_run(
dm, me, NULL, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl);
dm, me, nullptr, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl);
subdm->release(subdm);
}
@ -1150,8 +1153,8 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
BLI_bitmap **grid_hidden = ccgdm->gridHidden;
Mesh *me = ccgdm->multires.ob->data;
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
Mesh *me = static_cast<Mesh *>(ccgdm->multires.ob->data);
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
int totlvl = ccgdm->multires.totlvl;
int lvl = ccgdm->multires.lvl;
@ -1164,7 +1167,7 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
if (!gh && md->hidden) {
MEM_freeN(md->hidden);
md->hidden = NULL;
md->hidden = nullptr;
}
else if (gh) {
gh = multires_mdisps_upsample_hidden(gh, lvl, totlvl, md->hidden);
@ -1180,16 +1183,16 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
void multires_stitch_grids(Object *ob)
{
if (ob == NULL) {
if (ob == nullptr) {
return;
}
SculptSession *sculpt_session = ob->sculpt;
if (sculpt_session == NULL) {
if (sculpt_session == nullptr) {
return;
}
PBVH *pbvh = sculpt_session->pbvh;
SubdivCCG *subdiv_ccg = sculpt_session->subdiv_ccg;
if (pbvh == NULL || subdiv_ccg == NULL) {
if (pbvh == nullptr || subdiv_ccg == nullptr) {
return;
}
BLI_assert(BKE_pbvh_type(pbvh) == PBVH_GRIDS);
@ -1208,9 +1211,9 @@ void multires_stitch_grids(Object *ob)
DerivedMesh *multires_make_derived_from_derived(
DerivedMesh *dm, MultiresModifierData *mmd, Scene *scene, Object *ob, MultiresFlags flags)
{
Mesh *me = ob->data;
Mesh *me = static_cast<Mesh *>(ob->data);
DerivedMesh *result;
CCGDerivedMesh *ccgdm = NULL;
CCGDerivedMesh *ccgdm = nullptr;
CCGElem **gridData, **subGridData;
CCGKey key;
const bool render = (flags & MULTIRES_USE_RENDER_PARAMS) != 0;
@ -1222,7 +1225,7 @@ DerivedMesh *multires_make_derived_from_derived(
return dm;
}
const int subsurf_flags = ignore_simplify ? SUBSURF_IGNORE_SIMPLIFY : 0;
const SubsurfFlags subsurf_flags = ignore_simplify ? SUBSURF_IGNORE_SIMPLIFY : SubsurfFlags(0);
result = subsurf_dm_create_local(scene,
ob,
@ -1243,7 +1246,7 @@ DerivedMesh *multires_make_derived_from_derived(
ccgdm->multires.local_mmd = 0;
ccgdm->multires.lvl = lvl;
ccgdm->multires.totlvl = mmd->totlvl;
ccgdm->multires.modified_flags = 0;
ccgdm->multires.modified_flags = MultiresModifiedFlags(0);
}
numGrids = result->getNumGrids(result);
@ -1251,10 +1254,12 @@ DerivedMesh *multires_make_derived_from_derived(
gridData = result->getGridData(result);
result->getGridKey(result, &key);
subGridData = MEM_malloc_arrayN(numGrids, sizeof(CCGElem *), "subGridData*");
subGridData = static_cast<CCGElem **>(
MEM_malloc_arrayN(numGrids, sizeof(CCGElem *), "subGridData*"));
for (i = 0; i < numGrids; i++) {
subGridData[i] = MEM_malloc_arrayN(key.elem_size, gridSize * gridSize, "subGridData");
subGridData[i] = static_cast<CCGElem *>(
MEM_malloc_arrayN(key.elem_size, gridSize * gridSize, "subGridData"));
memcpy(subGridData[i], gridData[i], key.elem_size * gridSize * gridSize);
}
@ -1262,7 +1267,8 @@ DerivedMesh *multires_make_derived_from_derived(
multiresModifier_ensure_external_read(me, mmd);
/* Run displacement. */
multiresModifier_disp_run(result, ob->data, dm, APPLY_DISPLACEMENTS, subGridData, mmd->totlvl);
multiresModifier_disp_run(
result, static_cast<Mesh *>(ob->data), dm, APPLY_DISPLACEMENTS, subGridData, mmd->totlvl);
/* copy hidden elements for this level */
if (ccgdm) {
@ -1358,7 +1364,7 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
* up-sampled correct without modifier data.
* just remove mdisps if no multires present (nazgul) */
multires_customdata_delete(ob_src->data);
multires_customdata_delete(static_cast<Mesh *>(ob_src->data));
}
if (mmd_src && mmd_dst) {
@ -1369,7 +1375,7 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
static void multires_apply_uniform_scale(Object *object, const float scale)
{
Mesh *mesh = (Mesh *)object->data;
MDisps *mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&mesh->ldata, CD_MDISPS));
for (int i = 0; i < mesh->totloop; i++) {
MDisps *grid = &mdisps[i];
for (int j = 0; j < grid->totdisp; j++) {
@ -1378,13 +1384,13 @@ static void multires_apply_uniform_scale(Object *object, const float scale)
}
}
static void multires_apply_smat(struct Depsgraph *UNUSED(depsgraph),
static void multires_apply_smat(struct Depsgraph * /*depsgraph*/,
Scene *scene,
Object *object,
const float smat[3][3])
{
const MultiresModifierData *mmd = get_multires_modifier(scene, object, true);
if (mmd == NULL || mmd->totlvl == 0) {
if (mmd == nullptr || mmd->totlvl == 0) {
return;
}
/* Make sure layer present. */
@ -1450,11 +1456,11 @@ void multiresModifier_prepare_join(struct Depsgraph *depsgraph,
void multires_topology_changed(Mesh *me)
{
MDisps *mdisp = NULL, *cur = NULL;
MDisps *mdisp = nullptr, *cur = nullptr;
int i, grid = 0;
CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop);
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
mdisp = static_cast<MDisps *>(CustomData_get_layer(&me->ldata, CD_MDISPS));
if (!mdisp) {
return;
@ -1474,7 +1480,8 @@ void multires_topology_changed(Mesh *me)
if (!mdisp->totdisp || !mdisp->disps) {
if (grid) {
mdisp->totdisp = grid;
mdisp->disps = MEM_calloc_arrayN(mdisp->totdisp, sizeof(float[3]), "mdisp topology");
mdisp->disps = static_cast<float(*)[3]>(
MEM_calloc_arrayN(mdisp->totdisp, sizeof(float[3]), "mdisp topology"));
}
continue;
@ -1488,9 +1495,10 @@ void multires_ensure_external_read(struct Mesh *mesh, int top_level)
return;
}
MDisps *mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
if (mdisps == NULL) {
mdisps = CustomData_add_layer(&mesh->ldata, CD_MDISPS, CD_SET_DEFAULT, NULL, mesh->totloop);
MDisps *mdisps = static_cast<MDisps *>(CustomData_get_layer(&mesh->ldata, CD_MDISPS));
if (mdisps == nullptr) {
mdisps = static_cast<MDisps *>(
CustomData_add_layer(&mesh->ldata, CD_MDISPS, CD_SET_DEFAULT, nullptr, mesh->totloop));
}
const int totloop = mesh->totloop;
@ -1517,10 +1525,10 @@ void multiresModifier_ensure_external_read(struct Mesh *mesh, const MultiresModi
/***************** Multires interpolation stuff *****************/
int mdisp_rot_face_to_crn(struct MVert *UNUSED(mvert),
int mdisp_rot_face_to_crn(struct MVert * /*mvert*/,
struct MPoly *mpoly,
struct MLoop *UNUSED(mloop),
const struct MLoopTri *UNUSED(lt),
struct MLoop * /*mloop*/,
const struct MLoopTri * /*lt*/,
const int face_side,
const float u,
const float v,
@ -1598,7 +1606,7 @@ int mdisp_rot_face_to_crn(struct MVert *UNUSED(mvert),
float mindist = FLT_MAX;
for (i = 0; i < mpoly->totloop; i++) {
float len = len_v3v3(NULL, mvert[mloop[mpoly->loopstart + i].v].co);
float len = len_v3v3(nullptr, mvert[mloop[mpoly->loopstart + i].v].co);
if (len < mindist) {
mindist = len;
minS = i;