Blender  V2.93
MOD_subsurf.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 #include <stdio.h>
26 #include <string.h>
27 
28 #include "MEM_guardedalloc.h"
29 
30 #include "BLI_utildefines.h"
31 
32 #include "BLT_translation.h"
33 
34 #include "DNA_defaults.h"
35 #include "DNA_mesh_types.h"
36 #include "DNA_object_types.h"
37 #include "DNA_scene_types.h"
38 #include "DNA_screen_types.h"
39 
40 #include "BKE_context.h"
41 #include "BKE_mesh.h"
42 #include "BKE_scene.h"
43 #include "BKE_screen.h"
44 #include "BKE_subdiv.h"
45 #include "BKE_subdiv_ccg.h"
46 #include "BKE_subdiv_deform.h"
47 #include "BKE_subdiv_mesh.h"
48 #include "BKE_subsurf.h"
49 
50 #include "UI_interface.h"
51 #include "UI_resources.h"
52 
53 #include "RE_engine.h"
54 
55 #include "RNA_access.h"
56 
57 #include "DEG_depsgraph.h"
58 #include "DEG_depsgraph_query.h"
59 
60 #include "MOD_modifiertypes.h"
61 #include "MOD_ui_common.h"
62 
63 #include "BLO_read_write.h"
64 
65 #include "intern/CCGSubSurf.h"
66 
67 typedef struct SubsurfRuntimeData {
68  /* Cached subdivision surface descriptor, with topology and settings. */
69  struct Subdiv *subdiv;
71 
72 static void initData(ModifierData *md)
73 {
75 
77 
79 }
80 
81 static void requiredDataMask(Object *UNUSED(ob),
82  ModifierData *md,
83  CustomData_MeshMasks *r_cddata_masks)
84 {
87  r_cddata_masks->lmask |= CD_MASK_NORMAL;
88  r_cddata_masks->lmask |= CD_MASK_CUSTOMLOOPNORMAL;
89  }
90 }
91 
93 {
96  return true;
97  }
98  return false;
99 }
100 
101 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
102 {
103 #if 0
104  const SubsurfModifierData *smd = (const SubsurfModifierData *)md;
105 #endif
106  SubsurfModifierData *tsmd = (SubsurfModifierData *)target;
107 
108  BKE_modifier_copydata_generic(md, target, flag);
109 
110  tsmd->emCache = tsmd->mCache = NULL;
111 }
112 
113 static void freeRuntimeData(void *runtime_data_v)
114 {
115  if (runtime_data_v == NULL) {
116  return;
117  }
118  SubsurfRuntimeData *runtime_data = (SubsurfRuntimeData *)runtime_data_v;
119  if (runtime_data->subdiv != NULL) {
120  BKE_subdiv_free(runtime_data->subdiv);
121  }
122  MEM_freeN(runtime_data);
123 }
124 
125 static void freeData(ModifierData *md)
126 {
128 
129  if (smd->mCache) {
130  ccgSubSurf_free(smd->mCache);
131  smd->mCache = NULL;
132  }
133  if (smd->emCache) {
134  ccgSubSurf_free(smd->emCache);
135  smd->emCache = NULL;
136  }
138 }
139 
140 static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParams)
141 {
143  int levels = (useRenderParams) ? smd->renderLevels : smd->levels;
144 
145  return get_render_subsurf_level(&scene->r, levels, useRenderParams != 0) == 0;
146 }
147 
149  const ModifierEvalContext *ctx)
150 {
152  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
153  const int requested_levels = (use_render_params) ? smd->renderLevels : smd->levels;
154  return get_render_subsurf_level(&scene->r, requested_levels, use_render_params);
155 }
156 
158  const SubsurfModifierData *smd,
159  const ModifierEvalContext *ctx)
160 {
161  const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
162  const int requested_levels = (use_render_params) ? smd->renderLevels : smd->levels;
163 
167  1 :
168  (settings->is_adaptive ? smd->quality : requested_levels);
171  smd->boundary_smooth);
173  smd->uv_smooth);
174 }
175 
176 /* Main goal of this function is to give usable subdivision surface descriptor
177  * which matches settings and topology. */
179  const SubdivSettings *subdiv_settings,
180  const Mesh *mesh)
181 {
182  SubsurfRuntimeData *runtime_data = (SubsurfRuntimeData *)smd->modifier.runtime;
183  Subdiv *subdiv = BKE_subdiv_update_from_mesh(runtime_data->subdiv, subdiv_settings, mesh);
184  runtime_data->subdiv = subdiv;
185  return subdiv;
186 }
187 
188 /* Subdivide into fully qualified mesh. */
189 
191  const SubsurfModifierData *smd,
192  const ModifierEvalContext *ctx)
193 {
194  const int level = subdiv_levels_for_modifier_get(smd, ctx);
195  settings->resolution = (1 << level) + 1;
196  settings->use_optimal_display = (smd->flags & eSubsurfModifierFlag_ControlEdges) &&
197  !(ctx->flag & MOD_APPLY_TO_BASE_MESH);
198 }
199 
201  const ModifierEvalContext *ctx,
202  Mesh *mesh,
203  Subdiv *subdiv)
204 {
205  Mesh *result = mesh;
206  SubdivToMeshSettings mesh_settings;
207  subdiv_mesh_settings_init(&mesh_settings, smd, ctx);
208  if (mesh_settings.resolution < 3) {
209  return result;
210  }
211  result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
212  return result;
213 }
214 
215 /* Subdivide into CCG. */
216 
218  const SubsurfModifierData *smd,
219  const ModifierEvalContext *ctx)
220 {
221  const int level = subdiv_levels_for_modifier_get(smd, ctx);
222  settings->resolution = (1 << level) + 1;
223  settings->need_normal = true;
224  settings->need_mask = false;
225 }
226 
228  const ModifierEvalContext *ctx,
229  Mesh *mesh,
230  Subdiv *subdiv)
231 {
232  Mesh *result = mesh;
233  SubdivToCCGSettings ccg_settings;
234  subdiv_ccg_settings_init(&ccg_settings, smd, ctx);
235  if (ccg_settings.resolution < 3) {
236  return result;
237  }
238  result = BKE_subdiv_to_ccg_mesh(subdiv, &ccg_settings, mesh);
239  return result;
240 }
241 
243 {
244  SubsurfRuntimeData *runtime_data = (SubsurfRuntimeData *)smd->modifier.runtime;
245  if (runtime_data == NULL) {
246  runtime_data = MEM_callocN(sizeof(*runtime_data), "subsurf runtime");
247  smd->modifier.runtime = runtime_data;
248  }
249  return runtime_data;
250 }
251 
252 /* Modifier itself. */
253 
255 {
256  Mesh *result = mesh;
257 #if !defined(WITH_OPENSUBDIV)
258  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
259  return result;
260 #endif
262  SubdivSettings subdiv_settings;
263  subdiv_settings_init(&subdiv_settings, smd, ctx);
264  if (subdiv_settings.level == 0) {
265  return result;
266  }
267  SubsurfRuntimeData *runtime_data = subsurf_ensure_runtime(smd);
268  Subdiv *subdiv = subdiv_descriptor_ensure(smd, &subdiv_settings, mesh);
269  if (subdiv == NULL) {
270  /* Happens on bad topology, but also on empty input mesh. */
271  return result;
272  }
273  const bool use_clnors = (smd->flags & eSubsurfModifierFlag_UseCustomNormals) &&
274  (mesh->flag & ME_AUTOSMOOTH) &&
276  if (use_clnors) {
277  /* If custom normals are present and the option is turned on calculate the split
278  * normals and clear flag so the normals get interpolated to the result mesh. */
281  }
282  /* TODO(sergey): Decide whether we ever want to use CCG for subsurf,
283  * maybe when it is a last modifier in the stack? */
284  if (true) {
285  result = subdiv_as_mesh(smd, ctx, mesh, subdiv);
286  }
287  else {
288  result = subdiv_as_ccg(smd, ctx, mesh, subdiv);
289  }
290 
291  if (use_clnors) {
292  float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
293  BLI_assert(lnors != NULL);
297  }
298  // BKE_subdiv_stats_print(&subdiv->stats);
299  if (subdiv != runtime_data->subdiv) {
300  BKE_subdiv_free(subdiv);
301  }
302  return result;
303 }
304 
305 static void deformMatrices(ModifierData *md,
306  const ModifierEvalContext *ctx,
307  Mesh *mesh,
308  float (*vertex_cos)[3],
309  float (*deform_matrices)[3][3],
310  int num_verts)
311 {
312 #if !defined(WITH_OPENSUBDIV)
313  BKE_modifier_set_error(ctx->object, md, "Disabled, built without OpenSubdiv");
314  return;
315 #endif
316 
317  /* Subsurf does not require extra space mapping, keep matrices as is. */
318  (void)deform_matrices;
319 
321  SubdivSettings subdiv_settings;
322  subdiv_settings_init(&subdiv_settings, smd, ctx);
323  if (subdiv_settings.level == 0) {
324  return;
325  }
326  SubsurfRuntimeData *runtime_data = subsurf_ensure_runtime(smd);
327  Subdiv *subdiv = subdiv_descriptor_ensure(smd, &subdiv_settings, mesh);
328  if (subdiv == NULL) {
329  /* Happens on bad topology, but also on empty input mesh. */
330  return;
331  }
332  BKE_subdiv_deform_coarse_vertices(subdiv, mesh, vertex_cos, num_verts);
333  if (subdiv != runtime_data->subdiv) {
334  BKE_subdiv_free(subdiv);
335  }
336 }
337 
338 #ifdef WITH_CYCLES
339 static bool get_show_adaptive_options(const bContext *C, Panel *panel)
340 {
341  /* Don't show adaptive options if cycles isn't the active engine. */
342  const struct RenderEngineType *engine_type = CTX_data_engine_type(C);
343  if (!STREQ(engine_type->idname, "CYCLES")) {
344  return false;
345  }
346 
347  /* Only show adaptive options if this is the last modifier. */
349  ModifierData *md = ptr->data;
350  if (md->next != NULL) {
351  return false;
352  }
353 
354  /* Don't show adaptive options if regular subdivision used*/
355  if (!RNA_boolean_get(ptr, "use_limit_surface")) {
356  return false;
357  }
358 
359  /* Don't show adaptive options if the cycles experimental feature set is disabled. */
361  PointerRNA scene_ptr;
362  RNA_id_pointer_create(&scene->id, &scene_ptr);
364  PointerRNA cycles_ptr = RNA_pointer_get(&scene_ptr, "cycles");
365  if (RNA_enum_get(&cycles_ptr, "feature_set") != 1) { /* EXPERIMENTAL */
366  return false;
367  }
368  }
369 
370  return true;
371 }
372 #endif
373 
374 static void panel_draw(const bContext *C, Panel *panel)
375 {
376  uiLayout *layout = panel->layout;
377 
378  PointerRNA ob_ptr;
380 
381  /* Only test for adaptive subdivision if built with cycles. */
382  bool show_adaptive_options = false;
383  bool ob_use_adaptive_subdivision = false;
384  PointerRNA cycles_ptr = {NULL};
385  PointerRNA ob_cycles_ptr = {NULL};
386 #ifdef WITH_CYCLES
387  PointerRNA scene_ptr;
389  RNA_id_pointer_create(&scene->id, &scene_ptr);
391  cycles_ptr = RNA_pointer_get(&scene_ptr, "cycles");
392  ob_cycles_ptr = RNA_pointer_get(&ob_ptr, "cycles");
393  if (!RNA_pointer_is_null(&ob_cycles_ptr)) {
394  ob_use_adaptive_subdivision = RNA_boolean_get(&ob_cycles_ptr, "use_adaptive_subdivision");
395  show_adaptive_options = get_show_adaptive_options(C, panel);
396  }
397  }
398 #else
399  UNUSED_VARS(C);
400 #endif
401 
402  uiItemR(layout, ptr, "subdivision_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
403 
404  uiLayoutSetPropSep(layout, true);
405 
406  if (show_adaptive_options) {
407  uiItemR(layout,
408  &ob_cycles_ptr,
409  "use_adaptive_subdivision",
410  0,
411  IFACE_("Adaptive Subdivision"),
412  ICON_NONE);
413  }
414  if (ob_use_adaptive_subdivision && show_adaptive_options) {
415  uiItemR(layout, &ob_cycles_ptr, "dicing_rate", 0, NULL, ICON_NONE);
416  float render = MAX2(RNA_float_get(&cycles_ptr, "dicing_rate") *
417  RNA_float_get(&ob_cycles_ptr, "dicing_rate"),
418  0.1f);
419  float preview = MAX2(RNA_float_get(&cycles_ptr, "preview_dicing_rate") *
420  RNA_float_get(&ob_cycles_ptr, "dicing_rate"),
421  0.1f);
422  char output[64];
423  snprintf(output, 64, "Final Scale: Render %.2f px, Viewport %.2f px", render, preview);
424  uiItemL(layout, output, ICON_NONE);
425 
426  uiItemS(layout);
427 
428  uiItemR(layout, ptr, "levels", 0, IFACE_("Levels Viewport"), ICON_NONE);
429  }
430  else {
431  uiLayout *col = uiLayoutColumn(layout, true);
432  uiItemR(col, ptr, "levels", 0, IFACE_("Levels Viewport"), ICON_NONE);
433  uiItemR(col, ptr, "render_levels", 0, IFACE_("Render"), ICON_NONE);
434  }
435 
436  uiItemR(layout, ptr, "show_only_control_edges", 0, NULL, ICON_NONE);
437 
438  modifier_panel_end(layout, ptr);
439 }
440 
441 static void advanced_panel_draw(const bContext *C, Panel *panel)
442 {
443  uiLayout *layout = panel->layout;
444 
445  PointerRNA ob_ptr;
447 
448  bool ob_use_adaptive_subdivision = false;
449  bool show_adaptive_options = false;
450 #ifdef WITH_CYCLES
453  PointerRNA ob_cycles_ptr = RNA_pointer_get(&ob_ptr, "cycles");
454  if (!RNA_pointer_is_null(&ob_cycles_ptr)) {
455  ob_use_adaptive_subdivision = RNA_boolean_get(&ob_cycles_ptr, "use_adaptive_subdivision");
456  show_adaptive_options = get_show_adaptive_options(C, panel);
457  }
458  }
459 #else
460  UNUSED_VARS(C);
461 #endif
462 
463  uiLayoutSetPropSep(layout, true);
464 
465  uiLayoutSetActive(layout, !(show_adaptive_options && ob_use_adaptive_subdivision));
466  uiItemR(layout, ptr, "use_limit_surface", 0, NULL, ICON_NONE);
467 
468  uiLayout *col = uiLayoutColumn(layout, true);
469  uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_limit_surface"));
470  uiItemR(col, ptr, "quality", 0, NULL, ICON_NONE);
471 
472  uiItemR(layout, ptr, "uv_smooth", 0, NULL, ICON_NONE);
473  uiItemR(layout, ptr, "boundary_smooth", 0, NULL, ICON_NONE);
474  uiItemR(layout, ptr, "use_creases", 0, NULL, ICON_NONE);
475  uiItemR(layout, ptr, "use_custom_normals", 0, NULL, ICON_NONE);
476 }
477 
478 static void panelRegister(ARegionType *region_type)
479 {
482  region_type, "advanced", "Advanced", NULL, advanced_panel_draw, panel_type);
483 }
484 
485 static void blendRead(BlendDataReader *UNUSED(reader), ModifierData *md)
486 {
488 
489  smd->emCache = smd->mCache = NULL;
490 }
491 
493  /* name */ "Subdivision",
494  /* structName */ "SubsurfModifierData",
495  /* structSize */ sizeof(SubsurfModifierData),
496  /* srna */ &RNA_SubsurfModifier,
501  /* icon */ ICON_MOD_SUBSURF,
502 
503  /* copyData */ copyData,
504 
505  /* deformVerts */ NULL,
506  /* deformMatrices */ deformMatrices,
507  /* deformVertsEM */ NULL,
508  /* deformMatricesEM */ NULL,
509  /* modifyMesh */ modifyMesh,
510  /* modifyHair */ NULL,
511  /* modifyGeometrySet */ NULL,
512  /* modifyVolume */ NULL,
513 
514  /* initData */ initData,
515  /* requiredDataMask */ requiredDataMask,
516  /* freeData */ freeData,
517  /* isDisabled */ isDisabled,
518  /* updateDepsgraph */ NULL,
519  /* dependsOnTime */ NULL,
520  /* dependsOnNormals */ dependsOnNormals,
521  /* foreachIDLink */ NULL,
522  /* foreachTexLink */ NULL,
523  /* freeRuntimeData */ freeRuntimeData,
524  /* panelRegister */ panelRegister,
525  /* blendWrite */ NULL,
526  /* blendRead */ blendRead,
527 };
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
struct RenderEngineType * CTX_data_engine_type(const bContext *C)
Definition: context.c:1064
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_AcceptsCVs
Definition: BKE_modifier.h:81
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:92
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
@ 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_TO_BASE_MESH
Definition: BKE_modifier.h:141
bool BKE_scene_uses_cycles(const struct Scene *scene)
int get_render_subsurf_level(const struct RenderData *r, int lvl, bool for_render)
eSubdivVtxBoundaryInterpolation BKE_subdiv_vtx_boundary_interpolation_from_subsurf(int boundary_smooth)
Definition: subdiv.c:75
void BKE_subdiv_free(Subdiv *subdiv)
Definition: subdiv.c:189
Subdiv * BKE_subdiv_update_from_mesh(Subdiv *subdiv, const SubdivSettings *settings, const struct Mesh *mesh)
eSubdivFVarLinearInterpolation BKE_subdiv_fvar_interpolation_from_uv_smooth(int uv_smooth)
Definition: subdiv.c:55
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_VARS(...)
#define UNUSED(x)
#define MAX2(a, b)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STREQ(a, b)
#define snprintf
Definition: BLI_winstuff.h:69
#define IFACE_(msgid)
void ccgSubSurf_free(CCGSubSurf *ss)
Definition: CCGSubSurf.c:295
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_NORMAL
@ CD_CUSTOMLOOPNORMAL
#define CD_MASK_CUSTOMLOOPNORMAL
@ CD_FLAG_TEMPORARY
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ ME_AUTOSMOOTH
@ SUBSURF_TYPE_SIMPLE
@ eModifierType_Subsurf
struct SubsurfModifierData SubsurfModifierData
@ eSubsurfModifierFlag_UseRecursiveSubdivision
@ eSubsurfModifierFlag_UseCrease
@ eSubsurfModifierFlag_ControlEdges
@ eSubsurfModifierFlag_UseCustomNormals
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void blendRead(BlendDataReader *UNUSED(reader), ModifierData *md)
Definition: MOD_subsurf.c:485
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
Definition: MOD_subsurf.c:101
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_subsurf.c:254
static SubsurfRuntimeData * subsurf_ensure_runtime(SubsurfModifierData *smd)
Definition: MOD_subsurf.c:242
static void deformMatrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertex_cos)[3], float(*deform_matrices)[3][3], int num_verts)
Definition: MOD_subsurf.c:305
static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
Definition: MOD_subsurf.c:190
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_subsurf.c:92
static void freeRuntimeData(void *runtime_data_v)
Definition: MOD_subsurf.c:113
static void subdiv_settings_init(SubdivSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
Definition: MOD_subsurf.c:157
static void subdiv_ccg_settings_init(SubdivToCCGSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
Definition: MOD_subsurf.c:217
ModifierTypeInfo modifierType_Subsurf
Definition: MOD_subsurf.c:492
static void advanced_panel_draw(const bContext *C, Panel *panel)
Definition: MOD_subsurf.c:441
static Mesh * subdiv_as_ccg(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_subsurf.c:227
static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParams)
Definition: MOD_subsurf.c:140
static void initData(ModifierData *md)
Definition: MOD_subsurf.c:72
static void panelRegister(ARegionType *region_type)
Definition: MOD_subsurf.c:478
static Subdiv * subdiv_descriptor_ensure(SubsurfModifierData *smd, const SubdivSettings *subdiv_settings, const Mesh *mesh)
Definition: MOD_subsurf.c:178
static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
Definition: MOD_subsurf.c:148
struct SubsurfRuntimeData SubsurfRuntimeData
static void freeData(ModifierData *md)
Definition: MOD_subsurf.c:125
static Mesh * subdiv_as_mesh(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
Definition: MOD_subsurf.c:200
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_subsurf.c:81
static void panel_draw(const bContext *C, Panel *panel)
Definition: MOD_subsurf.c:374
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_SubsurfModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_EXPAND
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
#define output
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
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6562
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
Definition: rna_access.c:122
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6355
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:174
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
struct CustomData pdata ldata
short flag
struct ModifierData * next
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
ModifierApplyFlag flag
Definition: BKE_modifier.h:155
struct Object * object
Definition: BKE_modifier.h:154
struct uiLayout * layout
void * data
Definition: RNA_types.h:52
void(* render)(struct RenderEngine *engine, struct Depsgraph *depsgraph)
Definition: RE_engine.h:88
char idname[64]
Definition: RE_engine.h:83
struct RenderData r
bool is_adaptive
Definition: BKE_subdiv.h:76
eSubdivFVarLinearInterpolation fvar_linear_interpolation
Definition: BKE_subdiv.h:87
bool use_creases
Definition: BKE_subdiv.h:84
eSubdivVtxBoundaryInterpolation vtx_boundary_interpolation
Definition: BKE_subdiv.h:86
SubdivSettings settings
Definition: BKE_subdiv.h:176
struct Subdiv * subdiv
Definition: MOD_subsurf.c:69
PointerRNA * ptr
Definition: wm_files.c:3157