Blender  V2.93
MOD_multires.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <stddef.h>
25 
26 #include "MEM_guardedalloc.h"
27 
28 #include "BLI_utildefines.h"
29 
30 #include "BLT_translation.h"
31 
32 #include "DNA_defaults.h"
33 #include "DNA_mesh_types.h"
34 #include "DNA_object_types.h"
35 #include "DNA_scene_types.h"
36 #include "DNA_screen_types.h"
37 
38 #include "BKE_cdderivedmesh.h"
39 #include "BKE_context.h"
40 #include "BKE_mesh.h"
41 #include "BKE_modifier.h"
42 #include "BKE_multires.h"
43 #include "BKE_paint.h"
44 #include "BKE_screen.h"
45 #include "BKE_subdiv.h"
46 #include "BKE_subdiv_ccg.h"
47 #include "BKE_subdiv_deform.h"
48 #include "BKE_subdiv_mesh.h"
49 #include "BKE_subsurf.h"
50 
51 #include "UI_interface.h"
52 #include "UI_resources.h"
53 
54 #include "RNA_access.h"
55 
56 #include "WM_types.h" /* For subdivide operator UI. */
57 
58 #include "DEG_depsgraph_query.h"
59 
60 #include "MOD_modifiertypes.h"
61 #include "MOD_ui_common.h"
62 
63 typedef struct MultiresRuntimeData {
64  /* Cached subdivision surface descriptor, with topology and settings. */
65  struct Subdiv *subdiv;
67 
68 static void initData(ModifierData *md)
69 {
71 
73 
75 
76  /* Open subdivision panels by default. */
78 }
79 
80 static void requiredDataMask(Object *UNUSED(ob),
81  ModifierData *md,
82  CustomData_MeshMasks *r_cddata_masks)
83 {
86  r_cddata_masks->lmask |= CD_MASK_NORMAL;
87  r_cddata_masks->lmask |= CD_MASK_CUSTOMLOOPNORMAL;
88  }
89 }
90 
92 {
95  return true;
96  }
97  return false;
98 }
99 
100 static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
101 {
102  BKE_modifier_copydata_generic(md_src, md_dst, flag);
103 }
104 
105 static void freeRuntimeData(void *runtime_data_v)
106 {
107  if (runtime_data_v == NULL) {
108  return;
109  }
110  MultiresRuntimeData *runtime_data = (MultiresRuntimeData *)runtime_data_v;
111  if (runtime_data->subdiv != NULL) {
112  BKE_subdiv_free(runtime_data->subdiv);
113  }
114  MEM_freeN(runtime_data);
115 }
116 
117 static void freeData(ModifierData *md)
118 {
121 }
122 
124 {
126  if (runtime_data == NULL) {
127  runtime_data = MEM_callocN(sizeof(*runtime_data), "subsurf runtime");
128  mmd->modifier.runtime = runtime_data;
129  }
130  return runtime_data;
131 }
132 
133 /* Main goal of this function is to give usable subdivision surface descriptor
134  * which matches settings and topology. */
136  const SubdivSettings *subdiv_settings,
137  const Mesh *mesh)
138 {
140  Subdiv *subdiv = BKE_subdiv_update_from_mesh(runtime_data->subdiv, subdiv_settings, mesh);
141  runtime_data->subdiv = subdiv;
142  return subdiv;
143 }
144 
145 /* Subdivide into fully qualified mesh. */
146 
148  const ModifierEvalContext *ctx,
149  Mesh *mesh,
150  Subdiv *subdiv)
151 {
152  Mesh *result = mesh;
153  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
154  const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
155  const bool ignore_control_edges = (ctx->flag & MOD_APPLY_TO_BASE_MESH);
157  Object *object = ctx->object;
158  SubdivToMeshSettings mesh_settings;
160  scene,
161  object,
162  mmd,
163  use_render_params,
164  ignore_simplify,
165  ignore_control_edges);
166  if (mesh_settings.resolution < 3) {
167  return result;
168  }
170  result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
171  return result;
172 }
173 
174 /* Subdivide into CCG. */
175 
177  const MultiresModifierData *mmd,
178  const ModifierEvalContext *ctx,
179  Mesh *mesh)
180 {
181  const bool has_mask = CustomData_has_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
182  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
183  const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
185  Object *object = ctx->object;
186  const int level = multires_get_level(scene, object, mmd, use_render_params, ignore_simplify);
187  settings->resolution = (1 << level) + 1;
188  settings->need_normal = true;
189  settings->need_mask = has_mask;
190 }
191 
193  const ModifierEvalContext *ctx,
194  Mesh *mesh,
195  Subdiv *subdiv)
196 {
197  Mesh *result = mesh;
198  SubdivToCCGSettings ccg_settings;
199  multires_ccg_settings_init(&ccg_settings, mmd, ctx, mesh);
200  if (ccg_settings.resolution < 3) {
201  return result;
202  }
204  result = BKE_subdiv_to_ccg_mesh(subdiv, &ccg_settings, mesh);
205 
206  /* NOTE: CCG becomes an owner of Subdiv descriptor, so can not share
207  * this pointer. Not sure if it's needed, but might have a second look
208  * on the ownership model here. */
209  MultiresRuntimeData *runtime_data = mmd->modifier.runtime;
210  runtime_data->subdiv = NULL;
211 
212  return result;
213 }
214 
216 {
217  Mesh *result = mesh;
218 #if !defined(WITH_OPENSUBDIV)
219  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
220  return result;
221 #endif
223  SubdivSettings subdiv_settings;
224  BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
225  if (subdiv_settings.level == 0) {
226  return result;
227  }
228  MultiresRuntimeData *runtime_data = multires_ensure_runtime(mmd);
229  Subdiv *subdiv = subdiv_descriptor_ensure(mmd, &subdiv_settings, mesh);
230  if (subdiv == NULL) {
231  /* Happens on bad topology, ut also on empty input mesh. */
232  return result;
233  }
234  const bool use_clnors = mmd->flags & eMultiresModifierFlag_UseCustomNormals &&
235  mesh->flag & ME_AUTOSMOOTH &&
237  /* NOTE: Orco needs final coordinates on CPU side, which are expected to be
238  * accessible via MVert. For this reason we do not evaluate multires to
239  * grids when orco is requested. */
240  const bool for_orco = (ctx->flag & MOD_APPLY_ORCO) != 0;
241  /* Needed when rendering or baking will in sculpt mode. */
242  const bool for_render = (ctx->flag & MOD_APPLY_RENDER) != 0;
243 
244  const bool sculpt_base_mesh = mmd->flags & eMultiresModifierFlag_UseSculptBaseMesh;
245 
246  if ((ctx->object->mode & OB_MODE_SCULPT) && !for_orco && !for_render && !sculpt_base_mesh) {
247  /* NOTE: CCG takes ownership over Subdiv. */
248  result = multires_as_ccg(mmd, ctx, mesh, subdiv);
249  result->runtime.subdiv_ccg_tot_level = mmd->totlvl;
250  /* TODO(sergey): Usually it is sculpt stroke's update variants which
251  * takes care of this, but is possible that we need this before the
252  * stroke: i.e. when exiting blender right after stroke is done.
253  * Annoying and not so much black-boxed as far as sculpting goes, and
254  * surely there is a better way of solving this. */
255  if (ctx->object->sculpt != NULL) {
256  SculptSession *sculpt_session = ctx->object->sculpt;
257  sculpt_session->subdiv_ccg = result->runtime.subdiv_ccg;
258  sculpt_session->multires.active = true;
259  sculpt_session->multires.modifier = mmd;
260  sculpt_session->multires.level = mmd->sculptlvl;
261  sculpt_session->totvert = mesh->totvert;
262  sculpt_session->totpoly = mesh->totpoly;
263  sculpt_session->mvert = NULL;
264  sculpt_session->mpoly = NULL;
265  sculpt_session->mloop = NULL;
266  }
267  // BKE_subdiv_stats_print(&subdiv->stats);
268  }
269  else {
270  if (use_clnors) {
271  /* If custom normals are present and the option is turned on calculate the split
272  * normals and clear flag so the normals get interpolated to the result mesh. */
275  }
276 
277  result = multires_as_mesh(mmd, ctx, mesh, subdiv);
278 
279  if (use_clnors) {
280  float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
281  BLI_assert(lnors != NULL);
285  }
286  // BKE_subdiv_stats_print(&subdiv->stats);
287  if (subdiv != runtime_data->subdiv) {
288  BKE_subdiv_free(subdiv);
289  }
290  }
291  return result;
292 }
293 
294 static void deformMatrices(ModifierData *md,
295  const ModifierEvalContext *ctx,
296  Mesh *mesh,
297  float (*vertex_cos)[3],
298  float (*deform_matrices)[3][3],
299  int num_verts)
300 
301 {
302 #if !defined(WITH_OPENSUBDIV)
303  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
304  return;
305 #endif
306 
307  /* Subsurf does not require extra space mapping, keep matrices as is. */
308  (void)deform_matrices;
309 
311 
312  SubdivSettings subdiv_settings;
313  BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
314  if (subdiv_settings.level == 0) {
315  return;
316  }
317 
318  SubdivToCCGSettings ccg_settings;
319  multires_ccg_settings_init(&ccg_settings, mmd, ctx, mesh);
320  if (ccg_settings.resolution < 3) {
321  return;
322  }
323 
324  MultiresRuntimeData *runtime_data = multires_ensure_runtime(mmd);
325  Subdiv *subdiv = subdiv_descriptor_ensure(mmd, &subdiv_settings, mesh);
326  if (subdiv == NULL) {
327  /* Happens on bad topology, ut also on empty input mesh. */
328  return;
329  }
331  BKE_subdiv_deform_coarse_vertices(subdiv, mesh, vertex_cos, num_verts);
332  if (subdiv != runtime_data->subdiv) {
333  BKE_subdiv_free(subdiv);
334  }
335 }
336 
337 static void panel_draw(const bContext *C, Panel *panel)
338 {
339  uiLayout *col;
340  uiLayout *layout = panel->layout;
341 
343 
344  uiLayoutSetPropSep(layout, true);
345 
346  col = uiLayoutColumn(layout, true);
347  uiItemR(col, ptr, "levels", 0, IFACE_("Level Viewport"), ICON_NONE);
348  uiItemR(col, ptr, "sculpt_levels", 0, IFACE_("Sculpt"), ICON_NONE);
349  uiItemR(col, ptr, "render_levels", 0, IFACE_("Render"), ICON_NONE);
350 
351  const bool is_sculpt_mode = CTX_data_active_object(C)->mode & OB_MODE_SCULPT;
352  uiBlock *block = uiLayoutGetBlock(panel->layout);
353  UI_block_lock_set(block, !is_sculpt_mode, IFACE_("Sculpt Base Mesh"));
354  uiItemR(col, ptr, "use_sculpt_base_mesh", 0, IFACE_("Sculpt Base Mesh"), ICON_NONE);
355  UI_block_lock_clear(block);
356 
357  uiItemR(layout, ptr, "show_only_control_edges", 0, NULL, ICON_NONE);
358 
359  modifier_panel_end(layout, ptr);
360 }
361 
362 static void subdivisions_panel_draw(const bContext *UNUSED(C), Panel *panel)
363 {
364  uiLayout *row;
365  uiLayout *layout = panel->layout;
366 
367  PointerRNA ob_ptr;
369 
370  uiLayoutSetEnabled(layout, RNA_enum_get(&ob_ptr, "mode") != OB_MODE_EDIT);
371 
373 
385  PointerRNA op_ptr;
386  uiItemFullO(layout,
387  "OBJECT_OT_multires_subdivide",
388  IFACE_("Subdivide"),
389  ICON_NONE,
390  NULL,
392  0,
393  &op_ptr);
395  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
396 
397  row = uiLayoutRow(layout, false);
398  uiItemFullO(row,
399  "OBJECT_OT_multires_subdivide",
400  IFACE_("Simple"),
401  ICON_NONE,
402  NULL,
404  0,
405  &op_ptr);
406  RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_SIMPLE);
407  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
408  uiItemFullO(row,
409  "OBJECT_OT_multires_subdivide",
410  IFACE_("Linear"),
411  ICON_NONE,
412  NULL,
414  0,
415  &op_ptr);
416  RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_LINEAR);
417  RNA_string_set(&op_ptr, "modifier", ((ModifierData *)mmd)->name);
418 
419  uiItemS(layout);
420 
421  uiItemO(layout, IFACE_("Unsubdivide"), ICON_NONE, "OBJECT_OT_multires_unsubdivide");
422  uiItemO(layout, IFACE_("Delete Higher"), ICON_NONE, "OBJECT_OT_multires_higher_levels_delete");
423 }
424 
425 static void shape_panel_draw(const bContext *UNUSED(C), Panel *panel)
426 {
427  uiLayout *row;
428  uiLayout *layout = panel->layout;
429 
430  PointerRNA ob_ptr;
431  modifier_panel_get_property_pointers(panel, &ob_ptr);
432 
433  uiLayoutSetEnabled(layout, RNA_enum_get(&ob_ptr, "mode") != OB_MODE_EDIT);
434 
435  row = uiLayoutRow(layout, false);
436  uiItemO(row, IFACE_("Reshape"), ICON_NONE, "OBJECT_OT_multires_reshape");
437  uiItemO(row, IFACE_("Apply Base"), ICON_NONE, "OBJECT_OT_multires_base_apply");
438 }
439 
440 static void generate_panel_draw(const bContext *UNUSED(C), Panel *panel)
441 {
442  uiLayout *col, *row;
443  uiLayout *layout = panel->layout;
444 
447 
448  bool is_external = RNA_boolean_get(ptr, "is_external");
449 
450  if (mmd->totlvl == 0) {
451  uiItemO(
452  layout, IFACE_("Rebuild Subdivisions"), ICON_NONE, "OBJECT_OT_multires_rebuild_subdiv");
453  }
454 
455  col = uiLayoutColumn(layout, false);
456  row = uiLayoutRow(col, false);
457  if (is_external) {
458  uiItemO(row, IFACE_("Pack External"), ICON_NONE, "OBJECT_OT_multires_external_pack");
459  uiLayoutSetPropSep(col, true);
460  row = uiLayoutRow(col, false);
461  uiItemR(row, ptr, "filepath", 0, NULL, ICON_NONE);
462  }
463  else {
464  uiItemO(col, IFACE_("Save External..."), ICON_NONE, "OBJECT_OT_multires_external_save");
465  }
466 }
467 
468 static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
469 {
470  uiLayout *col;
471  uiLayout *layout = panel->layout;
472 
474 
475  bool has_displacement = RNA_int_get(ptr, "total_levels") != 0;
476 
477  uiLayoutSetPropSep(layout, true);
478 
479  uiLayoutSetActive(layout, !has_displacement);
480 
481  uiItemR(layout, ptr, "quality", 0, NULL, ICON_NONE);
482 
483  col = uiLayoutColumn(layout, false);
484  uiLayoutSetActive(col, true);
485  uiItemR(col, ptr, "uv_smooth", 0, NULL, ICON_NONE);
486  uiItemR(col, ptr, "boundary_smooth", 0, NULL, ICON_NONE);
487 
488  uiItemR(layout, ptr, "use_creases", 0, NULL, ICON_NONE);
489  uiItemR(layout, ptr, "use_custom_normals", 0, NULL, ICON_NONE);
490 }
491 
492 static void panelRegister(ARegionType *region_type)
493 {
496  region_type, "subdivide", "Subdivision", NULL, subdivisions_panel_draw, panel_type);
497  modifier_subpanel_register(region_type, "shape", "Shape", NULL, shape_panel_draw, panel_type);
499  region_type, "generate", "Generate", NULL, generate_panel_draw, panel_type);
501  region_type, "advanced", "Advanced", NULL, advanced_panel_draw, panel_type);
502 }
503 
505  /* name */ "Multires",
506  /* structName */ "MultiresModifierData",
507  /* structSize */ sizeof(MultiresModifierData),
508  /* srna */ &RNA_MultiresModifier,
512  /* icon */ ICON_MOD_MULTIRES,
513 
514  /* copyData */ copyData,
515 
516  /* deformVerts */ NULL,
517  /* deformMatrices */ deformMatrices,
518  /* deformVertsEM */ NULL,
519  /* deformMatricesEM */ NULL,
520  /* modifyMesh */ modifyMesh,
521  /* modifyHair */ NULL,
522  /* modifyGeometrySet */ NULL,
523  /* modifyVolume */ NULL,
524 
525  /* initData */ initData,
526  /* requiredDataMask */ requiredDataMask,
527  /* freeData */ freeData,
528  /* isDisabled */ NULL,
529  /* updateDepsgraph */ NULL,
530  /* dependsOnTime */ NULL,
531  /* dependsOnNormals */ dependsOnNormals,
532  /* foreachIDLink */ NULL,
533  /* foreachTexLink */ NULL,
534  /* freeRuntimeData */ freeRuntimeData,
535  /* panelRegister */ panelRegister,
536  /* blendWrite */ NULL,
537  /* blendRead */ NULL,
538 };
typedef float(TangentPoint)[2]
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1279
void CustomData_clear_layer_flag(struct CustomData *data, int type, int flag)
Definition: customdata.c:2484
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.c:2475
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
Definition: mesh.c:1865
void BKE_mesh_set_custom_normals(struct Mesh *mesh, float(*r_custom_loopnors)[3])
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_RequiresOriginalData
Definition: BKE_modifier.h:98
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
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:128
@ MOD_APPLY_IGNORE_SIMPLIFY
Definition: BKE_modifier.h:136
@ MOD_APPLY_TO_BASE_MESH
Definition: BKE_modifier.h:141
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:133
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)
@ MULTIRES_SUBDIVIDE_LINEAR
Definition: BKE_multires.h:174
@ MULTIRES_SUBDIVIDE_CATMULL_CLARK
Definition: BKE_multires.h:172
@ MULTIRES_SUBDIVIDE_SIMPLE
Definition: BKE_multires.h:173
void BKE_multires_subdiv_mesh_settings_init(struct SubdivToMeshSettings *mesh_settings, const struct Scene *scene, const struct Object *object, const struct MultiresModifierData *mmd, const bool use_render_params, const bool ignore_simplify, const bool ignore_control_edges)
void BKE_subdiv_free(Subdiv *subdiv)
Definition: subdiv.c:189
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:58
#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_CUSTOMLOOPNORMAL
@ CD_GRID_PAINT_MASK
#define CD_MASK_CUSTOMLOOPNORMAL
@ CD_FLAG_TEMPORARY
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ 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:100
static void subdivisions_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:362
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_multires.c:215
static Mesh * multires_as_mesh(MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_multires.c:147
static void deformMatrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertex_cos)[3], float(*deform_matrices)[3][3], int num_verts)
Definition: MOD_multires.c:294
static Subdiv * subdiv_descriptor_ensure(MultiresModifierData *mmd, const SubdivSettings *subdiv_settings, const Mesh *mesh)
Definition: MOD_multires.c:135
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_multires.c:91
static void freeRuntimeData(void *runtime_data_v)
Definition: MOD_multires.c:105
ModifierTypeInfo modifierType_Multires
Definition: MOD_multires.c:504
static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:468
struct MultiresRuntimeData MultiresRuntimeData
static Mesh * multires_as_ccg(MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_multires.c:192
static void generate_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:440
static void multires_ccg_settings_init(SubdivToCCGSettings *settings, const MultiresModifierData *mmd, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_multires.c:176
static MultiresRuntimeData * multires_ensure_runtime(MultiresModifierData *mmd)
Definition: MOD_multires.c:123
static void initData(ModifierData *md)
Definition: MOD_multires.c:68
static void panelRegister(ARegionType *region_type)
Definition: MOD_multires.c:492
static void freeData(ModifierData *md)
Definition: MOD_multires.c:117
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_multires.c:80
static void panel_draw(const bContext *C, Panel *panel)
Definition: MOD_multires.c:337
static void shape_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_multires.c:425
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
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)
StructRNA RNA_MultiresModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, int context, int flag, struct PointerRNA *r_opptr)
void UI_block_lock_clear(uiBlock *block)
Definition: interface.c:2219
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 UI_block_lock_set(uiBlock *block, bool val, const char *lockstr)
Definition: interface.c:2211
@ WM_OP_EXEC_DEFAULT
Definition: WM_types.h:204
Scene scene
uint col
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:6550
int RNA_int_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6308
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:6413
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
struct CustomData pdata ldata
int totvert
short flag
int totpoly
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
ModifierApplyFlag flag
Definition: BKE_modifier.h:155
struct Object * object
Definition: BKE_modifier.h:154
struct Subdiv * subdiv
Definition: MOD_multires.c:65
struct SculptSession * sculpt
struct uiLayout * layout
void * data
Definition: RNA_types.h:52
struct SubdivCCG * subdiv_ccg
Definition: BKE_paint.h:501
struct MVert * mvert
Definition: BKE_paint.h:461
struct MLoop * mloop
Definition: BKE_paint.h:463
struct MPoly * mpoly
Definition: BKE_paint.h:462
struct MultiresModifierData * modifier
Definition: BKE_paint.h:453
struct SculptSession::@53 multires
SubdivSettings settings
Definition: BKE_subdiv.h:176
PointerRNA * ptr
Definition: wm_files.c:3157