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:
Diffstat (limited to 'release')
-rw-r--r--release/scripts/modules/bpy_extras/object_utils.py2
-rw-r--r--release/scripts/startup/bl_operators/clip.py4
-rw-r--r--release/scripts/startup/bl_operators/presets.py2
-rw-r--r--release/scripts/startup/bl_operators/rigidbody.py12
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py8
-rw-r--r--release/scripts/startup/bl_ui/properties_grease_pencil_common.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py449
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py200
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py328
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_rigidbody.py136
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py5
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py560
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py4
-rw-r--r--release/scripts/startup/bl_ui/space_node.py24
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py11
-rw-r--r--release/scripts/startup/bl_ui/space_topbar.py57
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py16
-rw-r--r--release/scripts/templates_py/batch_export.py8
-rw-r--r--release/scripts/templates_py/operator_modal_view3d_raycast.py2
22 files changed, 1235 insertions, 608 deletions
diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py
index 7719e2f6e30..fff73a4285a 100644
--- a/release/scripts/modules/bpy_extras/object_utils.py
+++ b/release/scripts/modules/bpy_extras/object_utils.py
@@ -166,7 +166,7 @@ def object_data_add(context, obdata, operator=None, name=None):
obj_act.select_set(action='SELECT')
scene.update() # apply location
- # scene.objects.active = obj_new
+ # layer.objects.active = obj_new
# Match up UV layers, this is needed so adding an object with UV's
# doesn't create new layers when there happens to be a naming mis-match.
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
index 2717a4f62a3..a94076ab61b 100644
--- a/release/scripts/startup/bl_operators/clip.py
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -238,7 +238,7 @@ class CLIP_OT_track_to_empty(Operator):
ob = bpy.data.objects.new(name=track.name, object_data=None)
ob.select_set(action='SELECT')
context.scene.objects.link(ob)
- context.scene.objects.active = ob
+ context.view_layer.objects.active = ob
for con in ob.constraints:
if con.type == 'FOLLOW_TRACK':
@@ -314,7 +314,7 @@ class CLIP_OT_bundles_to_mesh(Operator):
ob.matrix_world = matrix
context.scene.objects.link(ob)
ob.select = True
- context.scene.objects.active = ob
+ context.view_layer.objects.active = ob
else:
self.report({'WARNING'}, "No usable tracks selected")
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index 530194e5bb7..fe09fada297 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -257,7 +257,7 @@ class PresetMenu(Panel):
bl_space_type = 'PROPERTIES'
bl_region_type = 'HEADER'
bl_label = "Presets"
- path_menu: Menu.path_menu
+ path_menu = Menu.path_menu
@classmethod
def draw_panel_header(cls, layout):
diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py
index 36150a63895..6b76fb96b62 100644
--- a/release/scripts/startup/bl_operators/rigidbody.py
+++ b/release/scripts/startup/bl_operators/rigidbody.py
@@ -60,7 +60,7 @@ class CopyRigidbodySettings(Operator):
def execute(self, context):
obj_act = context.object
- scene = context.scene
+ view_layer = context.view_layer
# deselect all but mesh objects
for o in context.selected_objects:
@@ -68,9 +68,9 @@ class CopyRigidbodySettings(Operator):
o.select_set(action='DESELECT')
elif o.rigid_body is None:
# Add rigidbody to object!
- scene.objects.active = o
+ view_layer.objects.active = o
bpy.ops.rigidbody.object_add()
- scene.objects.active = obj_act
+ view_layer.objects.active = obj_act
objects = context.selected_objects
if objects:
@@ -265,7 +265,7 @@ class ConnectRigidBodies(Operator):
ob = bpy.data.objects.new("Constraint", object_data=None)
ob.location = loc
context.scene.objects.link(ob)
- context.scene.objects.active = ob
+ context.view_layer.objects.active = ob
ob.select_set(action='SELECT')
bpy.ops.rigidbody.constraint_add()
@@ -278,7 +278,7 @@ class ConnectRigidBodies(Operator):
con.object2 = object2
def execute(self, context):
- scene = context.scene
+ view_layer = context.view_layer
objects = context.selected_objects
obj_act = context.active_object
change = False
@@ -312,7 +312,7 @@ class ConnectRigidBodies(Operator):
bpy.ops.object.select_all(action='DESELECT')
for obj in objects:
obj.select_set(action='SELECT')
- scene.objects.active = obj_act
+ view_layer.objects.active = obj_act
return {'FINISHED'}
else:
self.report({'WARNING'}, "No other objects selected")
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index 95a3d18304b..b866fb1ce40 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -579,7 +579,7 @@ def unwrap(operator, context, **kwargs):
# define list of meshes
meshes = []
if PREF_ACT_ONLY:
- obj = context.scene.objects.active
+ obj = context.view_layer.objects.active
if obj and obj.type == 'MESH':
meshes = [obj.data]
else:
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index f66419a7f8e..cc0bde46189 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -88,7 +88,7 @@ class DATA_PT_lens(CameraButtonsPanel, Panel):
if cam.lens_unit == 'MILLIMETERS':
col.prop(cam, "lens")
elif cam.lens_unit == 'FOV':
- row.prop(cam, "angle")
+ col.prop(cam, "angle")
col.prop(cam, "lens_unit")
elif cam.type == 'ORTHO':
@@ -250,15 +250,10 @@ class DATA_PT_camera_dof_aperture(CameraButtonsPanel, Panel):
col.prop(dof_options, "rotation")
col.prop(dof_options, "ratio")
else:
- hq_support = dof_options.is_hq_supported
col = flow.column()
col.label("Viewport")
- sub = col.column()
- sub.active = hq_support
- sub.prop(dof_options, "use_high_quality")
col.prop(dof_options, "fstop")
- if dof_options.use_high_quality and hq_support:
- col.prop(dof_options, "blades")
+ col.prop(dof_options, "blades")
class DATA_PT_camera_background_image(CameraButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 214852cc826..f096ff83957 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -152,6 +152,7 @@ class DATA_PT_context_mesh(MeshButtonsPanel, Panel):
class DATA_PT_normals(MeshButtonsPanel, Panel):
bl_label = "Normals"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
@@ -239,6 +240,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel):
class DATA_PT_face_maps(MeshButtonsPanel, Panel):
bl_label = "Face Maps"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
@classmethod
@@ -450,13 +452,13 @@ classes = (
MESH_UL_shape_keys,
MESH_UL_uvmaps_vcols,
DATA_PT_context_mesh,
- DATA_PT_normals,
- DATA_PT_texture_space,
DATA_PT_vertex_groups,
- DATA_PT_face_maps,
DATA_PT_shape_keys,
DATA_PT_uv_texture,
DATA_PT_vertex_colors,
+ DATA_PT_face_maps,
+ DATA_PT_normals,
+ DATA_PT_texture_space,
DATA_PT_customdata,
DATA_PT_custom_props_mesh,
)
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index a2ccfb4f1b8..55b798d103a 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -728,7 +728,7 @@ class GPENCIL_MT_snap(Menu):
layout.operator("gpencil.snap_to_grid", text="Selection to Grid")
layout.operator("gpencil.snap_to_cursor", text="Selection to Cursor").use_offset = False
- layout.operator("gpencil.snap_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
+ layout.operator("gpencil.snap_to_cursor", text="Selection to Cursor (Keep Offset)").use_offset = True
layout.separator()
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index 9d891a07989..75b2d76d9c4 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -662,164 +662,336 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel):
if part.physics_type == 'FLUID':
fluid = part.fluid
- col.label(text="Fluid")
+ col.separator()
col.prop(fluid, "solver")
col.prop(fluid, "stiffness", text="Stiffness")
col.prop(fluid, "linear_viscosity", text="Viscosity")
col.prop(fluid, "buoyancy", text="Buoyancy", slider=True)
- col.label(text="Advanced")
+ elif part.physics_type == 'KEYED':
+
+ sub = col.column()
+ sub.active = not psys.use_keyed_timing
+ sub.prop(part, "keyed_loops", text="Loops")
+ if psys:
+ col.prop(psys, "use_keyed_timing", text="Use Timing")
+
+ col.label(text="Keys")
+
+
+class PARTICLE_PT_physics_fluid_advanced(ParticleButtonsPanel, Panel):
+ bl_label = "Advanced"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- if fluid.solver == 'DDR':
- sub = col.column()
- sub.prop(fluid, "repulsion", slider=fluid.factor_repulsion)
- sub.prop(fluid, "factor_repulsion")
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ fluid = part.fluid
+ if part.physics_type == 'FLUID':
+ return True
+ else:
+ return False
- sub.prop(fluid, "stiff_viscosity", slider=fluid.factor_stiff_viscosity)
- sub.prop(fluid, "factor_stiff_viscosity")
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ fluid = part.fluid
+
+ col = layout.column()
+
+ if fluid.solver == 'DDR':
sub = col.column()
- sub.prop(fluid, "fluid_radius", slider=fluid.factor_radius)
- sub.prop(fluid, "factor_radius")
+ sub.prop(fluid, "repulsion", slider=fluid.factor_repulsion)
+ sub.prop(fluid, "factor_repulsion")
- sub.prop(fluid, "rest_density", slider=fluid.use_factor_density)
- sub.prop(fluid, "use_factor_density")
+ sub.prop(fluid, "stiff_viscosity", slider=fluid.factor_stiff_viscosity)
+ sub.prop(fluid, "factor_stiff_viscosity")
- if fluid.solver == 'CLASSICAL':
- # With the classical solver, it is possible to calculate the
- # spacing between particles when the fluid is at rest. This
- # makes it easier to set stable initial conditions.
- particle_volume = part.mass / fluid.rest_density
- spacing = pow(particle_volume, 1.0 / 3.0)
+ sub = col.column()
+ sub.prop(fluid, "fluid_radius", slider=fluid.factor_radius)
+ sub.prop(fluid, "factor_radius")
- sub.label(text="Spacing: %g" % spacing)
+ sub.prop(fluid, "rest_density", slider=fluid.use_factor_density)
+ sub.prop(fluid, "use_factor_density")
- elif fluid.solver == 'DDR':
+ if fluid.solver == 'CLASSICAL':
+ # With the classical solver, it is possible to calculate the
+ # spacing between particles when the fluid is at rest. This
+ # makes it easier to set stable initial conditions.
+ particle_volume = part.mass / fluid.rest_density
+ spacing = pow(particle_volume, 1.0 / 3.0)
- col.label(text="Springs")
- col.prop(fluid, "spring_force", text="Force")
- col.prop(fluid, "use_viscoelastic_springs")
+ sub.label(text="Spacing: %g" % spacing)
- sub = col.column()
- sub.active = fluid.use_viscoelastic_springs
- sub.prop(fluid, "yield_ratio", slider=True)
- sub.prop(fluid, "plasticity", slider=True)
- col.label(text="Advanced")
- sub = col.column()
- sub.prop(fluid, "rest_length", slider=fluid.factor_rest_length)
- sub.prop(fluid, "factor_rest_length", text="")
+class PARTICLE_PT_physics_fluid_springs(ParticleButtonsPanel, Panel):
+ bl_label = "Springs"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- sub = col.column()
- sub.active = fluid.use_viscoelastic_springs
- sub.prop(fluid, "use_initial_rest_length")
- sub.prop(fluid, "spring_frames", text="Frames")
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ fluid = part.fluid
+ if part.physics_type == 'FLUID' and fluid.solver == 'DDR':
+ return True
+ else:
+ return False
- elif part.physics_type == 'KEYED':
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
- sub = col.column()
- sub.active = not psys.use_keyed_timing
- sub.prop(part, "keyed_loops", text="Loops")
- if psys:
- col.prop(psys, "use_keyed_timing", text="Use Timing")
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ fluid = part.fluid
- col.label(text="Keys")
+ col = layout.column()
- elif part.physics_type == 'BOIDS':
- boids = part.boids
+ col.prop(fluid, "spring_force", text="Force")
- row = layout.row()
- row.prop(boids, "use_flight")
- row.prop(boids, "use_land")
- row.prop(boids, "use_climb")
-
- split = layout.split()
-
- col = split.column(align=True)
- col.active = boids.use_flight
- col.prop(boids, "air_speed_max")
- col.prop(boids, "air_speed_min", slider=True)
- col.prop(boids, "air_acc_max", slider=True)
- col.prop(boids, "air_ave_max", slider=True)
- col.prop(boids, "air_personal_space")
- row = col.row(align=True)
- row.active = (boids.use_land or boids.use_climb) and boids.use_flight
- row.prop(boids, "land_smooth")
-
- col = split.column(align=True)
- col.active = boids.use_land or boids.use_climb
- col.prop(boids, "land_speed_max")
- col.prop(boids, "land_jump_speed")
- col.prop(boids, "land_acc_max", slider=True)
- col.prop(boids, "land_ave_max", slider=True)
- col.prop(boids, "land_personal_space")
- col.prop(boids, "land_stick_force")
-
- layout.prop(part, "collision_group")
-
- split = layout.split()
-
- col = split.column(align=True)
- col.label(text="Battle:")
- col.prop(boids, "health")
- col.prop(boids, "strength")
- col.prop(boids, "aggression")
- col.prop(boids, "accuracy")
- col.prop(boids, "range")
- col = split.column()
- col.label(text="Misc:")
- col.prop(boids, "bank", slider=True)
- col.prop(boids, "pitch", slider=True)
- col.prop(boids, "height", slider=True)
-
- if psys and part.physics_type in {'KEYED', 'BOIDS', 'FLUID'}:
- if part.physics_type == 'BOIDS':
- layout.label(text="Relations:")
+class PARTICLE_PT_physics_fluid_springs_viscoelastic(ParticleButtonsPanel, Panel):
+ bl_label = "Viscoelastic Springs"
+ bl_parent_id = "PARTICLE_PT_physics_fluid_springs"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ fluid = part.fluid
+ if part.physics_type == 'FLUID' and fluid.solver == 'DDR':
+ return True
+ else:
+ return False
+
+ def draw_header(self, context):
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ fluid = part.fluid
+
+ self.layout.prop(fluid, "use_viscoelastic_springs", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ fluid = part.fluid
+
+ col = layout.column()
+ col.active = fluid.use_viscoelastic_springs
+ col.prop(fluid, "yield_ratio", slider=True)
+ col.prop(fluid, "plasticity", slider=True)
+
+ col.separator()
+
+ col.prop(fluid, "use_initial_rest_length")
+ col.prop(fluid, "spring_frames", text="Frames")
+
+
+class PARTICLE_PT_physics_fluid_springs_advanced(ParticleButtonsPanel, Panel):
+ bl_label = "Advanced"
+ bl_parent_id = "PARTICLE_PT_physics_fluid_springs"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ fluid = part.fluid
+ if part.physics_type == 'FLUID' and fluid.solver == 'DDR':
+ return True
+ else:
+ return False
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ fluid = part.fluid
+
+ sub = layout.column()
+ sub.prop(fluid, "rest_length", slider=fluid.factor_rest_length)
+ sub.prop(fluid, "factor_rest_length")
+
+
+class PARTICLE_PT_physics_boids_movement(ParticleButtonsPanel, Panel):
+ bl_label = "Movement"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ return part.physics_type in {'BOIDS'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ boids = part.boids
+
+ col=layout.column()
+
+ col.prop(boids, "use_flight")
+ col.prop(boids, "use_land")
+ col.prop(boids, "use_climb")
+
+ col=layout.column()
+
+ col.active = boids.use_flight
+ sub = col.column()
+ sub.prop(boids, "air_speed_max")
+ sub.prop(boids, "air_speed_min", slider=True)
+ col.prop(boids, "air_acc_max", slider=True)
+ col.prop(boids, "air_ave_max", slider=True)
+ col.prop(boids, "air_personal_space")
+ row = col.row(align=True)
+ row.active = (boids.use_land or boids.use_climb) and boids.use_flight
+ row.prop(boids, "land_smooth")
+
+ layout.separator()
+
+ col=layout.column()
+ col.active = boids.use_land or boids.use_climb
+ col.prop(boids, "land_speed_max")
+ col.prop(boids, "land_jump_speed")
+ col.prop(boids, "land_acc_max", slider=True)
+ col.prop(boids, "land_ave_max", slider=True)
+ col.prop(boids, "land_personal_space")
+ col.prop(boids, "land_stick_force")
+
+ layout.separator()
+
+ layout.prop(part, "collision_group")
+
+class PARTICLE_PT_physics_boids_battle(ParticleButtonsPanel, Panel):
+ bl_label = "Battle"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ return part.physics_type in {'BOIDS'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ boids = part.boids
+
+ col=layout.column()
+
+ col.prop(boids, "health")
+ col.prop(boids, "strength")
+ col.prop(boids, "aggression")
+ col.prop(boids, "accuracy")
+ col.prop(boids, "range")
+
+class PARTICLE_PT_physics_boids_misc(ParticleButtonsPanel, Panel):
+ bl_label = "Misc"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ return part.physics_type in {'BOIDS'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+ boids = part.boids
+
+ col=layout.column()
+
+ col.prop(boids, "bank", slider=True)
+ col.prop(boids, "pitch", slider=True)
+ col.prop(boids, "height", slider=True)
+
+
+class PARTICLE_PT_physics_relations(ParticleButtonsPanel, Panel):
+ bl_label = "Relations"
+ bl_parent_id = "PARTICLE_PT_physics"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ part = particle_get_settings(context)
+ return part.physics_type in {'KEYED', 'BOIDS', 'FLUID'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ psys = context.particle_system
+ part = particle_get_settings(context)
+
+
+ row = layout.row()
+ row.template_list("UI_UL_list", "particle_targets", psys, "targets",
+ psys, "active_particle_target_index", rows=4)
+
+ col = row.column()
+ sub = col.row()
+ subsub = sub.column(align=True)
+ subsub.operator("particle.new_target", icon='ZOOMIN', text="")
+ subsub.operator("particle.target_remove", icon='ZOOMOUT', text="")
+ sub = col.row()
+ subsub = sub.column(align=True)
+ subsub.operator("particle.target_move_up", icon='TRIA_UP', text="")
+ subsub.operator("particle.target_move_down", icon='TRIA_DOWN', text="")
+
+ key = psys.active_particle_target
+
+ if key:
+ if part.physics_type == 'KEYED':
+ col = layout.column()
+ # doesn't work yet
+ #col.alert = key.valid
+ col.prop(key, "object")
+ col.prop(key, "system", text="System")
+
+ col.active = psys.use_keyed_timing
+ col.prop(key, "time")
+ col.prop(key, "duration")
+ elif part.physics_type == 'BOIDS':
+ sub = layout.column()
+ # doesn't work yet
+ #sub.alert = key.valid
+ sub.prop(key, "object")
+ sub.prop(key, "system", text="System")
+ layout.prop(key, "alliance")
elif part.physics_type == 'FLUID':
- layout.label(text="Fluid Interaction:")
+ sub = layout.column()
+ # doesn't work yet
+ #sub.alert = key.valid
+ sub.prop(key, "object")
+ sub.prop(key, "system", text="System")
- row = layout.row()
- row.template_list("UI_UL_list", "particle_targets", psys, "targets",
- psys, "active_particle_target_index", rows=4)
-
- col = row.column()
- sub = col.row()
- subsub = sub.column(align=True)
- subsub.operator("particle.new_target", icon='ZOOMIN', text="")
- subsub.operator("particle.target_remove", icon='ZOOMOUT', text="")
- sub = col.row()
- subsub = sub.column(align=True)
- subsub.operator("particle.target_move_up", icon='TRIA_UP', text="")
- subsub.operator("particle.target_move_down", icon='TRIA_DOWN', text="")
-
- key = psys.active_particle_target
- if key:
- row = layout.row()
- if part.physics_type == 'KEYED':
- col = row.column()
- # doesn't work yet
- #col.alert = key.valid
- col.prop(key, "object", text="")
- col.prop(key, "system", text="System")
- col = row.column()
- col.active = psys.use_keyed_timing
- col.prop(key, "time")
- col.prop(key, "duration")
- elif part.physics_type == 'BOIDS':
- sub = row.row()
- # doesn't work yet
- #sub.alert = key.valid
- sub.prop(key, "object", text="")
- sub.prop(key, "system", text="System")
-
- layout.row().prop(key, "alliance", expand=True)
- elif part.physics_type == 'FLUID':
- sub = row.row()
- # doesn't work yet
- #sub.alert = key.valid
- sub.prop(key, "object", text="")
- sub.prop(key, "system", text="System")
class PARTICLE_PT_physics_deflection(ParticleButtonsPanel, Panel):
@@ -911,6 +1083,9 @@ class PARTICLE_PT_physics_integration(ParticleButtonsPanel, Panel):
class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
bl_label = "Boid Brain"
+ bl_options = {'DEFAULT_CLOSED'}
+ bl_parent_id = "PARTICLE_PT_physics"
+
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
@classmethod
@@ -1941,9 +2116,17 @@ classes = (
PARTICLE_PT_rotation,
PARTICLE_PT_rotation_angular_velocity,
PARTICLE_PT_physics,
+ PARTICLE_PT_physics_fluid_springs,
+ PARTICLE_PT_physics_fluid_springs_viscoelastic,
+ PARTICLE_PT_physics_fluid_springs_advanced,
+ PARTICLE_PT_physics_fluid_advanced,
+ PARTICLE_PT_physics_boids_movement,
+ PARTICLE_PT_physics_boids_battle,
+ PARTICLE_PT_physics_boids_misc,
PARTICLE_PT_physics_forces,
PARTICLE_PT_physics_deflection,
PARTICLE_PT_physics_integration,
+ PARTICLE_PT_physics_relations,
PARTICLE_PT_boidbrain,
PARTICLE_PT_render,
PARTICLE_PT_render_line,
diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index 7775722784b..0a7318864a3 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -17,8 +17,11 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
+
import bpy
-from bpy.types import Menu, Panel
+from bpy.types import (
+ Panel,
+)
from bl_operators.presets import PresetMenu
from .properties_physics_common import (
@@ -58,6 +61,7 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
md = context.cloth
ob = context.object
@@ -65,64 +69,82 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
layout.active = cloth_panel_enabled(md)
- split = layout.split(percentage=0.25)
-
- split.label(text="Quality:")
- split.prop(cloth, "quality", text="Steps")
-
- split = layout.split(percentage=0.25)
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
- split.label(text="Speed:")
- split.prop(cloth, "time_scale", text="Multiplier")
+ col = flow.column()
+ col.prop(cloth, "quality", text="Quality Steps")
+ col.prop(cloth, "time_scale", text="Speed Multiplier")
- split = layout.split()
+ col.separator()
- col = split.column()
-
- col.label(text="Material:")
- col.prop(cloth, "mass")
+ col = flow.column()
+ col.prop(cloth, "mass", text="Material Mass")
col.prop(cloth, "structural_stiffness", text="Structural")
col.prop(cloth, "bending_stiffness", text="Bending")
- col = split.column()
+ col.separator()
- col.label(text="Damping:")
- col.prop(cloth, "spring_damping", text="Spring")
+ col = flow.column()
+ col.prop(cloth, "spring_damping", text="Damping Spring")
col.prop(cloth, "air_damping", text="Air")
col.prop(cloth, "vel_damping", text="Velocity")
- split = layout.split()
+ col = flow.column()
+ col.prop(cloth, "use_dynamic_mesh", text="Dynamic Mesh")
- col = split.column()
+ key = ob.data.shape_keys
- col.prop(cloth, "use_pin_cloth", text="Pinning:")
- sub = col.column()
- sub.active = cloth.use_pin_cloth
- sub.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="")
- sub.prop(cloth, "pin_stiffness", text="Stiffness")
+ if key:
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.active = not cloth.use_dynamic_mesh
+ row.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="Rest Shape Key")
+ row.label(text="", icon='BLANK1')
- # Disabled for now
- """
- if cloth.vertex_group_mass:
- layout.label(text="Goal:")
- col = layout.column_flow()
- col.prop(cloth, "goal_default", text="Default")
- col.prop(cloth, "goal_spring", text="Stiffness")
- col.prop(cloth, "goal_friction", text="Friction")
- """
+class PHYSICS_PT_cloth_pinning(PhysicButtonsPanel, Panel):
+ bl_label = "Pinning"
+ bl_parent_id = 'PHYSICS_PT_cloth'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- col = split.column()
+ def draw_header(self, context):
+ md = context.cloth
+ cloth = md.settings
- col.prop(cloth, "use_dynamic_mesh", text="Dynamic Mesh")
+ self.layout.active = cloth_panel_enabled(md) and cloth.use_pin_cloth
+ self.layout.prop(cloth, "use_pin_cloth", text="")
- key = ob.data.shape_keys
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
- if key:
- sub = col.column()
- sub.active = not cloth.use_dynamic_mesh
- sub.label(text="Rest Shape Key:")
- sub.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
+ md = context.cloth
+ ob = context.object
+ cloth = md.settings
+
+ layout.active = cloth_panel_enabled(md) and cloth.use_pin_cloth
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ col = flow.column()
+
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="Mass Group")
+ row.label(text="", icon='BLANK1')
+
+ col = flow.column()
+ col.prop(cloth, "pin_stiffness", text="Stiffness")
+
+ # Disabled for now.
+ """
+ if cloth.vertex_group_mass:
+ col = flow.column()
+ col.prop(cloth, "goal_default", text="Goal Default")
+ col.prop(cloth, "goal_spring", text="Stiffness")
+ col.prop(cloth, "goal_friction", text="Friction")
+ """
class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
@@ -150,31 +172,59 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
cloth = context.cloth.collision_settings
md = context.cloth
- ob = context.object
layout.active = cloth.use_collision and cloth_panel_enabled(md)
- split = layout.split()
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
- col = split.column()
+ col = flow.column()
col.prop(cloth, "collision_quality", text="Quality")
col.prop(cloth, "distance_min", slider=True, text="Distance")
col.prop(cloth, "repel_force", slider=True, text="Repel")
+
+ col = flow.column()
col.prop(cloth, "distance_repel", slider=True, text="Repel Distance")
col.prop(cloth, "friction")
+ col.prop(cloth, "group")
- col = split.column()
- col.prop(cloth, "use_self_collision", text="Self Collision")
- sub = col.column()
- sub.active = cloth.use_self_collision
- sub.prop(cloth, "self_collision_quality", text="Quality")
- sub.prop(cloth, "self_distance_min", slider=True, text="Distance")
- sub.prop_search(cloth, "vertex_group_self_collisions", ob, "vertex_groups", text="")
- layout.prop(cloth, "group")
+class PHYSICS_PT_cloth_self_collision(PhysicButtonsPanel, Panel):
+ bl_label = "Self Collision"
+ bl_parent_id = 'PHYSICS_PT_cloth_collision'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ cloth = context.cloth.collision_settings
+
+ self.layout.active = cloth_panel_enabled(context.cloth) and cloth.use_self_collision
+ self.layout.prop(cloth, "use_self_collision", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ cloth = context.cloth.collision_settings
+ md = context.cloth
+ ob = context.object
+
+ layout.active = cloth.use_collision and cloth_panel_enabled(md) and cloth.use_self_collision
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ col = flow.column()
+ col.prop(cloth, "self_collision_quality", text="Quality")
+ col.prop(cloth, "self_distance_min", slider=True, text="Distance")
+
+ col = flow.column()
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.prop_search(cloth, "vertex_group_self_collisions", ob, "vertex_groups", text="Vertex Group")
+ row.label(text="", icon='BLANK1')
class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
@@ -191,6 +241,7 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
md = context.cloth
ob = context.object
@@ -198,16 +249,27 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
layout.active = (cloth.use_stiffness_scale and cloth_panel_enabled(md))
- split = layout.split()
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
- col = split.column()
- col.label(text="Structural Stiffness:")
- col.prop_search(cloth, "vertex_group_structural_stiffness", ob, "vertex_groups", text="")
+ col = flow.column()
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.prop_search(
+ cloth, "vertex_group_structural_stiffness", ob, "vertex_groups",
+ text="Structural Group"
+ )
+ row.label(text="", icon='BLANK1')
col.prop(cloth, "structural_stiffness_max", text="Max")
- col = split.column()
- col.label(text="Bending Stiffness:")
- col.prop_search(cloth, "vertex_group_bending", ob, "vertex_groups", text="")
+ col.separator()
+
+ col = flow.column()
+ row = col.row(align=True)
+ row.prop_search(
+ cloth, "vertex_group_bending", ob, "vertex_groups",
+ text="Bending Group"
+ )
+ row.label(text="", icon='BLANK1')
col.prop(cloth, "bending_stiffness_max", text="Max")
@@ -225,23 +287,27 @@ class PHYSICS_PT_cloth_sewing(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
md = context.cloth
ob = context.object
cloth = context.cloth.settings
layout.active = (cloth.use_sewing_springs and cloth_panel_enabled(md))
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
- layout.prop(cloth, "sewing_force_max", text="Sewing Force")
+ col = flow.column()
+ col.prop(cloth, "sewing_force_max", text="Sewing Force")
- split = layout.split()
+ col.separator()
- col = split.column(align=True)
- col.label(text="Shrinking:")
- col.prop_search(cloth, "vertex_group_shrink", ob, "vertex_groups", text="")
+ col = col.column()
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.prop_search(cloth, "vertex_group_shrink", ob, "vertex_groups", text="Shrinking Group")
+ row.label(text="", icon='BLANK1')
- col = split.column(align=True)
- col.label()
+ col = flow.column(align=True)
col.prop(cloth, "shrink_min", text="Min")
col.prop(cloth, "shrink_max", text="Max")
@@ -262,6 +328,8 @@ classes = (
PHYSICS_PT_cloth,
PHYSICS_PT_cloth_cache,
PHYSICS_PT_cloth_collision,
+ PHYSICS_PT_cloth_self_collision,
+ PHYSICS_PT_cloth_pinning,
PHYSICS_PT_cloth_stiffness,
PHYSICS_PT_cloth_sewing,
PHYSICS_PT_cloth_field_weights,
diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
index 611f477a31b..44d07ff53e6 100644
--- a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
@@ -87,24 +87,22 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
+ layout.use_property_split = True
+
if surface:
layout.prop(surface, "surface_format")
col = layout.column()
if surface.surface_format != 'VERTEX':
- col.label(text="Quality:")
col.prop(surface, "image_resolution")
col.prop(surface, "use_antialiasing")
- col = layout.column()
- col.label(text="Frames:")
- split = col.split()
- col = split.column(align=True)
- col.prop(surface, "frame_start", text="Start")
- col.prop(surface, "frame_end", text="End")
+ sub = col.column(align=True)
+ sub.prop(surface, "frame_start", text="Frame Start")
+ sub.prop(surface, "frame_end", text="End")
- split.prop(surface, "frame_substeps")
+ col.prop(surface, "frame_substeps")
elif md.ui_type == 'BRUSH':
brush = md.brush_settings
@@ -114,16 +112,14 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
else:
layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
- split = layout.split()
+ layout.use_property_split = True
- col = split.column()
+ col = layout.column()
+ col.prop(brush, "paint_color")
+ col.prop(brush, "paint_alpha", text="Alpha", slider=True)
+ col.prop(brush, "paint_wetness", text="Wetness", slider=True)
col.prop(brush, "use_absolute_alpha")
col.prop(brush, "use_paint_erase")
- col.prop(brush, "paint_wetness", text="Wetness")
-
- col = split.column()
- col.prop(brush, "paint_color", text="")
- col.prop(brush, "paint_alpha", text="Alpha")
class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, Panel):
@@ -141,65 +137,113 @@ class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, Panel):
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
-
surface_type = surface.surface_type
+ layout.use_property_split = True
+
layout.prop(surface, "surface_type")
+
layout.separator()
- # dissolve
- if surface_type == 'PAINT':
- split = layout.split(percentage=0.35)
- split.prop(surface, "use_drying", text="Dry:")
-
- col = split.column()
- col.active = surface.use_drying
- split = col.split(percentage=0.7)
- col = split.column(align=True)
- col.prop(surface, "dry_speed", text="Time")
- col.prop(surface, "color_dry_threshold")
- split.prop(surface, "use_dry_log", text="Slow")
-
- if surface_type != 'WAVE':
- split = layout.split(percentage=0.35)
- col = split.column()
- if surface_type == 'WEIGHT':
- col.prop(surface, "use_dissolve", text="Fade:")
- else:
- col.prop(surface, "use_dissolve", text="Dissolve:")
- col = split.column()
- col.active = surface.use_dissolve
- split = col.split(percentage=0.7)
- split.prop(surface, "dissolve_speed", text="Time")
- split.prop(surface, "use_dissolve_log", text="Slow")
+ col = layout.column()
# per type settings
if surface_type == 'DISPLACE':
- layout.prop(surface, "use_incremental_displace")
+ col.prop(surface, "use_incremental_displace")
if surface.surface_format == 'VERTEX':
- row = layout.row()
- row.prop(surface, "depth_clamp")
- row.prop(surface, "displace_factor")
-
- elif surface_type == 'WAVE':
- layout.prop(surface, "use_wave_open_border")
+ col.prop(surface, "depth_clamp")
+ col.prop(surface, "displace_factor")
- split = layout.split()
+ col.separator()
- col = split.column(align=True)
+ elif surface_type == 'WAVE':
+ col.prop(surface, "use_wave_open_border")
col.prop(surface, "wave_timescale")
col.prop(surface, "wave_speed")
-
- col = split.column(align=True)
col.prop(surface, "wave_damping")
col.prop(surface, "wave_spring")
col.prop(surface, "wave_smoothness")
- layout.separator()
- layout.prop(surface, "brush_group")
- row = layout.row()
- row.prop(surface, "brush_influence_scale")
- row.prop(surface, "brush_radius_scale")
+ col.separator()
+
+ col.prop(surface, "brush_group")
+ col.prop(surface, "brush_influence_scale")
+ col.prop(surface, "brush_radius_scale")
+
+
+class PHYSICS_PT_dp_advanced_canvas_paint_dry(PhysicButtonsPanel, Panel):
+ bl_label = "Dry"
+ bl_parent_id = "PHYSICS_PT_dp_advanced_canvas"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ surface_type = surface.surface_type
+
+ return md and md.ui_type == 'CANVAS' and md.canvas_settings and md.canvas_settings.canvas_surfaces.active and surface_type == 'PAINT' and context.engine in cls.COMPAT_ENGINES
+
+ def draw_header(self, context):
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ self.layout.prop(surface, "use_drying", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ surface_type = surface.surface_type
+
+ layout.use_property_split = True
+
+ layout.active = surface.use_drying
+
+ col = layout.column()
+ col.prop(surface, "dry_speed", text="Time")
+ col.prop(surface, "color_dry_threshold")
+ col.prop(surface, "use_dry_log", text="Slow")
+
+
+class PHYSICS_PT_dp_advanced_canvas_paint_dissolve(PhysicButtonsPanel, Panel):
+ bl_label = "Dissolve"
+ bl_parent_id = "PHYSICS_PT_dp_advanced_canvas"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ surface_type = surface.surface_type
+
+ return md and md.ui_type == 'CANVAS' and md.canvas_settings and md.canvas_settings.canvas_surfaces.active and surface_type != 'WAVE' and context.engine in cls.COMPAT_ENGINES
+
+ def draw_header(self, context):
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ self.layout.prop(surface, "use_dissolve", text="")
+
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ surface_type = surface.surface_type
+
+ layout.use_property_split = True
+
+ layout.active = surface.use_dissolve
+
+ col = layout.column()
+
+ col.prop(surface, "dissolve_speed", text="Time")
+ col.prop(surface, "use_dissolve_log", text="Slow")
class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
@@ -220,6 +264,7 @@ class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
@@ -317,6 +362,8 @@ class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, Panel):
surface = canvas.canvas_surfaces.active
ob = context.object
+ layout.use_property_split = True
+
layout.prop(surface, "init_color_type", expand=False)
if surface.init_color_type != 'NONE':
layout.separator()
@@ -350,37 +397,86 @@ class PHYSICS_PT_dp_effects(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+
+
+class PHYSICS_PT_dp_effects_spread(PhysicButtonsPanel, Panel):
+ bl_label = "Spread"
+ bl_parent_id = "PHYSICS_PT_dp_effects"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
- layout.row().prop(surface, "effect_ui", expand=True)
+ self.layout.prop(surface, "use_spread", text="")
- if surface.effect_ui == 'SPREAD':
- layout.prop(surface, "use_spread")
+ def draw(self, context):
+ layout = self.layout
- row = layout.row()
- row.active = surface.use_spread
- row.prop(surface, "spread_speed")
- row.prop(surface, "color_spread_speed")
+ layout.use_property_split = True
- elif surface.effect_ui == 'DRIP':
- layout.prop(surface, "use_drip")
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ layout.active = surface.use_spread
- col = layout.column()
- col.active = surface.use_drip
- effector_weights_ui(self, context, surface.effector_weights, 'DYNAMIC_PAINT')
+ col = layout.column()
- layout.label(text="Surface Movement:")
- row = layout.row()
- row.prop(surface, "drip_velocity", slider=True)
- row.prop(surface, "drip_acceleration", slider=True)
+ col.prop(surface, "spread_speed")
+ col.prop(surface, "color_spread_speed")
- elif surface.effect_ui == 'SHRINK':
- layout.prop(surface, "use_shrink")
- row = layout.row()
- row.active = surface.use_shrink
- row.prop(surface, "shrink_speed")
+class PHYSICS_PT_dp_effects_drip(PhysicButtonsPanel, Panel):
+ bl_label = "Drip"
+ bl_parent_id = "PHYSICS_PT_dp_effects"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+
+ self.layout.prop(surface, "use_drip", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+
+ layout.active = surface.use_drip
+
+ col = layout.column()
+ col.prop(surface, "drip_velocity", slider=True)
+ col.prop(surface, "drip_acceleration", slider=True)
+
+ col.separator()
+
+ effector_weights_ui(self, context, surface.effector_weights, 'DYNAMIC_PAINT')
+
+class PHYSICS_PT_dp_effects_shrink(PhysicButtonsPanel, Panel):
+ bl_label = "Shrink"
+ bl_parent_id = "PHYSICS_PT_dp_effects"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+
+ self.layout.prop(surface, "use_shrink", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.use_property_split = True
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ layout.active = surface.use_shrink
+
+ layout.prop(surface, "shrink_speed")
class PHYSICS_PT_dp_cache(PhysicButtonsPanel, Panel):
@@ -418,6 +514,7 @@ class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
brush = context.dynamic_paint.brush_settings
ob = context.object
@@ -427,7 +524,7 @@ class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
col.prop(brush, "paint_source")
if brush.paint_source == 'PARTICLE_SYSTEM':
- col.prop_search(brush, "particle_system", ob, "particle_systems", text="")
+ col.prop_search(brush, "particle_system", ob, "particle_systems")
if brush.particle_system:
col.label(text="Particle Effect:")
sub = col.column()
@@ -438,22 +535,19 @@ class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE', 'POINT'}:
col.prop(brush, "paint_distance", text="Paint Distance")
- split = layout.row().split(percentage=0.4)
- sub = split.column()
+
if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE'}:
- sub.prop(brush, "use_proximity_project")
+ col.prop(brush, "use_proximity_project")
if brush.paint_source == 'VOLUME_DISTANCE':
- sub.prop(brush, "invert_proximity")
- sub.prop(brush, "use_negative_volume")
-
- sub = split.column()
+ col.prop(brush, "invert_proximity")
+ col.prop(brush, "use_negative_volume")
if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE'}:
- column = sub.column()
- column.active = brush.use_proximity_project
- column.prop(brush, "ray_direction")
- sub.prop(brush, "proximity_falloff")
+ sub = col.column()
+ sub.active = brush.use_proximity_project
+ sub.prop(brush, "ray_direction")
+ col.prop(brush, "proximity_falloff")
if brush.proximity_falloff == 'RAMP':
- col = layout.row().column()
+
col.separator()
col.prop(brush, "use_proximity_ramp_alpha", text="Only Use Alpha")
col.template_color_ramp(brush, "paint_ramp", expand=True)
@@ -472,28 +566,45 @@ class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
brush = context.dynamic_paint.brush_settings
- split = layout.split()
-
- col = split.column()
+ col = layout.column()
col.prop(brush, "use_velocity_alpha")
col.prop(brush, "use_velocity_color")
-
- split.prop(brush, "use_velocity_depth")
+ col.prop(brush, "use_velocity_depth")
col = layout.column()
col.active = (brush.use_velocity_alpha or brush.use_velocity_color or brush.use_velocity_depth)
col.prop(brush, "velocity_max")
col.template_color_ramp(brush, "velocity_ramp", expand=True)
- layout.separator()
- row = layout.row()
- row.prop(brush, "use_smudge")
- sub = row.row()
- sub.active = brush.use_smudge
- sub.prop(brush, "smudge_strength")
+
+class PHYSICS_PT_dp_brush_velocity_smudge(PhysicButtonsPanel, Panel):
+ bl_label = "Smudge"
+ bl_parent_id = "PHYSICS_PT_dp_brush_velocity"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return md and md.ui_type == 'BRUSH' and md.brush_settings and (context.engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ brush = context.dynamic_paint.brush_settings
+
+ self.layout.prop(brush, "use_smudge", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ brush = context.dynamic_paint.brush_settings
+
+ layout.active = brush.use_smudge
+ layout.prop(brush, "smudge_strength", slider=True)
class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
@@ -509,26 +620,33 @@ class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
brush = context.dynamic_paint.brush_settings
layout.prop(brush, "wave_type")
if brush.wave_type != 'REFLECT':
- row = layout.row()
- row.prop(brush, "wave_factor")
- row.prop(brush, "wave_clamp")
+ col = layout.column()
+ col.prop(brush, "wave_factor")
+ col.prop(brush, "wave_clamp")
classes = (
PHYSICS_UL_dynapaint_surfaces,
PHYSICS_PT_dynamic_paint,
PHYSICS_PT_dp_advanced_canvas,
+ PHYSICS_PT_dp_advanced_canvas_paint_dry,
+ PHYSICS_PT_dp_advanced_canvas_paint_dissolve,
PHYSICS_PT_dp_canvas_output,
PHYSICS_PT_dp_canvas_initial_color,
PHYSICS_PT_dp_effects,
+ PHYSICS_PT_dp_effects_spread,
+ PHYSICS_PT_dp_effects_drip,
+ PHYSICS_PT_dp_effects_shrink,
PHYSICS_PT_dp_cache,
PHYSICS_PT_dp_brush_source,
PHYSICS_PT_dp_brush_velocity,
+ PHYSICS_PT_dp_brush_velocity_smudge,
PHYSICS_PT_dp_brush_wave,
)
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
index 013822793de..00733e2fb12 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py
@@ -39,20 +39,23 @@ class PHYSICS_PT_rigid_body(PHYSICS_PT_rigidbody_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
ob = context.object
rbo = ob.rigid_body
if rbo is not None:
layout.prop(rbo, "type", text="Type")
- row = layout.row()
- if rbo.type == 'ACTIVE':
- row.prop(rbo, "enabled", text="Dynamic")
- row.prop(rbo, "kinematic", text="Animated")
if rbo.type == 'ACTIVE':
layout.prop(rbo, "mass")
+ col = layout.column()
+ if rbo.type == 'ACTIVE':
+ col.prop(rbo, "enabled", text="Dynamic")
+ col.prop(rbo, "kinematic", text="Animated")
+
+
class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel):
bl_label = "Collisions"
@@ -70,6 +73,7 @@ class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel):
ob = context.object
rbo = ob.rigid_body
+ layout.use_property_split = True
layout.prop(rbo, "collision_shape", text="Shape")
@@ -79,15 +83,51 @@ class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel):
if rbo.collision_shape == 'MESH' and rbo.mesh_source == 'DEFORM':
layout.prop(rbo, "use_deform", text="Deforming")
- split = layout.split()
- col = split.column()
- col.label(text="Surface Response:")
+class PHYSICS_PT_rigid_body_collisions_surface(PHYSICS_PT_rigidbody_panel, Panel):
+ bl_label = "Surface Response"
+ bl_parent_id = 'PHYSICS_PT_rigid_body_collisions'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.object
+ return (obj and obj.rigid_body and
+ (context.engine in cls.COMPAT_ENGINES))
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+ rbo = ob.rigid_body
+ layout.use_property_split = True
+
+ col = layout.column()
col.prop(rbo, "friction")
col.prop(rbo, "restitution", text="Bounciness")
- col = split.column()
- col.label(text="Sensitivity:")
+class PHYSICS_PT_rigid_body_collisions_sensitivity(PHYSICS_PT_rigidbody_panel, Panel):
+ bl_label = "Sensitivity"
+ bl_parent_id = 'PHYSICS_PT_rigid_body_collisions'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.object
+ return (obj and obj.rigid_body and
+ (context.engine in cls.COMPAT_ENGINES))
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+ rbo = ob.rigid_body
+ layout.use_property_split = True
+
+ col = layout.column()
+
if rbo.collision_shape in {'MESH', 'CONE'}:
col.prop(rbo, "collision_margin", text="Margin")
else:
@@ -96,7 +136,25 @@ class PHYSICS_PT_rigid_body_collisions(PHYSICS_PT_rigidbody_panel, Panel):
sub.active = rbo.use_margin
sub.prop(rbo, "collision_margin", text="Margin")
- layout.prop(rbo, "collision_groups")
+class PHYSICS_PT_rigid_body_collisions_collections(PHYSICS_PT_rigidbody_panel, Panel):
+ bl_label = "Collision Collections"
+ bl_parent_id = 'PHYSICS_PT_rigid_body_collisions'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.object
+ return (obj and obj.rigid_body and
+ (context.engine in cls.COMPAT_ENGINES))
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+ rbo = ob.rigid_body
+
+ layout.prop(rbo, "collision_groups", text="")
class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel):
@@ -114,6 +172,7 @@ class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
ob = context.object
rbo = ob.rigid_body
@@ -122,28 +181,53 @@ class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel):
# col.label(text="Activation:")
# XXX: settings such as activate on collison/etc.
- split = layout.split()
-
- col = split.column()
- col.label(text="Deactivation:")
- col.prop(rbo, "use_deactivation")
- sub = col.column()
- sub.active = rbo.use_deactivation
- sub.prop(rbo, "use_start_deactivated")
- sub.prop(rbo, "deactivate_linear_velocity", text="Linear Vel")
- sub.prop(rbo, "deactivate_angular_velocity", text="Angular Vel")
- # TODO: other params such as time?
-
- col = split.column()
- col.label(text="Damping:")
- col.prop(rbo, "linear_damping", text="Translation")
- col.prop(rbo, "angular_damping", text="Rotation")
+ col = layout.column()
+ col.prop(rbo, "linear_damping", text="Translation Damping")
+ col.prop(rbo, "angular_damping", text="Rotation Damping")
+
+
+class PHYSICS_PT_rigid_body_dynamics_deactivation(PHYSICS_PT_rigidbody_panel, Panel):
+ bl_label = "Deactivation"
+ bl_parent_id = 'PHYSICS_PT_rigid_body_dynamics'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.object
+ return (obj and obj.rigid_body and
+ obj.rigid_body.type == 'ACTIVE' and
+ (context.engine in cls.COMPAT_ENGINES))
+
+ def draw_header(self, context):
+ ob = context.object
+ rbo = ob.rigid_body
+ self.layout.prop(rbo, "use_deactivation", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ ob = context.object
+ rbo = ob.rigid_body
+
+ layout.active = rbo.use_deactivation
+
+ col = layout.column()
+ col.prop(rbo, "use_start_deactivated")
+ col.prop(rbo, "deactivate_linear_velocity", text="Linear Velocity")
+ col.prop(rbo, "deactivate_angular_velocity", text="Angular Velocity")
+ # TODO: other params such as time?
classes = (
PHYSICS_PT_rigid_body,
PHYSICS_PT_rigid_body_collisions,
+ PHYSICS_PT_rigid_body_collisions_surface,
+ PHYSICS_PT_rigid_body_collisions_sensitivity,
+ PHYSICS_PT_rigid_body_collisions_collections,
PHYSICS_PT_rigid_body_dynamics,
+ PHYSICS_PT_rigid_body_dynamics_deactivation,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
index 69491f36c63..5e67caadc90 100644
--- a/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody_constraint.py
@@ -139,6 +139,11 @@ class PHYSICS_PT_rigid_body_constraint(PHYSICS_PT_rigidbody_constraint_panel, Pa
sub.prop(rbc, "motor_ang_max_impulse", text="Max Impulse")
elif rbc.type in {'GENERIC', 'GENERIC_SPRING'}:
+ if rbc.type == 'GENERIC_SPRING':
+ row = layout.row()
+ row.label("Spring Type:")
+ row.prop(rbc, "spring_type", text="")
+
col = layout.column(align=True)
col.label("Limits:")
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index b1c5edf97e7..83d31ae6114 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -594,8 +594,6 @@ class RENDER_PT_eevee_volumetric(RenderButtonsPanel, Panel):
sub = col.column()
sub.active = props.use_volumetric_shadows
sub.prop(props, "volumetric_shadow_samples", text="Shadow Samples")
- col.separator()
- col.prop(props, "use_volumetric_colored_transmittance")
class RENDER_PT_eevee_subsurface_scattering(RenderButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index d937f2470b8..a4f6f753669 100644
--- a/release/scripts/startup/bl_ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -17,19 +17,21 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
-import bpy
-from bpy.types import Menu, Panel, UIList
+import bpy
+from bpy.types import (
+ Menu,
+ Panel,
+ UIList,
+)
from bpy.types import (
Brush,
FreestyleLineStyle,
- Object,
ParticleSettings,
Texture,
)
from rna_prop_ui import PropertyPanel
-
from .properties_paint_common import brush_texture_settings
@@ -47,9 +49,9 @@ class TEXTURE_MT_specials(Menu):
class TEXTURE_UL_texslots(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
- ma = data
slot = item
tex = slot.texture if slot else None
+
if self.layout_type in {'DEFAULT', 'COMPACT'}:
if tex:
layout.prop(tex, "name", text="", emboss=False, icon_value=icon)
@@ -131,18 +133,18 @@ class TEXTURE_PT_context(TextureButtonsPanel, Panel):
if not pin_id:
col.template_texture_user()
- col.separator()
-
if user or pin_id:
+ col.separator()
+
if pin_id:
col.template_ID(space, "pin_id")
else:
propname = context.texture_user_property.identifier
col.template_ID(user, propname, new="texture.new")
- col.separator()
-
if tex:
+ col.separator()
+
split = col.split(percentage=0.2)
split.label(text="Type")
split.prop(tex, "type", text="")
@@ -179,25 +181,35 @@ class TEXTURE_PT_node_mapping(TextureButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
node = context.texture_node
mapping = node.texture_mapping
- layout.prop(mapping, "vector_type", expand=True)
+ col = flow.column()
+ col.prop(mapping, "vector_type")
+
+ col.separator()
+
+ col = col.column(align=True)
+ col.prop(mapping, "mapping_x", text="Projection X")
+ col.prop(mapping, "mapping_y", text="Y")
+ col.prop(mapping, "mapping_z", text="Z")
- row = layout.row()
+ col.separator()
- row.column().prop(mapping, "translation")
- row.column().prop(mapping, "rotation")
- row.column().prop(mapping, "scale")
+ col = flow.column()
+ col.column().prop(mapping, "translation")
- layout.label(text="Projection:")
+ col = flow.column()
+ col.column().prop(mapping, "rotation")
- row = layout.row()
- row.prop(mapping, "mapping_x", text="")
- row.prop(mapping, "mapping_y", text="")
- row.prop(mapping, "mapping_z", text="")
+ col = flow.column()
+ col.column().prop(mapping, "scale")
class TextureTypePanel(TextureButtonsPanel):
@@ -216,21 +228,29 @@ class TEXTURE_PT_clouds(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
tex = context.texture
- layout.row().prop(tex, "cloud_type", expand=True)
- layout.label(text="Noise:")
- layout.row().prop(tex, "noise_type", text="Type", expand=True)
- layout.prop(tex, "noise_basis", text="Basis")
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
+
+ col.separator()
+
+ col.prop(tex, "noise_type", text="Type")
+
+ col.separator()
- split = layout.split()
+ col = flow.column()
+ col.prop(tex, "cloud_type")
- col = split.column()
+ col.separator()
+
+ col = flow.column()
col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "noise_depth", text="Depth")
-
- split.prop(tex, "nabla", text="Nabla")
+ col.prop(tex, "nabla", text="Nabla")
class TEXTURE_PT_wood(TextureTypePanel, Panel):
@@ -240,26 +260,34 @@ class TEXTURE_PT_wood(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=False)
tex = context.texture
- layout.row().prop(tex, "noise_basis_2", expand=True)
- layout.row().prop(tex, "wood_type", expand=True)
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
- col = layout.column()
- col.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
- col.label(text="Noise:")
- col.row().prop(tex, "noise_type", text="Type", expand=True)
- layout.prop(tex, "noise_basis", text="Basis")
+ col.separator()
- split = layout.split()
- split.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
+ col.prop(tex, "wood_type")
- col = split.column()
- col.prop(tex, "noise_scale", text="Size")
- col.prop(tex, "turbulence")
+ col.separator()
- split.prop(tex, "nabla")
+ col = flow.column()
+ col.prop(tex, "noise_basis_2", text="Second Basis")
+
+ col = col.column()
+ col.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
+ col.prop(tex, "noise_type", text="Type")
+
+ col.separator()
+
+ sub = flow.column()
+ sub.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
+ sub.prop(tex, "noise_scale", text="Size")
+ sub.prop(tex, "turbulence")
+ sub.prop(tex, "nabla")
class TEXTURE_PT_marble(TextureTypePanel, Panel):
@@ -269,22 +297,29 @@ class TEXTURE_PT_marble(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
tex = context.texture
- layout.row().prop(tex, "marble_type", expand=True)
- layout.row().prop(tex, "noise_basis_2", expand=True)
- layout.label(text="Noise:")
- layout.row().prop(tex, "noise_type", text="Type", expand=True)
- layout.prop(tex, "noise_basis", text="Basis")
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
+
+ col.separator()
+
+ col.prop(tex, "marble_type")
- split = layout.split()
+ col.separator()
- col = split.column()
+ col = flow.column()
+ col.prop(tex, "noise_basis_2", text="Second Basis")
+ col.prop(tex, "noise_type", text="Type")
+
+ col.separator()
+
+ col = flow.column()
col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "noise_depth", text="Depth")
-
- col = split.column()
col.prop(tex, "turbulence")
col.prop(tex, "nabla")
@@ -296,12 +331,16 @@ class TEXTURE_PT_magic(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
tex = context.texture
- row = layout.row()
- row.prop(tex, "noise_depth", text="Depth")
- row.prop(tex, "turbulence")
+ col = flow.column()
+ col.prop(tex, "noise_depth", text="Depth")
+
+ col = flow.column()
+ col.prop(tex, "turbulence")
class TEXTURE_PT_blend(TextureTypePanel, Panel):
@@ -311,15 +350,19 @@ class TEXTURE_PT_blend(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
tex = context.texture
- layout.prop(tex, "progression")
+ col = flow.column()
+ col.prop(tex, "progression")
- sub = layout.row()
+ col.separator()
- sub.active = (tex.progression in {'LINEAR', 'QUADRATIC', 'EASING', 'RADIAL'})
- sub.prop(tex, "use_flip_axis", expand=True)
+ col = flow.column()
+ col.active = (tex.progression in {'LINEAR', 'QUADRATIC', 'EASING', 'RADIAL'})
+ col.prop(tex, "use_flip_axis", text="Orientation")
class TEXTURE_PT_stucci(TextureTypePanel, Panel):
@@ -329,17 +372,28 @@ class TEXTURE_PT_stucci(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
tex = context.texture
- layout.row().prop(tex, "stucci_type", expand=True)
- layout.label(text="Noise:")
- layout.row().prop(tex, "noise_type", text="Type", expand=True)
- layout.prop(tex, "noise_basis", text="Basis")
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
+
+ col.separator()
- row = layout.row()
- row.prop(tex, "noise_scale", text="Size")
- row.prop(tex, "turbulence")
+ col.row().prop(tex, "stucci_type")
+
+ col.separator()
+
+ col = flow.column()
+ col.prop(tex, "noise_type", text="Type")
+
+ col.separator()
+
+ col = flow.column()
+ col.prop(tex, "noise_scale", text="Size")
+ col.prop(tex, "turbulence")
class TEXTURE_PT_image(TextureTypePanel, Panel):
@@ -348,6 +402,18 @@ class TEXTURE_PT_image(TextureTypePanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
+ # TODO: maybe expose the template_ID from the template image here.
+ layout = self.layout
+ del layout
+
+
+class TEXTURE_PT_image_settings(TextureTypePanel, Panel):
+ bl_label = "Settings"
+ bl_parent_id = 'TEXTURE_PT_image'
+ tex_type = 'IMAGE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
layout = self.layout
tex = context.texture
@@ -356,11 +422,13 @@ class TEXTURE_PT_image(TextureTypePanel, Panel):
def texture_filter_common(tex, layout):
layout.prop(tex, "filter_type", text="Filter Type")
+
if tex.use_mipmap and tex.filter_type in {'AREA', 'EWA', 'FELINE'}:
+ col = layout.column()
if tex.filter_type == 'FELINE':
- layout.prop(tex, "filter_lightprobes", text="Light Probes")
+ col.prop(tex, "filter_lightprobes", text="Light Probes")
else:
- layout.prop(tex, "filter_eccentricity", text="Eccentricity")
+ col.prop(tex, "filter_eccentricity", text="Eccentricity")
layout.prop(tex, "filter_size", text="Size")
layout.prop(tex, "use_filter_size_min", text="Minimum Size")
@@ -376,14 +444,11 @@ class TEXTURE_PT_image_sampling(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
- idblock = context_tex_datablock(context)
tex = context.texture
- slot = getattr(context, "texture_slot", None)
col = flow.column()
- col.prop(tex, "use_flip_axis", text="Flip X/Y Axis")
col.prop(tex, "use_interpolation")
col.separator()
@@ -396,8 +461,7 @@ class TEXTURE_PT_image_sampling(TextureTypePanel, Panel):
col.separator()
- col = flow.column()
- texture_filter_common(tex, col)
+ texture_filter_common(tex, flow)
class TEXTURE_PT_image_alpha(TextureTypePanel, Panel):
@@ -433,43 +497,70 @@ class TEXTURE_PT_image_mapping(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
tex = context.texture
- col = flow.column()
- col.prop(tex, "extension")
+ col = layout.column()
+ col.prop(tex, "use_flip_axis", text="Flip Axes")
+
+ col.separator()
+
+ subcol = layout.column()
+ subcol.prop(tex, "extension") # use layout, to keep the same location in case of button cycling.
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
if tex.extension == 'REPEAT':
+
+ col = flow.column()
sub = col.column(align=True)
sub.prop(tex, "repeat_x", text="Repeat X")
sub.prop(tex, "repeat_y", text="Y")
+ col = flow.column()
sub = col.column()
- sub.prop(tex, "use_mirror_x", text="Mirror X")
sub.active = (tex.repeat_x > 1)
+ sub.prop(tex, "use_mirror_x", text="Mirror X")
sub = col.column()
- sub.prop(tex, "use_mirror_y", text="Y")
sub.active = (tex.repeat_y > 1)
+ sub.prop(tex, "use_mirror_y", text="Y")
elif tex.extension == 'CHECKER':
- col = layout.column(align=True)
- col.prop(tex, "use_checker_even", text="Even")
- col.prop(tex, "use_checker_odd", text="Odd")
+ subcol.separator()
- col = layout.column()
+ col = flow.column()
col.prop(tex, "checker_distance", text="Distance")
- col = flow.column()
- sub = col.column(align=True)
+ col = flow.column()
+ col.prop(tex, "use_checker_even", text="Tiles Even")
+ col.prop(tex, "use_checker_odd", text="Odd")
+ else:
+ del flow
+
+
+class TEXTURE_PT_image_mapping_crop(TextureTypePanel, Panel):
+ bl_label = "Crop"
+ bl_options = {'DEFAULT_CLOSED'}
+ bl_parent_id = 'TEXTURE_PT_image_mapping'
+ tex_type = 'IMAGE'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ tex = context.texture
+
+ col = flow.column(align=True)
# col.prop(tex, "crop_rectangle")
- sub.prop(tex, "crop_min_x", text="Crop Minimum X")
- sub.prop(tex, "crop_min_y", text="Y")
+ col.prop(tex, "crop_min_x", text="Minimum X")
+ col.prop(tex, "crop_min_y", text="Y")
- sub = col.column(align=True)
- sub.prop(tex, "crop_max_x", text="Crop Maximum X")
- sub.prop(tex, "crop_max_y", text="Y")
+ col = flow.column(align=True)
+ col.prop(tex, "crop_max_x", text="Maximum X")
+ col.prop(tex, "crop_max_y", text="Y")
class TEXTURE_PT_musgrave(TextureTypePanel, Panel):
@@ -479,34 +570,43 @@ class TEXTURE_PT_musgrave(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
tex = context.texture
- layout.prop(tex, "musgrave_type")
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
+
+ col.separator()
+
+ col.prop(tex, "musgrave_type")
+
+ col.separator()
+
+ col.prop(tex, "noise_scale", text="Size")
+ col.prop(tex, "nabla")
- split = layout.split()
+ col.separator()
- col = split.column()
+ col = flow.column()
col.prop(tex, "dimension_max", text="Dimension")
col.prop(tex, "lacunarity")
col.prop(tex, "octaves")
+ col.separator()
+
musgrave_type = tex.musgrave_type
- col = split.column()
+
+ col = flow.column()
+
if musgrave_type in {'HETERO_TERRAIN', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'}:
col.prop(tex, "offset")
col.prop(tex, "noise_intensity", text="Intensity")
+
if musgrave_type in {'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'}:
col.prop(tex, "gain")
- layout.label(text="Noise:")
-
- layout.prop(tex, "noise_basis", text="Basis")
-
- row = layout.row()
- row.prop(tex, "noise_scale", text="Size")
- row.prop(tex, "nabla")
-
class TEXTURE_PT_voronoi(TextureTypePanel, Panel):
bl_label = "Voronoi"
@@ -515,33 +615,51 @@ class TEXTURE_PT_voronoi(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
tex = context.texture
- split = layout.split()
+ col = flow.column()
+ col.prop(tex, "distance_metric")
- col = split.column()
- col.label(text="Distance Metric:")
- col.prop(tex, "distance_metric", text="")
sub = col.column()
sub.active = tex.distance_metric == 'MINKOVSKY'
sub.prop(tex, "minkovsky_exponent", text="Exponent")
- col.label(text="Coloring:")
- col.prop(tex, "color_mode", text="")
+
+ sub.separator()
+
+ col = flow.column()
+ col.prop(tex, "color_mode")
col.prop(tex, "noise_intensity", text="Intensity")
- col = split.column()
- sub = col.column(align=True)
- sub.label(text="Feature Weights:")
- sub.prop(tex, "weight_1", text="1", slider=True)
- sub.prop(tex, "weight_2", text="2", slider=True)
- sub.prop(tex, "weight_3", text="3", slider=True)
- sub.prop(tex, "weight_4", text="4", slider=True)
+ col.separator()
+
+ col = flow.column()
+ col.prop(tex, "noise_scale", text="Size")
+ col.prop(tex, "nabla")
+
+
+class TEXTURE_PT_voronoi_feature_weights(TextureTypePanel, Panel):
+ bl_label = "Feature Weights"
+ bl_parent_id = "TEXTURE_PT_voronoi"
+ tex_type = 'VORONOI'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ tex = context.texture
- layout.label(text="Noise:")
- row = layout.row()
- row.prop(tex, "noise_scale", text="Size")
- row.prop(tex, "nabla")
+ col = flow.column(align=True)
+ col.prop(tex, "weight_1", text="First", slider=True)
+ col.prop(tex, "weight_2", text="Second", slider=True)
+
+ sub = flow.column(align=True)
+ sub.prop(tex, "weight_3", text="Third", slider=True)
+ sub.prop(tex, "weight_4", text="Fourth", slider=True)
class TEXTURE_PT_distortednoise(TextureTypePanel, Panel):
@@ -551,19 +669,24 @@ class TEXTURE_PT_distortednoise(TextureTypePanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
tex = context.texture
- layout.prop(tex, "noise_distortion")
- layout.prop(tex, "noise_basis", text="Basis")
+ col = flow.column()
+ col.prop(tex, "noise_basis", text="Noise Basis")
- split = layout.split()
+ col.separator()
- col = split.column()
- col.prop(tex, "distortion", text="Distortion")
- col.prop(tex, "noise_scale", text="Size")
+ col.prop(tex, "noise_distortion", text="Distortion")
- split.prop(tex, "nabla")
+ col.separator()
+
+ col = flow.column()
+ col.prop(tex, "distortion", text="Amount")
+ col.prop(tex, "noise_scale", text="Size")
+ col.prop(tex, "nabla")
class TextureSlotPanel(TextureButtonsPanel):
@@ -595,68 +718,64 @@ class TEXTURE_PT_mapping(TextureSlotPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
idblock = context_tex_datablock(context)
tex = context.texture_slot
- if not isinstance(idblock, Brush):
- split = layout.split(percentage=0.3)
- col = split.column()
- col.label(text="Coordinates:")
- col = split.column()
- col.prop(tex, "texture_coords", text="")
+ if isinstance(idblock, Brush):
+ if context.sculpt_object or context.image_paint_object:
+ brush_texture_settings(layout, idblock, context.sculpt_object)
+ else:
+ col = flow.column()
- if tex.texture_coords == 'ORCO':
- """
- ob = context.object
- if ob and ob.type == 'MESH':
- split = layout.split(percentage=0.3)
- split.label(text="Mesh:")
- split.prop(ob.data, "texco_mesh", text="")
- """
- elif tex.texture_coords == 'UV':
- split = layout.split(percentage=0.3)
- split.label(text="Map:")
+ col.prop(tex, "texture_coords", text="Coordinates")
+
+ # Note: the ORCO case used to call ob.data, "texco_mesh" prop.
+ if tex.texture_coords == 'UV':
ob = context.object
+
if ob and ob.type == 'MESH':
- split.prop_search(tex, "uv_layer", ob.data, "uv_layers", text="")
+ # Note: TODO prop_search doesn't align on the right.
+ row = col.row(align=True)
+ row.prop_search(tex, "uv_layer", ob.data, "uv_layers", text="Map")
+ row.label(text="", icon='BLANK1')
else:
- split.prop(tex, "uv_layer", text="")
+ col.prop(tex, "uv_layer", text="Map")
elif tex.texture_coords == 'OBJECT':
- split = layout.split(percentage=0.3)
- split.label(text="Object:")
- split.prop(tex, "object", text="")
+ col.prop(tex, "object", text="Object")
elif tex.texture_coords == 'ALONG_STROKE':
- split = layout.split(percentage=0.3)
- split.label(text="Use Tips:")
- split.prop(tex, "use_tips", text="")
+ col.prop(tex, "use_tips", text="Use Tips")
+
+ col.separator()
- if isinstance(idblock, Brush):
- if context.sculpt_object or context.image_paint_object:
- brush_texture_settings(layout, idblock, context.sculpt_object)
- else:
if isinstance(idblock, FreestyleLineStyle):
- split = layout.split(percentage=0.3)
- split.label(text="Projection:")
- split.prop(tex, "mapping", text="")
+ col = flow.column()
+ col.prop(tex, "mapping", text="Projection")
+
+ col.separator()
+
+ col = flow.column()
+ col.prop(tex, "mapping_x", text="Mapping X")
+ col.prop(tex, "mapping_y", text="Y")
+ col.prop(tex, "mapping_z", text="Z")
- split = layout.split(percentage=0.3)
- split.separator()
- row = split.row()
- row.prop(tex, "mapping_x", text="")
- row.prop(tex, "mapping_y", text="")
- row.prop(tex, "mapping_z", text="")
+ col.separator()
- row = layout.row()
- row.column().prop(tex, "offset")
- row.column().prop(tex, "scale")
+ col = flow.column(align=True)
+ col.column().prop(tex, "offset")
+
+ col = flow.column(align=True)
+ col.column().prop(tex, "scale")
class TEXTURE_PT_influence(TextureSlotPanel, Panel):
bl_label = "Influence"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
@classmethod
@@ -672,107 +791,126 @@ class TEXTURE_PT_influence(TextureSlotPanel, Panel):
return (engine in cls.COMPAT_ENGINES)
def draw(self, context):
-
layout = self.layout
+ layout.use_property_split = True
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=False, even_rows=False, align=False)
idblock = context_tex_datablock(context)
-
tex = context.texture_slot
def factor_but(layout, toggle, factor, name):
row = layout.row(align=True)
- row.prop(tex, toggle, text="")
+ row.active = getattr(tex, toggle)
+
+ row.prop(tex, factor, text=name, slider=True)
sub = row.row(align=True)
- sub.active = getattr(tex, toggle)
- sub.prop(tex, factor, text=name, slider=True)
+ sub.prop(tex, toggle, text="")
return sub # XXX, temp. use_map_normal needs to override.
if isinstance(idblock, ParticleSettings):
- split = layout.split()
-
- col = split.column()
- col.label(text="General:")
- factor_but(col, "use_map_time", "time_factor", "Time")
+ col = flow.column()
+ factor_but(col, "use_map_time", "time_factor", "General Time")
factor_but(col, "use_map_life", "life_factor", "Lifetime")
factor_but(col, "use_map_density", "density_factor", "Density")
factor_but(col, "use_map_size", "size_factor", "Size")
- col = split.column()
- col.label(text="Physics:")
- factor_but(col, "use_map_velocity", "velocity_factor", "Velocity")
+ col.separator()
+
+ col = flow.column()
+ factor_but(col, "use_map_velocity", "velocity_factor", "Physics Velocity")
factor_but(col, "use_map_damp", "damp_factor", "Damp")
factor_but(col, "use_map_gravity", "gravity_factor", "Gravity")
factor_but(col, "use_map_field", "field_factor", "Force Fields")
- layout.label(text="Hair:")
-
- split = layout.split()
+ col.separator()
- col = split.column()
- factor_but(col, "use_map_length", "length_factor", "Length")
+ col = flow.column()
+ factor_but(col, "use_map_length", "length_factor", "Hair Length")
factor_but(col, "use_map_clump", "clump_factor", "Clump")
factor_but(col, "use_map_twist", "twist_factor", "Twist")
- col = split.column()
+ col = flow.column()
factor_but(col, "use_map_kink_amp", "kink_amp_factor", "Kink Amplitude")
factor_but(col, "use_map_kink_freq", "kink_freq_factor", "Kink Frequency")
factor_but(col, "use_map_rough", "rough_factor", "Rough")
elif isinstance(idblock, FreestyleLineStyle):
- split = layout.split()
-
- col = split.column()
+ col = flow.column()
factor_but(col, "use_map_color_diffuse", "diffuse_color_factor", "Color")
- col = split.column()
factor_but(col, "use_map_alpha", "alpha_factor", "Alpha")
- layout.separator()
-
if not isinstance(idblock, ParticleSettings):
- split = layout.split()
+ col = flow.column()
- col = split.column()
col.prop(tex, "blend_type", text="Blend")
col.prop(tex, "use_rgb_to_intensity")
+
# color is used on gray-scale textures even when use_rgb_to_intensity is disabled.
col.prop(tex, "color", text="")
- col = split.column()
+ col = flow.column()
col.prop(tex, "invert", text="Negative")
col.prop(tex, "use_stencil")
-class TEXTURE_PT_colors(TextureButtonsPanel, Panel):
- bl_label = "Colors"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
+class TextureColorsPoll:
@classmethod
def poll(cls, context):
tex = context.texture
return tex and (tex.type != 'NONE' or tex.use_nodes) and (context.engine in cls.COMPAT_ENGINES)
+
+class TEXTURE_PT_colors(TextureButtonsPanel, TextureColorsPoll, Panel):
+ bl_label = "Colors"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=False, even_rows=False, align=False)
tex = context.texture
- col = layout.column()
- sub = col.column(align=True)
- sub.prop(tex, "factor_red", text="Multiply R")
- sub.prop(tex, "factor_green", text="G")
- sub.prop(tex, "factor_blue", text="B")
+ col = flow.column()
+ col.prop(tex, "use_clamp", text="Clamp")
+
+ col = flow.column(align=True)
+ col.prop(tex, "factor_red", text="Multiply R")
+ col.prop(tex, "factor_green", text="G")
+ col.prop(tex, "factor_blue", text="B")
+ col.separator()
+
+ col = flow.column()
col.prop(tex, "intensity")
col.prop(tex, "contrast")
col.prop(tex, "saturation")
- col.prop(tex, "use_clamp", text="Clamp")
- col.prop(tex, "use_color_ramp", text="Ramp")
- if tex.use_color_ramp:
- layout.use_property_split = False
+
+class TEXTURE_PT_colors_ramp(TextureButtonsPanel, TextureColorsPoll, Panel):
+ bl_label = "Color Ramp"
+ bl_options = {'DEFAULT_CLOSED'}
+ bl_parent_id = 'TEXTURE_PT_colors'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ tex = context.texture
+ self.layout.prop(tex, "use_color_ramp", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ tex = context.texture
+
+ # Note: TODO after creation of a new texture, the template_color_ramp will be blank.
+ # Possibly needs to be fixed in the template itself.
+ is_active = bool(tex and tex.use_color_ramp)
+ if is_active:
layout.template_color_ramp(tex, "color_ramp", expand=True)
+ else:
+ layout.alignment = 'RIGHT'
+ layout.label("Please enable the Color Ramp first")
class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, Panel):
@@ -792,8 +930,6 @@ classes = (
TEXTURE_PT_context,
TEXTURE_PT_node,
TEXTURE_PT_node_mapping,
- TEXTURE_PT_mapping,
- TEXTURE_PT_influence,
TEXTURE_PT_clouds,
TEXTURE_PT_wood,
TEXTURE_PT_marble,
@@ -801,13 +937,19 @@ classes = (
TEXTURE_PT_blend,
TEXTURE_PT_stucci,
TEXTURE_PT_image,
+ TEXTURE_PT_image_settings,
TEXTURE_PT_image_alpha,
- TEXTURE_PT_image_sampling,
TEXTURE_PT_image_mapping,
+ TEXTURE_PT_image_mapping_crop,
+ TEXTURE_PT_image_sampling,
TEXTURE_PT_musgrave,
TEXTURE_PT_voronoi,
+ TEXTURE_PT_voronoi_feature_weights,
TEXTURE_PT_distortednoise,
+ TEXTURE_PT_influence,
+ TEXTURE_PT_mapping,
TEXTURE_PT_colors,
+ TEXTURE_PT_colors_ramp,
TEXTURE_PT_custom_props,
)
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 9d903829bbb..a85dd591b2f 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -56,6 +56,8 @@ class FILEBROWSER_HT_header(Header):
layout.separator_spacer()
+ layout.template_running_jobs()
+
if params:
layout.prop(params, "use_filter", text="", icon='FILTER')
@@ -86,8 +88,6 @@ class FILEBROWSER_HT_header(Header):
row.separator()
row.prop(params, "filter_search", text="", icon='VIEWZOOM')
- layout.template_running_jobs()
-
class FILEBROWSER_UL_dir(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 9d8c14ba9c3..45343c09b27 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -364,7 +364,6 @@ class NODE_PT_active_node_generic(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Node"
-# bl_options = {'HIDE_HEADER'}
@classmethod
def poll(cls, context):
@@ -383,6 +382,7 @@ class NODE_PT_active_node_color(Panel):
bl_region_type = 'UI'
bl_label = "Color"
bl_options = {'DEFAULT_CLOSED'}
+ bl_parent_id = 'NODE_PT_active_node_generic'
@classmethod
def poll(cls, context):
@@ -410,6 +410,8 @@ class NODE_PT_active_node_properties(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Properties"
+ bl_options = {'DEFAULT_CLOSED'}
+ bl_parent_id = 'NODE_PT_active_node_generic'
@classmethod
def poll(cls, context):
@@ -453,18 +455,22 @@ class NODE_PT_backdrop(Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
snode = context.space_data
layout.active = snode.show_backdrop
- layout.prop(snode, "backdrop_channels", text="")
- layout.prop(snode, "backdrop_zoom", text="Zoom")
- col = layout.column(align=True)
- col.label(text="Offset:")
- col.prop(snode, "backdrop_offset", text="")
- col.operator("node.backimage_move", text="Move")
+ col = layout.column()
+
+ col.prop(snode, "backdrop_channels", text="Channels")
+ col.prop(snode, "backdrop_zoom", text="Zoom")
- layout.operator("node.backimage_fit", text="Fit")
+ col.prop(snode, "backdrop_offset", text="Offset")
+
+ col.separator()
+
+ col.operator("node.backimage_move", text="Move")
+ col.operator("node.backimage_fit", text="Fit")
class NODE_PT_quality(bpy.types.Panel):
@@ -479,6 +485,7 @@ class NODE_PT_quality(bpy.types.Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
snode = context.space_data
tree = snode.node_tree
@@ -522,6 +529,7 @@ class NODE_UL_interface_sockets(bpy.types.UIList):
class NODE_PT_grease_pencil(GreasePencilDataPanel, Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
+ bl_options = {'DEFAULT_CLOSED'}
# NOTE: this is just a wrapper around the generic GP Panel
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 8f722c4d3ce..20ef5ae0c53 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -142,8 +142,15 @@ class OUTLINER_MT_collection_view_layer(Menu):
space = context.space_data
- layout.operator("outliner.collection_exclude_set", text="Exclude")
- layout.operator("outliner.collection_include_set", text="Include")
+ layout.operator("outliner.collection_exclude_set")
+ layout.operator("outliner.collection_exclude_clear")
+
+ if context.engine == 'CYCLES':
+ layout.operator("outliner.collection_indirect_only_set")
+ layout.operator("outliner.collection_indirect_only_clear")
+
+ layout.operator("outliner.collection_holdout_set")
+ layout.operator("outliner.collection_holdout_clear")
class OUTLINER_MT_collection(Menu):
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index 96ef2e51e60..55129aa0ce1 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -265,8 +265,8 @@ class INFO_MT_file(Menu):
layout.separator()
layout.operator_context = 'INVOKE_AREA'
- layout.operator("wm.link", text="Link", icon='LINK_BLEND')
- layout.operator("wm.append", text="Append", icon='APPEND_BLEND')
+ layout.operator("wm.link", text="Link...", icon='LINK_BLEND')
+ layout.operator("wm.append", text="Append...", icon='APPEND_BLEND')
layout.menu("INFO_MT_file_previews")
layout.separator()
@@ -495,12 +495,26 @@ class INFO_MT_help(Menu):
def draw(self, context):
layout = self.layout
+ show_developer = context.user_preferences.view.show_developer_ui
+
layout.operator(
"wm.url_open", text="Manual", icon='HELP',
).url = "https://docs.blender.org/manual/en/dev/"
+
+
layout.operator(
- "wm.url_open", text="Release Log", icon='URL',
- ).url = "http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/%d.%d" % bpy.app.version[:2]
+ "wm.url_open", text="Report a Bug", icon='URL',
+ ).url = "https://developer.blender.org/maniphest/task/edit/form/1"
+
+ layout.separator()
+
+ layout.operator(
+ "wm.url_open", text="User Communities", icon='URL',
+ ).url = "https://www.blender.org/community/"
+ layout.operator(
+ "wm.url_open", text="Developer Community", icon='URL',
+ ).url = "https://www.blender.org/get-involved/developers/"
+
layout.separator()
layout.operator(
@@ -509,24 +523,22 @@ class INFO_MT_help(Menu):
layout.operator(
"wm.url_open", text="Blender Store", icon='URL',
).url = "https://store.blender.org"
+
layout.operator(
- "wm.url_open", text="Developer Community", icon='URL',
- ).url = "https://www.blender.org/get-involved/"
- layout.operator(
- "wm.url_open", text="User Community", icon='URL',
- ).url = "https://www.blender.org/support/user-community"
- layout.separator()
- layout.operator(
- "wm.url_open", text="Report a Bug", icon='URL',
- ).url = "https://developer.blender.org/maniphest/task/edit/form/1"
+ "wm.url_open", text="Release Notes", icon='URL',
+ ).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
+
layout.separator()
- layout.operator(
- "wm.url_open", text="Python API Reference", icon='URL',
- ).url = bpy.types.WM_OT_doc_view._prefix
+ if show_developer:
+ layout.operator(
+ "wm.url_open", text="Python API Reference", icon='URL',
+ ).url = bpy.types.WM_OT_doc_view._prefix
+
+ layout.operator("wm.operator_cheat_sheet", icon='TEXT')
+
+ layout.operator("wm.sysinfo")
- layout.operator("wm.operator_cheat_sheet", icon='TEXT')
- layout.operator("wm.sysinfo", icon='TEXT')
layout.separator()
layout.operator("wm.splash", icon='BLENDER')
@@ -539,8 +551,13 @@ class TOPBAR_MT_file_specials(Menu):
layout = self.layout
layout.operator_context = 'INVOKE_AREA'
- layout.operator("wm.link", text="Link", icon='LINK_BLEND')
- layout.operator("wm.append", text="Append", icon='APPEND_BLEND')
+ layout.operator("wm.read_homefile", text="New", icon='NEW')
+ layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER')
+
+ layout.separator()
+
+ layout.operator("wm.link", text="Link...", icon='LINK_BLEND')
+ layout.operator("wm.append", text="Append...", icon='APPEND_BLEND')
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index e8c640721c8..e6d8b1ec2a7 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -453,7 +453,7 @@ class VIEW3D_MT_snap(Menu):
layout.operator("view3d.snap_selected_to_grid", text="Selection to Grid")
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor").use_offset = False
- layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
+ layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Keep Offset)").use_offset = True
layout.operator("view3d.snap_selected_to_active", text="Selection to Active")
layout.separator()
@@ -3839,10 +3839,14 @@ class VIEW3D_PT_shading_color(Panel):
shading = VIEW3D_PT_shading.get_shading(context)
- layout.row().prop(shading, "color_type", expand=True)
-
+ layout.row().prop(shading, 'color_type', expand=True)
if shading.color_type == 'SINGLE':
- layout.row().prop(shading, "single_color", text="")
+ layout.row().prop(shading, 'single_color', text="")
+
+ layout.row().label("Background")
+ layout.row().prop(shading, 'background_type', expand=True)
+ if shading.background_type == 'VIEWPORT':
+ layout.row().prop(shading, "background_color", text="")
class VIEW3D_PT_shading_options(Panel):
@@ -3912,10 +3916,6 @@ class VIEW3D_PT_shading_options(Panel):
if not shading.light == 'MATCAP':
col.prop(shading, "show_specular_highlight")
- view = context.space_data
- if view.type == 'VIEW_3D':
- col.prop(view, "show_world")
-
class VIEW3D_PT_shading_options_shadow(Panel):
bl_label = "Shadow Settings"
diff --git a/release/scripts/templates_py/batch_export.py b/release/scripts/templates_py/batch_export.py
index 1463915886a..a07491742ec 100644
--- a/release/scripts/templates_py/batch_export.py
+++ b/release/scripts/templates_py/batch_export.py
@@ -9,9 +9,9 @@ basedir = os.path.dirname(bpy.data.filepath)
if not basedir:
raise Exception("Blend file is not saved")
-scene = bpy.context.scene
+view_layer = bpy.context.view_layer
-obj_active = scene.objects.active
+obj_active = view_layer.objects.active
selection = bpy.context.selected_objects
bpy.ops.object.select_all(action='DESELECT')
@@ -21,7 +21,7 @@ for obj in selection:
obj.select_set(action='SELECT')
# some exporters only use the active object
- scene.objects.active = obj
+ view_layer.objects.active = obj
name = bpy.path.clean_name(obj.name)
fn = os.path.join(basedir, name)
@@ -36,7 +36,7 @@ for obj in selection:
print("written:", fn)
-scene.objects.active = obj_active
+view_layer.objects.active = obj_active
for obj in selection:
obj.select_set(action='SELECT')
diff --git a/release/scripts/templates_py/operator_modal_view3d_raycast.py b/release/scripts/templates_py/operator_modal_view3d_raycast.py
index e3b63813fc4..613501143f7 100644
--- a/release/scripts/templates_py/operator_modal_view3d_raycast.py
+++ b/release/scripts/templates_py/operator_modal_view3d_raycast.py
@@ -68,7 +68,7 @@ def main(context, event):
# we could do lots of stuff but for the example just select.
if best_obj is not None:
best_obj.select_set(action='SELECT')
- context.scene.objects.active = best_obj
+ context.view_layer.objects.active = best_obj
class ViewOperatorRayCast(bpy.types.Operator):