1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
22 from bl_ui.properties_physics_common import (
27 class PhysicButtonsPanel():
28 bl_space_type = 'PROPERTIES'
29 bl_region_type = 'WINDOW'
30 bl_context = "physics"
33 def poll(cls, context):
35 rd = context.scene.render
36 return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and (context.dynamic_paint)
39 class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
40 bl_label = "Dynamic Paint"
42 def draw(self, context):
45 md = context.dynamic_paint
49 layout.prop(md, "ui_type", expand=True)
51 if (md.ui_type == "CANVAS"):
52 canvas = md.canvas_settings
55 layout.operator("dpaint.type_toggle", text="Add Canvas").type = 'CANVAS'
57 layout.operator("dpaint.type_toggle", text="Remove Canvas", icon='X').type = 'CANVAS'
59 surface = canvas.canvas_surfaces.active
61 row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2)
63 col = row.column(align=True)
64 col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
65 col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
68 layout.prop(surface, "name")
69 layout.prop(surface, "surface_format", expand=False)
72 if surface.surface_format != "VERTEX":
73 col.label(text="Quality:")
74 col.prop(surface, "image_resolution")
75 col.prop(surface, "use_anti_aliasing")
78 col.label(text="Frames:")
81 col = split.column(align=True)
82 col.prop(surface, "start_frame", text="Start")
83 col.prop(surface, "end_frame", text="End")
86 col.prop(surface, "substeps")
88 elif (md.ui_type == "BRUSH"):
89 brush = md.brush_settings
92 layout.operator("dpaint.type_toggle", text="Add Brush").type = 'BRUSH'
94 layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
96 split = layout.split()
99 col.prop(brush, "absolute_alpha")
100 col.prop(brush, "paint_erase")
101 col.prop(brush, "paint_wetness", text="Wetness")
105 sub.active = (brush.paint_source != "PSYS");
106 sub.prop(brush, "use_material")
107 if brush.use_material and brush.paint_source != "PSYS":
108 col.prop(brush, "material", text="")
109 col.prop(brush, "paint_alpha", text="Alpha Factor")
111 col.prop(brush, "paint_color", text="")
112 col.prop(brush, "paint_alpha", text="Alpha")
115 class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, bpy.types.Panel):
116 bl_label = "Dynamic Paint Advanced"
119 def poll(cls, context):
120 md = context.dynamic_paint
121 return md and (md.ui_type == "CANVAS") and (md.canvas_settings) and (md.canvas_settings.canvas_surfaces.active)
123 def draw(self, context):
126 canvas = context.dynamic_paint.canvas_settings
127 surface = canvas.canvas_surfaces.active
130 layout.prop(surface, "surface_type", expand=False)
134 if (surface.surface_type == "PAINT"):
135 layout.label(text="Wetmap drying:")
136 split = layout.split(percentage=0.8)
137 split.prop(surface, "dry_speed", text="Dry Time")
138 split.prop(surface, "use_dry_log", text="Slow")
140 if (surface.surface_type != "WAVE"):
141 if (surface.surface_type == "DISPLACE"):
142 layout.prop(surface, "use_dissolve", text="Dissolve:")
143 elif (surface.surface_type == "WEIGHT"):
144 layout.prop(surface, "use_dissolve", text="Fade:")
146 layout.prop(surface, "use_dissolve", text="Dissolve:")
147 sub = layout.column()
148 sub.active = surface.use_dissolve
149 split = sub.split(percentage=0.8)
150 split.prop(surface, "dissolve_speed", text="Time")
151 split.prop(surface, "use_dissolve_log", text="Slow")
154 if (surface.surface_type == "DISPLACE"):
155 layout.prop(surface, "incremental_disp")
156 if (surface.surface_format == "VERTEX"):
157 split = layout.split()
159 col.prop(surface, "depth_clamp")
161 col.prop(surface, "disp_factor")
163 if (surface.surface_type == "WAVE"):
164 layout.prop(surface, "wave_open_borders")
166 split = layout.split()
168 col = split.column(align=True)
169 col.prop(surface, "wave_timescale")
170 col.prop(surface, "wave_speed")
172 col = split.column(align=True)
173 col.prop(surface, "wave_damping")
174 col.prop(surface, "wave_spring")
176 layout.label(text="Brush Group:")
177 layout.prop(surface, "brush_group", text="")
179 class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, bpy.types.Panel):
180 bl_label = "Dynamic Paint Output"
181 bl_options = {'DEFAULT_CLOSED'}
184 def poll(cls, context):
185 md = context.dynamic_paint
186 if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
188 surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
189 return (surface and not (surface.surface_format=="VERTEX" and (surface.surface_type=="DISPLACE" or surface.surface_type=="WAVE")))
191 def draw(self, context):
194 canvas = context.dynamic_paint.canvas_settings
195 surface = canvas.canvas_surfaces.active
198 # vertex format outputs
199 if (surface.surface_format == "VERTEX"):
200 if (surface.surface_type == "PAINT"):
201 # toggle active preview
202 layout.prop(surface, "preview_id")
206 row.prop_search(surface, "output_name", ob.data, "vertex_colors", text="Paintmap layer: ")
208 if (surface.output_exists(object=ob, index=0)):
210 col = row.column(align=True)
211 col.operator("dpaint.output_toggle", icon=ic, text="").index = 0
215 row.prop_search(surface, "output_name2", ob.data, "vertex_colors", text="Wetmap layer: ")
217 if (surface.output_exists(object=ob, index=1)):
219 col = row.column(align=True)
220 col.operator("dpaint.output_toggle", icon=ic, text="").index = 1
221 if (surface.surface_type == "WEIGHT"):
223 row.prop_search(surface, "output_name", ob, "vertex_groups", text="Vertex Group: ")
225 if (surface.output_exists(object=ob, index=0)):
227 col = row.column(align=True)
228 col.operator("dpaint.output_toggle", icon=ic, text="").index = 0
230 # image format outputs
231 if (surface.surface_format == "IMAGE"):
232 col = layout.column()
233 col.label(text="UV layer:")
234 col.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="")
237 col = layout.column()
238 col.prop(surface, "image_output_path", text="Output directory")
239 col.prop(surface, "image_fileformat", text="Image Format")
241 if (surface.surface_type == "PAINT"):
244 col.prop(surface, "do_output1", text="Output Paintmaps:")
246 sub.prop(surface, "premultiply", text="Premultiply alpha")
247 sub.active = surface.do_output1
248 sub = layout.column()
249 sub.active = surface.do_output1
250 sub.prop(surface, "output_name", text="Filename: ")
252 col = layout.column()
253 col.prop(surface, "do_output2", text="Output Wetmaps:")
255 sub.active = surface.do_output2
256 sub.prop(surface, "output_name2", text="Filename: ")
258 col.prop(surface, "output_name", text="Filename: ")
259 if (surface.surface_type == "DISPLACE"):
260 col.prop(surface, "disp_type", text="Displace Type")
261 col.prop(surface, "depth_clamp")
262 if (surface.surface_type == "WAVE"):
263 col.prop(surface, "depth_clamp", text="Wave Clamp")
266 layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
267 if len(canvas.ui_info) != 0:
268 layout.label(text=canvas.ui_info)
270 class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, bpy.types.Panel):
271 bl_label = "Dynamic Paint Initial Color"
272 bl_options = {'DEFAULT_CLOSED'}
275 def poll(cls, context):
276 md = context.dynamic_paint
277 if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
279 surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
280 return (surface and surface.surface_type=="PAINT")
282 def draw(self, context):
285 canvas = context.dynamic_paint.canvas_settings
286 surface = canvas.canvas_surfaces.active
289 layout.prop(surface, "init_color_type", expand=False)
293 if (surface.init_color_type == "COLOR"):
294 layout.prop(surface, "init_color")
296 if (surface.init_color_type == "TEXTURE"):
297 layout.prop(surface, "init_texture")
298 layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Layer:")
300 if (surface.init_color_type == "VERTEXCOLOR"):
301 layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer: ")
303 class PHYSICS_PT_dp_effects(PhysicButtonsPanel, bpy.types.Panel):
304 bl_label = "Dynamic Paint Effects"
305 bl_options = {'DEFAULT_CLOSED'}
308 def poll(cls, context):
309 md = context.dynamic_paint
310 if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
312 surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
313 return surface and (surface.surface_type == "PAINT")
315 def draw(self, context):
318 canvas = context.dynamic_paint.canvas_settings
319 surface = canvas.canvas_surfaces.active
321 layout.prop(surface, "effect_ui", expand=True)
323 if surface.effect_ui == "SPREAD":
324 layout.prop(surface, "use_spread")
325 col = layout.column()
326 col.active = surface.use_spread
329 sub.prop(surface, "spread_speed")
331 sub.prop(surface, "color_spread_speed")
333 elif surface.effect_ui == "DRIP":
334 layout.prop(surface, "use_drip")
335 col = layout.column()
336 col.active = surface.use_drip
337 effector_weights_ui(self, context, surface.effector_weights)
338 split = layout.split()
340 layout.label(text="Surface Movement:")
341 split = layout.split()
343 col.prop(surface, "drip_velocity", slider=True)
345 col.prop(surface, "drip_acceleration", slider=True)
347 elif surface.effect_ui == "SHRINK":
348 layout.prop(surface, "use_shrink")
349 col = layout.column()
350 col.active = surface.use_shrink
351 col.prop(surface, "shrink_speed")
354 class PHYSICS_PT_dp_cache(PhysicButtonsPanel, bpy.types.Panel):
355 bl_label = "Dynamic Paint Cache"
356 bl_options = {'DEFAULT_CLOSED'}
359 def poll(cls, context):
360 md = context.dynamic_paint
361 return md and (md.ui_type == "CANVAS") and (md.canvas_settings) and \
362 (md.canvas_settings.canvas_surfaces.active) and (md.canvas_settings.canvas_surfaces.active.uses_cache)
364 def draw(self, context):
367 surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
368 cache = surface.point_cache
370 point_cache_ui(self, context, cache, (cache.is_baked is False), 'DYNAMIC_PAINT')
373 class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, bpy.types.Panel):
374 bl_label = "Dynamic Paint Source"
377 def poll(cls, context):
378 md = context.dynamic_paint
379 return md and (md.ui_type == "BRUSH") and (md.brush_settings)
381 def draw(self, context):
384 brush = context.dynamic_paint.brush_settings
387 split = layout.split()
389 col.prop(brush, "paint_source")
391 if brush.paint_source == "PSYS":
392 col.prop_search(brush, "psys", ob, "particle_systems", text="")
394 col.label(text="Particle effect:")
396 sub.active = not brush.use_part_radius
397 sub.prop(brush, "solid_radius", text="Solid Radius")
398 col.prop(brush, "use_part_radius", text="Use Particle's Radius")
399 col.prop(brush, "smooth_radius", text="Smooth radius")
401 if brush.paint_source in {'DISTANCE', 'VOLDIST', 'POINT'}:
402 col.prop(brush, "paint_distance", text="Paint Distance")
403 split = layout.row().split(percentage=0.4)
405 if brush.paint_source == 'DISTANCE':
406 sub.prop(brush, "prox_project")
407 if brush.paint_source == "VOLDIST":
408 sub.prop(brush, "prox_inverse")
411 if brush.paint_source == 'DISTANCE':
412 column = sub.column()
413 column.active = brush.prox_project
414 column.prop(brush, "ray_dir")
415 sub.prop(brush, "prox_falloff")
416 if brush.prox_falloff == "RAMP":
417 col = layout.row().column()
419 col.prop(brush, "prox_ramp_alpha", text="Only Use Alpha")
420 col.template_color_ramp(brush, "paint_ramp", expand=True)
422 class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, bpy.types.Panel):
423 bl_label = "Dynamic Paint Velocity"
424 bl_options = {'DEFAULT_CLOSED'}
427 def poll(cls, context):
428 md = context.dynamic_paint
429 return md and (md.ui_type == "BRUSH") and (md.brush_settings)
431 def draw(self, context):
434 brush = context.dynamic_paint.brush_settings
437 col = layout.row().column()
438 col.label(text="Brush Velocity Settings:")
439 split = layout.split()
441 col.prop(brush, "velocity_alpha")
442 col.prop(brush, "velocity_color")
444 col.prop(brush, "velocity_depth")
445 sub = layout.row().column()
446 sub.active = (brush.velocity_alpha or brush.velocity_color or brush.velocity_depth)
447 sub.prop(brush, "max_velocity")
448 sub.template_color_ramp(brush, "velocity_ramp", expand=True)
450 layout.label(text="Smudge:")
451 layout.prop(brush, "do_smudge")
452 layout.prop(brush, "smudge_strength")
454 class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, bpy.types.Panel):
455 bl_label = "Dynamic Paint Wave"
456 bl_options = {'DEFAULT_CLOSED'}
459 def poll(cls, context):
460 md = context.dynamic_paint
461 return md and (md.ui_type == "BRUSH") and (md.brush_settings)
463 def draw(self, context):
466 brush = context.dynamic_paint.brush_settings
469 layout.prop(brush, "wave_type")
470 if (brush.wave_type != "REFLECT"):
471 split = layout.split(percentage=0.5)
473 col.prop(brush, "wave_factor")
475 col.prop(brush, "wave_clamp")
478 bpy.utils.register_module(__name__)
482 bpy.utils.register_module(__name__)
484 if __name__ == "__main__":