Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2020-06-05 17:41:03 +0300
committerHans Goudey <h.goudey@me.com>2020-06-05 17:41:03 +0300
commit9b099c86123fc828a194c59ce5b8bbf5a56f9cdb (patch)
tree38937711643f5816881710debd93df2d28cf9675
parent4e70e0e384c08d2d4b021758347aeb5e7a1da0dc (diff)
UI: Drag and Drop Modifiers, Layout Updates
This patch implements the list panel system D7490 for modifiers. It also moves modifier drawing to a callback in ModifierTypeInfo in line with the extensible architecture refactoring goal T75724. This adds a PanelRegister callback and utilities for registering panels and subpanels. It also adds the callbacks for expansion saving and drag and drop reordering described in D7490. These utilities, callbacks, and other common UI elements shared between modifiers live in MOD_ui_common.c. Because modifier buttons are now in panels, we can make use of subpanels for organization. The UI layouts also use the single column layout style consistently used elsewhere in Blender. Additionally, the mode-setting buttons are aligned and ordered consistently with the outliner. However, the large number of UI changes in this patch may mean that additional polishing is required in master. Thanks to William Reynish (@billreynish) who did a fair amount of the layout work and to Julian Eisel (@Severin) for consistent help. Differential Revision: https://developer.blender.org/D7498
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py1803
-rw-r--r--source/blender/blenkernel/BKE_modifier.h10
-rw-r--r--source/blender/blenkernel/intern/modifier.c15
-rw-r--r--source/blender/blenloader/intern/versioning_290.c13
-rw-r--r--source/blender/editors/include/ED_object.h17
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/interface/interface_templates.c366
-rw-r--r--source/blender/editors/object/object_intern.h1
-rw-r--r--source/blender/editors/object/object_modifier.c108
-rw-r--r--source/blender/editors/object/object_ops.c1
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c12
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c48
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c8
-rw-r--r--source/blender/modifiers/CMakeLists.txt10
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c42
-rw-r--r--source/blender/modifiers/intern/MOD_array.c185
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c156
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c38
-rw-r--r--source/blender/modifiers/intern/MOD_build.c56
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c53
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c29
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c29
-rw-r--r--source/blender/modifiers/intern/MOD_correctivesmooth.c48
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c35
-rw-r--r--source/blender/modifiers/intern/MOD_datatransfer.c242
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c63
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c79
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c29
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c38
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c55
-rw-r--r--source/blender/modifiers/intern/MOD_fluid.c29
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c81
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciandeform.c47
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciansmooth.c49
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c36
-rw-r--r--source/blender/modifiers/intern/MOD_mask.cc53
-rw-r--r--source/blender/modifiers/intern/MOD_meshcache.c97
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c49
-rw-r--r--source/blender/modifiers/intern/MOD_meshsequencecache.c47
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c99
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c120
-rw-r--r--source/blender/modifiers/intern/MOD_normal_edit.c92
-rw-r--r--source/blender/modifiers/intern/MOD_ocean.c180
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c135
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c49
-rw-r--r--source/blender/modifiers/intern/MOD_remesh.c65
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c90
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c1
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c71
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c86
-rw-r--r--source/blender/modifiers/intern/MOD_simulation.cc33
-rw-r--r--source/blender/modifiers/intern/MOD_skin.c73
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c43
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c29
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c172
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c151
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c29
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c57
-rw-r--r--source/blender/modifiers/intern/MOD_triangulate.c36
-rw-r--r--source/blender/modifiers/intern/MOD_ui_common.c426
-rw-r--r--source/blender/modifiers/intern/MOD_ui_common.h70
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c49
-rw-r--r--source/blender/modifiers/intern/MOD_uvwarp.c76
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c117
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c128
-rw-r--r--source/blender/modifiers/intern/MOD_weighted_normal.c42
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c54
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.h3
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c97
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c60
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c71
-rw-r--r--source/blender/modifiers/intern/MOD_weld.c34
-rw-r--r--source/blender/modifiers/intern/MOD_wireframe.c75
74 files changed, 4806 insertions, 2192 deletions
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index d58dec211be..e7536838199 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -39,1809 +39,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
-
- ob = context.object
-
layout.operator_menu_enum("object.modifier_add", "type")
-
- for md in ob.modifiers:
- box = layout.template_modifier(md)
- if box:
- # match enum type to our functions, avoids a lookup table.
- getattr(self, md.type)(box, ob, md)
-
- # the mt.type enum is (ab)used for a lookup on function names
- # ...to avoid lengthy if statements
- # so each type must have a function here.
-
- def ARMATURE(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Object:")
- col.prop(md, "object", text="")
- col.prop(md, "use_deform_preserve_volume")
-
- col = split.column()
- col.label(text="Bind To:")
- col.prop(md, "use_vertex_groups", text="Vertex Groups")
- col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
-
- layout.separator()
-
- split = layout.split()
-
- row = split.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = bool(md.vertex_group)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- split.prop(md, "use_multi_modifier")
-
- def ARRAY(self, layout, _ob, md):
- layout.prop(md, "fit_type")
-
- if md.fit_type == 'FIXED_COUNT':
- layout.prop(md, "count")
- elif md.fit_type == 'FIT_LENGTH':
- layout.prop(md, "fit_length")
- elif md.fit_type == 'FIT_CURVE':
- layout.prop(md, "curve")
-
- layout.separator()
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "use_constant_offset")
- sub = col.column()
- sub.active = md.use_constant_offset
- sub.prop(md, "constant_offset_displace", text="")
-
- col.separator()
-
- col.prop(md, "use_merge_vertices", text="Merge")
- sub = col.column()
- sub.active = md.use_merge_vertices
- sub.prop(md, "use_merge_vertices_cap", text="First Last")
- sub.prop(md, "merge_threshold", text="Distance")
-
- col = split.column()
- col.prop(md, "use_relative_offset")
- sub = col.column()
- sub.active = md.use_relative_offset
- sub.prop(md, "relative_offset_displace", text="")
-
- col.separator()
-
- col.prop(md, "use_object_offset")
- sub = col.column()
- sub.active = md.use_object_offset
- sub.prop(md, "offset_object", text="")
-
- row = layout.row()
- split = row.split()
- col = split.column()
- col.label(text="UVs:")
- sub = col.column(align=True)
- sub.prop(md, "offset_u")
- sub.prop(md, "offset_v")
- layout.separator()
-
- layout.prop(md, "start_cap")
- layout.prop(md, "end_cap")
-
- def BEVEL(self, layout, ob, md):
- offset_type = md.offset_type
- if offset_type == 'PERCENT':
- layout.prop(md, "width_pct")
- else:
- offset_text = "Width"
- if offset_type == 'DEPTH':
- offset_text = "Depth"
- elif offset_type == 'OFFSET':
- offset_text = "Offset"
- layout.prop(md, "width", text=offset_text)
- layout.row().prop(md, "offset_type", expand=True)
-
- split = layout.split()
- col = split.column()
- col.prop(md, "use_only_vertices")
- col.prop(md, "use_clamp_overlap")
- col.prop(md, "loop_slide")
- col = split.column()
- col.prop(md, "mark_seam")
- col.prop(md, "mark_sharp")
- col.prop(md, "harden_normals")
-
- layout.row().prop(md, "segments")
- layout.row().prop(md, "profile")
- layout.row().prop(md, "material")
-
- layout.label(text="Miter Type:")
- layout.row().prop(md, "miter_outer", text="Outer")
- layout.row().prop(md, "miter_inner", text="Inner")
- if md.miter_inner in {'MITER_PATCH', 'MITER_ARC'}:
- layout.row().prop(md, "spread")
-
- layout.label(text="Limit Method:")
- layout.row().prop(md, "limit_method", expand=True)
- if md.limit_method == 'ANGLE':
- layout.prop(md, "angle_limit")
- elif md.limit_method == 'VGROUP':
- row = layout.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout.label(text="Face Strength Mode:")
- layout.row().prop(md, "face_strength_mode", expand=True)
-
- layout.label(text="Intersection Type:")
- layout.row().prop(md, "vmesh_method", expand=True)
- layout.row().prop(md, "use_custom_profile")
- row = layout.row()
- row.enabled = md.use_custom_profile
- if md.use_custom_profile:
- layout.template_curveprofile(md, "custom_profile")
-
- def BOOLEAN(self, layout, _ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Operation:")
- col.prop(md, "operation", text="")
-
- col = split.column()
- col.label(text="Object:")
- col.prop(md, "object", text="")
-
- layout.prop(md, "double_threshold")
-
- if bpy.app.debug:
- layout.prop(md, "debug_options")
-
- def BUILD(self, layout, _ob, md):
- split = layout.split()
-
- col = split.column()
- col.prop(md, "frame_start")
- col.prop(md, "frame_duration")
- col.prop(md, "use_reverse")
-
- col = split.column()
- col.prop(md, "use_random_order")
- sub = col.column()
- sub.active = md.use_random_order
- sub.prop(md, "seed")
-
- def MESH_CACHE(self, layout, _ob, md):
- layout.prop(md, "cache_format")
- layout.prop(md, "filepath")
-
- if md.cache_format == 'ABC':
- layout.prop(md, "sub_object")
-
- layout.label(text="Evaluation:")
- layout.prop(md, "factor", slider=True)
- layout.prop(md, "deform_mode")
- layout.prop(md, "interpolation")
-
- layout.label(text="Time Mapping:")
-
- row = layout.row()
- row.prop(md, "time_mode", expand=True)
- row = layout.row()
- row.prop(md, "play_mode", expand=True)
- if md.play_mode == 'SCENE':
- layout.prop(md, "frame_start")
- layout.prop(md, "frame_scale")
- else:
- time_mode = md.time_mode
- if time_mode == 'FRAME':
- layout.prop(md, "eval_frame")
- elif time_mode == 'TIME':
- layout.prop(md, "eval_time")
- elif time_mode == 'FACTOR':
- layout.prop(md, "eval_factor")
-
- layout.label(text="Axis Mapping:")
- split = layout.split(factor=0.5, align=True)
- split.alert = (md.forward_axis[-1] == md.up_axis[-1])
- split.label(text="Forward/Up Axis:")
- split.prop(md, "forward_axis", text="")
- split.prop(md, "up_axis", text="")
- split = layout.split(factor=0.5)
- split.label(text="Flip Axis:")
- row = split.row()
- row.prop(md, "flip_axis")
-
- def MESH_SEQUENCE_CACHE(self, layout, ob, md):
- layout.label(text="Cache File Properties:")
- box = layout.box()
- box.template_cache_file(md, "cache_file")
-
- cache_file = md.cache_file
-
- layout.label(text="Modifier Properties:")
- box = layout.box()
-
- if cache_file is not None:
- box.prop_search(md, "object_path", cache_file, "object_paths")
-
- if ob.type == 'MESH':
- box.row().prop(md, "read_data")
-
- def CAST(self, layout, ob, md):
- split = layout.split(factor=0.25)
-
- split.label(text="Cast Type:")
- split.prop(md, "cast_type", text="")
-
- split = layout.split(factor=0.25)
-
- col = split.column()
- col.prop(md, "use_x")
- col.prop(md, "use_y")
- col.prop(md, "use_z")
-
- col = split.column()
- col.prop(md, "factor")
- col.prop(md, "radius")
- col.prop(md, "size")
- col.prop(md, "use_radius_as_size")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- col = split.column()
- col.label(text="Control Object:")
- col.prop(md, "object", text="")
- if md.object:
- col.prop(md, "use_transform")
-
- def CLOTH(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def COLLISION(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def CURVE(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Object:")
- col.prop(md, "object", text="")
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- layout.label(text="Deformation Axis:")
- layout.row().prop(md, "deform_axis", expand=True)
-
- def DECIMATE(self, layout, ob, md):
- decimate_type = md.decimate_type
-
- row = layout.row()
- row.prop(md, "decimate_type", expand=True)
-
- if decimate_type == 'COLLAPSE':
- has_vgroup = bool(md.vertex_group)
- layout.prop(md, "ratio")
-
- split = layout.split()
-
- col = split.column()
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout_info = col
-
- col = split.column()
- row = col.row()
- row.active = has_vgroup
- row.prop(md, "vertex_group_factor")
-
- col.prop(md, "use_collapse_triangulate")
- row = col.split(factor=0.75)
- row.prop(md, "use_symmetry")
- row.prop(md, "symmetry_axis", text="")
-
- elif decimate_type == 'UNSUBDIV':
- layout.prop(md, "iterations")
- layout_info = layout
- else: # decimate_type == 'DISSOLVE':
- layout.prop(md, "angle_limit")
- layout.prop(md, "use_dissolve_boundaries")
- layout.label(text="Delimit:")
- row = layout.row()
- row.prop(md, "delimit")
- layout_info = layout
-
- layout_info.label(
- text=iface_("Face Count: {:,}".format(md.face_count)),
- translate=False,
- )
-
- def DISPLACE(self, layout, ob, md):
- has_texture = (md.texture is not None)
-
- col = layout.column(align=True)
- col.label(text="Texture:")
- col.template_ID(md, "texture", new="texture.new")
-
- split = layout.split()
-
- col = split.column(align=True)
- col.label(text="Direction:")
- col.prop(md, "direction", text="")
- if md.direction in {'X', 'Y', 'Z', 'RGB_TO_XYZ'}:
- col.label(text="Space:")
- col.prop(md, "space", text="")
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- col = split.column(align=True)
- col.active = has_texture
- col.label(text="Texture Coordinates:")
- col.prop(md, "texture_coords", text="")
- if md.texture_coords == 'OBJECT':
- col.label(text="Object:")
- col.prop(md, "texture_coords_object", text="")
- obj = md.texture_coords_object
- if obj and obj.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "texture_coords_bone", obj.data, "bones", text="")
- elif md.texture_coords == 'UV' and ob.type == 'MESH':
- col.label(text="UV Map:")
- col.prop_search(md, "uv_layer", ob.data, "uv_layers", text="")
-
- layout.separator()
-
- row = layout.row()
- row.prop(md, "mid_level")
- row.prop(md, "strength")
-
- def DYNAMIC_PAINT(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def EDGE_SPLIT(self, layout, _ob, md):
- split = layout.split()
-
- col = split.column()
- col.prop(md, "use_edge_angle", text="Edge Angle")
- sub = col.column()
- sub.active = md.use_edge_angle
- sub.prop(md, "split_angle")
-
- split.prop(md, "use_edge_sharp", text="Sharp Edges")
-
- def EXPLODE(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- sub = col.column()
- sub.active = bool(md.vertex_group)
- sub.prop(md, "protect")
- col.label(text="Particle UV")
- col.prop_search(md, "particle_uv", ob.data, "uv_layers", text="")
-
- col = split.column()
- col.prop(md, "use_edge_cut")
- col.prop(md, "show_unborn")
- col.prop(md, "show_alive")
- col.prop(md, "show_dead")
- col.prop(md, "use_size")
-
- layout.operator("object.explode_refresh", text="Refresh")
-
- def FLUID_SIMULATION(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def HOOK(self, layout, ob, md):
- use_falloff = (md.falloff_type != 'NONE')
- split = layout.split()
-
- col = split.column()
- col.label(text="Object:")
- col.prop(md, "object", text="")
- if md.object and md.object.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "subtarget", md.object.data, "bones", text="")
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout.separator()
-
- row = layout.row(align=True)
- if use_falloff:
- row.prop(md, "falloff_radius")
- row.prop(md, "strength", slider=True)
- layout.prop(md, "falloff_type")
-
- col = layout.column()
- if use_falloff:
- if md.falloff_type == 'CURVE':
- col.template_curve_mapping(md, "falloff_curve")
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "use_falloff_uniform")
-
- if ob.mode == 'EDIT':
- row = col.row(align=True)
- row.operator("object.hook_reset", text="Reset")
- row.operator("object.hook_recenter", text="Recenter")
-
- row = layout.row(align=True)
- row.operator("object.hook_select", text="Select")
- row.operator("object.hook_assign", text="Assign")
-
- def LAPLACIANDEFORM(self, layout, ob, md):
- is_bind = md.is_bind
-
- layout.prop(md, "iterations")
-
- row = layout.row(align=True)
- row.enabled = not is_bind
- row.prop_search(md, "vertex_group", ob, "vertex_groups")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout.separator()
-
- row = layout.row()
- row.enabled = bool(md.vertex_group)
- row.operator("object.laplaciandeform_bind", text="Unbind" if is_bind else "Bind")
-
- def LAPLACIANSMOOTH(self, layout, ob, md):
- layout.prop(md, "iterations")
-
- split = layout.split(factor=0.25)
-
- col = split.column()
- col.label(text="Axis:")
- col.prop(md, "use_x")
- col.prop(md, "use_y")
- col.prop(md, "use_z")
-
- col = split.column()
- col.label(text="Lambda:")
- col.prop(md, "lambda_factor", text="Factor")
- col.prop(md, "lambda_border", text="Border")
-
- col.separator()
- col.prop(md, "use_volume_preserve")
- col.prop(md, "use_normalized")
-
- layout.label(text="Vertex Group:")
- row = layout.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- def LATTICE(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Object:")
- col.prop(md, "object", text="")
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout.separator()
- layout.prop(md, "strength", slider=True)
-
- def MASK(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Mode:")
- col.prop(md, "mode", text="")
-
- col = split.column()
- if md.mode == 'ARMATURE':
- col.label(text="Armature:")
- row = col.row(align=True)
- row.prop(md, "armature", text="")
- sub = row.row(align=True)
- sub.active = (md.armature is not None)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- elif md.mode == 'VERTEX_GROUP':
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = bool(md.vertex_group)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- col = layout.column()
- col.prop(md, "threshold")
-
- def MESH_DEFORM(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.enabled = not md.is_bound
- col.label(text="Object:")
- col.prop(md, "object", text="")
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = bool(md.vertex_group)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- layout.separator()
- row = layout.row()
- row.enabled = not md.is_bound
- row.prop(md, "precision")
- row.prop(md, "use_dynamic_bind")
-
- layout.separator()
- if md.is_bound:
- layout.operator("object.meshdeform_bind", text="Unbind")
- else:
- layout.operator("object.meshdeform_bind", text="Bind")
-
- def MIRROR(self, layout, _ob, md):
- axis_text = "XYZ"
- split = layout.split(factor=0.33)
-
- col = split.column()
- col.label(text="Axis:")
- for i, text in enumerate(axis_text):
- col.prop(md, "use_axis", text=text, index=i)
-
- col = split.column()
- col.label(text="Bisect:")
- for i, text in enumerate(axis_text):
- colsub = col.column()
- colsub.prop(md, "use_bisect_axis", text=text, index=i)
- colsub.active = md.use_axis[i]
-
- col = split.column()
- col.label(text="Flip:")
- for i, text in enumerate(axis_text):
- colsub = col.column()
- colsub.prop(md, "use_bisect_flip_axis", text=text, index=i)
- colsub.active = md.use_axis[i] and md.use_bisect_axis[i]
-
- layout.separator()
-
- col = layout.column()
- col.label(text="Mirror Object:")
- col.prop(md, "mirror_object", text="")
-
- layout.separator()
-
- col = layout.column()
- col.label(text="Options:")
-
- row = layout.row()
- row.prop(md, "use_mirror_vertex_groups", text="Vertex Groups")
- row.prop(md, "use_clip", text="Clipping")
- row = layout.row()
- row.prop(md, "use_mirror_merge", text="Merge")
-
- col = layout.column()
- if md.use_mirror_merge is True:
- col.prop(md, "merge_threshold")
-
- layout.separator()
- col = layout.column()
-
- col.label(text="Textures:")
- row = layout.row()
- row.prop(md, "use_mirror_u", text="Flip U")
- row.prop(md, "use_mirror_v", text="Flip V")
- row = layout.row()
- row.prop(md, "use_mirror_udim", text="Flip UDIM")
-
- col = layout.column(align=True)
-
- if md.use_mirror_u:
- col.prop(md, "mirror_offset_u")
-
- if md.use_mirror_v:
- col.prop(md, "mirror_offset_v")
-
- col = layout.column(align=True)
- col.prop(md, "offset_u")
- col.prop(md, "offset_v")
-
- def MULTIRES(self, layout, ob, md):
- # Changing some of the properties can not be done once there is an
- # actual displacement stored for this multires modifier. This check
- # will disallow those properties from change.
- # This is a bit stupid check but should be sufficient for the usual
- # multires usage. It might become less strict and only disallow
- # modifications if there is CD_MDISPS layer, or if there is actual
- # non-zero displacement but such checks will be too slow to be done
- # on every redraw.
- have_displacement = (md.total_levels != 0)
-
- row = layout.row()
- row.enabled = not have_displacement
- row.prop(md, "subdivision_type", expand=True)
-
- split = layout.split()
- col = split.column()
- col.prop(md, "levels", text="Preview")
- col.prop(md, "sculpt_levels", text="Sculpt")
- col.prop(md, "render_levels", text="Render")
-
- row = col.row()
- row.enabled = not have_displacement
- row.prop(md, "quality")
-
- col = split.column()
-
- col.enabled = ob.mode != 'EDIT'
- op = col.operator("object.multires_subdivide", text="Subdivide")
- op.mode = 'CATMULL_CLARK'
-
- op = col.operator("object.multires_subdivide", text="Subdivide Simple")
- op.mode = 'SIMPLE'
-
- op = col.operator("object.multires_subdivide", text="Subdivide Linear")
- op.mode = 'LINEAR'
-
- col.operator("object.multires_higher_levels_delete", text="Delete Higher")
- col.operator("object.multires_unsubdivide", text="Unsubdivide")
- col.operator("object.multires_reshape", text="Reshape")
- col.operator("object.multires_base_apply", text="Apply Base")
- col.operator("object.multires_rebuild_subdiv", text="Rebuild Subdivisions")
- col.prop(md, "uv_smooth", text="")
- col.prop(md, "show_only_control_edges")
-
- row = col.row()
- row.enabled = not have_displacement
- row.prop(md, "use_creases")
-
- layout.separator()
-
- col = layout.column()
- row = col.row()
- if md.is_external:
- row.operator("object.multires_external_pack", text="Pack External")
- row.label()
- row = col.row()
- row.prop(md, "filepath", text="")
- else:
- row.operator("object.multires_external_save", text="Save External...")
- row.label()
-
- def OCEAN(self, layout, _ob, md):
- if not bpy.app.build_options.mod_oceansim:
- layout.label(text="Built without OceanSim modifier")
- return
-
- layout.prop(md, "geometry_mode")
-
- if md.geometry_mode == 'GENERATE':
- row = layout.row()
- row.prop(md, "repeat_x")
- row.prop(md, "repeat_y")
-
- layout.separator()
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "time")
- col.prop(md, "depth")
- col.prop(md, "random_seed")
-
- col = split.column()
- col.prop(md, "resolution")
- col.prop(md, "size")
- col.prop(md, "spatial_size")
-
- layout.separator()
-
- layout.prop(md, "spectrum")
-
- if md.spectrum in {'TEXEL_MARSEN_ARSLOE', 'JONSWAP'}:
- split = layout.split()
-
- col = split.column()
- col.prop(md, "sharpen_peak_jonswap")
-
- col = split.column()
- col.prop(md, "fetch_jonswap")
-
- layout.label(text="Waves:")
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "choppiness")
- col.prop(md, "wave_scale", text="Scale")
- col.prop(md, "wave_scale_min")
- col.prop(md, "wind_velocity")
-
- col = split.column()
- col.prop(md, "wave_alignment", text="Alignment")
- sub = col.column()
- sub.active = (md.wave_alignment > 0.0)
- sub.prop(md, "wave_direction", text="Direction")
- sub.prop(md, "damping")
-
- layout.separator()
-
- layout.prop(md, "use_normals")
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "use_foam")
- sub = col.row()
- sub.active = md.use_foam
- sub.prop(md, "foam_coverage", text="Coverage")
-
- col = split.column()
- col.active = md.use_foam
- col.label(text="Foam Data Layer Name:")
- col.prop(md, "foam_layer_name", text="")
-
- layout.separator()
-
- if md.is_cached:
- layout.operator("object.ocean_bake", text="Delete Bake").free = True
- else:
- layout.operator("object.ocean_bake").free = False
-
- split = layout.split()
- split.enabled = not md.is_cached
-
- col = split.column(align=True)
- col.prop(md, "frame_start", text="Start")
- col.prop(md, "frame_end", text="End")
-
- col = split.column(align=True)
- col.label(text="Cache path:")
- col.prop(md, "filepath", text="")
-
- split = layout.split()
- split.enabled = not md.is_cached
-
- col = split.column()
- col.active = md.use_foam
- col.prop(md, "bake_foam_fade")
-
- col = split.column()
-
- def PARTICLE_INSTANCE(self, layout, ob, md):
- layout.prop(md, "object")
- if md.object:
- layout.prop_search(md, "particle_system", md.object, "particle_systems", text="Particle System")
- else:
- layout.prop(md, "particle_system_index", text="Particle System")
-
- split = layout.split()
- col = split.column()
- col.label(text="Create From:")
- layout.prop(md, "space", text="")
- col.prop(md, "use_normal")
- col.prop(md, "use_children")
- col.prop(md, "use_size")
-
- col = split.column()
- col.label(text="Show Particles When:")
- col.prop(md, "show_alive")
- col.prop(md, "show_unborn")
- col.prop(md, "show_dead")
-
- row = layout.row(align=True)
- row.prop(md, "particle_amount", text="Amount")
- row.prop(md, "particle_offset", text="Offset")
-
- row = layout.row(align=True)
- row.prop(md, "axis", expand=True)
-
- layout.separator()
-
- layout.prop(md, "use_path", text="Create Along Paths")
-
- col = layout.column()
- col.active = md.use_path
- col.prop(md, "use_preserve_shape")
-
- row = col.row(align=True)
- row.prop(md, "position", slider=True)
- row.prop(md, "random_position", text="Random", slider=True)
- row = col.row(align=True)
- row.prop(md, "rotation", slider=True)
- row.prop(md, "random_rotation", text="Random", slider=True)
-
- layout.separator()
-
- col = layout.column()
- col.prop_search(md, "index_layer_name", ob.data, "vertex_colors", text="Index Layer")
- col.prop_search(md, "value_layer_name", ob.data, "vertex_colors", text="Value Layer")
-
- def PARTICLE_SYSTEM(self, layout, _ob, _md):
- layout.label(text="Settings can be found inside the Particle context")
-
- def SCREW(self, layout, _ob, md):
- split = layout.split()
-
- col = split.column()
- col.prop(md, "axis")
- col.prop(md, "object", text="AxisOb")
- col.prop(md, "angle")
- col.prop(md, "steps")
- col.prop(md, "render_steps")
- col.prop(md, "use_smooth_shade")
- col.prop(md, "use_merge_vertices")
- sub = col.column()
- sub.active = md.use_merge_vertices
- sub.prop(md, "merge_threshold")
-
- col = split.column()
- row = col.row()
- row.active = (md.object is None or md.use_object_screw_offset is False)
- row.prop(md, "screw_offset")
- row = col.row()
- row.active = (md.object is not None)
- row.prop(md, "use_object_screw_offset")
- col.prop(md, "use_normal_calculate")
- col.prop(md, "use_normal_flip")
- col.prop(md, "iterations")
- col.prop(md, "use_stretch_u")
- col.prop(md, "use_stretch_v")
-
- def SHRINKWRAP(self, layout, ob, md):
- split = layout.split()
- col = split.column()
- col.label(text="Target:")
- col.prop(md, "target", text="")
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "offset")
-
- col = split.column()
- col.label(text="Mode:")
- col.prop(md, "wrap_method", text="")
-
- if md.wrap_method in {'PROJECT', 'NEAREST_SURFACEPOINT', 'TARGET_PROJECT'}:
- col.prop(md, "wrap_mode", text="")
-
- if md.wrap_method == 'PROJECT':
- split = layout.split()
- col = split.column()
- col.prop(md, "subsurf_levels")
- col = split.column()
-
- col.prop(md, "project_limit", text="Limit")
- split = layout.split(factor=0.25)
-
- col = split.column()
- col.label(text="Axis:")
- col.prop(md, "use_project_x")
- col.prop(md, "use_project_y")
- col.prop(md, "use_project_z")
-
- col = split.column()
- col.label(text="Direction:")
- col.prop(md, "use_negative_direction")
- col.prop(md, "use_positive_direction")
-
- subcol = col.column()
- subcol.active = md.use_negative_direction and md.cull_face != 'OFF'
- subcol.prop(md, "use_invert_cull")
-
- col = split.column()
- col.label(text="Cull Faces:")
- col.prop(md, "cull_face", expand=True)
-
- layout.prop(md, "auxiliary_target")
-
- def SIMPLE_DEFORM(self, layout, ob, md):
-
- layout.row().prop(md, "deform_method", expand=True)
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Axis, Origin:")
- col.prop(md, "origin", text="")
-
- col.prop(md, "deform_axis")
-
- if md.deform_method in {'TAPER', 'STRETCH', 'TWIST'}:
- row = col.row(align=True)
- row.label(text="Lock:")
- deform_axis = md.deform_axis
- if deform_axis != 'X':
- row.prop(md, "lock_x")
- if deform_axis != 'Y':
- row.prop(md, "lock_y")
- if deform_axis != 'Z':
- row.prop(md, "lock_z")
-
- col = split.column()
- col.label(text="Deform:")
- if md.deform_method in {'TAPER', 'STRETCH'}:
- col.prop(md, "factor")
- else:
- col.prop(md, "angle")
- col.prop(md, "limits", slider=True)
-
- def FLUID(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def SMOOTH(self, layout, ob, md):
- split = layout.split(factor=0.25)
-
- col = split.column()
- col.label(text="Axis:")
- col.prop(md, "use_x")
- col.prop(md, "use_y")
- col.prop(md, "use_z")
-
- col = split.column()
- col.prop(md, "factor")
- col.prop(md, "iterations")
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- def SOFT_BODY(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def SOLIDIFY(self, layout, ob, md):
-
- layout.row().prop(md, "solidify_mode")
-
- solidify_mode = md.solidify_mode
-
- if solidify_mode == 'NON_MANIFOLD':
- layout.prop(md, "nonmanifold_thickness_mode")
- layout.prop(md, "nonmanifold_boundary_mode")
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "thickness")
- col.prop(md, "thickness_clamp")
- row = col.row()
- row.active = md.thickness_clamp > 0.0
- row.prop(md, "use_thickness_angle_clamp")
-
- col.separator()
-
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = bool(md.vertex_group)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- sub = col.row()
- sub.active = bool(md.vertex_group)
- sub.prop(md, "thickness_vertex_group", text="Factor")
- if solidify_mode == 'NON_MANIFOLD':
- sub = col.row()
- sub.active = bool(md.vertex_group)
- sub.prop(md, "use_flat_faces")
-
- if solidify_mode == 'EXTRUDE':
- col.label(text="Crease:")
- col.prop(md, "edge_crease_inner", text="Inner")
- col.prop(md, "edge_crease_outer", text="Outer")
- col.prop(md, "edge_crease_rim", text="Rim")
- col.label(text="Bevel:")
- col.prop(md, "bevel_convex")
- else:
- col.label(text="Bevel:")
- col.prop(md, "bevel_convex")
- col.separator()
- col.prop(md, "nonmanifold_merge_threshold")
-
- col = split.column()
-
- col.prop(md, "offset")
-
- col.prop(md, "use_flip_normals")
-
- if solidify_mode == 'EXTRUDE':
- col.prop(md, "use_even_offset")
- col.prop(md, "use_quality_normals")
-
- col.prop(md, "use_rim")
- col_rim = col.column()
- col_rim.active = md.use_rim
- col_rim.prop(md, "use_rim_only")
-
- col.separator()
-
- col.label(text="Material Index Offset:")
-
- sub = col.column()
- row = sub.split(factor=0.4, align=True)
- row.prop(md, "material_offset", text="")
- row = row.row(align=True)
- row.active = md.use_rim
- row.prop(md, "material_offset_rim", text="Rim")
-
- col.separator()
-
- row = col.row(align=True)
- row.label(text="Shell Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "shell_vertex_group", ob, "vertex_groups", text="")
- row = col.row(align=True)
- row.label(text="Rim Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "rim_vertex_group", ob, "vertex_groups", text="")
-
- def SUBSURF(self, layout, ob, md):
- from bpy import context
- layout.row().prop(md, "subdivision_type", expand=True)
-
- split = layout.split()
- col = split.column()
-
- scene = context.scene
- engine = context.engine
- show_adaptive_options = (
- engine == 'CYCLES' and md == ob.modifiers[-1] and
- scene.cycles.feature_set == 'EXPERIMENTAL'
- )
- if show_adaptive_options:
- col.label(text="Render:")
- col.prop(ob.cycles, "use_adaptive_subdivision", text="Adaptive")
- if ob.cycles.use_adaptive_subdivision:
- col.prop(ob.cycles, "dicing_rate")
- else:
- col.prop(md, "render_levels", text="Levels")
-
- col.separator()
-
- col.label(text="Viewport:")
- col.prop(md, "levels", text="Levels")
- else:
- col.label(text="Subdivisions:")
- sub = col.column(align=True)
- sub.prop(md, "render_levels", text="Render")
- sub.prop(md, "levels", text="Viewport")
-
- col.prop(md, "quality")
-
- col = split.column()
- col.label(text="Options:")
-
- sub = col.column()
- sub.active = (not show_adaptive_options) or (not ob.cycles.use_adaptive_subdivision)
- sub.prop(md, "uv_smooth", text="")
-
- col.prop(md, "show_only_control_edges")
- col.prop(md, "use_creases")
-
- if show_adaptive_options and ob.cycles.use_adaptive_subdivision:
- col = layout.column(align=True)
- col.scale_y = 0.6
- col.separator()
- col.label(text="Final Dicing Rate:")
- col.separator()
-
- render = max(scene.cycles.dicing_rate * ob.cycles.dicing_rate, 0.1)
- preview = max(scene.cycles.preview_dicing_rate * ob.cycles.dicing_rate, 0.1)
- col.label(text=f"Render {render:.2f} px, Preview {preview:.2f} px")
-
- def SURFACE(self, layout, _ob, _md):
- layout.label(text="Settings are inside the Physics tab")
-
- def SURFACE_DEFORM(self, layout, _ob, md):
- split = layout.split()
- col = split.column()
- col.active = not md.is_bound
-
- col.label(text="Target:")
- col.prop(md, "target", text="")
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", _ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- split = layout.split()
- col = split.column()
- col.prop(md, "falloff")
- col = split.column()
- col.prop(md, "strength")
-
- col = layout.column()
-
- if md.is_bound:
- col.operator("object.surfacedeform_bind", text="Unbind")
- else:
- col.active = md.target is not None
- col.operator("object.surfacedeform_bind", text="Bind")
-
- def UV_PROJECT(self, layout, ob, md):
- split = layout.split()
- col = split.column()
- col.prop_search(md, "uv_layer", ob.data, "uv_layers")
- col.separator()
-
- col.prop(md, "projector_count", text="Projectors")
- for proj in md.projectors:
- col.prop(proj, "object", text="")
-
- col = split.column()
- sub = col.column(align=True)
- sub.prop(md, "aspect_x", text="Aspect X")
- sub.prop(md, "aspect_y", text="Aspect Y")
-
- sub = col.column(align=True)
- sub.prop(md, "scale_x", text="Scale X")
- sub.prop(md, "scale_y", text="Scale Y")
-
- def WARP(self, layout, ob, md):
- use_falloff = (md.falloff_type != 'NONE')
- split = layout.split()
-
- col = split.column()
- col.label(text="From:")
- col.prop(md, "object_from", text="")
-
- col = split.column()
- col.label(text="To:")
- col.prop(md, "object_to", text="")
-
- split = layout.split()
- col = split.column()
- obj = md.object_from
- if obj and obj.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "bone_from", obj.data, "bones", text="")
-
- col = split.column()
- obj = md.object_to
- if obj and obj.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "bone_to", obj.data, "bones", text="")
-
- split = layout.split()
- col = split.column()
- col.prop(md, "use_volume_preserve")
- col = split.column()
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- col = layout.column()
-
- row = col.row(align=True)
- row.prop(md, "strength")
- if use_falloff:
- row.prop(md, "falloff_radius")
-
- col.prop(md, "falloff_type")
- if use_falloff:
- if md.falloff_type == 'CURVE':
- col.template_curve_mapping(md, "falloff_curve")
-
- # 2 new columns
- split = layout.split()
- col = split.column()
- col.label(text="Texture:")
- col.template_ID(md, "texture", new="texture.new")
-
- col = split.column()
- col.label(text="Texture Coordinates:")
- col.prop(md, "texture_coords", text="")
-
- if md.texture_coords == 'OBJECT':
- layout.prop(md, "texture_coords_object", text="Object")
- obj = md.texture_coords_object
- if obj and obj.type == 'ARMATURE':
- layout.prop_search(md, "texture_coords_bone", obj.data, "bones", text="Bone")
- elif md.texture_coords == 'UV' and ob.type == 'MESH':
- layout.prop_search(md, "uv_layer", ob.data, "uv_layers")
-
- def WAVE(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Motion:")
- col.prop(md, "use_x")
- col.prop(md, "use_y")
- col.prop(md, "use_cyclic")
-
- col = split.column()
- col.prop(md, "use_normal")
- sub = col.column()
- sub.active = md.use_normal
- sub.prop(md, "use_normal_x", text="X")
- sub.prop(md, "use_normal_y", text="Y")
- sub.prop(md, "use_normal_z", text="Z")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Time:")
- sub = col.column(align=True)
- sub.prop(md, "time_offset", text="Offset")
- sub.prop(md, "lifetime", text="Life")
- col.prop(md, "damping_time", text="Damping")
-
- col = split.column()
- col.label(text="Position:")
- sub = col.column(align=True)
- sub.prop(md, "start_position_x", text="X")
- sub.prop(md, "start_position_y", text="Y")
- col.prop(md, "falloff_radius", text="Falloff")
-
- layout.separator()
-
- layout.prop(md, "start_position_object")
- row = layout.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- split = layout.split(factor=0.33)
- col = split.column()
- col.label(text="Texture")
- col = split.column()
- col.template_ID(md, "texture", new="texture.new")
- layout.prop(md, "texture_coords")
- if md.texture_coords == 'UV' and ob.type == 'MESH':
- layout.prop_search(md, "uv_layer", ob.data, "uv_layers")
- elif md.texture_coords == 'OBJECT':
- layout.prop(md, "texture_coords_object")
- obj = md.texture_coords_object
- if obj and obj.type == 'ARMATURE':
- layout.prop_search(md, "texture_coords_bone", obj.data, "bones")
-
- layout.separator()
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "speed", slider=True)
- col.prop(md, "height", slider=True)
-
- col = split.column()
- col.prop(md, "width", slider=True)
- col.prop(md, "narrowness", slider=True)
-
- def REMESH(self, layout, _ob, md):
- if not bpy.app.build_options.mod_remesh:
- layout.label(text="Built without Remesh modifier")
- return
-
- layout.prop(md, "mode")
-
- row = layout.row()
- if md.mode == 'VOXEL':
- layout.prop(md, "voxel_size")
- layout.prop(md, "adaptivity")
- else:
- row.prop(md, "octree_depth")
- row.prop(md, "scale")
-
- if md.mode == 'SHARP':
- layout.prop(md, "sharpness")
-
- layout.prop(md, "use_remove_disconnected")
- row = layout.row()
- row.active = md.use_remove_disconnected
- row.prop(md, "threshold")
-
- layout.prop(md, "use_smooth_shade")
-
- @staticmethod
- def vertex_weight_mask(layout, ob, md):
- layout.label(text="Influence/Mask Options:")
-
- split = layout.split(factor=0.4)
- split.label(text="Global Influence:")
- split.prop(md, "mask_constant", text="")
-
- if not md.mask_texture:
- split = layout.split(factor=0.4)
- split.label(text="Vertex Group Mask:")
- row = split.row(align=True)
- row.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_mask_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- if not md.mask_vertex_group:
- split = layout.split(factor=0.4)
- split.label(text="Texture Mask:")
- split.template_ID(md, "mask_texture", new="texture.new")
- if md.mask_texture:
- split = layout.split()
-
- col = split.column()
- col.label(text="Texture Coordinates:")
- col.prop(md, "mask_tex_mapping", text="")
-
- col = split.column()
- col.label(text="Use Channel:")
- col.prop(md, "mask_tex_use_channel", text="")
-
- if md.mask_tex_mapping == 'OBJECT':
- layout.prop(md, "mask_tex_map_object", text="Object")
- obj = md.mask_tex_map_object
- if obj and obj.type == 'ARMATURE':
- layout.prop_search(md, "mask_tex_map_bone", obj.data, "bones", text="Bone")
- elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
- layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_layers")
-
- def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
-
- col.label(text="Default Weight:")
- col.prop(md, "default_weight", text="")
-
- col = split.column()
- col.prop(md, "use_add")
- sub = col.column()
- sub.active = md.use_add
- sub.prop(md, "add_threshold")
-
- col = col.column()
- col.prop(md, "use_remove")
- sub = col.column()
- sub.active = md.use_remove
- sub.prop(md, "remove_threshold")
-
- layout.separator()
-
- row = layout.row(align=True)
- row.prop(md, "falloff_type")
- row.prop(md, "invert_falloff", text="", icon='ARROW_LEFTRIGHT')
- if md.falloff_type == 'CURVE':
- layout.template_curve_mapping(md, "map_curve")
-
- row = layout.row(align=True)
- row.prop(md, "normalize")
-
- # Common mask options
- layout.separator()
- self.vertex_weight_mask(layout, ob, md)
-
- def VERTEX_WEIGHT_MIX(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group A:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group_a", text="", icon='ARROW_LEFTRIGHT')
- col.label(text="Default Weight A:")
- col.prop(md, "default_weight_a", text="")
-
- col.label(text="Mix Mode:")
- col.prop(md, "mix_mode", text="")
-
- col = split.column()
- col.label(text="Vertex Group B:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group_b", text="", icon='ARROW_LEFTRIGHT')
- col.label(text="Default Weight B:")
- col.prop(md, "default_weight_b", text="")
-
- col.label(text="Mix Set:")
- col.prop(md, "mix_set", text="")
-
- row = layout.row(align=True)
- row.prop(md, "normalize")
-
- # Common mask options
- layout.separator()
- self.vertex_weight_mask(layout, ob, md)
-
- def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
-
- col = split.column()
- col.label(text="Target Object:")
- col.prop(md, "target", text="")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Distance:")
- col.prop(md, "proximity_mode", text="")
- if md.proximity_mode == 'GEOMETRY':
- col.row().prop(md, "proximity_geometry")
-
- col = split.column()
- col.label()
- col.prop(md, "min_dist")
- col.prop(md, "max_dist")
-
- layout.separator()
- row = layout.row(align=True)
- row.prop(md, "falloff_type")
- row.prop(md, "invert_falloff", text="", icon='ARROW_LEFTRIGHT')
-
- row = layout.row(align=True)
- row.prop(md, "normalize")
-
- # Common mask options
- layout.separator()
- self.vertex_weight_mask(layout, ob, md)
-
- def SKIN(self, layout, _ob, md):
- row = layout.row()
- row.operator("object.skin_armature_create", text="Create Armature")
- row.operator("mesh.customdata_skin_add")
-
- layout.separator()
-
- row = layout.row(align=True)
- row.prop(md, "branch_smoothing")
- row.prop(md, "use_smooth_shade")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Selected Vertices:")
- sub = col.column(align=True)
- sub.operator("object.skin_loose_mark_clear", text="Mark Loose").action = 'MARK'
- sub.operator("object.skin_loose_mark_clear", text="Clear Loose").action = 'CLEAR'
-
- sub = col.column()
- sub.operator("object.skin_root_mark", text="Mark Root")
- sub.operator("object.skin_radii_equalize", text="Equalize Radii")
-
- col = split.column()
- col.label(text="Symmetry Axes:")
- col.prop(md, "use_x_symmetry")
- col.prop(md, "use_y_symmetry")
- col.prop(md, "use_z_symmetry")
-
- def TRIANGULATE(self, layout, _ob, md):
- row = layout.row()
-
- col = row.column()
- col.label(text="Quad Method:")
- col.prop(md, "quad_method", text="")
- col.prop(md, "keep_custom_normals")
- col = row.column()
- col.label(text="Ngon Method:")
- col.prop(md, "ngon_method", text="")
- col.label(text="Minimum Vertices:")
- col.prop(md, "min_vertices", text="")
-
- def UV_WARP(self, layout, ob, md):
- split = layout.split()
- col = split.column()
- col.prop(md, "center")
-
- col = split.column()
- col.label(text="UV Axis:")
- col.prop(md, "axis_u", text="")
- col.prop(md, "axis_v", text="")
-
- split = layout.split()
- col = split.column()
- col.label(text="From:")
- col.prop(md, "object_from", text="")
-
- col = split.column()
- col.label(text="To:")
- col.prop(md, "object_to", text="")
-
- split = layout.split()
- col = split.column()
- obj = md.object_from
- if obj and obj.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "bone_from", obj.data, "bones", text="")
-
- col = split.column()
- obj = md.object_to
- if obj and obj.type == 'ARMATURE':
- col.label(text="Bone:")
- col.prop_search(md, "bone_to", obj.data, "bones", text="")
-
- split = layout.split()
- col = split.column()
- col.label(text="Offset:")
- col.prop(md, "offset", text="")
-
- col = split.column()
- col.label(text="Scale:")
- col.prop(md, "scale", text="")
-
- col = split.column()
- col.label(text="Rotate:")
- col.prop(md, "rotation", text="")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- col = split.column()
- col.label(text="UV Map:")
- col.prop_search(md, "uv_layer", ob.data, "uv_layers", text="")
-
- def WIREFRAME(self, layout, ob, md):
- has_vgroup = bool(md.vertex_group)
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "thickness", text="Thickness")
-
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = has_vgroup
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- row = col.row(align=True)
- row.active = has_vgroup
- row.prop(md, "thickness_vertex_group", text="Factor")
-
- col.prop(md, "use_crease", text="Crease Edges")
- row = col.row()
- row.active = md.use_crease
- row.prop(md, "crease_weight", text="Crease Weight")
-
- col = split.column()
-
- col.prop(md, "offset")
- col.prop(md, "use_even_offset", text="Even Thickness")
- col.prop(md, "use_relative_offset", text="Relative Thickness")
- col.prop(md, "use_boundary", text="Boundary")
- col.prop(md, "use_replace", text="Replace Original")
-
- col.prop(md, "material_offset", text="Material Offset")
-
- def WELD(self, layout, ob, md):
- layout.prop(md, "merge_threshold", text="Distance")
- layout.prop(md, "max_interactions")
- row = layout.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- def DATA_TRANSFER(self, layout, ob, md):
- row = layout.row(align=True)
- row.prop(md, "object")
- sub = row.row(align=True)
- sub.active = bool(md.object)
- sub.prop(md, "use_object_transform", text="", icon='GROUP')
-
- layout.separator()
-
- split = layout.split(factor=0.333)
- split.prop(md, "use_vert_data")
- use_vert = md.use_vert_data
- row = split.row()
- row.active = use_vert
- row.prop(md, "vert_mapping", text="")
- if use_vert:
- col = layout.column(align=True)
- split = col.split(factor=0.333, align=True)
- sub = split.column(align=True)
- sub.prop(md, "data_types_verts")
- sub = split.column(align=True)
- row = sub.row(align=True)
- row.prop(md, "layers_vgroup_select_src", text="")
- row.label(icon='RIGHTARROW')
- row.prop(md, "layers_vgroup_select_dst", text="")
- row = sub.row(align=True)
- row.label(text="", icon='NONE')
-
- layout.separator()
-
- split = layout.split(factor=0.333)
- split.prop(md, "use_edge_data")
- use_edge = md.use_edge_data
- row = split.row()
- row.active = use_edge
- row.prop(md, "edge_mapping", text="")
- if use_edge:
- col = layout.column(align=True)
- split = col.split(factor=0.333, align=True)
- sub = split.column(align=True)
- sub.prop(md, "data_types_edges")
-
- layout.separator()
-
- split = layout.split(factor=0.333)
- split.prop(md, "use_loop_data")
- use_loop = md.use_loop_data
- row = split.row()
- row.active = use_loop
- row.prop(md, "loop_mapping", text="")
- if use_loop:
- col = layout.column(align=True)
- split = col.split(factor=0.333, align=True)
- sub = split.column(align=True)
- sub.prop(md, "data_types_loops")
- sub = split.column(align=True)
- row = sub.row(align=True)
- row.label(text="", icon='NONE')
- row = sub.row(align=True)
- row.prop(md, "layers_vcol_select_src", text="")
- row.label(icon='RIGHTARROW')
- row.prop(md, "layers_vcol_select_dst", text="")
- row = sub.row(align=True)
- row.prop(md, "layers_uv_select_src", text="")
- row.label(icon='RIGHTARROW')
- row.prop(md, "layers_uv_select_dst", text="")
- col.prop(md, "islands_precision")
-
- layout.separator()
-
- split = layout.split(factor=0.333)
- split.prop(md, "use_poly_data")
- use_poly = md.use_poly_data
- row = split.row()
- row.active = use_poly
- row.prop(md, "poly_mapping", text="")
- if use_poly:
- col = layout.column(align=True)
- split = col.split(factor=0.333, align=True)
- sub = split.column(align=True)
- sub.prop(md, "data_types_polys")
-
- layout.separator()
-
- split = layout.split()
- col = split.column()
- row = col.row(align=True)
- sub = row.row(align=True)
- sub.active = md.use_max_distance
- sub.prop(md, "max_distance")
- row.prop(md, "use_max_distance", text="", icon='STYLUS_PRESSURE')
-
- col = split.column()
- col.prop(md, "ray_radius")
-
- layout.separator()
-
- split = layout.split()
- col = split.column()
- col.prop(md, "mix_mode")
- col.prop(md, "mix_factor")
-
- col = split.column()
- row = col.row()
- row.active = bool(md.object)
- row.operator("object.datalayout_transfer", text="Generate Data Layers")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = bool(md.vertex_group)
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- def NORMAL_EDIT(self, layout, ob, md):
- has_vgroup = bool(md.vertex_group)
- do_polynors_fix = not md.no_polynors_fix
- needs_object_offset = (((md.mode == 'RADIAL') and not md.target) or
- ((md.mode == 'DIRECTIONAL') and md.use_direction_parallel))
-
- row = layout.row()
- row.prop(md, "mode", expand=True)
-
- split = layout.split()
-
- col = split.column()
- col.prop(md, "target", text="")
- sub = col.column(align=True)
- sub.active = needs_object_offset
- sub.prop(md, "offset")
- row = col.row(align=True)
-
- col = split.column()
- row = col.row()
- row.active = (md.mode == 'DIRECTIONAL')
- row.prop(md, "use_direction_parallel")
-
- subcol = col.column(align=True)
- subcol.label(text="Mix Mode:")
- subcol.prop(md, "mix_mode", text="")
- subcol.prop(md, "mix_factor")
- row = subcol.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = row.row(align=True)
- sub.active = has_vgroup
- sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- row = subcol.row(align=True)
- row.prop(md, "mix_limit")
- row.prop(md, "no_polynors_fix", text="", icon='UNLOCKED' if do_polynors_fix else 'LOCKED')
-
- def CORRECTIVE_SMOOTH(self, layout, ob, md):
- is_bind = md.is_bind
-
- layout.prop(md, "factor", text="Factor")
- layout.prop(md, "iterations")
- layout.prop(md, "scale")
- row = layout.row()
- row.prop(md, "smooth_type")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
-
- col = split.column()
- col.prop(md, "use_only_smooth")
- col.prop(md, "use_pin_boundary")
-
- layout.prop(md, "rest_source")
- if md.rest_source == 'BIND':
- layout.operator("object.correctivesmooth_bind", text="Unbind" if is_bind else "Bind")
-
- def WEIGHTED_NORMAL(self, layout, ob, md):
- layout.label(text="Weighting Mode:")
- split = layout.split(align=True)
- col = split.column(align=True)
- col.prop(md, "mode", text="")
- col.prop(md, "weight", text="Weight")
- col.prop(md, "keep_sharp")
-
- col = split.column(align=True)
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.active = bool(md.vertex_group)
- row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
- col.prop(md, "thresh", text="Threshold")
- col.prop(md, "face_influence")
-
- def SIMULATION(self, layout, ob, md):
- layout.prop(md, "simulation")
- layout.prop(md, "data_path")
+ layout.template_modifiers()
class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index ad67ee290b0..e4cf7d44f05 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -28,6 +28,7 @@
extern "C" {
#endif
+struct ARegionType;
struct BMEditMesh;
struct CustomData_MeshMasks;
struct DepsNodeHandle;
@@ -351,13 +352,22 @@ typedef struct ModifierTypeInfo {
* more like "ensure the data is freed".
*/
void (*freeRuntimeData)(void *runtime_data);
+
+ /* Register the panel types for the modifier's UI. */
+ void (*panelRegister)(struct ARegionType *region_type);
} ModifierTypeInfo;
+/* Used to find a modifier's panel type. */
+#define MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_"
+
/* Initialize modifier's global data (type info and some common global storages). */
void BKE_modifier_init(void);
const ModifierTypeInfo *BKE_modifier_get_info(ModifierType type);
+/* For modifier UI panels. */
+void BKE_modifier_type_panel_id(ModifierType type, char *r_idname);
+
/* Modifier utility calls, do call through type pointer and return
* default values if pointer is optional.
*/
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 6b54a530034..324a9d3ccb0 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -116,6 +116,17 @@ const ModifierTypeInfo *BKE_modifier_get_info(ModifierType type)
}
}
+/**
+ * Get the idname of the modifier type's panel, which was defined in the #panelRegister callback.
+ */
+void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
+{
+ const ModifierTypeInfo *mti = BKE_modifier_get_info(type);
+
+ strcpy(r_idname, MODIFIER_TYPE_PANEL_PREFIX);
+ strcat(r_idname, mti->name);
+}
+
/***/
ModifierData *BKE_modifier_new(int type)
@@ -127,8 +138,9 @@ ModifierData *BKE_modifier_new(int type)
BLI_strncpy(md->name, DATA_(mti->name), sizeof(md->name));
md->type = type;
- md->mode = eModifierMode_Realtime | eModifierMode_Render | eModifierMode_Expanded;
+ md->mode = eModifierMode_Realtime | eModifierMode_Render;
md->flag = eModifierFlag_OverrideLibrary_Local;
+ md->ui_expand_flag = 1; /* Only open the main panel at the beginning, not the subpanels. */
if (mti->flags & eModifierTypeFlag_EnableInEditmode) {
md->mode |= eModifierMode_Editmode;
@@ -342,6 +354,7 @@ void BKE_modifier_copydata_ex(ModifierData *md, ModifierData *target, const int
target->mode = md->mode;
target->flag = md->flag;
+ target->ui_expand_flag = md->ui_expand_flag;
if (mti->copyData) {
mti->copyData(md, target, flag);
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index ed23b69c623..c5628b43960 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -266,5 +266,18 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
*/
{
/* Keep this block, even when empty. */
+
+ if (!DNA_struct_elem_find(fd->filesdna, "ModifierData", "short", "ui_expand_flag")) {
+ for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
+ LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
+ if (md->mode & eModifierMode_Expanded_DEPRECATED) {
+ md->ui_expand_flag = 1;
+ }
+ else {
+ md->ui_expand_flag = 0;
+ }
+ }
+ }
+ }
}
}
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index e027efce1d3..cd25ee54392 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -370,12 +370,17 @@ bool ED_object_modifier_remove(struct ReportList *reports,
struct Object *ob,
struct ModifierData *md);
void ED_object_modifier_clear(struct Main *bmain, struct Object *ob);
-int ED_object_modifier_move_down(struct ReportList *reports,
- struct Object *ob,
- struct ModifierData *md);
-int ED_object_modifier_move_up(struct ReportList *reports,
- struct Object *ob,
- struct ModifierData *md);
+bool ED_object_modifier_move_down(struct ReportList *reports,
+ struct Object *ob,
+ struct ModifierData *md);
+bool ED_object_modifier_move_up(struct ReportList *reports,
+ struct Object *ob,
+ struct ModifierData *md);
+bool ED_object_modifier_move_to_index(struct ReportList *reports,
+ struct Object *ob,
+ struct ModifierData *md,
+ const int index);
+
int ED_object_modifier_convert(struct ReportList *reports,
struct Main *bmain,
struct Depsgraph *depsgraph,
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 01bc59f71e7..11dbb105072 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -2002,7 +2002,7 @@ void uiTemplatePathBuilder(uiLayout *layout,
const char *propname,
struct PointerRNA *root_ptr,
const char *text);
-uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
+void uiTemplateModifiers(uiLayout *layout, struct bContext *C);
uiLayout *uiTemplateGpencilModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
void uiTemplateGpencilColorPreview(uiLayout *layout,
struct bContext *C,
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 6001e1ea1b5..1d55e2b3e4b 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1816,360 +1816,50 @@ void uiTemplatePathBuilder(uiLayout *layout,
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Modifier Template
+/** \name Modifiers Template
+ *
+ * Template for building the panel layout for the active object's modifiers.
* \{ */
-#define ERROR_LIBDATA_MESSAGE TIP_("Can't edit external library data")
-
-static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
+static void modifier_panel_id(void *md_link, char *r_name)
{
- Object *ob = ob_v;
- ModifierData *md = md_v;
- ModifierData *nmd = BKE_modifier_new(md->type);
-
- BKE_modifier_copydata(md, nmd);
- nmd->mode &= ~eModifierMode_Virtual;
-
- BLI_addhead(&ob->modifiers, nmd);
-
- BKE_modifier_unique_name(&ob->modifiers, nmd);
-
- ob->partype = PAROBJECT;
-
- WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
-
- ED_undo_push(C, "Modifier convert to real");
+ ModifierData *md = (ModifierData *)md_link;
+ BKE_modifier_type_panel_id(md->type, r_name);
}
-static bool modifier_can_delete(ModifierData *md)
+void uiTemplateModifiers(uiLayout *UNUSED(layout), bContext *C)
{
- /* fluid particle modifier can't be deleted here */
- if (md->type == eModifierType_ParticleSystem) {
- short particle_type = ((ParticleSystemModifierData *)md)->psys->part->type;
- if (ELEM(particle_type,
- PART_FLUID,
- PART_FLUID_FLIP,
- PART_FLUID_FOAM,
- PART_FLUID_SPRAY,
- PART_FLUID_BUBBLE,
- PART_FLUID_TRACER,
- PART_FLUID_SPRAYFOAM,
- PART_FLUID_SPRAYBUBBLE,
- PART_FLUID_FOAMBUBBLE,
- PART_FLUID_SPRAYFOAMBUBBLE)) {
- return false;
- }
- }
- return true;
-}
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *region = CTX_wm_region(C);
-/* Check whether Modifier is a simulation or not,
- * this is used for switching to the physics/particles context tab */
-static int modifier_is_simulation(ModifierData *md)
-{
- /* Physic Tab */
- if (ELEM(md->type,
- eModifierType_Cloth,
- eModifierType_Collision,
- eModifierType_Fluidsim,
- eModifierType_Fluid,
- eModifierType_Softbody,
- eModifierType_Surface,
- eModifierType_DynamicPaint)) {
- return 1;
- }
- /* Particle Tab */
- else if (md->type == eModifierType_ParticleSystem) {
- return 2;
- }
- else {
- return 0;
- }
-}
-
-static uiLayout *draw_modifier(uiLayout *layout,
- Scene *scene,
- Object *ob,
- ModifierData *md,
- int index,
- int cageIndex,
- int lastCageIndex)
-{
- const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
- PointerRNA ptr;
- uiBut *but;
- uiBlock *block;
- uiLayout *box, *column, *row, *sub;
- uiLayout *result = NULL;
- int isVirtual = (md->mode & eModifierMode_Virtual);
- char str[128];
-
- /* create RNA pointer */
- RNA_pointer_create(&ob->id, &RNA_Modifier, md, &ptr);
-
- column = uiLayoutColumn(layout, true);
- uiLayoutSetContextPointer(column, "modifier", &ptr);
-
- /* rounded header ------------------------------------------------------------------- */
- box = uiLayoutBox(column);
-
- if (isVirtual) {
- row = uiLayoutRow(box, false);
- uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND);
- block = uiLayoutGetBlock(row);
- /* VIRTUAL MODIFIER */
- /* XXX this is not used now, since these cannot be accessed via RNA */
- BLI_snprintf(str, sizeof(str), IFACE_("%s parent deform"), md->name);
- uiDefBut(block,
- UI_BTYPE_LABEL,
- 0,
- str,
- 0,
- 0,
- 185,
- UI_UNIT_Y,
- NULL,
- 0.0,
- 0.0,
- 0.0,
- 0.0,
- TIP_("Modifier name"));
-
- but = uiDefBut(block,
- UI_BTYPE_BUT,
- 0,
- IFACE_("Make Real"),
- 0,
- 0,
- 80,
- 16,
- NULL,
- 0.0,
- 0.0,
- 0.0,
- 0.0,
- TIP_("Convert virtual modifier to a real modifier"));
- UI_but_func_set(but, modifiers_convertToReal, ob, md);
+ Object *ob;
+ SpaceProperties *sbuts = CTX_wm_space_properties(C);
+ if (sbuts != NULL && (sbuts->pinid != NULL) && GS(sbuts->pinid->name) == ID_OB) {
+ ob = (Object *)sbuts->pinid;
}
else {
- /* REAL MODIFIER */
- row = uiLayoutRow(box, false);
- block = uiLayoutGetBlock(row);
-
- UI_block_emboss_set(block, UI_EMBOSS_NONE);
- /* Open/Close ................................. */
- uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NONE);
-
- /* modifier-type icon */
- uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
- UI_block_emboss_set(block, UI_EMBOSS);
-
- /* modifier name */
- if (mti->isDisabled && mti->isDisabled(scene, md, 0)) {
- uiLayoutSetRedAlert(row, true);
- }
- uiItemR(row, &ptr, "name", 0, "", ICON_NONE);
- uiLayoutSetRedAlert(row, false);
-
- /* mode enabling buttons */
- UI_block_align_begin(block);
- /* Collision and Surface are always enabled, hide buttons! */
- if (((md->type != eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) &&
- (md->type != eModifierType_Surface)) {
- uiItemR(row, &ptr, "show_render", 0, "", ICON_NONE);
- uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NONE);
-
- if (mti->flags & eModifierTypeFlag_SupportsEditmode) {
- sub = uiLayoutRow(row, true);
- if (!(md->mode & eModifierMode_Realtime)) {
- uiLayoutSetActive(sub, false);
- }
- uiItemR(sub, &ptr, "show_in_editmode", 0, "", ICON_NONE);
- }
- }
-
- if (ob->type == OB_MESH) {
- if (BKE_modifier_supports_cage(scene, md) && (index <= lastCageIndex)) {
- sub = uiLayoutRow(row, true);
- if (index < cageIndex || !BKE_modifier_couldbe_cage(scene, md)) {
- uiLayoutSetActive(sub, false);
- }
- uiItemR(sub, &ptr, "show_on_cage", 0, "", ICON_NONE);
- }
- } /* tessellation point for curve-typed objects */
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- /* some modifiers could work with pre-tessellated curves only */
- if (ELEM(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
- /* add disabled pre-tessellated button, so users could have
- * message for this modifiers */
- but = uiDefIconButBitI(block,
- UI_BTYPE_TOGGLE,
- eModifierMode_ApplyOnSpline,
- 0,
- ICON_SURFACE_DATA,
- 0,
- 0,
- UI_UNIT_X - 2,
- UI_UNIT_Y,
- &md->mode,
- 0.0,
- 0.0,
- 0.0,
- 0.0,
- TIP_("This modifier can only be applied on splines' points"));
- UI_but_flag_enable(but, UI_BUT_DISABLED);
- }
- else if (mti->type != eModifierTypeType_Constructive) {
- /* constructive modifiers tessellates curve before applying */
- uiItemR(row, &ptr, "use_apply_on_spline", 0, "", ICON_NONE);
- }
- }
-
- UI_block_align_end(block);
-
- /* Up/Down + Delete ........................... */
- UI_block_align_begin(block);
- uiItemO(row, "", ICON_TRIA_UP, "OBJECT_OT_modifier_move_up");
- uiItemO(row, "", ICON_TRIA_DOWN, "OBJECT_OT_modifier_move_down");
- UI_block_align_end(block);
-
- UI_block_emboss_set(block, UI_EMBOSS_NONE);
- /* When Modifier is a simulation,
- * show button to switch to context rather than the delete button. */
- if (modifier_can_delete(md) && !modifier_is_simulation(md)) {
- uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
- }
- else if (modifier_is_simulation(md) == 1) {
- uiItemStringO(
- row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
- }
- else if (modifier_is_simulation(md) == 2) {
- uiItemStringO(
- row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
- }
- UI_block_emboss_set(block, UI_EMBOSS);
+ ob = CTX_data_active_object(C);
}
+ ListBase *modifiers = &ob->modifiers;
- /* modifier settings (under the header) --------------------------------------------------- */
- if (!isVirtual && (md->mode & eModifierMode_Expanded)) {
- /* apply/convert/copy */
- box = uiLayoutBox(column);
- row = uiLayoutRow(box, false);
+ bool panels_match = UI_panel_list_matches_data(region, modifiers, modifier_panel_id);
- if (!ELEM(md->type, eModifierType_Collision, eModifierType_Surface)) {
- /* only here obdata, the rest of modifiers is ob level */
- UI_block_lock_set(block, BKE_object_obdata_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ if (!panels_match) {
+ UI_panels_free_instanced(C, region);
+ ModifierData *md = modifiers->first;
+ for (int i = 0; md; i++, md = md->next) {
+ const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
+ if (mti->panelRegister) {
+ char panel_idname[MAX_NAME];
+ modifier_panel_id(md, panel_idname);
- if (md->type == eModifierType_ParticleSystem) {
- ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
-
- if (!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
- if (ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB)) {
- uiItemO(row,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Convert"),
- ICON_NONE,
- "OBJECT_OT_duplicates_make_real");
- }
- else if (psys->part->ren_as == PART_DRAW_PATH) {
- uiItemO(row,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Convert"),
- ICON_NONE,
- "OBJECT_OT_modifier_convert");
- }
+ Panel *new_panel = UI_panel_add_instanced(sa, region, &region->panels, panel_idname, i);
+ if (new_panel != NULL) {
+ UI_panel_set_expand_from_list_data(C, new_panel);
}
}
- else {
- uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
- uiItemEnumO(row,
- "OBJECT_OT_modifier_apply",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
- 0,
- "apply_as",
- MODIFIER_APPLY_DATA);
-
- if (BKE_modifier_is_same_topology(md) && !BKE_modifier_is_non_geometrical(md)) {
- uiItemEnumO(row,
- "OBJECT_OT_modifier_apply",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply as Shape Key"),
- 0,
- "apply_as",
- MODIFIER_APPLY_SHAPE);
- }
- }
-
- UI_block_lock_clear(block);
- UI_block_lock_set(block, ob && ID_IS_LINKED(ob), ERROR_LIBDATA_MESSAGE);
-
- if (!ELEM(md->type,
- eModifierType_Fluidsim,
- eModifierType_Softbody,
- eModifierType_ParticleSystem,
- eModifierType_Cloth,
- eModifierType_Fluid)) {
- uiItemO(row,
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Copy"),
- ICON_NONE,
- "OBJECT_OT_modifier_copy");
- }
}
-
- /* result is the layout block inside the box,
- * that we return so that modifier settings can be drawn */
- result = uiLayoutColumn(box, false);
- block = uiLayoutAbsoluteBlock(box);
}
-
- /* error messages */
- if (md->error) {
- box = uiLayoutBox(column);
- row = uiLayoutRow(box, false);
- uiItemL(row, md->error, ICON_ERROR);
- }
-
- return result;
-}
-
-uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
- Scene *scene = CTX_data_scene(C);
- Object *ob;
- ModifierData *md, *vmd;
- VirtualModifierData virtualModifierData;
- int i, lastCageIndex, cageIndex;
-
- /* verify we have valid data */
- if (!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- RNA_warning("Expected modifier on object");
- return NULL;
- }
-
- ob = (Object *)ptr->owner_id;
- md = ptr->data;
-
- if (!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("Expected modifier on object");
- return NULL;
- }
-
- UI_block_lock_set(uiLayoutGetBlock(layout), (ob && ID_IS_LINKED(ob)), ERROR_LIBDATA_MESSAGE);
-
- /* find modifier and draw it */
- cageIndex = BKE_modifiers_get_cage_index(scene, ob, &lastCageIndex, 0);
-
- /* XXX virtual modifiers are not accessible for python */
- vmd = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
-
- for (i = 0; vmd; i++, vmd = vmd->next) {
- if (md == vmd) {
- return draw_modifier(layout, scene, ob, md, i, cageIndex, lastCageIndex);
- }
- else if (vmd->mode & eModifierMode_Virtual) {
- i--;
- }
- }
-
- return NULL;
}
/** \} */
@@ -2178,6 +1868,8 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/** \name Grease Pencil Modifier Template
* \{ */
+#define ERROR_LIBDATA_MESSAGE TIP_("Can't edit external library data")
+
static uiLayout *gpencil_draw_modifier(uiLayout *layout, Object *ob, GpencilModifierData *md)
{
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type);
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index d7a7b4ca110..c5a6e38fbcb 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -162,6 +162,7 @@ void OBJECT_OT_modifier_add(struct wmOperatorType *ot);
void OBJECT_OT_modifier_remove(struct wmOperatorType *ot);
void OBJECT_OT_modifier_move_up(struct wmOperatorType *ot);
void OBJECT_OT_modifier_move_down(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_move_to_index(struct wmOperatorType *ot);
void OBJECT_OT_modifier_apply(struct wmOperatorType *ot);
void OBJECT_OT_modifier_convert(struct wmOperatorType *ot);
void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 9398a5f2ce7..0bd49f74db9 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -430,7 +430,7 @@ void ED_object_modifier_clear(Main *bmain, Object *ob)
DEG_relations_tag_update(bmain);
}
-int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
+bool ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
{
if (md->prev) {
const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
@@ -440,18 +440,22 @@ int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md
if (nmti->flags & eModifierTypeFlag_RequiresOriginalData) {
BKE_report(reports, RPT_WARNING, "Cannot move above a modifier requiring original data");
- return 0;
+ return false;
}
}
BLI_remlink(&ob->modifiers, md);
BLI_insertlinkbefore(&ob->modifiers, md->prev, md);
}
+ else {
+ BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the start of the list");
+ return false;
+ }
- return 1;
+ return true;
}
-int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *md)
+bool ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *md)
{
if (md->next) {
const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
@@ -461,15 +465,53 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
if (nmti->type != eModifierTypeType_OnlyDeform) {
BKE_report(reports, RPT_WARNING, "Cannot move beyond a non-deforming modifier");
- return 0;
+ return false;
}
}
BLI_remlink(&ob->modifiers, md);
BLI_insertlinkafter(&ob->modifiers, md->next, md);
}
+ else {
+ BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the end of the list");
+ return false;
+ }
- return 1;
+ return true;
+}
+
+bool ED_object_modifier_move_to_index(ReportList *reports,
+ Object *ob,
+ ModifierData *md,
+ const int index)
+{
+ BLI_assert(md != NULL);
+ BLI_assert(index >= 0);
+ if (index >= BLI_listbase_count(&ob->modifiers)) {
+ BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the end of the stack");
+ return false;
+ }
+
+ int md_index = BLI_findindex(&ob->modifiers, md);
+ BLI_assert(md_index != -1);
+ if (md_index < index) {
+ /* Move modifier down in list. */
+ for (; md_index < index; md_index++) {
+ if (!ED_object_modifier_move_down(reports, ob, md)) {
+ break;
+ }
+ }
+ }
+ else {
+ /* Move modifier up in list. */
+ for (; md_index > index; md_index--) {
+ if (!ED_object_modifier_move_up(reports, ob, md)) {
+ break;
+ }
+ }
+ }
+
+ return true;
}
int ED_object_modifier_convert(ReportList *UNUSED(reports),
@@ -1180,6 +1222,60 @@ void OBJECT_OT_modifier_move_down(wmOperatorType *ot)
/** \} */
/* ------------------------------------------------------------------- */
+/** \name Move to Index Modifier Operator
+ * \{ */
+
+static bool modifier_move_to_index_poll(bContext *C)
+{
+ return edit_modifier_poll(C);
+}
+
+static int modifier_move_to_index_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
+ int index = RNA_int_get(op->ptr, "index");
+
+ if (!ED_object_modifier_move_to_index(op->reports, ob, md, index)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int modifier_move_to_index_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+ if (edit_modifier_invoke_properties(C, op)) {
+ return modifier_move_to_index_exec(C, op);
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+void OBJECT_OT_modifier_move_to_index(wmOperatorType *ot)
+{
+ ot->name = "Move Active Modifier to Index";
+ ot->description = "Move the active modifier to an index in the stack";
+ ot->idname = "OBJECT_OT_modifier_move_to_index";
+
+ ot->invoke = modifier_move_to_index_invoke;
+ ot->exec = modifier_move_to_index_exec;
+ ot->poll = modifier_move_to_index_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+ edit_modifier_properties(ot);
+ RNA_def_int(
+ ot->srna, "index", 0, 0, INT_MAX, "Index", "The index to move the modifier to", 0, INT_MAX);
+}
+
+/** \} */
+
+/* ------------------------------------------------------------------- */
/** \name Apply Modifier Operator
* \{ */
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 819b6c18a44..05f1ced8615 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -130,6 +130,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_modifier_remove);
WM_operatortype_append(OBJECT_OT_modifier_move_up);
WM_operatortype_append(OBJECT_OT_modifier_move_down);
+ WM_operatortype_append(OBJECT_OT_modifier_move_to_index);
WM_operatortype_append(OBJECT_OT_modifier_apply);
WM_operatortype_append(OBJECT_OT_modifier_convert);
WM_operatortype_append(OBJECT_OT_modifier_copy);
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index c06c107d4a3..187334a5c34 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -30,8 +30,11 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_modifier.h"
#include "BKE_screen.h"
+#include "DNA_modifier_types.h"
+
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_view3d.h" /* To draw toolbar UI. */
@@ -632,6 +635,15 @@ void ED_spacetype_buttons(void)
#endif
BLI_addhead(&st->regiontypes, art);
+ /* Register the panel types from modifiers. The actual panels are built per modifier rather than
+ * per modifier type. */
+ for (ModifierType i = 0; i < NUM_MODIFIER_TYPES; i++) {
+ const ModifierTypeInfo *mti = BKE_modifier_get_info(i);
+ if (mti != NULL && mti->panelRegister != NULL) {
+ mti->panelRegister(art);
+ }
+ }
+
/* regions: header */
art = MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
art->regionid = RGN_TYPE_HEADER;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 13972ae032d..a2b96ac2772 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -103,7 +103,8 @@ typedef enum ModifierMode {
eModifierMode_Render = (1 << 1),
eModifierMode_Editmode = (1 << 2),
eModifierMode_OnCage = (1 << 3),
- eModifierMode_Expanded = (1 << 4),
+ /* Old modifier box expansion, just for versioning. */
+ eModifierMode_Expanded_DEPRECATED = (1 << 4),
eModifierMode_Virtual = (1 << 5),
eModifierMode_ApplyOnSpline = (1 << 6),
eModifierMode_DisableTemporary = (1u << 31),
@@ -115,7 +116,8 @@ typedef struct ModifierData {
int type, mode;
int stackindex;
short flag;
- char _pad[2];
+ /* An "expand" bit for each of the modifier's (sub)panels. */
+ short ui_expand_flag;
/** MAX_NAME. */
char name[64];
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 585f866ffae..e9b8595ce3c 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -2808,7 +2808,7 @@ static void rna_def_modifier_array(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* PROP_TRANSLATION causes units to be used which we don't want */
- prop = RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_ui_text(
prop,
@@ -2824,7 +2824,8 @@ static void rna_def_modifier_array(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_merge_vertices_cap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_ARR_MERGEFINAL);
- RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices in first and last duplicates");
+ RNA_def_property_ui_text(
+ prop, "Merge End Vertices", "Merge vertices in first and last duplicates");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "merge_threshold", PROP_FLOAT, PROP_DISTANCE);
@@ -3356,7 +3357,7 @@ static void rna_def_modifier_cast(BlenderRNA *brna)
prop = RNA_def_property(srna, "cast_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_cast_type_items);
- RNA_def_property_ui_text(prop, "Cast Type", "Target object shape");
+ RNA_def_property_ui_text(prop, "Shape", "Target object shape");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
@@ -3958,6 +3959,12 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL},
};
+ static const EnumPropertyItem prop_affect_items[] = {
+ {0, "EDGES", 0, "Edges", "Affect only edges"},
+ {MOD_BEVEL_VERT, "VERTICES", 0, "Vertices", "Affect only vertices"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
srna = RNA_def_struct(brna, "BevelModifier", "Modifier");
RNA_def_struct_ui_text(
srna, "Bevel Modifier", "Bevel modifier to make edges and vertices more rounded");
@@ -3986,9 +3993,10 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Segments", "Number of segments for round edges/verts");
RNA_def_property_update(prop, 0, "rna_BevelModifier_update_segments");
- prop = RNA_def_property(srna, "use_only_vertices", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_BEVEL_VERT);
- RNA_def_property_ui_text(prop, "Only Vertices", "Bevel verts/corners, not edges");
+ prop = RNA_def_property(srna, "affect", PROP_ENUM, PROP_NONE); /* as an enum */
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
+ RNA_def_property_enum_items(prop, prop_affect_items);
+ RNA_def_property_ui_text(prop, "Affect", "Affect edges or vertices");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "limit_method", PROP_ENUM, PROP_NONE);
@@ -4036,7 +4044,7 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "mat");
RNA_def_property_range(prop, -1, SHRT_MAX);
RNA_def_property_ui_text(
- prop, "Material", "Material index of generated faces, -1 for automatic");
+ prop, "Material Index", "Material index of generated faces, -1 for automatic");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "loop_slide", PROP_BOOLEAN, PROP_NONE);
@@ -4063,7 +4071,7 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "face_str_mode");
RNA_def_property_enum_items(prop, prop_harden_normals_items);
RNA_def_property_ui_text(
- prop, "Set Face Strength", "Whether to set face strength, and which faces to set it on");
+ prop, "Face Strength", "Whether to set face strength, and which faces to set it on");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "miter_outer", PROP_ENUM, PROP_NONE);
@@ -4164,7 +4172,7 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
prop = RNA_def_property(srna, "wrap_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
RNA_def_property_enum_items(prop, shrink_type_items);
- RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_ui_text(prop, "Wrap Method", "");
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop = RNA_def_property(srna, "wrap_mode", PROP_ENUM, PROP_NONE);
@@ -4923,7 +4931,7 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *UNUSED(brna),
prop = RNA_def_property(srna, "mask_vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "mask_defgrp_name");
- RNA_def_property_ui_text(prop, "Mask VGroup", "Masking vertex group name");
+ RNA_def_property_ui_text(prop, "Mask Vertex Group", "Masking vertex group name");
RNA_def_property_string_funcs(prop, NULL, NULL, mask_vgroup_setter);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -5422,7 +5430,7 @@ static void rna_def_modifier_remesh(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_remove_disconnected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_REMESH_FLOOD_FILL);
- RNA_def_property_ui_text(prop, "Remove Disconnected Pieces", "");
+ RNA_def_property_ui_text(prop, "Remove Disconnected", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "use_smooth_shade", PROP_BOOLEAN, PROP_NONE);
@@ -5977,6 +5985,8 @@ static void rna_def_modifier_meshseqcache(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_ENUM_FLAG);
RNA_def_property_enum_sdna(prop, NULL, "read_flag");
RNA_def_property_enum_items(prop, read_flag_items);
+ RNA_def_property_ui_text(prop, "Read Data", "Data to read from the cache");
+
RNA_def_property_update(prop, 0, "rna_Modifier_update");
RNA_define_lib_overridable(false);
@@ -6161,7 +6171,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
{DT_TYPE_MDEFORMVERT,
"VGROUP_WEIGHTS",
0,
- "Vertex Group(s)",
+ "Vertex Groups",
"Transfer active or all vertex groups"},
# if 0 /* TODO */
{DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
@@ -6178,19 +6188,15 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
static const EnumPropertyItem DT_layer_edge_items[] = {
{DT_TYPE_SHARP_EDGE, "SHARP_EDGE", 0, "Sharp", "Transfer sharp mark"},
{DT_TYPE_SEAM, "SEAM", 0, "UV Seam", "Transfer UV seam mark"},
- {DT_TYPE_CREASE, "CREASE", 0, "Subsurf Crease", "Transfer crease values"},
+ {DT_TYPE_CREASE, "CREASE", 0, "Crease", "Transfer subdivision crease values"},
{DT_TYPE_BWEIGHT_EDGE, "BEVEL_WEIGHT_EDGE", 0, "Bevel Weight", "Transfer bevel weights"},
- {DT_TYPE_FREESTYLE_EDGE,
- "FREESTYLE_EDGE",
- 0,
- "Freestyle Mark",
- "Transfer Freestyle edge mark"},
+ {DT_TYPE_FREESTYLE_EDGE, "FREESTYLE_EDGE", 0, "Freestyle", "Transfer Freestyle edge mark"},
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem DT_layer_loop_items[] = {
{DT_TYPE_LNOR, "CUSTOM_NORMAL", 0, "Custom Normals", "Transfer custom normals"},
- {DT_TYPE_VCOL, "VCOL", 0, "VCol", "Vertex (face corners) colors"},
+ {DT_TYPE_VCOL, "VCOL", 0, "Vertex Colors", "Vertex (face corners) colors"},
{DT_TYPE_UV, "UV", 0, "UVs", "Transfer UV layers"},
{0, NULL, 0, NULL, NULL},
};
@@ -6374,7 +6380,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
0.0f,
0.0f,
1.0f,
- "Islands Handling Refinement",
+ "Islands Precision",
"Factor controlling precision of islands handling "
"(typically, 0.1 should be enough, higher values can make things really slow)",
0.0f,
@@ -6855,7 +6861,7 @@ void RNA_def_modifier(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
+ RNA_def_property_boolean_sdna(prop, NULL, "ui_expand_flag", 0);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 8d0e403aa2d..fd65b713d15 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -1209,13 +1209,9 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED | PARM_RNAPTR);
api_ui_item_common_text(func);
- func = RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
+ func = RNA_def_function(srna, "template_modifiers", "uiTemplateModifiers");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- RNA_def_function_ui_description(func, "Generates the UI layout for modifiers");
- parm = RNA_def_pointer(func, "data", "Modifier", "", "Modifier data");
- RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
- parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
- RNA_def_function_return(func, parm);
+ RNA_def_function_ui_description(func, "Generates the UI layout for the modifier stack");
func = RNA_def_function(srna, "template_greasepencil_modifier", "uiTemplateGpencilModifier");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 8ab7d35070b..78db7de2ac2 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -23,12 +23,15 @@ set(INC
intern
../blenfont
../blenkernel
+ ../blentranslation
../blenlib
../bmesh
../depsgraph
+ ../editors/include
../makesdna
../makesrna
../render/extern/include
+ ../windowmanager
../../../intern/eigen
../../../intern/guardedalloc
)
@@ -89,6 +92,7 @@ set(SRC
intern/MOD_surface.c
intern/MOD_surfacedeform.c
intern/MOD_triangulate.c
+ intern/MOD_ui_common.c
intern/MOD_util.c
intern/MOD_uvproject.c
intern/MOD_uvwarp.c
@@ -105,6 +109,7 @@ set(SRC
MOD_modifiertypes.h
intern/MOD_meshcache_util.h
intern/MOD_solidify_util.h
+ intern/MOD_ui_common.h
intern/MOD_util.h
intern/MOD_weightvg_util.h
)
@@ -157,6 +162,11 @@ if(WITH_INTERNATIONAL)
add_definitions(-DWITH_INTERNATIONAL)
endif()
+# To disable adaptive subdivision test in subsurf UI without cycles
+if(WITH_CYCLES)
+ add_definitions(-DWITH_CYCLES)
+endif()
+
# So we can have special tricks in modifier system.
add_definitions(${GL_DEFINITIONS})
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index 99ce447236b..84651f79e8a 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -26,17 +26,27 @@
#include "BLI_listbase.h"
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_armature_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_action.h"
+#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
@@ -45,6 +55,7 @@
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -244,6 +255,36 @@ static void deformMatrices(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE);
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "use_deform_preserve_volume", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "use_multi_modifier", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumnWithHeading(layout, true, "Bind to");
+ uiItemR(col, &ptr, "use_vertex_groups", 0, IFACE_("Vertex Groups"), ICON_NONE);
+ uiItemR(col, &ptr, "use_bone_envelopes", 0, IFACE_("Bone Envelopes"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Armature, panel_draw);
+}
+
ModifierTypeInfo modifierType_Armature = {
/* name */ "Armature",
/* structName */ "ArmatureModifierData",
@@ -274,4 +315,5 @@ ModifierTypeInfo modifierType_Armature = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index fc127c48fc9..68e12a8bbef 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -29,12 +29,16 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_lib_id.h"
@@ -42,7 +46,14 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object_deform.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "DEG_depsgraph.h"
@@ -822,6 +833,179 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
return false;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "fit_type", 0, NULL, ICON_NONE);
+
+ int fit_type = RNA_enum_get(&ptr, "fit_type");
+ if (fit_type == MOD_ARR_FIXEDCOUNT) {
+ uiItemR(layout, &ptr, "count", 0, NULL, ICON_NONE);
+ }
+ else if (fit_type == MOD_ARR_FITLENGTH) {
+ uiItemR(layout, &ptr, "fit_length", 0, NULL, ICON_NONE);
+ }
+ else if (fit_type == MOD_ARR_FITCURVE) {
+ uiItemR(layout, &ptr, "curve", 0, NULL, ICON_NONE);
+ }
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "start_cap", 0, IFACE_("Cap Start"), ICON_NONE);
+ uiItemR(col, &ptr, "end_cap", 0, IFACE_("End"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void relative_offset_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_relative_offset", 0, NULL, ICON_NONE);
+}
+
+static void relative_offset_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayout *col = uiLayoutColumn(layout, false);
+
+ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "use_relative_offset"));
+ uiItemR(col, &ptr, "relative_offset_displace", 0, IFACE_("Factor"), ICON_NONE);
+}
+
+static void constant_offset_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_constant_offset", 0, NULL, ICON_NONE);
+}
+
+static void constant_offset_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayout *col = uiLayoutColumn(layout, false);
+
+ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "use_constant_offset"));
+ uiItemR(col, &ptr, "constant_offset_displace", 0, IFACE_("Distance"), ICON_NONE);
+}
+
+/**
+ * Object offset in a subpanel for consistency with the other offset types.
+ */
+static void object_offset_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_object_offset", 0, NULL, ICON_NONE);
+}
+
+static void object_offset_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayout *col = uiLayoutColumn(layout, false);
+
+ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "use_object_offset"));
+ uiItemR(col, &ptr, "offset_object", 0, IFACE_("Object"), ICON_NONE);
+}
+
+static void symmetry_panel_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_merge_vertices", 0, IFACE_("Merge"), ICON_NONE);
+}
+
+static void symmetry_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayout *col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "use_merge_vertices"));
+ uiItemR(col, &ptr, "merge_threshold", 0, IFACE_("Distance"), ICON_NONE);
+ uiItemR(col, &ptr, "use_merge_vertices_cap", 0, IFACE_("First and Last Copies"), ICON_NONE);
+}
+
+static void uv_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "offset_u", UI_ITEM_R_EXPAND, IFACE_("Offset U"), ICON_NONE);
+ uiItemR(col, &ptr, "offset_v", UI_ITEM_R_EXPAND, IFACE_("V"), ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Array, panel_draw);
+ modifier_subpanel_register(region_type,
+ "relative_offset",
+ "",
+ relative_offset_header_draw,
+ relative_offset_draw,
+ panel_type);
+ modifier_subpanel_register(region_type,
+ "constant_offset",
+ "",
+ constant_offset_header_draw,
+ constant_offset_draw,
+ panel_type);
+ modifier_subpanel_register(
+ region_type, "object_offset", "", object_offset_header_draw, object_offset_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "merge", "", symmetry_panel_header_draw, symmetry_panel_draw, panel_type);
+ modifier_subpanel_register(region_type, "uv", "UVs", NULL, uv_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Array = {
/* name */ "Array",
/* structName */ "ArrayModifierData",
@@ -853,4 +1037,5 @@ ModifierTypeInfo modifierType_Array = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index fb1b3cd219e..76b8985975e 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -27,16 +27,28 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_curveprofile_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
+#include "BKE_curveprofile.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "BKE_curveprofile.h"
@@ -263,6 +275,149 @@ static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED
return (bmd->value == 0.0f);
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ const char *offset_name = "";
+ if (RNA_enum_get(&ptr, "offset_type") == BEVEL_AMT_PERCENT) {
+ uiItemR(col, &ptr, "width_pct", 0, NULL, ICON_NONE);
+ }
+ else {
+ switch (RNA_enum_get(&ptr, "offset_type")) {
+ case BEVEL_AMT_DEPTH:
+ offset_name = "Depth";
+ break;
+ case BEVEL_AMT_WIDTH:
+ offset_name = "Width";
+ break;
+ case BEVEL_AMT_OFFSET:
+ offset_name = "Offset";
+ break;
+ }
+ uiItemR(col, &ptr, "width", 0, IFACE_(offset_name), ICON_NONE);
+ }
+ uiItemR(col, &ptr, "offset_type", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "segments", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "affect", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "limit_method", 0, NULL, ICON_NONE);
+ int limit_method = RNA_enum_get(&ptr, "limit_method");
+ if (limit_method == MOD_BEVEL_ANGLE) {
+ uiItemR(col, &ptr, "angle_limit", 0, NULL, ICON_NONE);
+ }
+ else if (limit_method == MOD_BEVEL_VGROUP) {
+ modifier_vgroup_ui(col, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void geometry_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "miter_inner", 0, IFACE_("Miter Inner"), ICON_NONE);
+ uiItemR(layout, &ptr, "miter_outer", 0, IFACE_("Outer"), ICON_NONE);
+ if (RNA_enum_get(&ptr, "miter_inner") == BEVEL_MITER_ARC) {
+ uiItemR(layout, &ptr, "spread", 0, NULL, ICON_NONE);
+ }
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "vmesh_method", 0, IFACE_("Intersections"), ICON_NONE);
+ uiItemR(layout, &ptr, "use_clamp_overlap", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "loop_slide", 0, NULL, ICON_NONE);
+}
+
+static void shading_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "harden_normals", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumnWithHeading(layout, true, IFACE_("Mark"));
+ uiItemR(col, &ptr, "mark_seam", 0, IFACE_("Seam"), ICON_NONE);
+ uiItemR(col, &ptr, "mark_sharp", 0, IFACE_("Sharp"), ICON_NONE);
+
+ uiItemR(layout, &ptr, "material", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "face_strength_mode", 0, NULL, ICON_NONE);
+}
+
+static void profile_panel_draw(const bContext *C, Panel *panel)
+{
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+ uiLayout *layout = panel->layout;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "profile", UI_ITEM_R_SLIDER, IFACE_("Shape"), ICON_NONE);
+}
+
+static void custom_profile_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_custom_profile", 0, NULL, ICON_NONE);
+}
+
+static void custom_profile_panel_draw(const bContext *C, Panel *panel)
+{
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+ uiLayout *layout = panel->layout;
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_custom_profile"));
+
+ uiTemplateCurveProfile(layout, &ptr, "custom_profile");
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Bevel, panel_draw);
+ PanelType *bevel_profil_panel = modifier_subpanel_register(
+ region_type, "profile", "Profile", NULL, profile_panel_draw, panel_type);
+ modifier_subpanel_register(region_type,
+ "custom",
+ "",
+ custom_profile_panel_draw_header,
+ custom_profile_panel_draw,
+ bevel_profil_panel);
+ modifier_subpanel_register(
+ region_type, "geometry", "Geometry", NULL, geometry_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "shading", "Shading", NULL, shading_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Bevel = {
/* name */ "Bevel",
/* structName */ "BevelModifierData",
@@ -290,4 +445,5 @@ ModifierTypeInfo modifierType_Bevel = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* uiPanel */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index d8b375b0ee9..c2412b295ff 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -31,17 +31,28 @@
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_global.h" /* only to check G.debug */
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "RNA_access.h"
+
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "DEG_depsgraph_query.h"
@@ -346,6 +357,32 @@ static void requiredDataMask(Object *UNUSED(ob),
r_cddata_masks->fmask |= CD_MASK_MTFACE;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "operation", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "double_threshold", 0, NULL, ICON_NONE);
+
+ if (G.debug) {
+ uiLayout *col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "debug_options", 0, NULL, ICON_NONE);
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Boolean, panel_draw);
+}
+
ModifierTypeInfo modifierType_Boolean = {
/* name */ "Boolean",
/* structName */ "BooleanModifierData",
@@ -375,4 +412,5 @@ ModifierTypeInfo modifierType_Boolean = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index 2cd52005362..93f97c7c5b8 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -32,15 +32,24 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "DEG_depsgraph_query.h"
+#include "BKE_context.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -275,6 +284,52 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, struct
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "frame_duration", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_reverse", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void random_panel_header_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_random_order", 0, NULL, ICON_NONE);
+}
+
+static void random_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_random_order"));
+ uiItemR(layout, &ptr, "seed", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Build, panel_draw);
+ modifier_subpanel_register(
+ region_type, "randomize", "", random_panel_header_draw, random_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Build = {
/* name */ "Build",
/* structName */ "BuildModifierData",
@@ -304,4 +359,5 @@ ModifierTypeInfo modifierType_Build = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index ef8530557d7..2f475e9fca6 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -25,19 +25,30 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -523,6 +534,47 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA cast_object_ptr = RNA_pointer_get(&ptr, "object");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "cast_type", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Axis"));
+ uiItemR(row, &ptr, "use_x", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_y", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_z", toggles_flag, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "factor", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "radius", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "size", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_radius_as_size", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE);
+ if (!RNA_pointer_is_null(&cast_object_ptr)) {
+ uiItemR(layout, &ptr, "use_radius_as_size", 0, NULL, ICON_NONE);
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Cast, panel_draw);
+}
+
ModifierTypeInfo modifierType_Cast = {
/* name */ "Cast",
/* structName */ "CastModifierData",
@@ -553,4 +605,5 @@ ModifierTypeInfo modifierType_Cast = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index da7485b5a2d..c7551b1be00 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -27,15 +27,19 @@
#include "BLI_listbase.h"
+#include "BLT_translation.h"
+
#include "DNA_cloth_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "MEM_guardedalloc.h"
#include "BKE_cloth.h"
+#include "BKE_context.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_key.h"
@@ -44,10 +48,17 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_pointcache.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_physics.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -253,6 +264,23 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Cloth, panel_draw);
+}
+
ModifierTypeInfo modifierType_Cloth = {
/* name */ "Cloth",
/* structName */ "ClothModifierData",
@@ -283,4 +311,5 @@ ModifierTypeInfo modifierType_Cloth = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index 0c6133ed7a6..c58ba3b62dc 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -25,13 +25,17 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "MEM_guardedalloc.h"
#include "BKE_collision.h"
+#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
@@ -39,8 +43,15 @@
#include "BKE_modifier.h"
#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "DEG_depsgraph_query.h"
@@ -241,6 +252,23 @@ static void updateDepsgraph(ModifierData *UNUSED(md), const ModifierUpdateDepsgr
DEG_add_modifier_to_transform_relation(ctx->node, "Collision Modifier");
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Collision, panel_draw);
+}
+
ModifierTypeInfo modifierType_Collision = {
/* name */ "Collision",
/* structName */ "CollisionModifierData",
@@ -270,4 +298,5 @@ ModifierTypeInfo modifierType_Collision = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c
index 3b2268ea14d..3d9f59fba24 100644
--- a/source/blender/modifiers/intern/MOD_correctivesmooth.c
+++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c
@@ -27,19 +27,30 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "MEM_guardedalloc.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "BLI_strict_flags.h"
@@ -769,6 +780,42 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "factor", 0, IFACE_("Factor"), ICON_NONE);
+ uiItemR(layout, &ptr, "iterations", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "scale", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "smooth_type", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemR(layout, &ptr, "use_only_smooth", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_pin_boundary", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "rest_source", 0, NULL, ICON_NONE);
+ if (RNA_enum_get(&ptr, "rest_source") == MOD_CORRECTIVESMOOTH_RESTSOURCE_BIND) {
+ uiItemO(layout,
+ (RNA_boolean_get(&ptr, "is_bind") ? IFACE_("Unbind") : IFACE_("Bind")),
+ ICON_NONE,
+ "OBJECT_OT_correctivesmooth_bind");
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_CorrectiveSmooth, panel_draw);
+}
+
ModifierTypeInfo modifierType_CorrectiveSmooth = {
/* name */ "CorrectiveSmooth",
/* structName */ "CorrectiveSmoothModifierData",
@@ -798,4 +845,5 @@ ModifierTypeInfo modifierType_CorrectiveSmooth = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index eec87a918ec..491827720f0 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -25,22 +25,33 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -154,6 +165,29 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "object", 0, IFACE_("Curve Object"), ICON_NONE);
+ uiItemR(layout, &ptr, "deform_axis", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Curve, panel_draw);
+}
+
ModifierTypeInfo modifierType_Curve = {
/* name */ "Curve",
/* structName */ "CurveModifierData",
@@ -184,4 +218,5 @@ ModifierTypeInfo modifierType_Curve = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index dea4bad6999..e9436147649 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -25,11 +25,15 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_data_transfer.h"
#include "BKE_lib_id.h"
@@ -38,10 +42,18 @@
#include "BKE_mesh_remap.h"
#include "BKE_modifier.h"
#include "BKE_report.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+
+#include "MOD_ui_common.h"
#include "MOD_util.h"
/**************************************
@@ -231,6 +243,235 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "object", 0, IFACE_("Source"), ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetPropDecorate(sub, false);
+ uiItemR(sub, &ptr, "use_object_transform", 0, "", ICON_ORIENTATION_GLOBAL);
+
+ uiItemR(layout, &ptr, "mix_mode", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "mix_factor", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemO(layout, "Generate Data Layers", ICON_NONE, "OBJECT_OT_datalayout_transfer");
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void vertex_panel_draw_header(const bContext *C, Panel *panel)
+{
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+ uiLayout *layout = panel->layout;
+
+ uiItemR(layout, &ptr, "use_vert_data", 0, NULL, ICON_NONE);
+}
+
+static void vertex_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ bool use_vert_data = RNA_boolean_get(&ptr, "use_vert_data");
+ uiLayoutSetActive(layout, use_vert_data);
+
+ uiItemR(layout, &ptr, "data_types_verts", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "vert_mapping", 0, IFACE_("Mapping"), ICON_NONE);
+}
+
+static void vertex_vgroup_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetActive(layout, RNA_enum_get(&ptr, "data_types_verts") & DT_TYPE_MDEFORMVERT);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "layers_vgroup_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
+ uiItemR(layout, &ptr, "layers_vgroup_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
+}
+
+static void edge_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_edge_data", 0, NULL, ICON_NONE);
+}
+
+static void edge_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_edge_data"));
+
+ uiItemR(layout, &ptr, "data_types_edges", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "edge_mapping", 0, IFACE_("Mapping"), ICON_NONE);
+}
+
+static void face_corner_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_loop_data", 0, NULL, ICON_NONE);
+}
+
+static void face_corner_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_loop_data"));
+
+ uiItemR(layout, &ptr, "data_types_loops", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "loop_mapping", 0, IFACE_("Mapping"), ICON_NONE);
+}
+
+static void face_corner_vcol_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, RNA_enum_get(&ptr, "data_types_loops") & DT_TYPE_VCOL);
+
+ uiItemR(layout, &ptr, "layers_vcol_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
+ uiItemR(layout, &ptr, "layers_vcol_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
+}
+
+static void face_corner_uv_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, RNA_enum_get(&ptr, "data_types_loops") & DT_TYPE_UV);
+
+ uiItemR(layout, &ptr, "layers_uv_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
+ uiItemR(layout, &ptr, "layers_uv_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
+ uiItemR(layout, &ptr, "islands_precision", 0, NULL, ICON_NONE);
+}
+
+static void face_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_poly_data", 0, NULL, ICON_NONE);
+}
+
+static void face_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_poly_data"));
+
+ uiItemR(layout, &ptr, "data_types_polys", 0, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "poly_mapping", 0, IFACE_("Mapping"), ICON_NONE);
+}
+
+static void advanced_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Max Distance"));
+ uiItemR(row, &ptr, "use_max_distance", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_max_distance"));
+ uiItemR(sub, &ptr, "max_distance", 0, "", ICON_NONE);
+
+ uiItemR(layout, &ptr, "ray_radius", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_DataTransfer, panel_draw);
+ PanelType *vertex_panel = modifier_subpanel_register(
+ region_type, "vertex", "", vertex_panel_draw_header, vertex_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "vertex_vgroup", "Vertex Groups", NULL, vertex_vgroup_panel_draw, vertex_panel);
+
+ modifier_subpanel_register(
+ region_type, "edge", "", edge_panel_draw_header, edge_panel_draw, panel_type);
+
+ PanelType *face_corner_panel = modifier_subpanel_register(region_type,
+ "face_corner",
+ "",
+ face_corner_panel_draw_header,
+ face_corner_panel_draw,
+ panel_type);
+ modifier_subpanel_register(region_type,
+ "face_corner_vcol",
+ "Vertex Colors",
+ NULL,
+ face_corner_vcol_panel_draw,
+ face_corner_panel);
+ modifier_subpanel_register(
+ region_type, "face_corner_uv", "UVs", NULL, face_corner_uv_panel_draw, face_corner_panel);
+
+ modifier_subpanel_register(
+ region_type, "face", "", face_panel_draw_header, face_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "advanced", "Topology Mapping", NULL, advanced_panel_draw, panel_type);
+}
+
#undef HIGH_POLY_WARNING
#undef DT_TYPES_AFFECT_MESH
@@ -264,4 +505,5 @@ ModifierTypeInfo modifierType_DataTransfer = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 2bd33af7582..5b494baea1a 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -25,14 +25,24 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "MEM_guardedalloc.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
@@ -46,6 +56,7 @@
# include "PIL_time_utildefines.h"
#endif
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -215,6 +226,57 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ int decimate_type = RNA_enum_get(&ptr, "decimate_type");
+ char count_info[32];
+ snprintf(count_info, 32, IFACE_("Face Count: %d"), RNA_int_get(&ptr, "face_count"));
+
+ uiItemR(layout, &ptr, "decimate_type", 0, NULL, ICON_NONE);
+
+ if (decimate_type == MOD_DECIM_MODE_COLLAPSE) {
+ uiItemR(layout, &ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, "Symmetry");
+ uiLayoutSetPropDecorate(row, false);
+ sub = uiLayoutRow(row, true);
+ uiItemR(sub, &ptr, "use_symmetry", 0, "", ICON_NONE);
+ sub = uiLayoutRow(sub, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_symmetry"));
+ uiItemR(sub, &ptr, "symmetry_axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemDecoratorR(row, &ptr, "symmetry_axis", 0);
+
+ uiItemR(layout, &ptr, "use_collapse_triangulate", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+ }
+ else if (decimate_type == MOD_DECIM_MODE_UNSUBDIV) {
+ uiItemR(layout, &ptr, "iterations", 0, NULL, ICON_NONE);
+ }
+ else { /* decimate_type == MOD_DECIM_MODE_DISSOLVE. */
+ uiItemR(layout, &ptr, "angle_limit", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "delimit", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_dissolve_boundaries", 0, NULL, ICON_NONE);
+ }
+ uiItemL(layout, count_info, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Decimate, panel_draw);
+}
+
ModifierTypeInfo modifierType_Decimate = {
/* name */ "Decimate",
/* structName */ "DecimateModifierData",
@@ -244,4 +306,5 @@ ModifierTypeInfo modifierType_Decimate = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index 0cb882d0532..d562559d66d 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -26,10 +26,14 @@
#include "BLI_math.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
@@ -39,13 +43,20 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "RE_shader_ext.h"
@@ -419,6 +430,73 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA texture_ptr = RNA_pointer_get(&ptr, "texture");
+ bool has_texture = !RNA_pointer_is_null(&texture_ptr);
+ int texture_coords = RNA_enum_get(&ptr, "texture_coords");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiTemplateID(layout, C, &ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, has_texture);
+ uiItemR(col, &ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
+ if (texture_coords == MOD_DISP_MAP_OBJECT) {
+ uiItemR(col, &ptr, "texture_coords_object", 0, NULL, ICON_NONE);
+ PointerRNA texture_coords_obj_ptr = RNA_pointer_get(&ptr, "texture_coords_object");
+ if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
+ (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
+ PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
+ uiItemPointerR(layout,
+ &ptr,
+ "texture_coords_bone",
+ &texture_coords_obj_data_ptr,
+ "bones",
+ IFACE_("Bone"),
+ ICON_NONE);
+ }
+ }
+ else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
+ uiItemR(col, &ptr, "uv_layer", 0, NULL, ICON_NONE);
+ }
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "direction", 0, 0, ICON_NONE);
+ if (ELEM(RNA_enum_get(&ptr, "direction"),
+ MOD_DISP_DIR_X,
+ MOD_DISP_DIR_Y,
+ MOD_DISP_DIR_Z,
+ MOD_DISP_DIR_RGB_XYZ)) {
+ uiItemR(col, &ptr, "space", 0, NULL, ICON_NONE);
+ }
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "mid_level", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(col, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Displace, panel_draw);
+}
+
ModifierTypeInfo modifierType_Displace = {
/* name */ "Displace",
/* structName */ "DisplaceModifierData",
@@ -448,4 +526,5 @@ ModifierTypeInfo modifierType_Displace = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
index 3cace5745e6..f8a100f1f0a 100644
--- a/source/blender/modifiers/intern/MOD_dynamicpaint.c
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -23,17 +23,27 @@
#include "BLI_listbase.h"
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_dynamicpaint_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_dynamicpaint.h"
#include "BKE_layer.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -41,6 +51,7 @@
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -172,6 +183,23 @@ static void foreachTexLink(ModifierData *UNUSED(md),
// walk(userData, ob, md, ""); /* re-enable when possible */
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_DynamicPaint, panel_draw);
+}
+
ModifierTypeInfo modifierType_DynamicPaint = {
/* name */ "Dynamic Paint",
/* structName */ "DynamicPaintModifierData",
@@ -203,4 +231,5 @@ ModifierTypeInfo modifierType_DynamicPaint = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ freeRuntimeData,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index dd5669cd10c..0134b5c9d64 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -30,16 +30,27 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "bmesh.h"
#include "bmesh_tools.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd)
{
@@ -127,6 +138,32 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Edge Angle"));
+ uiItemR(row, &ptr, "use_edge_angle", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_edge_angle"));
+ uiItemR(sub, &ptr, "split_angle", 0, "", ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_edge_sharp", 0, IFACE_("Sharp Edges"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_EdgeSplit, panel_draw);
+}
+
ModifierTypeInfo modifierType_EdgeSplit = {
/* name */ "EdgeSplit",
/* structName */ "EdgeSplitModifierData",
@@ -158,4 +195,5 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index 747269f4c80..0c1eedd429a 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -28,11 +28,15 @@
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
@@ -40,12 +44,19 @@
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -1174,6 +1185,49 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return mesh;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+ bool has_vertex_group = RNA_string_length(&ptr, "vertex_group") != 0;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemPointerR(layout, &ptr, "particle_uv", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Show"));
+ uiItemR(row, &ptr, "show_alive", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "show_dead", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "show_unborn", toggles_flag, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "use_edge_cut", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_size", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, has_vertex_group);
+ uiItemR(row, &ptr, "protect", 0, NULL, ICON_NONE);
+
+ uiItemO(layout, IFACE_("Refresh"), ICON_NONE, "OBJECT_OT_explode_refresh");
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Explode, panel_draw);
+}
+
ModifierTypeInfo modifierType_Explode = {
/* name */ "Explode",
/* structName */ "ExplodeModifierData",
@@ -1202,4 +1256,5 @@ ModifierTypeInfo modifierType_Explode = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_fluid.c b/source/blender/modifiers/intern/MOD_fluid.c
index d3f05ee714f..0ef062d72d5 100644
--- a/source/blender/modifiers/intern/MOD_fluid.c
+++ b/source/blender/modifiers/intern/MOD_fluid.c
@@ -27,17 +27,27 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_collection_types.h"
#include "DNA_fluid_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_fluid.h"
#include "BKE_layer.h"
#include "BKE_lib_query.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -45,6 +55,7 @@
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -194,6 +205,23 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Fluid, panel_draw);
+}
+
ModifierTypeInfo modifierType_Fluid = {
/* name */ "Fluid",
/* structName */ "FluidModifierData",
@@ -223,4 +251,5 @@ ModifierTypeInfo modifierType_Fluid = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index d93b3c56e5a..2eff026c040 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -25,23 +25,34 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_action.h"
#include "BKE_colortools.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -388,6 +399,75 @@ static void deformVertsEM(struct ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA hook_object_ptr = RNA_pointer_get(&ptr, "object");
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "object", 0, NULL, ICON_NONE);
+ if (!RNA_pointer_is_null(&hook_object_ptr) &&
+ RNA_enum_get(&hook_object_ptr, "type") == OB_ARMATURE) {
+ PointerRNA hook_object_data_ptr = RNA_pointer_get(&hook_object_ptr, "data");
+ uiItemPointerR(
+ col, &ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
+ }
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemR(layout, &ptr, "strength", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ if (RNA_enum_get(&ob_ptr, "mode") == OB_MODE_EDIT) {
+ row = uiLayoutRow(layout, true);
+ uiItemO(row, "Reset", ICON_NONE, "OBJECT_OT_hook_reset");
+ uiItemO(row, "Recenter", ICON_NONE, "OBJECT_OT_hook_recenter");
+ row = uiLayoutRow(layout, true);
+ uiItemO(row, "Select", ICON_NONE, "OBJECT_OT_hook_select");
+ uiItemO(row, "Assign", ICON_NONE, "OBJECT_OT_hook_assign");
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void falloff_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ bool use_falloff = RNA_enum_get(&ptr, "falloff_type") != eWarp_Falloff_None;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "falloff_type", 0, IFACE_("Type"), ICON_NONE);
+
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, use_falloff);
+ uiItemR(row, &ptr, "falloff_radius", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_falloff_uniform", 0, NULL, ICON_NONE);
+
+ if (RNA_enum_get(&ptr, "falloff_type") == eWarp_Falloff_Curve) {
+ uiTemplateCurveMapping(layout, &ptr, "falloff_curve", 0, false, false, false, false);
+ }
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Hook, panel_draw);
+ modifier_subpanel_register(
+ region_type, "falloff", "Falloff", NULL, falloff_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Hook = {
/* name */ "Hook",
/* structName */ "HookModifierData",
@@ -417,4 +497,5 @@ ModifierTypeInfo modifierType_Hook = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.c b/source/blender/modifiers/intern/MOD_laplaciandeform.c
index 0ca8bc55fb8..b7975bec77a 100644
--- a/source/blender/modifiers/intern/MOD_laplaciandeform.c
+++ b/source/blender/modifiers/intern/MOD_laplaciandeform.c
@@ -29,9 +29,13 @@
#include "MEM_guardedalloc.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
@@ -39,7 +43,14 @@
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_particle.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "eigen_capi.h"
@@ -808,6 +819,41 @@ static void freeData(ModifierData *md)
lmd->total_verts = 0;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ bool is_bind = RNA_boolean_get(&ptr, "is_bind");
+ bool has_vertex_group = RNA_string_length(&ptr, "vertex_group") != 0;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "iterations", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemS(layout);
+
+ row = uiLayoutRow(layout, true);
+ uiLayoutSetEnabled(row, has_vertex_group);
+ uiItemO(row,
+ is_bind ? IFACE_("Unbind") : IFACE_("Bind"),
+ ICON_NONE,
+ "OBJECT_OT_laplaciandeform_bind");
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_LaplacianDeform, panel_draw);
+}
+
ModifierTypeInfo modifierType_LaplacianDeform = {
/* name */ "LaplacianDeform",
/* structName */ "LaplacianDeformModifierData",
@@ -836,4 +882,5 @@ ModifierTypeInfo modifierType_LaplacianDeform = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.c b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
index 643afc5b5fc..130c280c5f2 100644
--- a/source/blender/modifiers/intern/MOD_laplaciansmooth.c
+++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
@@ -25,18 +25,29 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "MEM_guardedalloc.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "eigen_capi.h"
@@ -572,8 +583,43 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "iterations", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Axis"));
+ uiItemR(row, &ptr, "use_x", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_y", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_z", toggles_flag, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "lambda_factor", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "lambda_border", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_volume_preserve", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_normalized", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_LaplacianSmooth, panel_draw);
+}
+
ModifierTypeInfo modifierType_LaplacianSmooth = {
- /* name */ "Laplacian Smooth",
+ /* name */ "LaplacianSmooth",
/* structName */ "LaplacianSmoothModifierData",
/* structSize */ sizeof(LaplacianSmoothModifierData),
/* type */ eModifierTypeType_OnlyDeform,
@@ -601,4 +647,5 @@ ModifierTypeInfo modifierType_LaplacianSmooth = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 0a7aa006fcc..31cfe3bb407 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -25,19 +25,30 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -137,6 +148,30 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemR(layout, &ptr, "strength", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Lattice, panel_draw);
+}
+
ModifierTypeInfo modifierType_Lattice = {
/* name */ "Lattice",
/* structName */ "LatticeModifierData",
@@ -167,4 +202,5 @@ ModifierTypeInfo modifierType_Lattice = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc
index 18b88864926..c6de980d674 100644
--- a/source/blender/modifiers/intern/MOD_mask.cc
+++ b/source/blender/modifiers/intern/MOD_mask.cc
@@ -28,23 +28,39 @@
#include "BLI_ghash.h"
#include "BLI_listbase.h"
+#include "BLT_translation.h"
+
#include "DNA_armature_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_action.h" /* BKE_pose_channel_find_name */
+#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+/* SpaceType struct has a member called 'new' which obviously conflicts with C++
+ * so temporarily redefining the new keyword to make it compile. */
+#define new extern_new
+#include "BKE_screen.h"
+#undef new
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "BLI_array.hh"
#include "BLI_listbase_wrapper.hh"
@@ -387,6 +403,42 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
return mmd->ob_arm && mmd->ob_arm->type != OB_ARMATURE;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int mode = RNA_enum_get(&ptr, "mode");
+
+ uiItemR(layout, &ptr, "mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ if (mode == MOD_MASK_MODE_ARM) {
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "armature", 0, NULL, ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetPropDecorate(sub, false);
+ uiItemR(sub, &ptr, "invert_vertex_group", 0, "", ICON_ARROW_LEFTRIGHT);
+ }
+ else if (mode == MOD_MASK_MODE_VGROUP) {
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", nullptr);
+ }
+
+ uiItemR(layout, &ptr, "threshold", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Mask, panel_draw);
+}
+
ModifierTypeInfo modifierType_Mask = {
/* name */ "Mask",
/* structName */ "MaskModifierData",
@@ -418,4 +470,5 @@ ModifierTypeInfo modifierType_Mask = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c
index 219de1569b3..2d104e1e0c2 100644
--- a/source/blender/modifiers/intern/MOD_meshcache.c
+++ b/source/blender/modifiers/intern/MOD_meshcache.c
@@ -26,22 +26,32 @@
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "MOD_meshcache_util.h" /* utility functions */
-
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -287,8 +297,90 @@ static void deformVertsEM(ModifierData *md,
meshcache_do(mcmd, scene, ctx->object, vertexCos, numVerts);
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "cache_format", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "filepath", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "factor", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "deform_mode", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "interpolation", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void time_remapping_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "time_mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "play_mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ if (RNA_enum_get(&ptr, "play_mode") == MOD_MESHCACHE_PLAY_CFEA) {
+ uiItemR(layout, &ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "frame_scale", 0, NULL, ICON_NONE);
+ }
+ else { /* play_mode == MOD_MESHCACHE_PLAY_EVAL */
+ int time_mode = RNA_enum_get(&ptr, "time_mode");
+ if (time_mode == MOD_MESHCACHE_TIME_FRAME) {
+ uiItemR(layout, &ptr, "eval_frame", 0, NULL, ICON_NONE);
+ }
+ else if (time_mode == MOD_MESHCACHE_TIME_SECONDS) {
+ uiItemR(layout, &ptr, "eval_time", 0, NULL, ICON_NONE);
+ }
+ else { /* time_mode == MOD_MESHCACHE_TIME_FACTOR */
+ uiItemR(layout, &ptr, "eval_factor", 0, NULL, ICON_NONE);
+ }
+ }
+}
+
+static void axis_mapping_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, true);
+ uiLayoutSetRedAlert(col, RNA_enum_get(&ptr, "forward_axis") == RNA_enum_get(&ptr, "up_axis"));
+ uiItemR(col, &ptr, "forward_axis", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "up_axis", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_MeshCache, panel_draw);
+ modifier_subpanel_register(region_type,
+ "time_remapping",
+ "Time Remapping",
+ NULL,
+ time_remapping_panel_draw,
+ panel_type);
+ modifier_subpanel_register(
+ region_type, "axis_mapping", "Axis Mapping", NULL, axis_mapping_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_MeshCache = {
- /* name */ "Mesh Cache",
+ /* name */ "MeshCache",
/* structName */ "MeshCacheModifierData",
/* structSize */ sizeof(MeshCacheModifierData),
/* type */ eModifierTypeType_OnlyDeform,
@@ -317,4 +409,5 @@ ModifierTypeInfo modifierType_MeshCache = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 57b5f3891b2..c24515e01eb 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -26,11 +26,15 @@
#include "BLI_math.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_global.h"
@@ -39,12 +43,19 @@
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MEM_guardedalloc.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#ifdef __SSE2__
@@ -558,6 +569,43 @@ void BKE_modifier_mdef_compact_influences(ModifierData *md)
mmd->bindweights = NULL;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ bool is_bound = RNA_boolean_get(&ptr, "is_bound");
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, true);
+ uiLayoutSetEnabled(col, !is_bound);
+ uiItemR(col, &ptr, "object", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetEnabled(col, !is_bound);
+ uiItemR(col, &ptr, "precision", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "use_dynamic_bind", 0, NULL, ICON_NONE);
+
+ uiItemO(layout,
+ is_bound ? IFACE_("Unbind") : IFACE_("Bind"),
+ ICON_NONE,
+ "OBJECT_OT_meshdeform_bind");
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_MeshDeform, panel_draw);
+}
+
ModifierTypeInfo modifierType_MeshDeform = {
/* name */ "MeshDeform",
/* structName */ "MeshDeformModifierData",
@@ -588,4 +636,5 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index 51275c4e58f..801badc382c 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -23,21 +23,32 @@
#include "BLI_string.h"
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_cachefile_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "BKE_cachefile.h"
+#include "BKE_context.h"
#include "BKE_lib_query.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#ifdef WITH_ALEMBIC
# include "ABC_alembic.h"
@@ -185,8 +196,41 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *box;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA cache_file_ptr = RNA_pointer_get(&ptr, "cache_file");
+ bool has_cache_file = !RNA_pointer_is_null(&cache_file_ptr);
+
+ box = uiLayoutBox(layout);
+ uiTemplateCacheFile(box, C, &ptr, "cache_file");
+
+ uiLayoutSetPropSep(layout, true);
+
+ if (has_cache_file) {
+ uiItemPointerR(layout, &ptr, "object_path", &cache_file_ptr, "object_paths", NULL, ICON_NONE);
+ }
+
+ if (RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
+ uiItemR(layout, &ptr, "read_data", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_MeshSequenceCache, panel_draw);
+}
+
ModifierTypeInfo modifierType_MeshSequenceCache = {
- /* name */ "Mesh Sequence Cache",
+ /* name */ "MeshSequenceCache",
/* structName */ "MeshSeqCacheModifierData",
/* structSize */ sizeof(MeshSeqCacheModifierData),
/* type */ eModifierTypeType_Constructive,
@@ -214,4 +258,5 @@ ModifierTypeInfo modifierType_MeshSequenceCache = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index bbbcac262ca..949b115a25f 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -23,16 +23,26 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mirror.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "bmesh.h"
#include "bmesh_tools.h"
@@ -43,6 +53,7 @@
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -113,6 +124,93 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col, *sub;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PropertyRNA *prop;
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetPropSep(col, true);
+
+ prop = RNA_struct_find_property(&ptr, "use_axis");
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Axis"));
+ uiItemFullR(row, &ptr, prop, 0, 0, toggles_flag, IFACE_("X"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 1, 0, toggles_flag, IFACE_("Y"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 2, 0, toggles_flag, IFACE_("Z"), ICON_NONE);
+
+ prop = RNA_struct_find_property(&ptr, "use_bisect_axis");
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Bisect"));
+ uiItemFullR(row, &ptr, prop, 0, 0, toggles_flag, IFACE_("X"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 1, 0, toggles_flag, IFACE_("Y"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 2, 0, toggles_flag, IFACE_("Z"), ICON_NONE);
+
+ prop = RNA_struct_find_property(&ptr, "use_bisect_flip_axis");
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Flip"));
+ uiItemFullR(row, &ptr, prop, 0, 0, toggles_flag, IFACE_("X"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 1, 0, toggles_flag, IFACE_("Y"), ICON_NONE);
+ uiItemFullR(row, &ptr, prop, 2, 0, toggles_flag, IFACE_("Z"), ICON_NONE);
+
+ uiItemS(col);
+
+ uiItemR(col, &ptr, "mirror_object", 0, NULL, ICON_NONE);
+
+ uiItemR(col, &ptr, "use_clip", 0, IFACE_("Clipping"), ICON_NONE);
+
+ row = uiLayoutRowWithHeading(col, true, IFACE_("Merge"));
+ uiItemR(row, &ptr, "use_mirror_merge", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_mirror_merge"));
+ uiItemR(sub, &ptr, "merge_threshold", 0, "", ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void data_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col, *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumnWithHeading(layout, false, IFACE_("Mirror U"));
+ row = uiLayoutRow(col, true);
+ uiLayoutSetPropDecorate(row, false);
+ sub = uiLayoutRow(row, true);
+ uiItemR(sub, &ptr, "use_mirror_u", 0, "", ICON_NONE);
+ sub = uiLayoutRow(sub, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_mirror_u"));
+ uiItemR(sub, &ptr, "mirror_offset_u", UI_ITEM_R_SLIDER, "", ICON_NONE);
+ uiItemDecoratorR(row, &ptr, "mirror_offset_v", 0);
+
+ col = uiLayoutColumnWithHeading(layout, false, "V");
+ row = uiLayoutRow(col, true);
+ uiLayoutSetPropDecorate(row, false);
+ sub = uiLayoutRow(row, true);
+ uiItemR(sub, &ptr, "use_mirror_v", 0, "", ICON_NONE);
+ sub = uiLayoutRow(sub, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_mirror_v"));
+ uiItemR(sub, &ptr, "mirror_offset_v", UI_ITEM_R_SLIDER, "", ICON_NONE);
+ uiItemDecoratorR(row, &ptr, "mirror_offset_v", 0);
+
+ uiItemR(layout, &ptr, "use_mirror_vertex_groups", 0, IFACE_("Vertex Groups"), ICON_NONE);
+ uiItemR(layout, &ptr, "use_mirror_udim", 0, IFACE_("Flip UDIM"), ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Mirror, panel_draw);
+ modifier_subpanel_register(region_type, "data", "Data", NULL, data_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Mirror = {
/* name */ "Mirror",
/* structName */ "MirrorModifierData",
@@ -146,4 +244,5 @@ ModifierTypeInfo modifierType_Mirror = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 5174a996480..75ec5eb5be7 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -27,24 +27,37 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_context.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_paint.h"
+#include "BKE_screen.h"
#include "BKE_subdiv.h"
#include "BKE_subdiv_ccg.h"
#include "BKE_subdiv_deform.h"
#include "BKE_subdiv_mesh.h"
#include "BKE_subsurf.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
+#include "WM_types.h" /* For subdivide operator UI. */
+
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
typedef struct MultiresRuntimeData {
/* Cached subdivision surface descriptor, with topology and settings. */
@@ -272,6 +285,112 @@ static void deformMatrices(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col, *split, *col2;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+ MultiresModifierData *mmd = (MultiresModifierData *)ptr.data;
+
+ PointerRNA op_ptr;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "subdivision_type", 0, NULL, ICON_NONE);
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "levels", 0, IFACE_("Levels Viewport"), ICON_NONE);
+ uiItemR(col, &ptr, "render_levels", 0, IFACE_("Render"), ICON_NONE);
+ uiItemR(layout, &ptr, "show_only_control_edges", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ split = uiLayoutSplit(layout, 0.5f, false);
+ uiLayoutSetEnabled(split, ELEM(RNA_enum_get(&ob_ptr, "mode"), OB_MODE_EDIT, OB_MODE_SCULPT));
+ col = uiLayoutColumn(split, false);
+ col2 = uiLayoutColumn(split, false);
+
+ uiItemO(col, IFACE_("Unsubdivide"), ICON_NONE, "OBJECT_OT_multires_unsubdivide");
+
+ row = uiLayoutRow(col2, true);
+ uiItemFullO(row,
+ "OBJECT_OT_multires_subdivide",
+ IFACE_("Subdivide"),
+ ICON_NONE,
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_CATMULL_CLARK);
+ uiItemFullO(row,
+ "OBJECT_OT_multires_subdivide",
+ IFACE_("Simple"),
+ ICON_NONE, /* TODO: Needs icon, remove text */
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_SIMPLE);
+ uiItemFullO(row,
+ "OBJECT_OT_multires_subdivide",
+ IFACE_("Linear"),
+ ICON_NONE, /* TODO: Needs icon, remove text */
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "mode", MULTIRES_SUBDIVIDE_LINEAR);
+
+ uiItemL(col, "", ICON_NONE);
+ uiItemO(col2, IFACE_("Delete Higher"), ICON_NONE, "OBJECT_OT_multires_higher_levels_delete");
+
+ uiItemO(col, IFACE_("Reshape"), ICON_NONE, "OBJECT_OT_multires_reshape");
+ uiItemO(col2, IFACE_("Apply Base"), ICON_NONE, "OBJECT_OT_multires_base_apply");
+
+ uiItemS(layout);
+
+ if (mmd->totlvl == 0) {
+ uiItemO(
+ layout, IFACE_("Rebuild Subdivisions"), ICON_NONE, "OBJECT_OT_multires_rebuild_subdiv");
+ }
+
+ col = uiLayoutColumn(layout, false);
+ row = uiLayoutRow(col, false);
+ if (RNA_boolean_get(&ptr, "is_external")) {
+ uiItemO(row, IFACE_("Pack External"), ICON_NONE, "OBJECT_OT_multires_external_pack");
+ row = uiLayoutRow(col, false);
+ uiItemR(row, &ptr, "filepath", 0, "", ICON_NONE);
+ }
+ else {
+ uiItemO(col, IFACE_("Save External..."), ICON_NONE, "OBJECT_OT_multires_external_save");
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void advanced_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "quality", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "uv_smooth", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_creases", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Multires, panel_draw);
+ modifier_subpanel_register(
+ region_type, "advanced", "Advanced", NULL, advanced_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Multires = {
/* name */ "Multires",
/* structName */ "MultiresModifierData",
@@ -302,4 +421,5 @@ ModifierTypeInfo modifierType_Multires = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ freeRuntimeData,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c b/source/blender/modifiers/intern/MOD_normal_edit.c
index 1521cfab356..c1901a97cda 100644
--- a/source/blender/modifiers/intern/MOD_normal_edit.c
+++ b/source/blender/modifiers/intern/MOD_normal_edit.c
@@ -27,17 +27,28 @@
#include "BLI_bitmap.h"
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void generate_vert_coordinates(Mesh *mesh,
@@ -689,8 +700,86 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return normalEditModifier_do((NormalEditModifierData *)md, ctx, ctx->object, mesh);
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ int mode = RNA_enum_get(&ptr, "mode");
+
+ uiItemR(layout, &ptr, "mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "target", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, mode == MOD_NORMALEDIT_MODE_DIRECTIONAL);
+ uiItemR(col, &ptr, "use_direction_parallel", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+/* This panel could be open by default, but it isn't currently. */
+static void mix_mode_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "mix_mode", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "mix_factor", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "mix_limit", 0, NULL, ICON_NONE);
+ uiItemR(row,
+ &ptr,
+ "no_polynors_fix",
+ 0,
+ "",
+ (RNA_boolean_get(&ptr, "no_polynors_fix") ? ICON_LOCKED : ICON_UNLOCKED));
+}
+
+static void offset_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ int mode = RNA_enum_get(&ptr, "mode");
+ PointerRNA target_ptr = RNA_pointer_get(&ptr, "target");
+ bool needs_object_offset = (mode == MOD_NORMALEDIT_MODE_RADIAL &&
+ RNA_pointer_is_null(&target_ptr)) ||
+ (mode == MOD_NORMALEDIT_MODE_DIRECTIONAL &&
+ RNA_boolean_get(&ptr, "use_direction_parallel"));
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, needs_object_offset);
+ uiItemR(layout, &ptr, "offset", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_NormalEdit, panel_draw);
+ modifier_subpanel_register(region_type, "mix", "Mix", NULL, mix_mode_panel_draw, panel_type);
+ modifier_subpanel_register(region_type, "offset", "Offset", NULL, offset_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_NormalEdit = {
- /* name */ "Set Split Normals",
+ /* name */ "NormalEdit",
/* structName */ "NormalEditModifierData",
/* structSize */ sizeof(NormalEditModifierData),
/* type */ eModifierTypeType_Constructive,
@@ -719,4 +808,5 @@ ModifierTypeInfo modifierType_NormalEdit = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c
index 4c7c644952b..e16a23f54c6 100644
--- a/source/blender/modifiers/intern/MOD_ocean.c
+++ b/source/blender/modifiers/intern/MOD_ocean.c
@@ -27,21 +27,34 @@
#include "BLI_math_inline.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_customdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_ocean.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
+#include "WM_types.h" /* For UI free bake operator. */
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#ifdef WITH_OCEANSIM
static void init_cache_data(Object *ob, struct OceanModifierData *omd)
@@ -494,6 +507,172 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+// #define WITH_OCEANSIM
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+#ifdef WITH_OCEANSIM
+ uiLayout *col;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "geometry_mode", 0, NULL, ICON_NONE);
+ if (RNA_enum_get(&ptr, "geometry_mode") == MOD_OCEAN_GEOM_GENERATE) {
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "repeat_x", 0, IFACE_("Repeat X"), ICON_NONE);
+ uiItemR(col, &ptr, "repeat_y", 0, IFACE_("Y"), ICON_NONE);
+ }
+ uiItemR(layout, &ptr, "random_seed", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "resolution", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "time", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "depth", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "size", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "spatial_size", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_normals", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+
+#else /* WITH_OCEANSIM */
+ uiItemL(layout, IFACE_("Built without Ocean modifier"), ICON_NONE);
+ UNUSED_VARS(C);
+#endif /* WITH_OCEANSIM */
+}
+
+#ifdef WITH_OCEANSIM
+static void waves_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "wave_scale", 0, IFACE_("Scale"), ICON_NONE);
+ uiItemR(layout, &ptr, "wave_scale_min", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "choppiness", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "wind_velocity", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "wave_alignment", 0, IFACE_("Alignment"), ICON_NONE);
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, RNA_float_get(&ptr, "wave_alignment") > 0.0f);
+ uiItemR(col, &ptr, "wave_direction", 0, IFACE_("Direction"), ICON_NONE);
+ uiItemR(col, &ptr, "damping", 0, NULL, ICON_NONE);
+}
+
+static void foam_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_foam", 0, IFACE_("Foam"), ICON_NONE);
+}
+
+static void foam_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ bool use_foam = RNA_boolean_get(&ptr, "use_foam");
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, use_foam);
+ uiItemR(col, &ptr, "foam_coverage", 0, IFACE_("Coverage"), ICON_NONE);
+
+ col = uiLayoutColumn(layout, true);
+ uiLayoutSetActive(col, use_foam);
+ uiItemR(col, &ptr, "foam_layer_name", 0, IFACE_("Data Layer"), ICON_NONE);
+}
+
+static void spectrum_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ int spectrum = RNA_enum_get(&ptr, "spectrum");
+
+ uiItemR(layout, &ptr, "spectrum", 0, NULL, ICON_NONE);
+ if (ELEM(spectrum, MOD_OCEAN_SPECTRUM_TEXEL_MARSEN_ARSLOE, MOD_OCEAN_SPECTRUM_JONSWAP)) {
+ uiItemR(layout, &ptr, "sharpen_peak_jonswap", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "fetch_jonswap", 0, NULL, ICON_NONE);
+ }
+}
+
+static void bake_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ bool is_cached = RNA_boolean_get(&ptr, "is_cached");
+ bool use_foam = RNA_boolean_get(&ptr, "use_foam");
+
+ if (is_cached) {
+ PointerRNA op_ptr;
+ uiItemFullO(layout,
+ "OBJECT_OT_ocean_bake",
+ IFACE_("Delete Bake"),
+ ICON_NONE,
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_boolean_set(&op_ptr, "free", true);
+ }
+ else {
+ uiItemO(layout, NULL, ICON_NONE, "OBJECT_OT_ocean_bake");
+ }
+
+ uiItemR(layout, &ptr, "filepath", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, true);
+ uiLayoutSetEnabled(col, !is_cached);
+ uiItemR(col, &ptr, "frame_start", 0, IFACE_("Start"), ICON_NONE);
+ uiItemR(col, &ptr, "frame_end", 0, IFACE_("End"), ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, use_foam);
+ uiItemR(col, &ptr, "bake_foam_fade", 0, NULL, ICON_NONE);
+}
+#endif /* WITH_OCEANSIM */
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Ocean, panel_draw);
+#ifdef WITH_OCEANSIM
+ modifier_subpanel_register(region_type, "waves", "Waves", NULL, waves_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "foam", "", foam_panel_draw_header, foam_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "spectrum", "Spectrum", NULL, spectrum_panel_draw, panel_type);
+ modifier_subpanel_register(region_type, "bake", "Bake", NULL, bake_panel_draw, panel_type);
+#else
+ UNUSED_VARS(panel_type);
+#endif /* WITH_OCEANSIM */
+}
ModifierTypeInfo modifierType_Ocean = {
/* name */ "Ocean",
@@ -525,4 +704,5 @@ ModifierTypeInfo modifierType_Ocean = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index 644962ab71c..0a9fb964281 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -30,9 +30,13 @@
#include "BLI_rand.h"
#include "BLI_string.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_effect.h"
#include "BKE_lattice.h"
#include "BKE_lib_query.h"
@@ -40,11 +44,18 @@
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void initData(ModifierData *md)
{
@@ -546,6 +557,129 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA particle_obj_ptr = RNA_pointer_get(&ptr, "object");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE);
+ if (!RNA_pointer_is_null(&particle_obj_ptr)) {
+ uiItemPointerR(layout,
+ &ptr,
+ "particle_system",
+ &particle_obj_ptr,
+ "particle_systems",
+ "Particle System",
+ ICON_NONE);
+ }
+ else {
+ uiItemR(layout, &ptr, "particle_system_index", 0, IFACE_("Particle System"), ICON_NONE);
+ }
+
+ uiItemS(layout);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Create Instances"));
+ uiItemR(row, &ptr, "use_normal", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_children", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_size", toggles_flag, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Show"));
+ uiItemR(row, &ptr, "show_alive", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "show_dead", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "show_unborn", toggles_flag, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "particle_amount", 0, IFACE_("Amount"), ICON_NONE);
+ uiItemR(layout, &ptr, "particle_offset", 0, IFACE_("Offset"), ICON_NONE);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "space", 0, IFACE_("Coordinate Space"), ICON_NONE);
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void path_panel_draw_header(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemR(layout, &ptr, "use_path", 0, IFACE_("Create Along Paths"), ICON_NONE);
+}
+
+static void path_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, RNA_boolean_get(&ptr, "use_path"));
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "position", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "random_position", UI_ITEM_R_SLIDER, IFACE_("Random"), ICON_NONE);
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "rotation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "random_rotation", UI_ITEM_R_SLIDER, IFACE_("Random"), ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_preserve_shape", 0, NULL, ICON_NONE);
+}
+
+static void layers_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemPointerR(layout,
+ &ptr,
+ "index_layer_name",
+ &obj_data_ptr,
+ "vertex_colors",
+ IFACE_("Index"),
+ ICON_NONE);
+ uiItemPointerR(layout,
+ &ptr,
+ "value_layer_name",
+ &obj_data_ptr,
+ "vertex_colors",
+ IFACE_("Value"),
+ ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_ParticleInstance, panel_draw);
+ modifier_subpanel_register(
+ region_type, "paths", "", path_panel_draw_header, path_panel_draw, panel_type);
+ modifier_subpanel_register(region_type, "layers", "Layers", NULL, layers_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_ParticleInstance = {
/* name */ "ParticleInstance",
/* structName */ "ParticleInstanceModifierData",
@@ -576,4 +710,5 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index e72a484e3a0..b63fb18de69 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -25,17 +25,28 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -247,6 +258,43 @@ static void deformVertsEM(ModifierData *md,
}
#endif
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ Object *ob = ob_ptr.data;
+ ModifierData *md = (ModifierData *)ptr.data;
+ ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
+
+ uiItemL(layout, IFACE_("Settings are in the particle tab"), ICON_NONE);
+
+ if (!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
+ if (ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB)) {
+ uiItemO(layout,
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Convert"),
+ ICON_NONE,
+ "OBJECT_OT_duplicates_make_real");
+ }
+ else if (psys->part->ren_as == PART_DRAW_PATH) {
+ uiItemO(layout,
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Convert"),
+ ICON_NONE,
+ "OBJECT_OT_modifier_convert");
+ }
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_ParticleSystem, panel_draw);
+}
+
ModifierTypeInfo modifierType_ParticleSystem = {
/* name */ "ParticleSystem",
/* structName */ "ParticleSystemModifierData",
@@ -280,4 +328,5 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 5a262adf47c..a76b3acb783 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -27,16 +27,27 @@
#include "BLI_math_base.h"
#include "BLI_threads.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
-#include "MOD_modifiertypes.h"
-
+#include "BKE_context.h"
#include "BKE_mesh.h"
#include "BKE_mesh_remesh_voxel.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
+#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include <assert.h>
#include <stdlib.h>
@@ -226,6 +237,54 @@ static Mesh *modifyMesh(ModifierData *UNUSED(md),
#endif /* !WITH_MOD_REMESH */
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+#ifdef WITH_MOD_REMESH
+ uiLayout *row;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int mode = RNA_enum_get(&ptr, "mode");
+
+ uiItemR(layout, &ptr, "mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ if (mode == MOD_REMESH_VOXEL) {
+ uiItemR(layout, &ptr, "voxel_size", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "adaptivity", 0, NULL, ICON_NONE);
+ }
+ else {
+ uiItemR(layout, &ptr, "octree_depth", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "scale", 0, NULL, ICON_NONE);
+
+ if (mode == MOD_REMESH_SHARP_FEATURES) {
+ uiItemR(layout, &ptr, "sharpness", 0, NULL, ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "use_remove_disconnected", 0, NULL, ICON_NONE);
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, RNA_boolean_get(&ptr, "use_remove_disconnected"));
+ uiItemR(layout, &ptr, "threshold", 0, NULL, ICON_NONE);
+ }
+ uiItemR(layout, &ptr, "use_smooth_shade", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+
+#else /* WITH_MOD_REMESH */
+ uiItemL(layout, IFACE_("Built without Remesh modifier"), ICON_NONE);
+ UNUSED_VARS(C);
+#endif /* WITH_MOD_REMESH */
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Remesh, panel_draw);
+}
+
ModifierTypeInfo modifierType_Remesh = {
/* name */ "Remesh",
/* structName */ "RemeshModifierData",
@@ -254,5 +313,7 @@ ModifierTypeInfo modifierType_Remesh = {
/* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL,
+ /* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index d3d42068812..b1c49ba2fec 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -29,18 +29,30 @@
#include "BLI_alloca.h"
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "BLI_strict_flags.h"
@@ -1156,6 +1168,83 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk,
walk(userData, ob, &ltmd->ob_axis, IDWALK_CB_NOP);
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row, *col;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ PointerRNA screw_obj_ptr = RNA_pointer_get(&ptr, "object");
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "angle", 0, NULL, ICON_NONE);
+ row = uiLayoutRow(col, false);
+ uiLayoutSetActive(row,
+ RNA_pointer_is_null(&screw_obj_ptr) ||
+ !RNA_boolean_get(&ptr, "use_object_screw_offset"));
+ uiItemR(row, &ptr, "screw_offset", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "iterations", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+ col = uiLayoutColumn(layout, false);
+ row = uiLayoutRow(col, false);
+ uiItemR(row, &ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "object", 0, IFACE_("Axis Object"), ICON_NONE);
+ sub = uiLayoutColumn(col, false);
+ uiLayoutSetActive(sub, !RNA_pointer_is_null(&screw_obj_ptr));
+ uiItemR(sub, &ptr, "use_object_screw_offset", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "steps", 0, IFACE_("Steps Viewport"), ICON_NONE);
+ uiItemR(col, &ptr, "render_steps", 0, IFACE_("Render"), ICON_NONE);
+
+ uiItemS(layout);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Merge"));
+ uiItemR(row, &ptr, "use_merge_vertices", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_merge_vertices"));
+ uiItemR(sub, &ptr, "merge_threshold", 0, "", ICON_NONE);
+
+ uiItemS(layout);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Stretch UVs"));
+ uiItemR(row, &ptr, "use_stretch_u", toggles_flag, IFACE_("U"), ICON_NONE);
+ uiItemR(row, &ptr, "use_stretch_v", toggles_flag, IFACE_("V"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void normals_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "use_smooth_shade", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "use_normal_calculate", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "use_normal_flip", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Screw, panel_draw);
+ modifier_subpanel_register(
+ region_type, "normals", "Normals", NULL, normals_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Screw = {
/* name */ "Screw",
/* structName */ "ScrewModifierData",
@@ -1187,4 +1276,5 @@ ModifierTypeInfo modifierType_Screw = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c
index abab0aff927..bd3301b543c 100644
--- a/source/blender/modifiers/intern/MOD_shapekey.c
+++ b/source/blender/modifiers/intern/MOD_shapekey.c
@@ -147,4 +147,5 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index 11dc0a92769..c0f7a0a7db0 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -25,18 +25,29 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
#include "BKE_shrinkwrap.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static bool dependsOnNormals(ModifierData *md);
@@ -203,6 +214,65 @@ static bool dependsOnNormals(ModifierData *md)
return false;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ int wrap_method = RNA_enum_get(&ptr, "wrap_method");
+
+ uiItemR(layout, &ptr, "wrap_method", 0, NULL, ICON_NONE);
+
+ if (ELEM(wrap_method,
+ MOD_SHRINKWRAP_PROJECT,
+ MOD_SHRINKWRAP_NEAREST_SURFACE,
+ MOD_SHRINKWRAP_TARGET_PROJECT)) {
+ uiItemR(layout, &ptr, "wrap_mode", 0, NULL, ICON_NONE);
+ }
+
+ if (wrap_method == MOD_SHRINKWRAP_PROJECT) {
+ uiItemR(layout, &ptr, "project_limit", 0, IFACE_("Limit"), ICON_NONE);
+ uiItemR(layout, &ptr, "subsurf_levels", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Axis"));
+ uiItemR(row, &ptr, "use_project_x", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_project_y", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_project_z", toggles_flag, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_negative_direction", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_positive_direction", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "cull_face", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col,
+ RNA_boolean_get(&ptr, "use_negative_direction") &&
+ RNA_enum_get(&ptr, "cull_face") != 0);
+ uiItemR(col, &ptr, "use_invert_cull", 0, NULL, ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "target", 0, NULL, ICON_NONE);
+ if (wrap_method == MOD_SHRINKWRAP_PROJECT) {
+ uiItemR(layout, &ptr, "auxiliary_target", 0, NULL, ICON_NONE);
+ }
+ uiItemR(layout, &ptr, "offset", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Shrinkwrap, panel_draw);
+}
+
ModifierTypeInfo modifierType_Shrinkwrap = {
/* name */ "Shrinkwrap",
/* structName */ "ShrinkwrapModifierData",
@@ -234,4 +304,5 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index a81b42905e3..3a3b3a4f3ce 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -25,19 +25,30 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "bmesh.h"
@@ -452,6 +463,80 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int deform_method = RNA_enum_get(&ptr, "deform_method");
+
+ row = uiLayoutRow(layout, false);
+ uiItemR(row, &ptr, "deform_method", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ uiLayoutSetPropSep(layout, true);
+
+ if (ELEM(deform_method, MOD_SIMPLEDEFORM_MODE_TAPER, MOD_SIMPLEDEFORM_MODE_STRETCH)) {
+ uiItemR(layout, &ptr, "factor", 0, NULL, ICON_NONE);
+ }
+ else {
+ uiItemR(layout, &ptr, "angle", 0, NULL, ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "origin", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "deform_axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void restrictions_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int deform_method = RNA_enum_get(&ptr, "deform_method");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "limits", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ if (ELEM(deform_method,
+ MOD_SIMPLEDEFORM_MODE_TAPER,
+ MOD_SIMPLEDEFORM_MODE_STRETCH,
+ MOD_SIMPLEDEFORM_MODE_TWIST)) {
+ int deform_axis = RNA_enum_get(&ptr, "deform_axis");
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Lock"));
+ if (deform_axis != 0) {
+ uiItemR(row, &ptr, "lock_x", toggles_flag, NULL, ICON_NONE);
+ }
+ if (deform_axis != 1) {
+ uiItemR(row, &ptr, "lock_y", toggles_flag, NULL, ICON_NONE);
+ }
+ if (deform_axis != 2) {
+ uiItemR(row, &ptr, "lock_z", toggles_flag, NULL, ICON_NONE);
+ }
+ }
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_SimpleDeform, panel_draw);
+ modifier_subpanel_register(
+ region_type, "restrictions", "Restrictions", NULL, restrictions_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_SimpleDeform = {
/* name */ "SimpleDeform",
/* structName */ "SimpleDeformModifierData",
@@ -484,4 +569,5 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_simulation.cc b/source/blender/modifiers/intern/MOD_simulation.cc
index f52daf53186..a9af48b682f 100644
--- a/source/blender/modifiers/intern/MOD_simulation.cc
+++ b/source/blender/modifiers/intern/MOD_simulation.cc
@@ -34,6 +34,7 @@
#include "DNA_object_types.h"
#include "DNA_pointcloud_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "DNA_simulation_types.h"
#include "BKE_customdata.h"
@@ -41,10 +42,22 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+/* SpaceType struct has a member called 'new' which obviously conflicts with C++
+ * so temporarily redefining the new keyword to make it compile. */
+#define new extern_new
+#include "BKE_screen.h"
+#undef new
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
{
@@ -77,6 +90,25 @@ static PointCloud *modifyPointCloud(ModifierData *md,
return pointcloud;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiItemR(layout, &ptr, "simulation", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "data_path", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Mask, panel_draw);
+}
+
ModifierTypeInfo modifierType_Simulation = {
/* name */ "Simulation",
/* structName */ "SimulationModifierData",
@@ -106,4 +138,5 @@ ModifierTypeInfo modifierType_Simulation = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c
index 34590736e37..38d7b31a335 100644
--- a/source/blender/modifiers/intern/MOD_skin.c
+++ b/source/blender/modifiers/intern/MOD_skin.c
@@ -61,18 +61,31 @@
#include "BLI_math_geom.h"
#include "BLI_stack.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
+#include "WM_types.h" /* For skin mark clear operator UI. */
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "bmesh.h"
@@ -1934,6 +1947,64 @@ static void requiredDataMask(Object *UNUSED(ob),
r_cddata_masks->vmask |= CD_MASK_MVERT_SKIN | CD_MASK_MDEFORMVERT;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA op_ptr;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "branch_smoothing", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Symmetry"));
+ uiItemR(row, &ptr, "use_x_symmetry", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_y_symmetry", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_z_symmetry", toggles_flag, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_smooth_shade", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRow(layout, false);
+ uiItemO(row, IFACE_("Create Armature"), ICON_NONE, "OBJECT_OT_skin_armature_create");
+ uiItemO(row, NULL, ICON_NONE, "MESH_OT_customdata_skin_add");
+
+ row = uiLayoutRow(layout, true);
+ uiItemFullO(row,
+ "OBJECT_OT_skin_loose_mark_clear",
+ IFACE_("Mark Loose"),
+ ICON_NONE,
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "action", 0); /* SKIN_LOOSE_MARK */
+ uiItemFullO(row,
+ "OBJECT_OT_skin_loose_mark_clear",
+ IFACE_("Clear Loose"),
+ ICON_NONE,
+ NULL,
+ WM_OP_EXEC_DEFAULT,
+ 0,
+ &op_ptr);
+ RNA_enum_set(&op_ptr, "action", 1); /* SKIN_LOOSE_CLEAR */
+
+ uiItemO(layout, IFACE_("Mark Root"), ICON_NONE, "OBJECT_OT_skin_root_mark");
+ uiItemO(layout, IFACE_("Equalize Radii"), ICON_NONE, "OBJECT_OT_skin_radii_equalize");
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Skin, panel_draw);
+}
+
ModifierTypeInfo modifierType_Skin = {
/* name */ "Skin",
/* structName */ "SkinModifierData",
@@ -1961,5 +2032,7 @@ ModifierTypeInfo modifierType_Skin = {
/* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL,
+ /* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index 7ac6690e3a7..21313746ce3 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -27,16 +27,27 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -226,6 +237,37 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col;
+ uiLayout *layout = panel->layout;
+ int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Axis"));
+ uiItemR(row, &ptr, "use_x", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_y", toggles_flag, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_z", toggles_flag, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "factor", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "iterations", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Smooth, panel_draw);
+}
+
ModifierTypeInfo modifierType_Smooth = {
/* name */ "Smooth",
/* structName */ "SmoothModifierData",
@@ -256,4 +298,5 @@ ModifierTypeInfo modifierType_Smooth = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 92516d3d417..515303b7271 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -25,20 +25,31 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_force_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_layer.h"
#include "BKE_particle.h"
+#include "BKE_screen.h"
#include "BKE_softbody.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_physics.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static void deformVerts(ModifierData *UNUSED(md),
const ModifierEvalContext *ctx,
@@ -73,6 +84,23 @@ static void updateDepsgraph(ModifierData *UNUSED(md), const ModifierUpdateDepsgr
DEG_add_modifier_to_transform_relation(ctx->node, "SoftBody Modifier");
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Softbody, panel_draw);
+}
+
ModifierTypeInfo modifierType_Softbody = {
/* name */ "Softbody",
/* structName */ "SoftbodyModifierData",
@@ -104,4 +132,5 @@ ModifierTypeInfo modifierType_Softbody = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 01277facacf..09351450d3b 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -21,13 +21,26 @@
* \ingroup modifiers
*/
+#include <string.h>
+
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_particle.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_solidify_util.h"
@@ -84,6 +97,164 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return mesh;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row, *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int solidify_mode = RNA_enum_get(&ptr, "solidify_mode");
+ bool has_vertex_group = RNA_string_length(&ptr, "vertex_group") != 0;
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "solidify_mode", 0, NULL, ICON_NONE);
+
+ if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
+ uiItemR(layout, &ptr, "nonmanifold_thickness_mode", 0, IFACE_("Thickness"), ICON_NONE);
+ uiItemR(layout, &ptr, "nonmanifold_boundary_mode", 0, IFACE_("Boundary"), ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "thickness", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "offset", 0, NULL, ICON_NONE);
+
+ if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
+ uiItemR(layout, &ptr, "nonmanifold_merge_threshold", 0, NULL, ICON_NONE);
+ }
+
+ col = uiLayoutColumnWithHeading(layout, false, "Rim");
+ uiItemR(col, &ptr, "use_rim", 0, IFACE_("Fill"), ICON_NONE);
+ sub = uiLayoutColumn(col, false);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_rim"));
+ uiItemR(sub, &ptr, "use_rim_only", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, has_vertex_group);
+ uiItemR(row, &ptr, "thickness_vertex_group", 0, IFACE_("Factor"), ICON_NONE);
+
+ if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, has_vertex_group);
+ uiItemR(row, &ptr, "use_flat_faces", 0, NULL, ICON_NONE);
+ }
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void normals_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int solidify_mode = RNA_enum_get(&ptr, "solidify_mode");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "use_flip_normals", 0, NULL, ICON_NONE);
+ if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
+ uiItemR(layout, &ptr, "use_quality_normals", 0, IFACE_("High Quality"), ICON_NONE);
+ uiItemR(layout, &ptr, "use_even_offset", 0, NULL, ICON_NONE);
+ }
+}
+
+static void materials_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "material_offset", 0, NULL, ICON_NONE);
+ col = uiLayoutColumn(layout, true);
+ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "use_rim"));
+ uiItemR(col, &ptr, "material_offset_rim", 0, IFACE_("Rim"), ICON_NONE);
+}
+
+static void edge_data_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int solidify_mode = RNA_enum_get(&ptr, "solidify_mode");
+
+ uiLayoutSetPropSep(layout, true);
+
+ if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
+ uiItemR(layout, &ptr, "edge_crease_inner", 0, IFACE_("Inner"), ICON_NONE);
+ uiItemR(layout, &ptr, "edge_crease_outer", 0, IFACE_("Outer"), ICON_NONE);
+ uiItemR(layout, &ptr, "edge_crease_rim", 0, IFACE_("Rim"), ICON_NONE);
+ }
+ uiItemR(layout, &ptr, "bevel_convex", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+}
+
+static void clamp_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "thickness_clamp", 0, NULL, ICON_NONE);
+ row = uiLayoutRow(layout, false);
+ uiLayoutSetActive(row, RNA_float_get(&ptr, "thickness_clamp") > 0.0f);
+ uiItemR(row, &ptr, "use_thickness_angle_clamp", 0, NULL, ICON_NONE);
+}
+
+static void vertex_group_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemPointerR(col, &ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", "Shell", ICON_NONE);
+ uiItemPointerR(col, &ptr, "rim_vertex_group", &ob_ptr, "vertex_groups", "Rim", ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Solidify, panel_draw);
+ modifier_subpanel_register(
+ region_type, "normals", "Normals", NULL, normals_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "materials", "Materials", NULL, materials_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "edge_data", "Edge Data", NULL, edge_data_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "clamp", "Thickness Clamp", NULL, clamp_panel_draw, panel_type);
+ modifier_subpanel_register(region_type,
+ "vertex_groups",
+ "Output Vertex Groups",
+ NULL,
+ vertex_group_panel_draw,
+ panel_type);
+}
+
ModifierTypeInfo modifierType_Solidify = {
/* name */ "Solidify",
/* structName */ "SolidifyModifierData",
@@ -116,4 +287,5 @@ ModifierTypeInfo modifierType_Solidify = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index e054e3478ea..2b2f6893a2e 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -22,26 +22,40 @@
*/
#include <stddef.h>
+#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "BKE_subdiv.h"
#include "BKE_subdiv_ccg.h"
#include "BKE_subdiv_deform.h"
#include "BKE_subdiv_mesh.h"
#include "BKE_subsurf.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RE_engine.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "intern/CCGSubSurf.h"
@@ -275,6 +289,142 @@ static void deformMatrices(ModifierData *md,
}
}
+#ifdef WITH_CYCLES
+static bool get_show_adaptive_options(const bContext *C, Panel *panel)
+{
+ /* Don't show adaptive options if cycles isn't the active engine. */
+ const struct RenderEngineType *engine_type = CTX_data_engine_type(C);
+ if (!STREQ(engine_type->idname, "CYCLES")) {
+ return false;
+ }
+
+ /* Only show adaptive options if this is the last modifier. */
+ PointerRNA md_ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &md_ptr);
+ ModifierData *md = md_ptr.data;
+ if (md->next != NULL) {
+ return false;
+ }
+
+ /* Don't show adaptive options if the cycles experimental feature set is disabled. */
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA scene_ptr;
+ RNA_id_pointer_create(&scene->id, &scene_ptr);
+ if (BKE_scene_uses_cycles(scene)) {
+ PointerRNA cycles_ptr = RNA_pointer_get(&scene_ptr, "cycles");
+ if (RNA_enum_get(&cycles_ptr, "feature_set") != 1) { /* EXPERIMENTAL */
+ return false;
+ }
+ }
+
+ return true;
+}
+#endif
+
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ /* Only test for adaptive subdivision if built with cycles. */
+ bool show_adaptive_options = false;
+ bool ob_use_adaptive_subdivision = false;
+ PointerRNA cycles_ptr = {NULL};
+ PointerRNA ob_cycles_ptr = {NULL};
+#ifdef WITH_CYCLES
+ PointerRNA scene_ptr;
+ Scene *scene = CTX_data_scene(C);
+ RNA_id_pointer_create(&scene->id, &scene_ptr);
+ if (BKE_scene_uses_cycles(scene)) {
+ cycles_ptr = RNA_pointer_get(&scene_ptr, "cycles");
+ ob_cycles_ptr = RNA_pointer_get(&ob_ptr, "cycles");
+ if (!RNA_pointer_is_null(&ob_cycles_ptr)) {
+ ob_use_adaptive_subdivision = RNA_boolean_get(&ob_cycles_ptr, "use_adaptive_subdivision");
+ show_adaptive_options = get_show_adaptive_options(C, panel);
+ }
+ }
+#endif
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "subdivision_type", 0, IFACE_("Type"), ICON_NONE);
+
+ if (show_adaptive_options) {
+ uiItemR(layout,
+ &ob_cycles_ptr,
+ "use_adaptive_subdivision",
+ 0,
+ IFACE_("Adaptive Subdivision"),
+ ICON_NONE);
+ }
+ if (ob_use_adaptive_subdivision && show_adaptive_options) {
+ uiItemR(layout, &ob_cycles_ptr, "dicing_rate", 0, NULL, ICON_NONE);
+ float render = MAX2(RNA_float_get(&cycles_ptr, "dicing_rate") *
+ RNA_float_get(&ob_cycles_ptr, "dicing_rate"),
+ 0.1f);
+ float preview = MAX2(RNA_float_get(&cycles_ptr, "preview_dicing_rate") *
+ RNA_float_get(&ob_cycles_ptr, "dicing_rate"),
+ 0.1f);
+ char output[64];
+ snprintf(output, 64, "Final Scale: Render %.2f px, Viewport %.2f px", render, preview);
+ uiItemL(layout, output, ICON_NONE);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "levels", 0, IFACE_("Levels Viewport"), ICON_NONE);
+ }
+ else {
+ uiLayout *col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "levels", 0, IFACE_("Levels Viewport"), ICON_NONE);
+ uiItemR(col, &ptr, "render_levels", 0, IFACE_("Render"), ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "show_only_control_edges", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void advanced_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ bool ob_use_adaptive_subdivision = false;
+ bool show_adaptive_options = false;
+#ifdef WITH_CYCLES
+ Scene *scene = CTX_data_scene(C);
+ if (BKE_scene_uses_cycles(scene)) {
+ PointerRNA ob_cycles_ptr = RNA_pointer_get(&ob_ptr, "cycles");
+ if (!RNA_pointer_is_null(&ob_cycles_ptr)) {
+ ob_use_adaptive_subdivision = RNA_boolean_get(&ob_cycles_ptr, "use_adaptive_subdivision");
+ show_adaptive_options = get_show_adaptive_options(C, panel);
+ }
+ }
+#endif
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiLayoutSetActive(layout, !(show_adaptive_options && ob_use_adaptive_subdivision));
+ uiItemR(layout, &ptr, "quality", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "uv_smooth", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "use_creases", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Subsurf, panel_draw);
+ modifier_subpanel_register(
+ region_type, "advanced", "Advanced", NULL, advanced_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Subsurf = {
/* name */ "Subdivision",
/* structName */ "SubsurfModifierData",
@@ -306,4 +456,5 @@ ModifierTypeInfo modifierType_Subsurf = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ freeRuntimeData,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index b7449cbe91c..252022a5439 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -25,19 +25,30 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "BKE_bvhutils.h"
+#include "BKE_context.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "MEM_guardedalloc.h"
@@ -182,6 +193,23 @@ static void deformVerts(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiItemL(layout, IFACE_("Settings are inside the Physics tab"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Surface, panel_draw);
+}
+
ModifierTypeInfo modifierType_Surface = {
/* name */ "Surface",
/* structName */ "SurfaceModifierData",
@@ -212,4 +240,5 @@ ModifierTypeInfo modifierType_Surface = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 4169c76272e..4a2ed1d71db 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -24,25 +24,35 @@
#include "BLI_math_geom.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "BKE_bvhutils.h"
+#include "BKE_context.h"
+#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
-#include "BKE_deform.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
typedef struct SDefAdjacency {
@@ -1385,8 +1395,50 @@ static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED
!(smd->verts != NULL && !(smd->flags & MOD_SDEF_BIND));
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA target_ptr = RNA_pointer_get(&ptr, "target");
+
+ bool is_bound = RNA_boolean_get(&ptr, "is_bound");
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiLayoutSetActive(col, !is_bound);
+ uiItemR(col, &ptr, "target", 0, NULL, ICON_NONE);
+
+ uiItemR(col, &ptr, "falloff", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ uiItemS(layout);
+
+ col = uiLayoutColumn(layout, false);
+ if (is_bound) {
+ uiItemO(col, IFACE_("Unbind"), ICON_NONE, "OBJECT_OT_surfacedeform_bind");
+ }
+ else {
+ uiLayoutSetActive(col, !RNA_pointer_is_null(&target_ptr));
+ uiItemO(col, IFACE_("Bind"), ICON_NONE, "OBJECT_OT_surfacedeform_bind");
+ }
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_SurfaceDeform, panel_draw);
+}
+
ModifierTypeInfo modifierType_SurfaceDeform = {
- /* name */ "Surface Deform",
+ /* name */ "SurfaceDeform",
/* structName */ "SurfaceDeformModifierData",
/* structSize */ sizeof(SurfaceDeformModifierData),
/* type */ eModifierTypeType_OnlyDeform,
@@ -1414,4 +1466,5 @@ ModifierTypeInfo modifierType_SurfaceDeform = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c
index bb88bda6394..351a1016a35 100644
--- a/source/blender/modifiers/intern/MOD_triangulate.c
+++ b/source/blender/modifiers/intern/MOD_triangulate.c
@@ -22,17 +22,28 @@
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "bmesh.h"
#include "bmesh_tools.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
static Mesh *triangulate_mesh(Mesh *mesh,
const int quad_method,
@@ -115,6 +126,29 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "quad_method", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "ngon_method", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "min_vertices", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "keep_custom_normals", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Triangulate, panel_draw);
+}
+
ModifierTypeInfo modifierType_Triangulate = {
/* name */ "Triangulate",
/* structName */ "TriangulateModifierData",
@@ -144,5 +178,7 @@ ModifierTypeInfo modifierType_Triangulate = {
/* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL,
+ /* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_ui_common.c b/source/blender/modifiers/intern/MOD_ui_common.c
new file mode 100644
index 00000000000..973afe5fef6
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_ui_common.c
@@ -0,0 +1,426 @@
+/* This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup modifiers
+ */
+
+#include <string.h>
+
+#include "BLI_listbase.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_context.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_screen.h"
+
+#include "DNA_object_force_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+
+#include "ED_object.h"
+
+#include "BLT_translation.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h" /* Self include */
+
+static Object *get_modifier_object(const bContext *C)
+{
+ SpaceProperties *sbuts = CTX_wm_space_properties(C);
+ if (sbuts != NULL && (sbuts->pinid != NULL) && GS(sbuts->pinid->name) == ID_OB) {
+ return (Object *)sbuts->pinid;
+ }
+ else {
+ return CTX_data_active_object(C);
+ }
+}
+
+/**
+ * Poll function so these modifier panels don't show for other object types with modifiers (only
+ * grease pencil currently).
+ */
+static bool modifier_ui_poll(const bContext *C, PanelType *UNUSED(pt))
+{
+ Object *ob = get_modifier_object(C);
+
+ return (ob != NULL) && (ob->type != OB_GPENCIL);
+}
+
+/* -------------------------------------------------------------------- */
+/** \name Panel Drag and Drop, Expansion Saving
+ * \{ */
+
+/**
+ * Move a modifier to the index it's moved to after a drag and drop.
+ */
+static void modifier_reorder(bContext *C, Panel *panel, int new_index)
+{
+ Object *ob = get_modifier_object(C);
+
+ ModifierData *md = BLI_findlink(&ob->modifiers, panel->runtime.list_index);
+ PointerRNA props_ptr;
+ wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_modifier_move_to_index", false);
+ WM_operator_properties_create_ptr(&props_ptr, ot);
+ RNA_string_set(&props_ptr, "modifier", md->name);
+ RNA_int_set(&props_ptr, "index", new_index);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr);
+ WM_operator_properties_free(&props_ptr);
+}
+
+static short get_modifier_expand_flag(const bContext *C, Panel *panel)
+{
+ Object *ob = get_modifier_object(C);
+ ModifierData *md = BLI_findlink(&ob->modifiers, panel->runtime.list_index);
+ return md->ui_expand_flag;
+}
+
+static void set_modifier_expand_flag(const bContext *C, Panel *panel, short expand_flag)
+{
+ Object *ob = get_modifier_object(C);
+ ModifierData *md = BLI_findlink(&ob->modifiers, panel->runtime.list_index);
+ md->ui_expand_flag = expand_flag;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Modifier Panel Layouts
+ * \{ */
+
+/**
+ * Draw modifier error message.
+ */
+void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
+{
+ ModifierData *md = ptr->data;
+ if (md->error) {
+ uiLayout *row = uiLayoutRow(layout, false);
+ uiItemL(row, IFACE_(md->error), ICON_ERROR);
+ }
+}
+
+/**
+ * Gets RNA pointers for the active object and the panel's modifier data. Also locks
+ * the layout if the modifer is from a linked object, and sets the context pointer.
+ */
+#define ERROR_LIBDATA_MESSAGE TIP_("External library data")
+void modifier_panel_get_property_pointers(const bContext *C,
+ Panel *panel,
+ PointerRNA *r_ob_ptr,
+ PointerRNA *r_md_ptr)
+{
+ Object *ob = get_modifier_object(C);
+
+ ModifierData *md = BLI_findlink(&ob->modifiers, panel->runtime.list_index);
+
+ RNA_pointer_create(&ob->id, &RNA_Modifier, md, r_md_ptr);
+
+ if (r_ob_ptr != NULL) {
+ RNA_pointer_create(&ob->id, &RNA_Object, ob, r_ob_ptr);
+ }
+
+ uiBlock *block = uiLayoutGetBlock(panel->layout);
+ UI_block_lock_set(
+ block, BKE_object_obdata_is_libdata(ob) || ID_IS_LINKED(ob), ERROR_LIBDATA_MESSAGE);
+
+ uiLayoutSetContextPointer(panel->layout, "modifier", r_md_ptr);
+}
+
+/**
+ * Helper function for modifier layouts to draw vertex group settings.
+ */
+void modifier_vgroup_ui(uiLayout *layout,
+ PointerRNA *ptr,
+ PointerRNA *ob_ptr,
+ const char *vgroup_prop,
+ const char *invert_vgroup_prop,
+ const char *text)
+{
+ bool has_vertex_group = RNA_string_length(ptr, vgroup_prop) != 0;
+
+ uiLayout *row = uiLayoutRow(layout, true);
+ uiItemPointerR(row, ptr, vgroup_prop, ob_ptr, "vertex_groups", text, ICON_NONE);
+ if (invert_vgroup_prop != NULL) {
+ uiLayout *sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, has_vertex_group);
+ uiLayoutSetPropDecorate(sub, false);
+ uiItemR(sub, ptr, invert_vgroup_prop, 0, "", ICON_ARROW_LEFTRIGHT);
+ }
+ if (uiLayoutGetPropDecorate(layout)) {
+ uiItemL(row, "", ICON_BLANK1);
+ }
+}
+
+/**
+ * Check whether Modifier is a simulation or not. Used for switching to the
+ * physics/particles context tab.
+ */
+static int modifier_is_simulation(ModifierData *md)
+{
+ /* Physic Tab */
+ if (ELEM(md->type,
+ eModifierType_Cloth,
+ eModifierType_Collision,
+ eModifierType_Fluidsim,
+ eModifierType_Fluid,
+ eModifierType_Softbody,
+ eModifierType_Surface,
+ eModifierType_DynamicPaint)) {
+ return 1;
+ }
+ /* Particle Tab */
+ else if (md->type == eModifierType_ParticleSystem) {
+ return 2;
+ }
+ else {
+ return 0;
+ }
+}
+
+static bool modifier_can_delete(ModifierData *md)
+{
+ /* fluid particle modifier can't be deleted here */
+ if (md->type == eModifierType_ParticleSystem) {
+ short particle_type = ((ParticleSystemModifierData *)md)->psys->part->type;
+ if (ELEM(particle_type,
+ PART_FLUID,
+ PART_FLUID_FLIP,
+ PART_FLUID_FOAM,
+ PART_FLUID_SPRAY,
+ PART_FLUID_BUBBLE,
+ PART_FLUID_TRACER,
+ PART_FLUID_SPRAYFOAM,
+ PART_FLUID_SPRAYBUBBLE,
+ PART_FLUID_FOAMBUBBLE,
+ PART_FLUID_SPRAYFOAMBUBBLE)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static void modifier_ops_extra_draw(bContext *UNUSED(C), uiLayout *layout, void *md_v)
+{
+ ModifierData *md = (ModifierData *)md_v;
+
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
+
+ uiItemEnumO(layout,
+ "OBJECT_OT_modifier_apply",
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
+ 0,
+ "apply_as",
+ MODIFIER_APPLY_DATA);
+
+ if (BKE_modifier_is_same_topology(md) && !BKE_modifier_is_non_geometrical(md)) {
+ uiItemEnumO(layout,
+ "OBJECT_OT_modifier_apply",
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply As Shapekey"),
+ ICON_SHAPEKEY_DATA,
+ "apply_as",
+ MODIFIER_APPLY_SHAPE);
+ }
+
+ if (!ELEM(md->type,
+ eModifierType_Fluidsim,
+ eModifierType_Softbody,
+ eModifierType_ParticleSystem,
+ eModifierType_Cloth,
+ eModifierType_Fluid)) {
+ uiItemO(layout,
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Duplicate"),
+ ICON_DUPLICATE,
+ "OBJECT_OT_modifier_copy");
+ }
+
+ if (modifier_can_delete(md) && !modifier_is_simulation(md)) {
+ uiItemO(layout,
+ CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Delete"),
+ ICON_X,
+ "OBJECT_OT_modifier_remove");
+ }
+}
+
+static void modifier_panel_header(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ Object *ob = get_modifier_object(C);
+
+ /* Don't use #modifier_panel_get_property_pointers, we don't want to lock the header. */
+ ModifierData *md = BLI_findlink(&ob->modifiers, panel->runtime.list_index);
+ RNA_pointer_create(&ob->id, &RNA_Modifier, md, &ptr);
+ uiLayoutSetContextPointer(panel->layout, "modifier", &ptr);
+
+ const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type);
+ Scene *scene = CTX_data_scene(C);
+ int index = panel->runtime.list_index;
+ bool narrow_panel = (panel->sizex < UI_UNIT_X * 8 && panel->sizex != 0);
+
+ /* Modifier Icon. */
+ row = uiLayoutRow(layout, false);
+ if (mti->isDisabled && mti->isDisabled(scene, md, 0)) {
+ uiLayoutSetRedAlert(row, true);
+ }
+ uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
+
+ /* Modifier Name. */
+ if (!narrow_panel) {
+ uiItemR(layout, &ptr, "name", 0, "", ICON_NONE);
+ }
+
+ /* Switch context buttons. */
+ if (modifier_is_simulation(md) == 1) {
+ uiItemStringO(
+ layout, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
+ }
+ else if (modifier_is_simulation(md) == 2) {
+ uiItemStringO(
+ layout, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
+ }
+
+ /* Mode switching buttons. */
+ row = uiLayoutRow(layout, true);
+ if (ob->type == OB_MESH) {
+ int last_cage_index;
+ int cage_index = BKE_modifiers_get_cage_index(scene, ob, &last_cage_index, 0);
+ if (BKE_modifier_supports_cage(scene, md) && (index <= last_cage_index)) {
+ sub = uiLayoutRow(row, true);
+ if (index < cage_index || !BKE_modifier_couldbe_cage(scene, md)) {
+ uiLayoutSetActive(sub, false);
+ }
+ uiItemR(sub, &ptr, "show_on_cage", 0, "", ICON_NONE);
+ }
+ } /* Tessellation point for curve-typed objects. */
+ else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ if (mti->type != eModifierTypeType_Constructive) {
+ /* Constructive modifiers tessellates curve before applying. */
+ uiItemR(layout, &ptr, "use_apply_on_spline", 0, "", ICON_NONE);
+ }
+ }
+ /* Collision and Surface are always enabled, hide buttons. */
+ if (((md->type != eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) &&
+ (md->type != eModifierType_Surface)) {
+ if (mti->flags & eModifierTypeFlag_SupportsEditmode) {
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, (md->mode & eModifierMode_Realtime));
+ uiItemR(sub, &ptr, "show_in_editmode", 0, "", ICON_NONE);
+ }
+ uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NONE);
+ uiItemR(row, &ptr, "show_render", 0, "", ICON_NONE);
+ }
+
+ row = uiLayoutRow(layout, false);
+ uiItemMenuF(row, "", ICON_DOWNARROW_HLT, modifier_ops_extra_draw, md);
+
+ /* Some padding at the end, so the buttons aren't too close to the drag button. */
+ uiItemS(layout);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Modifier Registration Helpers
+ * \{ */
+
+/**
+ * Create a panel in the context's region
+ */
+PanelType *modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
+{
+ /* Get the name for the modifier's panel. */
+ char panel_idname[BKE_ST_MAXNAME];
+ BKE_modifier_type_panel_id(type, panel_idname);
+
+ PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname);
+
+ strcpy(panel_type->idname, panel_idname);
+ strcpy(panel_type->label, "");
+ strcpy(panel_type->context, "modifier");
+ strcpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+
+ panel_type->draw_header = modifier_panel_header;
+ panel_type->draw = draw;
+ panel_type->poll = modifier_ui_poll;
+
+ /* Give the panel the special flag that says it was built here and corresponds to a
+ * modifer rather than a PanelType. */
+ panel_type->flag = PNL_LAYOUT_HEADER_EXPAND | PNL_DRAW_BOX | PNL_INSTANCED;
+ panel_type->reorder = modifier_reorder;
+ panel_type->get_list_data_expand_flag = get_modifier_expand_flag;
+ panel_type->set_list_data_expand_flag = set_modifier_expand_flag;
+
+ BLI_addtail(&region_type->paneltypes, panel_type);
+
+ return panel_type;
+}
+
+/**
+ * Add a shild panel to the parent.
+ *
+ * \note To create the panel type's idname, it appends the \a name argument to the \a parent's
+ * idname.
+ */
+PanelType *modifier_subpanel_register(ARegionType *region_type,
+ const char *name,
+ const char *label,
+ PanelDrawFn draw_header,
+ PanelDrawFn draw,
+ PanelType *parent)
+{
+ /* Create the subpanel's ID name. */
+ char panel_idname[BKE_ST_MAXNAME];
+ strcpy(panel_idname, parent->idname);
+ strcat(panel_idname, "_");
+ strcat(panel_idname, name);
+
+ PanelType *panel_type = MEM_callocN(sizeof(PanelType), panel_idname);
+
+ strcpy(panel_type->idname, panel_idname);
+ strcpy(panel_type->label, label);
+ strcpy(panel_type->context, "modifier");
+ strcpy(panel_type->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+
+ panel_type->draw_header = draw_header;
+ panel_type->draw = draw;
+ panel_type->poll = modifier_ui_poll;
+ panel_type->flag = (PNL_DEFAULT_CLOSED | PNL_DRAW_BOX);
+
+ BLI_assert(parent != NULL);
+ strcpy(panel_type->parent_id, parent->idname);
+ panel_type->parent = parent;
+ BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
+ BLI_addtail(&region_type->paneltypes, panel_type);
+
+ return panel_type;
+}
+
+/** \} */
diff --git a/source/blender/modifiers/intern/MOD_ui_common.h b/source/blender/modifiers/intern/MOD_ui_common.h
new file mode 100644
index 00000000000..59c0fe1c413
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_ui_common.h
@@ -0,0 +1,70 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup modifiers
+ */
+
+#ifndef __MOD_UI_COMMON_H__
+#define __MOD_UI_COMMON_H__
+
+/* so modifier types match their defines */
+#include "MOD_modifiertypes.h"
+
+#include "DEG_depsgraph_build.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ARegionType;
+struct bContext;
+struct PanelType;
+struct uiLayout;
+typedef void (*PanelDrawFn)(const bContext *, struct Panel *);
+
+void modifier_panel_buttons(const struct bContext *C, struct Panel *panel);
+
+void modifier_vgroup_ui(struct uiLayout *layout,
+ struct PointerRNA *ptr,
+ struct PointerRNA *ob_ptr,
+ const char *vgroup_prop,
+ const char *invert_vgroup_prop,
+ const char *text);
+
+void modifier_panel_end(struct uiLayout *layout, PointerRNA *ptr);
+
+void modifier_panel_get_property_pointers(const bContext *C,
+ struct Panel *panel,
+ struct PointerRNA *r_ob_ptr,
+ struct PointerRNA *r_ptr);
+
+struct PanelType *modifier_panel_register(struct ARegionType *region_type,
+ ModifierType type,
+ PanelDrawFn draw);
+
+struct PanelType *modifier_subpanel_register(struct ARegionType *region_type,
+ const char *name,
+ const char *label,
+ PanelDrawFn draw_header,
+ PanelDrawFn draw,
+ struct PanelType *parent);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MOD_UI_COMMON_H__ */
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 580a065f35e..07a57806f87 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -28,17 +28,28 @@
#include "BLI_math.h"
#include "BLI_uvproject.h"
+#include "BLT_translation.h"
+
#include "DNA_camera_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_camera.h"
+#include "BKE_context.h"
#include "BKE_lib_query.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MEM_guardedalloc.h"
@@ -313,6 +324,43 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return result;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemPointerR(layout, &ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+
+ sub = uiLayoutColumn(layout, true);
+ uiItemR(sub, &ptr, "aspect_x", 0, IFACE_("Aspect X"), ICON_NONE);
+ uiItemR(sub, &ptr, "aspect_y", 0, IFACE_("Y"), ICON_NONE);
+
+ sub = uiLayoutColumn(layout, true);
+ uiItemR(sub, &ptr, "scale_x", 0, IFACE_("Scale X"), ICON_NONE);
+ uiItemR(sub, &ptr, "scale_y", 0, IFACE_("Y"), ICON_NONE);
+
+ uiItemR(layout, &ptr, "projector_count", 0, IFACE_("Projectors"), ICON_NONE);
+ RNA_BEGIN (&ptr, projector_ptr, "projectors") {
+ uiItemR(layout, &projector_ptr, "object", 0, NULL, ICON_NONE);
+ }
+ RNA_END;
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_UVProject, panel_draw);
+}
+
ModifierTypeInfo modifierType_UVProject = {
/* name */ "UVProject",
/* structName */ "UVProjectModifierData",
@@ -343,4 +391,5 @@ ModifierTypeInfo modifierType_UVProject = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c
index 4ece36d82a4..a8321cdc26a 100644
--- a/source/blender/modifiers/intern/MOD_uvwarp.c
+++ b/source/blender/modifiers/intern/MOD_uvwarp.c
@@ -25,17 +25,28 @@
#include "BLI_math.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_action.h" /* BKE_pose_channel_find_name */
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_query.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph_query.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void uv_warp_from_mat4_pair(float uv_dst[2], const float uv_src[2], float warp_mat[4][4])
@@ -245,6 +256,70 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
DEG_add_modifier_to_transform_relation(ctx->node, "UVWarp Modifier");
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ PointerRNA warp_obj_ptr;
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemPointerR(layout, &ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "center", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "axis_u", 0, IFACE_("Axis U"), ICON_NONE);
+ uiItemR(col, &ptr, "axis_v", 0, IFACE_("V"), ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "object_from", 0, NULL, ICON_NONE);
+ warp_obj_ptr = RNA_pointer_get(&ptr, "object_from");
+ if (!RNA_pointer_is_null(&warp_obj_ptr) && RNA_enum_get(&warp_obj_ptr, "type") == OB_ARMATURE) {
+ PointerRNA warp_obj_data_ptr = RNA_pointer_get(&warp_obj_ptr, "data");
+ uiItemPointerR(col, &ptr, "bone_from", &warp_obj_data_ptr, "bones", NULL, ICON_NONE);
+ }
+
+ uiItemR(col, &ptr, "object_to", 0, IFACE_("To"), ICON_NONE);
+ warp_obj_ptr = RNA_pointer_get(&ptr, "object_to");
+ if (!RNA_pointer_is_null(&warp_obj_ptr) && RNA_enum_get(&warp_obj_ptr, "type") == OB_ARMATURE) {
+ PointerRNA warp_obj_data_ptr = RNA_pointer_get(&warp_obj_ptr, "data");
+ uiItemPointerR(col, &ptr, "bone_to", &warp_obj_data_ptr, "bones", NULL, ICON_NONE);
+ }
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void transform_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "offset", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "scale", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "rotation", 0, NULL, ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_UVWarp, panel_draw);
+ modifier_subpanel_register(
+ region_type, "offset", "Transform", NULL, transform_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_UVWarp = {
/* name */ "UVWarp",
/* structName */ "UVWarpModifierData",
@@ -275,4 +350,5 @@ ModifierTypeInfo modifierType_UVWarp = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index 692f0ca18f0..eab8ba478aa 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -26,25 +26,36 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_action.h" /* BKE_pose_channel_find_name */
#include "BKE_colortools.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "RE_shader_ext.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
static void initData(ModifierData *md)
@@ -393,6 +404,111 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "object_from", 0, NULL, ICON_NONE);
+ PointerRNA from_obj_ptr = RNA_pointer_get(&ptr, "object_from");
+ if (!RNA_pointer_is_null(&from_obj_ptr) && RNA_enum_get(&from_obj_ptr, "type") == OB_ARMATURE) {
+
+ PointerRNA from_obj_data_ptr = RNA_pointer_get(&from_obj_ptr, "data");
+ uiItemPointerR(col, &ptr, "bone_from", &from_obj_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
+ }
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "object_to", 0, NULL, ICON_NONE);
+ PointerRNA to_obj_ptr = RNA_pointer_get(&ptr, "object_to");
+ if (!RNA_pointer_is_null(&to_obj_ptr) && RNA_enum_get(&to_obj_ptr, "type") == OB_ARMATURE) {
+ PointerRNA to_obj_data_ptr = RNA_pointer_get(&to_obj_ptr, "data");
+ uiItemPointerR(col, &ptr, "bone_to", &to_obj_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
+ }
+
+ uiItemR(layout, &ptr, "use_volume_preserve", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "strength", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void falloff_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ bool use_falloff = (RNA_enum_get(&ptr, "falloff_type") != eWarp_Falloff_None);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "falloff_type", 0, NULL, ICON_NONE);
+
+ if (use_falloff) {
+ uiItemR(layout, &ptr, "falloff_radius", 0, NULL, ICON_NONE);
+ }
+
+ if (use_falloff && RNA_enum_get(&ptr, "falloff_type") == eWarp_Falloff_Curve) {
+ uiTemplateCurveMapping(layout, &ptr, "falloff_curve", 0, false, false, false, false);
+ }
+}
+
+static void texture_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int texture_coords = RNA_enum_get(&ptr, "texture_coords");
+
+ uiTemplateID(layout, C, &ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
+
+ if (texture_coords == MOD_DISP_MAP_OBJECT) {
+ uiItemR(layout, &ptr, "texture_coords_object", 0, "Object", ICON_NONE);
+ PointerRNA texture_coords_obj_ptr = RNA_pointer_get(&ptr, "texture_coords_object");
+ if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
+ (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
+ PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
+ uiItemPointerR(layout,
+ &ptr,
+ "texture_coords_bone",
+ &texture_coords_obj_data_ptr,
+ "bones",
+ IFACE_("Bone"),
+ ICON_NONE);
+ }
+ }
+ else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+ uiItemPointerR(layout, &ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+ }
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Warp, panel_draw);
+ modifier_subpanel_register(
+ region_type, "falloff", "Falloff", NULL, falloff_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "texture", "Texture", NULL, texture_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Warp = {
/* name */ "Warp",
/* structName */ "WarpModifierData",
@@ -422,4 +538,5 @@ ModifierTypeInfo modifierType_Warp = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 90d9f451f75..48aca9284eb 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -25,23 +25,34 @@
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "MEM_guardedalloc.h"
#include "RE_shader_ext.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "DEG_depsgraph.h"
@@ -365,6 +376,122 @@ static void deformVertsEM(ModifierData *md,
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *row, *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRowWithHeading(layout, true, "Motion");
+ uiItemR(row, &ptr, "use_x", UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE, NULL, ICON_NONE);
+ uiItemR(row, &ptr, "use_y", UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "use_cyclic", 0, NULL, ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Along Normals"));
+ uiItemR(row, &ptr, "use_normal", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_normal"));
+ uiItemR(sub, &ptr, "use_normal_x", UI_ITEM_R_TOGGLE, "X", ICON_NONE);
+ uiItemR(sub, &ptr, "use_normal_y", UI_ITEM_R_TOGGLE, "Y", ICON_NONE);
+ uiItemR(sub, &ptr, "use_normal_z", UI_ITEM_R_TOGGLE, "Z", ICON_NONE);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "falloff_radius", 0, "Falloff", ICON_NONE);
+ uiItemR(col, &ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "narrowness", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void position_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "start_position_object", 0, IFACE_("Object"), ICON_NONE);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "start_position_x", 0, "Start position X", ICON_NONE);
+ uiItemR(col, &ptr, "start_position_y", 0, "Y", ICON_NONE);
+}
+
+static void time_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ modifier_panel_get_property_pointers(C, panel, NULL, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, false);
+ uiItemR(col, &ptr, "time_offset", 0, "Offset", ICON_NONE);
+ uiItemR(col, &ptr, "lifetime", 0, "Life", ICON_NONE);
+ uiItemR(col, &ptr, "damping_time", 0, "Damping", ICON_NONE);
+ uiItemR(col, &ptr, "speed", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+}
+
+static void texture_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ int texture_coords = RNA_enum_get(&ptr, "texture_coords");
+
+ uiTemplateID(layout, C, &ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
+ if (texture_coords == MOD_DISP_MAP_OBJECT) {
+ uiItemR(layout, &ptr, "texture_coords_object", 0, NULL, ICON_NONE);
+ PointerRNA texture_coords_obj_ptr = RNA_pointer_get(&ptr, "texture_coords_object");
+ if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
+ (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
+ PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
+ uiItemPointerR(layout,
+ &ptr,
+ "texture_coords_bone",
+ &texture_coords_obj_data_ptr,
+ "bones",
+ IFACE_("Bone"),
+ ICON_NONE);
+ }
+ }
+ else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
+ PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
+ uiItemPointerR(layout, &ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+ }
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Wave, panel_draw);
+ modifier_subpanel_register(
+ region_type, "position", "Start Position", NULL, position_panel_draw, panel_type);
+ modifier_subpanel_register(region_type, "time", "Time", NULL, time_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "texture", "Texture", NULL, texture_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Wave = {
/* name */ "Wave",
/* structName */ "WaveModifierData",
@@ -395,4 +522,5 @@ ModifierTypeInfo modifierType_Wave = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.c b/source/blender/modifiers/intern/MOD_weighted_normal.c
index 3baf7c878dc..dc1b7ba8a75 100644
--- a/source/blender/modifiers/intern/MOD_weighted_normal.c
+++ b/source/blender/modifiers/intern/MOD_weighted_normal.c
@@ -24,16 +24,27 @@
#include "BLI_linklist.h"
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "bmesh.h"
@@ -700,8 +711,36 @@ static bool dependsOnNormals(ModifierData *UNUSED(md))
return true;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "mode", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "weight", 0, IFACE_("Weight"), ICON_NONE);
+ uiItemR(layout, &ptr, "thresh", 0, IFACE_("Threshold"), ICON_NONE);
+
+ uiItemR(layout, &ptr, "keep_sharp", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "face_influence", 0, NULL, ICON_NONE);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_WeightedNormal, panel_draw);
+}
+
ModifierTypeInfo modifierType_WeightedNormal = {
- /* name */ "Weighted Normal",
+ /* name */ "WeightedNormal",
/* structName */ "WeightedNormalModifierData",
/* structSize */ sizeof(WeightedNormalModifierData),
/* type */ eModifierTypeType_Constructive,
@@ -730,4 +769,5 @@ ModifierTypeInfo modifierType_WeightedNormal = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c
index 1a38787777f..54d3aa46344 100644
--- a/source/blender/modifiers/intern/MOD_weightvg_util.c
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.c
@@ -27,6 +27,8 @@
#include "BLI_rand.h"
#include "BLI_string.h"
+#include "BLT_translation.h"
+
#include "DNA_color_types.h" /* CurveMapping. */
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -35,15 +37,22 @@
#include "DNA_scene_types.h"
#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_modifier.h"
#include "BKE_texture.h" /* Texture masking. */
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "MOD_weightvg_util.h"
#include "RE_shader_ext.h" /* Texture masking. */
@@ -329,3 +338,48 @@ void weightvg_update_vg(MDeformVert *dvert,
}
}
}
+
+/* Common vertex weight mask interface elements for the modifier panels.
+ */
+void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, uiLayout *layout)
+{
+ PointerRNA mask_texture_ptr = RNA_pointer_get(ptr, "mask_texture");
+ bool has_mask_texture = !RNA_pointer_is_null(&mask_texture_ptr);
+ bool has_mask_vertex_group = RNA_string_length(ptr, "mask_vertex_group") != 0;
+ int mask_tex_mapping = RNA_enum_get(ptr, "mask_tex_mapping");
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, ptr, "mask_constant", UI_ITEM_R_SLIDER, IFACE_("Global Influence:"), ICON_NONE);
+
+ if (!has_mask_texture) {
+ modifier_vgroup_ui(layout, ptr, ob_ptr, "mask_vertex_group", "invert_mask_vertex_group", NULL);
+ }
+
+ if (!has_mask_vertex_group) {
+ uiTemplateID(layout,
+ C,
+ ptr,
+ "mask_texture",
+ "texture.new",
+ NULL,
+ NULL,
+ 0,
+ ICON_NONE,
+ IFACE_("Mask Texture"));
+
+ if (has_mask_texture) {
+ uiItemR(layout, ptr, "mask_tex_use_channel", 0, IFACE_("Channel"), ICON_NONE);
+ uiItemR(layout, ptr, "mask_tex_mapping", 0, NULL, ICON_NONE);
+
+ if (mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ uiItemR(layout, ptr, "mask_tex_map_object", 0, IFACE_("Object"), ICON_NONE);
+ }
+ else if (mask_tex_mapping == MOD_DISP_MAP_UV && RNA_enum_get(ob_ptr, "type") == OB_MESH) {
+ PointerRNA obj_data_ptr = RNA_pointer_get(ob_ptr, "data");
+ uiItemPointerR(
+ layout, ptr, "mask_tex_uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h
index 50597d43112..725574dc0a5 100644
--- a/source/blender/modifiers/intern/MOD_weightvg_util.h
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.h
@@ -30,9 +30,11 @@ struct MDeformWeight;
struct Mesh;
struct ModifierEvalContext;
struct Object;
+struct PointerRNA;
struct RNG;
struct Scene;
struct Tex;
+struct uiLayout;
/*
* XXX I'd like to make modified weights visible in WeightPaint mode,
@@ -89,4 +91,5 @@ void weightvg_update_vg(struct MDeformVert *dvert,
const float rem_thresh,
const bool do_normalize);
+void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, uiLayout *layout);
#endif /* __MOD_WEIGHTVG_UTIL_H__ */
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
index 8ce1aaee942..9a9ab55a835 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -27,24 +27,35 @@
#include "BLI_listbase.h"
#include "BLI_rand.h"
+#include "BLT_translation.h"
+
#include "DNA_color_types.h" /* CurveMapping. */
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_lib_query.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
#include "BKE_texture.h" /* Texture masking. */
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "MOD_weightvg_util.h"
@@ -303,6 +314,91 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return mesh;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *sub, *col, *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemPointerR(col, &ptr, "vertex_group", &ob_ptr, "vertex_groups", NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "default_weight", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+
+ col = uiLayoutColumnWithHeading(layout, false, IFACE_("Group Add"));
+ row = uiLayoutRow(col, true);
+ uiLayoutSetPropDecorate(row, false);
+ sub = uiLayoutRow(row, true);
+ uiItemR(sub, &ptr, "use_add", 0, "", ICON_NONE);
+ sub = uiLayoutRow(sub, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_add"));
+ uiLayoutSetPropSep(sub, false);
+ uiItemR(sub, &ptr, "add_threshold", UI_ITEM_R_SLIDER, "Threshold", ICON_NONE);
+ uiItemDecoratorR(row, &ptr, "add_threshold", 0);
+
+ col = uiLayoutColumnWithHeading(layout, false, IFACE_("Group Remove"));
+ row = uiLayoutRow(col, true);
+ uiLayoutSetPropDecorate(row, false);
+ sub = uiLayoutRow(row, true);
+ uiItemR(sub, &ptr, "use_remove", 0, "", ICON_NONE);
+ sub = uiLayoutRow(sub, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_remove"));
+ uiLayoutSetPropSep(sub, false);
+ uiItemR(sub, &ptr, "remove_threshold", UI_ITEM_R_SLIDER, "Threshold", ICON_NONE);
+ uiItemDecoratorR(row, &ptr, "remove_threshold", 0);
+
+ uiItemR(layout, &ptr, "normalize", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void falloff_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "falloff_type", 0, IFACE_("Type"), ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetPropSep(sub, false);
+ uiItemR(row, &ptr, "invert_falloff", 0, "", ICON_ARROW_LEFTRIGHT);
+ if (RNA_enum_get(&ptr, "falloff_type") == MOD_WVG_MAPPING_CURVE) {
+ uiTemplateCurveMapping(layout, &ptr, "map_curve", 0, false, false, false, false);
+ }
+}
+
+static void influence_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ weightvg_ui_common(C, &ob_ptr, &ptr, layout);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_WeightVGEdit, panel_draw);
+ modifier_subpanel_register(
+ region_type, "falloff", "Falloff", NULL, falloff_panel_draw, panel_type);
+ modifier_subpanel_register(
+ region_type, "influence", "Influence", NULL, influence_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_WeightVGEdit = {
/* name */ "VertexWeightEdit",
/* structName */ "WeightVGEditModifierData",
@@ -333,4 +429,5 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
index a71b1d9d0e8..e089720b3e3 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -26,23 +26,34 @@
#include "BLI_listbase.h"
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_lib_query.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
#include "BKE_texture.h" /* Texture masking. */
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "MOD_weightvg_util.h"
@@ -449,6 +460,54 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return mesh;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group_a", "invert_vertex_group_a", NULL);
+ modifier_vgroup_ui(
+ layout, &ptr, &ob_ptr, "vertex_group_b", "invert_vertex_group_b", IFACE_("B"));
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "default_weight_a", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "default_weight_b", 0, IFACE_("B"), ICON_NONE);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "mix_set", 0, NULL, ICON_NONE);
+ uiItemR(layout, &ptr, "mix_mode", 0, NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "normalize", 0, NULL, ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void influence_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ weightvg_ui_common(C, &ob_ptr, &ptr, layout);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_WeightVGMix, panel_draw);
+ modifier_subpanel_register(
+ region_type, "influence", "Influence", NULL, influence_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_WeightVGMix = {
/* name */ "VertexWeightMix",
/* structName */ "WeightVGMixModifierData",
@@ -479,4 +538,5 @@ ModifierTypeInfo modifierType_WeightVGMix = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index e3f833ff81e..02d1f7a94aa 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -29,12 +29,16 @@
#include "BLI_rand.h"
#include "BLI_task.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_bvhutils.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
@@ -42,14 +46,21 @@
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
#include "BKE_texture.h" /* Texture masking. */
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "MOD_weightvg_util.h"
@@ -630,6 +641,65 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return mesh;
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row, *col, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemPointerR(layout, &ptr, "vertex_group", &ob_ptr, "vertex_groups", NULL, ICON_NONE);
+
+ uiItemR(layout, &ptr, "target", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "proximity_mode", 0, NULL, ICON_NONE);
+ if (RNA_enum_get(&ptr, "proximity_mode") == MOD_WVG_PROXIMITY_GEOMETRY) {
+ uiItemR(layout, &ptr, "proximity_geometry", UI_ITEM_R_EXPAND, IFACE_("Geometry"), ICON_NONE);
+ }
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "min_dist", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "max_dist", 0, NULL, ICON_NONE);
+
+ uiItemS(layout);
+
+ row = uiLayoutRow(layout, true);
+ uiItemR(row, &ptr, "falloff_type", 0, NULL, ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetPropSep(sub, false);
+ uiItemR(row, &ptr, "invert_falloff", 0, "", ICON_ARROW_LEFTRIGHT);
+ modifier_panel_end(layout, &ptr);
+
+ uiItemS(layout);
+
+ uiItemR(layout, &ptr, "normalize", 0, NULL, ICON_NONE);
+}
+
+static void influence_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ weightvg_ui_common(C, &ob_ptr, &ptr, layout);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_WeightVGProximity, panel_draw);
+ modifier_subpanel_register(
+ region_type, "influence", "Influence", NULL, influence_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_WeightVGProximity = {
/* name */ "VertexWeightProximity",
/* structName */ "WeightVGProximityModifierData",
@@ -660,4 +730,5 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
diff --git a/source/blender/modifiers/intern/MOD_weld.c b/source/blender/modifiers/intern/MOD_weld.c
index 3bef0ad6bf7..76ca85163d9 100644
--- a/source/blender/modifiers/intern/MOD_weld.c
+++ b/source/blender/modifiers/intern/MOD_weld.c
@@ -35,19 +35,30 @@
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
#include "BKE_bvhutils.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "DEG_depsgraph.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
//#define USE_WELD_DEBUG
//#define USE_WELD_NORMALS
@@ -1939,6 +1950,28 @@ static void requiredDataMask(Object *UNUSED(ob),
}
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "merge_threshold", 0, IFACE_("Distance"), ICON_NONE);
+ uiItemR(layout, &ptr, "max_interactions", 0, NULL, ICON_NONE);
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ modifier_panel_register(region_type, eModifierType_Weld, panel_draw);
+}
+
ModifierTypeInfo modifierType_Weld = {
/* name */ "Weld",
/* structName */ "WeldModifierData",
@@ -1970,6 +2003,7 @@ ModifierTypeInfo modifierType_Weld = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};
/** \} */
diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c
index 4e2e97a2b8b..66a03ee5d71 100644
--- a/source/blender/modifiers/intern/MOD_wireframe.c
+++ b/source/blender/modifiers/intern/MOD_wireframe.c
@@ -18,15 +18,28 @@
* \ingroup modifiers
*/
+#include <string.h>
+
#include "BLI_utildefines.h"
+#include "BLT_translation.h"
+
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
+#include "BKE_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
#include "MOD_modifiertypes.h"
+#include "MOD_ui_common.h"
#include "bmesh.h"
#include "tools/bmesh_wireframe.h"
@@ -104,6 +117,67 @@ static Mesh *modifyMesh(ModifierData *md, const struct ModifierEvalContext *ctx,
return WireframeModifier_do((WireframeModifierData *)md, ctx->object, mesh);
}
+static void panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *col, *row, *sub;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ uiLayoutSetPropSep(layout, true);
+
+ uiItemR(layout, &ptr, "thickness", 0, IFACE_("Thickness"), ICON_NONE);
+ uiItemR(layout, &ptr, "offset", 0, NULL, ICON_NONE);
+
+ col = uiLayoutColumn(layout, true);
+ uiItemR(col, &ptr, "use_boundary", 0, IFACE_("Boundary"), ICON_NONE);
+ uiItemR(col, &ptr, "use_replace", 0, IFACE_("Replace Original"), ICON_NONE);
+
+ col = uiLayoutColumnWithHeading(layout, true, IFACE_("Thickness"));
+ uiItemR(col, &ptr, "use_even_offset", 0, IFACE_("Even"), ICON_NONE);
+ uiItemR(col, &ptr, "use_relative_offset", 0, IFACE_("Relative"), ICON_NONE);
+
+ row = uiLayoutRowWithHeading(layout, true, IFACE_("Crease Edges"));
+ uiItemR(row, &ptr, "use_crease", 0, "", ICON_NONE);
+ sub = uiLayoutRow(row, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&ptr, "use_crease"));
+ uiItemR(sub, &ptr, "crease_weight", UI_ITEM_R_SLIDER, "", ICON_NONE);
+
+ uiItemR(layout, &ptr, "material_offset", 0, IFACE_("Material Offset"), ICON_NONE);
+
+ modifier_panel_end(layout, &ptr);
+}
+
+static void vertex_group_panel_draw(const bContext *C, Panel *panel)
+{
+ uiLayout *row;
+ uiLayout *layout = panel->layout;
+
+ PointerRNA ptr;
+ PointerRNA ob_ptr;
+ modifier_panel_get_property_pointers(C, panel, &ob_ptr, &ptr);
+
+ bool has_vertex_group = RNA_string_length(&ptr, "vertex_group") != 0;
+
+ uiLayoutSetPropSep(layout, true);
+
+ modifier_vgroup_ui(layout, &ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
+
+ row = uiLayoutRow(layout, true);
+ uiLayoutSetActive(row, has_vertex_group);
+ uiItemR(row, &ptr, "thickness_vertex_group", 0, IFACE_("Factor"), ICON_NONE);
+}
+
+static void panelRegister(ARegionType *region_type)
+{
+ PanelType *panel_type = modifier_panel_register(
+ region_type, eModifierType_Wireframe, panel_draw);
+ modifier_subpanel_register(
+ region_type, "vertex_group", "Vertex Group", NULL, vertex_group_panel_draw, panel_type);
+}
+
ModifierTypeInfo modifierType_Wireframe = {
/* name */ "Wireframe",
/* structName */ "WireframeModifierData",
@@ -133,4 +207,5 @@ ModifierTypeInfo modifierType_Wireframe = {
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
/* freeRuntimeData */ NULL,
+ /* panelRegister */ panelRegister,
};