43#include "RNA_prototypes.hh"
84 if (runtime_data_v ==
nullptr) {
136 settings->resolution = (1 << level) + 1;
163 settings->resolution = (1 << level) + 1;
164 settings->need_normal =
true;
165 settings->need_mask =
false;
198 mesh->runtime->subsurf_runtime_data = runtime_data;
206#if !defined(WITH_OPENSUBDIV)
234 const bool is_editmode = (mesh->runtime->edit_mesh !=
nullptr);
243 runtime_data, mesh,
false);
244 if (subdiv ==
nullptr) {
252 memcpy(data, mesh->corner_normals().data(), mesh->corner_normals().size_in_bytes());
266 static_cast<float(*)[3]
>(
283#if !defined(WITH_OPENSUBDIV)
296 runtime_data, mesh,
false);
297 if (subdiv ==
nullptr) {
308static bool get_show_adaptive_options(
const bContext *C,
Panel *panel)
319 if (md->
next !=
nullptr) {
346 bool show_adaptive_options =
false;
347 bool ob_use_adaptive_subdivision =
false;
357 ob_use_adaptive_subdivision =
RNA_boolean_get(&ob_cycles_ptr,
"use_adaptive_subdivision");
358 show_adaptive_options = get_show_adaptive_options(C, panel);
369 if (show_adaptive_options) {
372 "use_adaptive_subdivision",
374 IFACE_(
"Adaptive Subdivision"),
377 if (ob_use_adaptive_subdivision && show_adaptive_options) {
379 float render = std::max(
RNA_float_get(&cycles_ptr,
"dicing_rate") *
382 float preview = std::max(
RNA_float_get(&cycles_ptr,
"preview_dicing_rate") *
386 SNPRINTF(output,
RPT_(
"Final Scale: Render %.2f px, Viewport %.2f px"), render, preview);
387 uiItemL(layout, output, ICON_NONE);
407 RPT_(
"Sharp edges or custom normals detected, disabling GPU subdivision"),
415 if (runtime_data && runtime_data->
used_gpu) {
417 uiItemL(layout,
RPT_(
"Using both CPU and GPU subdivision"), ICON_INFO);
434 bool ob_use_adaptive_subdivision =
false;
435 bool show_adaptive_options =
false;
441 ob_use_adaptive_subdivision =
RNA_boolean_get(&ob_cycles_ptr,
"use_adaptive_subdivision");
442 show_adaptive_options = get_show_adaptive_options(C, panel);
451 uiLayoutSetActive(layout, !(show_adaptive_options && ob_use_adaptive_subdivision));
481 "SubsurfModifierData",
483 &RNA_SubsurfModifier,
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
RenderEngineType * CTX_data_engine_type(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
void BKE_mesh_set_custom_normals_normalized(Mesh *mesh, float(*r_custom_loop_normals)[3])
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
ModifierData * BKE_modifiers_findby_name(const Object *ob, const char *name)
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_scene_uses_cycles(const Scene *scene)
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
bool BKE_scene_uses_cycles_experimental_features(Scene *scene)
Mesh * BKE_subdiv_to_ccg_mesh(blender::bke::subdiv::Subdiv &subdiv, const SubdivToCCGSettings &settings, const Mesh &coarse_mesh)
int BKE_subsurf_modifier_eval_required_mode(bool is_final_render, bool is_edit_mode)
bool BKE_subsurf_modifier_force_disable_gpu_evaluation_for_mesh(const SubsurfModifierData *smd, const Mesh *mesh)
bool BKE_subsurf_modifier_can_do_gpu_subdiv(const Scene *scene, const Object *ob, const Mesh *mesh, const SubsurfModifierData *smd, int required_mode)
bool BKE_subsurf_modifier_use_custom_loop_normals(const SubsurfModifierData *smd, const Mesh *mesh)
bool BKE_subsurf_modifier_runtime_init(SubsurfModifierData *smd, bool use_render_params)
blender::bke::subdiv::Subdiv * BKE_subsurf_modifier_subdiv_descriptor_ensure(SubsurfRuntimeData *runtime_data, const Mesh *mesh, bool for_draw_code)
#define SNPRINTF(dst, format,...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void ccgSubSurf_free(CCGSubSurf *ss)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
struct SubsurfModifierData SubsurfModifierData
@ eSubsurfModifierFlag_ControlEdges
@ eSubsurfModifierFlag_UseCustomNormals
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void free_runtime_data(void *runtime_data_v)
static Mesh * subdiv_as_ccg(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, blender::bke::subdiv::Subdiv *subdiv)
static void blend_read(BlendDataReader *, ModifierData *md)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void free_data(ModifierData *md)
static void subdiv_mesh_settings_init(blender::bke::subdiv::ToMeshSettings *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_mesh(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, blender::bke::subdiv::Subdiv *subdiv)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void deform_matrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 >)
static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd, const ModifierEvalContext *ctx)
static void panel_draw(const bContext *C, Panel *panel)
static void subdiv_cache_mesh_wrapper_settings(const ModifierEvalContext *ctx, Mesh *mesh, SubsurfModifierData *smd, SubsurfRuntimeData *runtime_data)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
const Depsgraph * depsgraph
void MEM_freeN(void *vmemh)
void free(Subdiv *subdiv)
void deform_coarse_vertices(Subdiv *subdiv, const Mesh *coarse_mesh, MutableSpan< float3 > vert_positions)
Mesh * subdiv_to_mesh(Subdiv *subdiv, const ToMeshSettings *settings, const Mesh *coarse_mesh)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
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)
PointerRNA RNA_id_pointer_create(ID *id)
struct ModifierData * next
blender::bke::subdiv::Subdiv * subdiv_cpu
blender::bke::subdiv::Subdiv * subdiv_gpu