12#include <fmt/format.h>
46#include "RNA_prototypes.hh"
65 if (runtime_data_v ==
nullptr) {
162 const bool has_gpu_subdiv)
172 mesh->
runtime->subsurf_runtime_data = runtime_data;
198#if !defined(WITH_OPENSUBDIV)
227 const bool is_editmode = (mesh->
runtime->edit_mesh !=
nullptr);
244 const bool delay =
G.background || is_render_mode || has_gpu_subdiv;
254 runtime_data, mesh,
false);
255 if (subdiv ==
nullptr) {
263 memcpy(
data, mesh->corner_normals().data(), mesh->corner_normals().size_in_bytes());
295#if !defined(WITH_OPENSUBDIV)
308 runtime_data, mesh,
false);
309 if (subdiv ==
nullptr) {
330 if (md->
next !=
nullptr) {
358 smd,
static_cast<const Mesh *
>(ob->
data)))
360 layout->
label(
RPT_(
"Sharp edges or custom normals detected, disabling GPU subdivision"),
368 if (runtime_data && runtime_data->
used_gpu) {
370 layout->
label(
RPT_(
"Using both CPU and GPU subdivision"), ICON_INFO);
381 "open_adaptive_subdivision_panel",
383 "use_adaptive_subdivision",
384 IFACE_(
"Adaptive Subdivision"));
385 if (adaptive_panel.
body) {
389 const float render_rate =
RNA_float_get(&cycles_ptr,
"dicing_rate");
390 const float preview_rate =
RNA_float_get(&cycles_ptr,
"preview_dicing_rate");
391 std::string render_str, preview_str;
397 ptr,
"adaptive_object_edge_length",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
404 preview_str = fmt::format(
"{:.2f} px",
406 render_str = fmt::format(
"{:.2f} px",
413 col->label(
IFACE_(
"Viewport"), ICON_NONE);
416 col->label(preview_str, ICON_NONE);
417 col->label(render_str, ICON_NONE);
422 C,
ptr,
"open_advanced_panel",
IFACE_(
"Advanced")))
424 advanced_layout->use_property_split_set(
true);
426 advanced_layout->prop(
ptr,
"use_limit_surface",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
433 advanced_layout->prop(
ptr,
"uv_smooth",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
434 advanced_layout->prop(
ptr,
"boundary_smooth",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
435 advanced_layout->prop(
ptr,
"use_creases",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
436 advanced_layout->prop(
ptr,
"use_custom_normals",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
450 "SubsurfModifierData",
452 &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)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
Mesh * BKE_mesh_wrapper_ensure_subdivision(Mesh *mesh)
bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode)
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
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
Mesh * BKE_subdiv_to_ccg_mesh(blender::bke::subdiv::Subdiv &subdiv, const SubdivToCCGSettings &settings, const Mesh &coarse_mesh)
bool BKE_subsurf_modifier_can_do_gpu_subdiv(const SubsurfModifierData *smd, const Mesh *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_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 MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
#define DNA_struct_default_get(struct_name)
@ eSubsurfModifierFlag_UseAdaptiveSubdivision
@ eSubsurfModifierFlag_ControlEdges
@ eSubsurfModifierFlag_UseCustomNormals
@ SUBSURF_ADAPTIVE_SPACE_OBJECT
Object is a sort of wrapper for general info.
static void split(const char *text, const char *seps, char ***str, int *count)
Read Guarded memory(de)allocation.
static void deform_matrices(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 > matrices)
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void panel_draw(const bContext *, Panel *panel)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void free_data(ModifierData *md)
static void free_runtime_data(void *runtime_data_v)
static void init_data(ModifierData *md)
static void subdiv_cache_mesh_wrapper_settings(const ModifierEvalContext *ctx, Mesh *mesh, SubsurfModifierData *smd, SubsurfRuntimeData *runtime_data, const bool has_gpu_subdiv)
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 ModifierData * modifier_get_last_enabled_for_mode(const Scene *scene, const Object *ob, int required_mode)
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 Mesh * subdiv_as_mesh(SubsurfModifierData *smd, const ModifierEvalContext *ctx, Mesh *mesh, blender::bke::subdiv::Subdiv *subdiv)
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 bool get_show_adaptive_options(const bContext *C, Panel *panel)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
BMesh const char void * data
BPy_StructRNA * 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)
void mesh_set_custom_normals_normalized(Mesh &mesh, MutableSpan< float3 > corner_normals)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_id_pointer_create(ID *id)
MeshRuntimeHandle * runtime
struct ModifierData * next
struct ModifierData * prev
float adaptive_object_edge_length
float adaptive_pixel_size
blender::bke::subdiv::Subdiv * subdiv_cpu
blender::bke::subdiv::Subdiv * subdiv_gpu
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
PanelLayout panel_prop_with_bool_header(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name, PointerRNA *bool_prop_owner, blender::StringRefNull bool_prop_name, std::optional< blender::StringRef > label)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void active_set(bool active)
uiLayout & split(float percentage, bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)