blender/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py

493 lines
17 KiB
Python
Raw Normal View History

# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
2011-11-11 03:28:46 +00:00
import bpy
2011-11-11 03:28:46 +00:00
from bpy.types import Panel
2011-11-11 03:28:46 +00:00
from .properties_physics_common import (
point_cache_ui,
effector_weights_ui,
)
2011-11-11 03:28:46 +00:00
class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "physics"
@classmethod
def poll(cls, context):
ob = context.object
rd = context.scene.render
2011-11-11 03:28:46 +00:00
return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and context.dynamic_paint
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint"
def draw(self, context):
layout = self.layout
md = context.dynamic_paint
layout.prop(md, "ui_type", expand=True)
2011-11-11 03:28:46 +00:00
if md.ui_type == 'CANVAS':
canvas = md.canvas_settings
2011-11-11 03:28:46 +00:00
if canvas is None:
layout.operator("dpaint.type_toggle", text="Add Canvas").type = 'CANVAS'
else:
layout.operator("dpaint.type_toggle", text="Remove Canvas", icon='X').type = 'CANVAS'
2011-11-11 03:28:46 +00:00
surface = canvas.canvas_surfaces.active
row = layout.row()
row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2)
col = row.column(align=True)
col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
2011-11-11 03:28:46 +00:00
if surface:
layout.prop(surface, "name")
layout.prop(surface, "surface_format")
2011-11-11 03:28:46 +00:00
col = layout.column()
2011-11-11 03:28:46 +00:00
if surface.surface_format != 'VERTEX':
col.label(text="Quality:")
col.prop(surface, "image_resolution")
col.prop(surface, "use_antialiasing")
2011-11-11 03:28:46 +00:00
col = layout.column()
col.label(text="Frames:")
split = col.split()
2011-11-11 03:28:46 +00:00
col = split.column(align=True)
col.prop(surface, "frame_start", text="Start")
col.prop(surface, "frame_end", text="End")
2011-11-11 03:28:46 +00:00
split.prop(surface, "frame_substeps")
2011-11-11 03:28:46 +00:00
elif md.ui_type == 'BRUSH':
brush = md.brush_settings
engine = context.scene.render.engine
2011-11-11 03:28:46 +00:00
if brush is None:
layout.operator("dpaint.type_toggle", text="Add Brush").type = 'BRUSH'
else:
layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
split = layout.split()
col = split.column()
col.prop(brush, "use_absolute_alpha")
col.prop(brush, "use_paint_erase")
col.prop(brush, "paint_wetness", text="Wetness")
2011-11-11 03:28:46 +00:00
col = split.column()
2011-11-11 03:28:46 +00:00
if engine == 'BLENDER_RENDER':
sub = col.column()
2011-11-11 03:28:46 +00:00
sub.active = (brush.paint_source != 'PARTICLE_SYSTEM')
sub.prop(brush, "use_material")
2011-11-11 03:28:46 +00:00
if brush.use_material and brush.paint_source != 'PARTICLE_SYSTEM' and engine == 'BLENDER_RENDER':
col.prop(brush, "material", text="")
col.prop(brush, "paint_alpha", text="Alpha Factor")
else:
col.prop(brush, "paint_color", text="")
col.prop(brush, "paint_alpha", text="Alpha")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Advanced"
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
return md and md.ui_type == 'CANVAS' and md.canvas_settings and md.canvas_settings.canvas_surfaces.active
def draw(self, context):
layout = self.layout
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
2011-11-11 03:28:46 +00:00
surface_type = surface.surface_type
layout.prop(surface, "surface_type")
layout.separator()
# dissolve
2011-11-11 03:28:46 +00:00
if surface_type == 'PAINT':
split = layout.split(percentage=0.35)
split.label(text="Wetmap drying:")
2011-11-11 03:28:46 +00:00
col = split.column()
split = col.split(percentage=0.7)
split.prop(surface, "dry_speed", text="Time")
split.prop(surface, "use_dry_log", text="Slow")
2011-11-11 03:28:46 +00:00
if surface_type != 'WAVE':
split = layout.split(percentage=0.35)
col = split.column()
2011-11-11 03:28:46 +00:00
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")
2011-11-11 03:28:46 +00:00
# per type settings
2011-11-11 03:28:46 +00:00
if surface_type == 'DISPLACE':
layout.prop(surface, "use_incremental_displace")
2011-11-11 03:28:46 +00:00
if surface.surface_format == 'VERTEX':
row = layout.row()
row.prop(surface, "depth_clamp")
row.prop(surface, "displace_factor")
2011-11-11 03:28:46 +00:00
elif surface_type == 'WAVE':
layout.prop(surface, "use_wave_open_border")
2011-11-11 03:28:46 +00:00
split = layout.split()
2011-11-11 03:28:46 +00:00
col = split.column(align=True)
col.prop(surface, "wave_timescale")
col.prop(surface, "wave_speed")
2011-11-11 03:28:46 +00:00
col = split.column(align=True)
col.prop(surface, "wave_damping")
col.prop(surface, "wave_spring")
2011-11-11 03:28:46 +00:00
layout.separator()
layout.prop(surface, "brush_group", text="Brush Group")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Output"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
return 0
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
2011-11-11 03:28:46 +00:00
return surface and not (surface.surface_format == 'VERTEX' and (surface.surface_type in {'DISPLACE', 'WAVE'}))
def draw(self, context):
layout = self.layout
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
ob = context.object
2011-11-11 03:28:46 +00:00
surface_type = surface.surface_type
# vertex format outputs
2011-11-11 03:28:46 +00:00
if surface.surface_format == 'VERTEX':
if surface_type == 'PAINT':
# toggle active preview
layout.prop(surface, "preview_id")
2011-11-11 03:28:46 +00:00
# paintmap output
row = layout.row()
row.prop_search(surface, "output_name_a", ob.data, "vertex_colors", text="Paintmap layer: ")
2011-11-11 03:28:46 +00:00
if surface.output_exists(object=ob, index=0):
ic = 'ZOOMOUT'
else:
ic = 'ZOOMIN'
2011-11-11 03:28:46 +00:00
row.operator("dpaint.output_toggle", icon=ic, text="").output = 'A'
2011-11-11 03:28:46 +00:00
# wetmap output
row = layout.row()
row.prop_search(surface, "output_name_b", ob.data, "vertex_colors", text="Wetmap layer: ")
2011-11-11 03:28:46 +00:00
if surface.output_exists(object=ob, index=1):
ic = 'ZOOMOUT'
else:
ic = 'ZOOMIN'
2011-11-11 03:28:46 +00:00
row.operator("dpaint.output_toggle", icon=ic, text="").output = 'B'
2011-11-11 03:28:46 +00:00
elif surface_type == 'WEIGHT':
row = layout.row()
row.prop_search(surface, "output_name_a", ob, "vertex_groups", text="Vertex Group: ")
2011-11-11 03:28:46 +00:00
if surface.output_exists(object=ob, index=0):
ic = 'ZOOMOUT'
else:
ic = 'ZOOMIN'
row.operator("dpaint.output_toggle", icon=ic, text="").output = 'A'
# image format outputs
2011-11-11 03:28:46 +00:00
if surface.surface_format == 'IMAGE':
layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
layout.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV Map:")
layout.separator()
2011-11-11 03:28:46 +00:00
layout.prop(surface, "image_output_path", text="")
row = layout.row()
row.prop(surface, "image_fileformat", text="")
row.prop(surface, "use_premultiply", text="Premultiply alpha")
2011-11-11 03:28:46 +00:00
if surface_type == 'PAINT':
split = layout.split(percentage=0.4)
split.prop(surface, "use_output_a", text="Paintmaps:")
sub = split.row()
sub.active = surface.use_output_a
sub.prop(surface, "output_name_a", text="")
2011-11-11 03:28:46 +00:00
split = layout.split(percentage=0.4)
2011-11-15 10:49:02 +00:00
split.prop(surface, "use_output_b", text="Wetmaps:")
sub = split.row()
2011-11-15 10:49:02 +00:00
sub.active = surface.use_output_b
sub.prop(surface, "output_name_b", text="")
else:
col = layout.column()
col.prop(surface, "output_name_a", text="Filename: ")
2011-11-11 03:28:46 +00:00
if surface_type == 'DISPLACE':
col.prop(surface, "displace_type", text="Displace Type")
col.prop(surface, "depth_clamp")
2011-11-11 03:28:46 +00:00
elif surface_type == 'WAVE':
col.prop(surface, "depth_clamp", text="Wave Clamp")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Initial Color"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
return 0
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
2011-11-11 03:28:46 +00:00
return (surface and surface.surface_type == 'PAINT')
def draw(self, context):
layout = self.layout
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
ob = context.object
layout.prop(surface, "init_color_type", expand=False)
layout.separator()
# dissolve
2011-11-11 03:28:46 +00:00
if surface.init_color_type == 'COLOR':
layout.prop(surface, "init_color")
2011-11-11 03:28:46 +00:00
elif surface.init_color_type == 'TEXTURE':
layout.prop(surface, "init_texture")
layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Map:")
2011-11-11 03:28:46 +00:00
elif surface.init_color_type == 'VERTEX_COLOR':
layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer: ")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_effects(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Effects"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
return False
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
2011-11-11 03:28:46 +00:00
return (surface and surface.surface_type == 'PAINT')
def draw(self, context):
layout = self.layout
canvas = context.dynamic_paint.canvas_settings
surface = canvas.canvas_surfaces.active
layout.prop(surface, "effect_ui", expand=True)
2011-11-11 03:28:46 +00:00
if surface.effect_ui == 'SPREAD':
layout.prop(surface, "use_spread")
2011-11-11 03:28:46 +00:00
row = layout.row()
row.active = surface.use_spread
row.prop(surface, "spread_speed")
row.prop(surface, "color_spread_speed")
2011-11-11 03:28:46 +00:00
elif surface.effect_ui == 'DRIP':
layout.prop(surface, "use_drip")
2011-11-11 03:28:46 +00:00
col = layout.column()
col.active = surface.use_drip
effector_weights_ui(self, context, surface.effector_weights)
layout.label(text="Surface Movement:")
row = layout.row()
row.prop(surface, "drip_velocity", slider=True)
row.prop(surface, "drip_acceleration", slider=True)
2011-11-11 03:28:46 +00:00
elif surface.effect_ui == 'SHRINK':
layout.prop(surface, "use_shrink")
2011-11-11 03:28:46 +00:00
row = layout.row()
row.active = surface.use_shrink
row.prop(surface, "shrink_speed")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_cache(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Cache"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
return (md and
md.ui_type == 'CANVAS' and
md.canvas_settings and
md.canvas_settings.canvas_surfaces.active and
md.canvas_settings.canvas_surfaces.active.is_cache_user)
def draw(self, context):
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
cache = surface.point_cache
2011-11-11 03:28:46 +00:00
point_cache_ui(self, context, cache, (cache.is_baked is False), 'DYNAMIC_PAINT')
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Source"
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
return md and md.ui_type == 'BRUSH' and md.brush_settings
def draw(self, context):
layout = self.layout
brush = context.dynamic_paint.brush_settings
ob = context.object
2011-11-11 03:28:46 +00:00
split = layout.split()
col = split.column()
col.prop(brush, "paint_source")
2011-11-11 03:28:46 +00:00
if brush.paint_source == 'PARTICLE_SYSTEM':
col.prop_search(brush, "particle_system", ob, "particle_systems", text="")
if brush.particle_system:
col.label(text="Particle effect:")
sub = col.column()
sub.active = not brush.use_particle_radius
sub.prop(brush, "solid_radius", text="Solid Radius")
col.prop(brush, "use_particle_radius", text="Use Particle's Radius")
col.prop(brush, "smooth_radius", text="Smooth radius")
2011-11-11 03:28:46 +00:00
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 == 'DISTANCE':
sub.prop(brush, "use_proximity_project")
2011-11-11 03:28:46 +00:00
elif brush.paint_source == 'VOLUME_DISTANCE':
sub.prop(brush, "invert_proximity")
sub.prop(brush, "use_negative_volume")
2011-11-11 03:28:46 +00:00
sub = split.column()
if brush.paint_source == 'DISTANCE':
column = sub.column()
column.active = brush.use_proximity_project
column.prop(brush, "ray_direction")
sub.prop(brush, "proximity_falloff")
2011-11-11 03:28:46 +00:00
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)
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Velocity"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
return md and md.ui_type == 'BRUSH' and md.brush_settings
def draw(self, context):
layout = self.layout
brush = context.dynamic_paint.brush_settings
2011-11-11 03:28:46 +00:00
split = layout.split()
2011-11-11 03:28:46 +00:00
col = split.column()
col.prop(brush, "use_velocity_alpha")
col.prop(brush, "use_velocity_color")
2011-11-11 03:28:46 +00:00
split.prop(brush, "use_velocity_depth")
2011-11-11 03:28:46 +00:00
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()
2011-11-11 03:28:46 +00:00
row = layout.row()
row.prop(brush, "use_smudge")
sub = row.row()
sub.active = brush.use_smudge
sub.prop(brush, "smudge_strength")
2011-11-11 03:28:46 +00:00
class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
bl_label = "Dynamic Paint Waves"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
md = context.dynamic_paint
2011-11-11 03:28:46 +00:00
return md and md.ui_type == 'BRUSH' and md.brush_settings
def draw(self, context):
layout = self.layout
brush = context.dynamic_paint.brush_settings
2011-11-11 03:28:46 +00:00
layout.prop(brush, "wave_type")
2011-11-11 03:28:46 +00:00
if brush.wave_type != 'REFLECT':
row = layout.row()
row.prop(brush, "wave_factor")
row.prop(brush, "wave_clamp")
2011-11-11 03:28:46 +00:00
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.register_module(__name__)
if __name__ == "__main__":
register()