115 if (runtime_data_v ==
NULL) {
184 runtime_data->
subdiv = subdiv;
195 settings->resolution = (1 << level) + 1;
222 settings->resolution = (1 << level) + 1;
245 if (runtime_data ==
NULL) {
246 runtime_data =
MEM_callocN(
sizeof(*runtime_data),
"subsurf runtime");
257 #if !defined(WITH_OPENSUBDIV)
264 if (subdiv_settings.
level == 0) {
269 if (subdiv ==
NULL) {
299 if (subdiv != runtime_data->
subdiv) {
308 float (*vertex_cos)[3],
309 float (*deform_matrices)[3][3],
312 #if !defined(WITH_OPENSUBDIV)
318 (void)deform_matrices;
323 if (subdiv_settings.
level == 0) {
328 if (subdiv ==
NULL) {
333 if (subdiv != runtime_data->
subdiv) {
339 static bool get_show_adaptive_options(
const bContext *
C,
Panel *panel)
382 bool show_adaptive_options =
false;
383 bool ob_use_adaptive_subdivision =
false;
394 ob_use_adaptive_subdivision =
RNA_boolean_get(&ob_cycles_ptr,
"use_adaptive_subdivision");
395 show_adaptive_options = get_show_adaptive_options(
C, panel);
406 if (show_adaptive_options) {
409 "use_adaptive_subdivision",
411 IFACE_(
"Adaptive Subdivision"),
414 if (ob_use_adaptive_subdivision && show_adaptive_options) {
415 uiItemR(layout, &ob_cycles_ptr,
"dicing_rate", 0,
NULL, ICON_NONE);
436 uiItemR(layout,
ptr,
"show_only_control_edges", 0,
NULL, ICON_NONE);
448 bool ob_use_adaptive_subdivision =
false;
449 bool show_adaptive_options =
false;
455 ob_use_adaptive_subdivision =
RNA_boolean_get(&ob_cycles_ptr,
"use_adaptive_subdivision");
456 show_adaptive_options = get_show_adaptive_options(
C, panel);
465 uiLayoutSetActive(layout, !(show_adaptive_options && ob_use_adaptive_subdivision));
494 "SubsurfModifierData",
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
struct RenderEngineType * CTX_data_engine_type(const bContext *C)
void CustomData_clear_layer_flag(struct CustomData *data, int type, int flag)
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)
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
void BKE_mesh_set_custom_normals(struct Mesh *mesh, float(*r_custom_loopnors)[3])
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
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)
void BKE_subdiv_free(Subdiv *subdiv)
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)
struct Mesh * BKE_subdiv_to_ccg_mesh(struct Subdiv *subdiv, const SubdivToCCGSettings *settings, const struct Mesh *coarse_mesh)
struct Mesh * BKE_subdiv_to_mesh(struct Subdiv *subdiv, const SubdivToMeshSettings *settings, const struct Mesh *coarse_mesh)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void ccgSubSurf_free(CCGSubSurf *ss)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
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)
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static SubsurfRuntimeData * subsurf_ensure_runtime(SubsurfModifierData *smd)
static void deformMatrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertex_cos)[3], float(*deform_matrices)[3][3], int num_verts)
static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
static bool dependsOnNormals(ModifierData *md)
static void freeRuntimeData(void *runtime_data_v)
static void subdiv_settings_init(SubdivSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
static void subdiv_ccg_settings_init(SubdivToCCGSettings *settings, const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
ModifierTypeInfo modifierType_Subsurf
static void advanced_panel_draw(const bContext *C, Panel *panel)
static Mesh * subdiv_as_ccg(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParams)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static Subdiv * subdiv_descriptor_ensure(SubsurfModifierData *smd, const SubdivSettings *subdiv_settings, const Mesh *mesh)
static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
struct SubsurfRuntimeData SubsurfRuntimeData
static void freeData(ModifierData *md)
static Mesh * subdiv_as_mesh(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, Subdiv *subdiv)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void panel_draw(const bContext *C, Panel *panel)
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
void uiLayoutSetActive(uiLayout *layout, bool active)
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)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct CustomData pdata ldata
struct ModifierData * next
struct Depsgraph * depsgraph
void(* render)(struct RenderEngine *engine, struct Depsgraph *depsgraph)
eSubdivFVarLinearInterpolation fvar_linear_interpolation
eSubdivVtxBoundaryInterpolation vtx_boundary_interpolation