Blender  V3.3
MOD_multires.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2005 Blender Foundation. All rights reserved. */
3 
8 #include <stddef.h>
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "BLI_utildefines.h"
13 
14 #include "BLT_translation.h"
15 
16 #include "DNA_defaults.h"
17 #include "DNA_mesh_types.h"
18 #include "DNA_object_types.h"
19 #include "DNA_scene_types.h"
20 #include "DNA_screen_types.h"
21 
22 #include "BKE_cdderivedmesh.h"
23 #include "BKE_context.h"
24 #include "BKE_mesh.h"
25 #include "BKE_modifier.h"
26 #include "BKE_multires.h"
27 #include "BKE_paint.h"
28 #include "BKE_screen.h"
29 #include "BKE_subdiv.h"
30 #include "BKE_subdiv_ccg.h"
31 #include "BKE_subdiv_deform.h"
32 #include "BKE_subdiv_mesh.h"
33 #include "BKE_subsurf.h"
34 
35 #include "UI_interface.h"
36 #include "UI_resources.h"
37 
38 #include "RNA_access.h"
39 #include "RNA_prototypes.h"
40 
41 #include "WM_types.h" /* For subdivide operator UI. */
42 
43 #include "DEG_depsgraph_query.h"
44 
45 #include "MOD_modifiertypes.h"
46 #include "MOD_ui_common.h"
47 
48 typedef struct MultiresRuntimeData {
49  /* Cached subdivision surface descriptor, with topology and settings. */
50  struct Subdiv *subdiv;
52 
53 static void initData(ModifierData *md)
54 {
56 
58 
60 
61  /* Open subdivision panels by default. */
63 }
64 
65 static void requiredDataMask(Object *UNUSED(ob),
66  ModifierData *md,
67  CustomData_MeshMasks *r_cddata_masks)
68 {
71  r_cddata_masks->lmask |= CD_MASK_NORMAL;
72  r_cddata_masks->lmask |= CD_MASK_CUSTOMLOOPNORMAL;
73  }
74 }
75 
77 {
80  return true;
81  }
82  return false;
83 }
84 
85 static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
86 {
87  BKE_modifier_copydata_generic(md_src, md_dst, flag);
88 }
89 
90 static void freeRuntimeData(void *runtime_data_v)
91 {
92  if (runtime_data_v == NULL) {
93  return;
94  }
95  MultiresRuntimeData *runtime_data = (MultiresRuntimeData *)runtime_data_v;
96  if (runtime_data->subdiv != NULL) {
97  BKE_subdiv_free(runtime_data->subdiv);
98  }
99  MEM_freeN(runtime_data);
100 }
101 
102 static void freeData(ModifierData *md)
103 {
106 }
107 
109 {
111  if (runtime_data == NULL) {
112  runtime_data = MEM_callocN(sizeof(*runtime_data), "subsurf runtime");
113  mmd->modifier.runtime = runtime_data;
114  }
115  return runtime_data;
116 }
117 
118 /* Main goal of this function is to give usable subdivision surface descriptor
119  * which matches settings and topology. */
121  const SubdivSettings *subdiv_settings,
122  const Mesh *mesh)
123 {
125  Subdiv *subdiv = BKE_subdiv_update_from_mesh(runtime_data->subdiv, subdiv_settings, mesh);
126  runtime_data->subdiv = subdiv;
127  return subdiv;
128 }
129 
130 /* Subdivide into fully qualified mesh. */
131 
133  const ModifierEvalContext *ctx,
134  Mesh *mesh,
135  Subdiv *subdiv)
136 {
137  Mesh *result = mesh;
138  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
139  const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
140  const bool ignore_control_edges = (ctx->flag & MOD_APPLY_TO_BASE_MESH);
142  Object *object = ctx->object;
143  SubdivToMeshSettings mesh_settings;
145  scene,
146  object,
147  mmd,
148  use_render_params,
149  ignore_simplify,
150  ignore_control_edges);
151  if (mesh_settings.resolution < 3) {
152  return result;
153  }
155  result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
156  return result;
157 }
158 
159 /* Subdivide into CCG. */
160 
162  const MultiresModifierData *mmd,
163  const ModifierEvalContext *ctx,
164  Mesh *mesh)
165 {
166  const bool has_mask = CustomData_has_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
167  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
168  const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
170  Object *object = ctx->object;
171  const int level = multires_get_level(scene, object, mmd, use_render_params, ignore_simplify);
172  settings->resolution = (1 << level) + 1;
173  settings->need_normal = true;
174  settings->need_mask = has_mask;
175 }
176 
178  const ModifierEvalContext *ctx,
179  Mesh *mesh,
180  Subdiv *subdiv)
181 {
182  Mesh *result = mesh;
183  SubdivToCCGSettings ccg_settings;
184  multires_ccg_settings_init(&ccg_settings, mmd, ctx, mesh);
185  if (ccg_settings.resolution < 3) {
186  return result;
187  }
189  result = BKE_subdiv_to_ccg_mesh(subdiv, &ccg_settings, mesh);
190 
191  /* NOTE: CCG becomes an owner of Subdiv descriptor, so can not share
192  * this pointer. Not sure if it's needed, but might have a second look
193  * on the ownership model here. */
194  MultiresRuntimeData *runtime_data = mmd->modifier.runtime;
195  runtime_data->subdiv = NULL;
196 
197  return result;
198 }
199 
201 {
202  Mesh *result = mesh;
203 #if !defined(WITH_OPENSUBDIV)
204  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
205  return result;
206 #endif
208  SubdivSettings subdiv_settings;
209  BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
210  if (subdiv_settings.level == 0) {
211  return result;
212  }
213  MultiresRuntimeData *runtime_data = multires_ensure_runtime(mmd);
214  Subdiv *subdiv = subdiv_descriptor_ensure(mmd, &subdiv_settings, mesh);
215  if (subdiv == NULL) {
216  /* Happens on bad topology, ut also on empty input mesh. */
217  return result;
218  }
219  const bool use_clnors = mmd->flags & eMultiresModifierFlag_UseCustomNormals &&
220  mesh->flag & ME_AUTOSMOOTH &&
222  /* NOTE: Orco needs final coordinates on CPU side, which are expected to be
223  * accessible via MVert. For this reason we do not evaluate multires to
224  * grids when orco is requested. */
225  const bool for_orco = (ctx->flag & MOD_APPLY_ORCO) != 0;
226  /* Needed when rendering or baking will in sculpt mode. */
227  const bool for_render = (ctx->flag & MOD_APPLY_RENDER) != 0;
228 
229  const bool sculpt_base_mesh = mmd->flags & eMultiresModifierFlag_UseSculptBaseMesh;
230 
231  if ((ctx->object->mode & OB_MODE_SCULPT) && !for_orco && !for_render && !sculpt_base_mesh) {
232  /* NOTE: CCG takes ownership over Subdiv. */
233  result = multires_as_ccg(mmd, ctx, mesh, subdiv);
234  result->runtime.subdiv_ccg_tot_level = mmd->totlvl;
235  /* TODO(sergey): Usually it is sculpt stroke's update variants which
236  * takes care of this, but is possible that we need this before the
237  * stroke: i.e. when exiting blender right after stroke is done.
238  * Annoying and not so much black-boxed as far as sculpting goes, and
239  * surely there is a better way of solving this. */
240  if (ctx->object->sculpt != NULL) {
241  SculptSession *sculpt_session = ctx->object->sculpt;
242  sculpt_session->subdiv_ccg = result->runtime.subdiv_ccg;
243  sculpt_session->multires.active = true;
244  sculpt_session->multires.modifier = mmd;
245  sculpt_session->multires.level = mmd->sculptlvl;
246  sculpt_session->totvert = mesh->totvert;
247  sculpt_session->totpoly = mesh->totpoly;
248  sculpt_session->mvert = NULL;
249  sculpt_session->mpoly = NULL;
250  sculpt_session->mloop = NULL;
251  }
252  // BKE_subdiv_stats_print(&subdiv->stats);
253  }
254  else {
255  if (use_clnors) {
256  /* If custom normals are present and the option is turned on calculate the split
257  * normals and clear flag so the normals get interpolated to the result mesh. */
260  }
261 
262  result = multires_as_mesh(mmd, ctx, mesh, subdiv);
263 
264  if (use_clnors) {
265  float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
266  BLI_assert(lnors != NULL);
270  }
271  // BKE_subdiv_stats_print(&subdiv->stats);
272  if (subdiv != runtime_data->subdiv) {
273  BKE_subdiv_free(subdiv);
274  }
275  }
276  return result;
277 }
278 
279 static void deformMatrices(ModifierData *md,
280  const ModifierEvalContext *ctx,
281  Mesh *mesh,
282  float (*vertex_cos)[3],
283  float (*deform_matrices)[3][3],
284  int verts_num)
285 
286 {
287 #if !defined(WITH_OPENSUBDIV)
288  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
289  return;
290 #endif
291 
292  /* Subsurf does not require extra space mapping, keep matrices as is. */
293  (void)deform_matrices;
294 
296 
297  SubdivSettings subdiv_settings;
298  BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
299  if (subdiv_settings.level == 0) {
300  return;
301  }
302 
303  SubdivToCCGSettings ccg_settings;
304  multires_ccg_settings_init(&ccg_settings, mmd, ctx, mesh);
305  if (ccg_settings.resolution < 3) {
306  return;
307  }
308 
309  MultiresRuntimeData *runtime_data = multires_ensure_runtime(mmd);
310  Subdiv *subdiv = subdiv_descriptor_ensure(mmd, &subdiv_settings, mesh);
311  if (subdiv == NULL) {
312  /* Happens on bad topology, ut also on empty input mesh. */
313  return;
314  }
316  BKE_subdiv_deform_coarse_vertices(subdiv, mesh, vertex_cos, verts_num);
317  if (subdiv != runtime_data->subdiv) {
318  BKE_subdiv_free(subdiv);
319  }
320 }
321 
322 static void panel_draw(const bContext *C, Panel *panel)
323 {
324  uiLayout *col;
325  uiLayout *layout = panel->layout;
326 
328 
329  uiLayoutSetPropSep(layout, true);
330 
331  col = uiLayoutColumn(layout, true);
332  uiItemR(col, ptr, "levels", 0, IFACE_("Level Viewport"), ICON_NONE);
333  uiItemR(col, ptr, "sculpt_levels", 0, IFACE_("Sculpt"), ICON_NONE);
334  uiItemR(col, ptr, "render_levels", 0, IFACE_("Render"), ICON_NONE);
335 
336  const bool is_sculpt_mode = CTX_data_active_object(C)->mode & OB_MODE_SCULPT;
337  uiBlock *block = uiLayoutGetBlock(panel->layout);
338  UI_block_lock_set(block, !is_sculpt_mode, IFACE_("Sculpt Base Mesh"));
339  uiItemR(col, ptr, "use_sculpt_base_mesh", 0, IFACE_("Sculpt Base Mesh"), ICON_NONE);
340  UI_block_lock_clear(block);
341 
342  uiItemR(layout, ptr, "show_only_control_edges", 0, NULL, ICON_NONE);
343 
344  modifier_panel_end(layout, ptr);
345 }
346 
347 static void subdivisions_panel_draw(const bContext *UNUSED(C), Panel *panel)
348 {
349  uiLayout *row;
350  uiLayout *layout = panel->layout;
351 
352  PointerRNA ob_ptr;
354 
355  uiLayoutSetEnabled(layout, RNA_enum_get(&ob_ptr, "mode") != OB_MODE_EDIT);
356 
358 
370  PointerRNA op_ptr;
371  uiItemFullO(layout,
372  "OBJECT_OT_multires_subdivide",
373  IFACE_("Subdivide"),
374  ICON_NONE,
375  NULL,
377  0,
378  &op_ptr);
380  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
381 
382  row = uiLayoutRow(layout, false);
383  uiItemFullO(row,
384  "OBJECT_OT_multires_subdivide",
385  IFACE_("Simple"),
386  ICON_NONE,
387  NULL,
389  0,
390  &op_ptr);
391  RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_SIMPLE);
392  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
393  uiItemFullO(row,
394  "OBJECT_OT_multires_subdivide",
395  IFACE_("Linear"),
396  ICON_NONE,
397  NULL,
399  0,
400  &op_ptr);
401  RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_LINEAR);
402  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
403 
404  uiItemS(layout);
405 
406  uiItemO(layout, IFACE_("Unsubdivide"), ICON_NONE, "OBJECT_OT_multires_unsubdivide");
407  uiItemO(layout, IFACE_("Delete Higher"), ICON_NONE, "OBJECT_OT_multires_higher_levels_delete");
408 }
409 
410 static void shape_panel_draw(const bContext *UNUSED(C), Panel *panel)
411 {
412  uiLayout *row;
413  uiLayout *layout = panel->layout;
414 
415  PointerRNA ob_ptr;
416  modifier_panel_get_property_pointers(panel, &ob_ptr);
417 
418  uiLayoutSetEnabled(layout, RNA_enum_get(&ob_ptr, "mode") != OB_MODE_EDIT);
419 
420  row = uiLayoutRow(layout, false);
421  uiItemO(row, IFACE_("Reshape"), ICON_NONE, "OBJECT_OT_multires_reshape");
422  uiItemO(row, IFACE_("Apply Base"), ICON_NONE, "OBJECT_OT_multires_base_apply");
423 }
424 
425 static void generate_panel_draw(const bContext *UNUSED(C), Panel *panel)
426 {
427  uiLayout *col, *row;
428  uiLayout *layout = panel->layout;
429 
432 
433  bool is_external = RNA_boolean_get(ptr, "is_external");
434 
435  if (mmd->totlvl == 0) {
436  uiItemO(
437  layout, IFACE_("Rebuild Subdivisions"), ICON_NONE, "OBJECT_OT_multires_rebuild_subdiv");
438  }
439 
440  col = uiLayoutColumn(layout, false);
441  row = uiLayoutRow(col, false);
442  if (is_external) {
443  uiItemO(row, IFACE_("Pack External"), ICON_NONE, "OBJECT_OT_multires_external_pack");
444  uiLayoutSetPropSep(col, true);
445  row = uiLayoutRow(col, false);
446  uiItemR(row, ptr, "filepath", 0, NULL, ICON_NONE);
447  }
448  else {
449  uiItemO(col, IFACE_("Save External..."), ICON_NONE, "OBJECT_OT_multires_external_save");
450  }
451 }
452 
453 static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
454 {
455  uiLayout *col;
456  uiLayout *layout = panel->layout;
457 
459 
460  bool has_displacement = RNA_int_get(ptr, "total_levels") != 0;
461 
462  uiLayoutSetPropSep(layout, true);
463 
464  uiLayoutSetActive(layout, !has_displacement);
465 
466  uiItemR(layout, ptr, "quality", 0, NULL, ICON_NONE);
467 
468  col = uiLayoutColumn(layout, false);
469  uiLayoutSetActive(col, true);
470  uiItemR(col, ptr, "uv_smooth", 0, NULL, ICON_NONE);
471  uiItemR(col, ptr, "boundary_smooth", 0, NULL, ICON_NONE);
472 
473  uiItemR(layout, ptr, "use_creases", 0, NULL, ICON_NONE);
474  uiItemR(layout, ptr, "use_custom_normals", 0, NULL, ICON_NONE);
475 }
476 
477 static void panelRegister(ARegionType *region_type)
478 {
481  region_type, "subdivide", "Subdivision", NULL, subdivisions_panel_draw, panel_type);
482  modifier_subpanel_register(region_type, "shape", "Shape", NULL, shape_panel_draw, panel_type);
484  region_type, "generate", "Generate", NULL, generate_panel_draw, panel_type);
486  region_type, "advanced", "Advanced", NULL, advanced_panel_draw, panel_type);
487 }
488 
490  /* name */ N_("Multires"),
491  /* structName */ "MultiresModifierData",
492  /* structSize */ sizeof(MultiresModifierData),
493  /* srna */ &RNA_MultiresModifier,
497  /* icon */ ICON_MOD_MULTIRES,
498 
499  /* copyData */ copyData,
500 
501  /* deformVerts */ NULL,
502  /* deformMatrices */ deformMatrices,
503  /* deformVertsEM */ NULL,
504  /* deformMatricesEM */ NULL,
505  /* modifyMesh */ modifyMesh,
506  /* modifyGeometrySet */ NULL,
507 
508  /* initData */ initData,
509  /* requiredDataMask */ requiredDataMask,
510  /* freeData */ freeData,
511  /* isDisabled */ NULL,
512  /* updateDepsgraph */ NULL,
513  /* dependsOnTime */ NULL,
514  /* dependsOnNormals */ dependsOnNormals,
515  /* foreachIDLink */ NULL,
516  /* foreachTexLink */ NULL,
517  /* freeRuntimeData */ freeRuntimeData,
518  /* panelRegister */ panelRegister,
519  /* blendWrite */ NULL,
520  /* blendRead */ NULL,
521 };
typedef float(TangentPoint)[2]
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1353
void CustomData_clear_layer_flag(struct CustomData *data, int type, int flag)
Definition: customdata.cc:2635
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_get_layer(const struct CustomData *data, int type)
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
Definition: customdata.cc:2626
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
Definition: mesh.cc:1911
void BKE_mesh_set_custom_normals(struct Mesh *mesh, float(*r_custom_loopnors)[3])
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:68
@ eModifierTypeFlag_RequiresOriginalData
Definition: BKE_modifier.h:84
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
@ MOD_APPLY_RENDER
Definition: BKE_modifier.h:115
@ MOD_APPLY_IGNORE_SIMPLIFY
Definition: BKE_modifier.h:123
@ MOD_APPLY_TO_BASE_MESH
Definition: BKE_modifier.h:128
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:120
void BKE_multires_subdiv_settings_init(struct SubdivSettings *settings, const struct MultiresModifierData *mmd)
int multires_get_level(const struct Scene *scene, const struct Object *ob, const struct MultiresModifierData *mmd, bool render, bool ignore_simplify)
void BKE_multires_subdiv_mesh_settings_init(struct SubdivToMeshSettings *mesh_settings, const struct Scene *scene, const struct Object *object, const struct MultiresModifierData *mmd, bool use_render_params, bool ignore_simplify, bool ignore_control_edges)
@ MULTIRES_SUBDIVIDE_LINEAR
Definition: BKE_multires.h:198
@ MULTIRES_SUBDIVIDE_CATMULL_CLARK
Definition: BKE_multires.h:196
@ MULTIRES_SUBDIVIDE_SIMPLE
Definition: BKE_multires.h:197
void BKE_subdiv_free(Subdiv *subdiv)
Definition: subdiv.c:184
void BKE_subdiv_displacement_attach_from_multires(Subdiv *subdiv, struct Mesh *mesh, const struct MultiresModifierData *mmd)
Subdiv * BKE_subdiv_update_from_mesh(Subdiv *subdiv, const SubdivSettings *settings, const struct Mesh *mesh)
struct Mesh * BKE_subdiv_to_ccg_mesh(struct Subdiv *subdiv, const SubdivToCCGSettings *settings, const struct Mesh *coarse_mesh)
void BKE_subdiv_deform_coarse_vertices(struct Subdiv *subdiv, const struct Mesh *coarse_mesh, float(*vertex_cos)[3], int num_verts)
struct Mesh * BKE_subdiv_to_mesh(struct Subdiv *subdiv, const SubdivToMeshSettings *settings, const struct Mesh *coarse_mesh)
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_NORMAL
@ CD_FLAG_TEMPORARY
@ CD_CUSTOMLOOPNORMAL
@ CD_GRID_PAINT_MASK
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ ME_AUTOSMOOTH
@ eMultiresModifierFlag_UseSculptBaseMesh
@ eMultiresModifierFlag_UseCustomNormals
struct MultiresModifierData MultiresModifierData
@ eModifierType_Multires
@ OB_MODE_EDIT
@ OB_MODE_SCULPT
Object is a sort of wrapper for general info.
@ UI_PANEL_DATA_EXPAND_ROOT
@ UI_SUBPANEL_DATA_EXPAND_1
Read Guarded memory(de)allocation.
static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
Definition: MOD_multires.c:85
static void subdivisions_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:347
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_multires.c:200
static Mesh * multires_as_mesh(MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_multires.c:132
static Subdiv * subdiv_descriptor_ensure(MultiresModifierData *mmd, const SubdivSettings *subdiv_settings, const Mesh *mesh)
Definition: MOD_multires.c:120
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_multires.c:76
static void freeRuntimeData(void *runtime_data_v)
Definition: MOD_multires.c:90
ModifierTypeInfo modifierType_Multires
Definition: MOD_multires.c:489
static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:453
struct MultiresRuntimeData MultiresRuntimeData
static void deformMatrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertex_cos)[3], float(*deform_matrices)[3][3], int verts_num)
Definition: MOD_multires.c:279
static Mesh * multires_as_ccg(MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_multires.c:177
static void generate_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:425
static void multires_ccg_settings_init(SubdivToCCGSettings *settings, const MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_multires.c:161
static MultiresRuntimeData * multires_ensure_runtime(MultiresModifierData *mmd)
Definition: MOD_multires.c:108
static void initData(ModifierData *md)
Definition: MOD_multires.c:53
static void panelRegister(ARegionType *region_type)
Definition: MOD_multires.c:477
static void freeData(ModifierData *md)
Definition: MOD_multires.c:102
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_multires.c:65
static void panel_draw(const bContext *C, Panel *panel)
Definition: MOD_multires.c:322
static void shape_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:410
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
Definition: MOD_ui_common.c:91
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
#define C
Definition: RandGen.cpp:25
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void UI_block_lock_clear(uiBlock *block)
Definition: interface.cc:2281
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr)
Definition: interface.cc:2273
@ WM_OP_EXEC_DEFAULT
Definition: WM_types.h:208
Scene scene
SyclQueue void void size_t num_bytes void
uint col
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
int RNA_int_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4910
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:5015
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
uint16_t flag
int totvert
int totpoly
CustomData ldata
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
ModifierApplyFlag flag
Definition: BKE_modifier.h:142
struct Object * object
Definition: BKE_modifier.h:141
struct Subdiv * subdiv
Definition: MOD_multires.c:50
struct SculptSession * sculpt
struct uiLayout * layout
void * data
Definition: RNA_types.h:38
struct SubdivCCG * subdiv_ccg
Definition: BKE_paint.h:547
struct MVert * mvert
Definition: BKE_paint.h:498
struct MLoop * mloop
Definition: BKE_paint.h:500
struct SculptSession::@52 multires
struct MPoly * mpoly
Definition: BKE_paint.h:499
struct MultiresModifierData * modifier
Definition: BKE_paint.h:490
SubdivSettings settings
Definition: BKE_subdiv.h:160
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480