style cleanup
[blender.git] / release / scripts / startup / bl_ui / properties_data_modifier.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
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.
7 #
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.
12 #
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.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21 from bpy.types import Panel
22
23
24 class ModifierButtonsPanel():
25     bl_space_type = 'PROPERTIES'
26     bl_region_type = 'WINDOW'
27     bl_context = "modifier"
28     bl_options = {'HIDE_HEADER'}
29
30
31 class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
32     bl_label = "Modifiers"
33
34     def draw(self, context):
35         layout = self.layout
36
37         ob = context.object
38
39         layout.operator_menu_enum("object.modifier_add", "type")
40
41         for md in ob.modifiers:
42             box = layout.template_modifier(md)
43             if box:
44                 # match enum type to our functions, avoids a lookup table.
45                 getattr(self, md.type)(box, ob, md)
46
47     # the mt.type enum is (ab)used for a lookup on function names
48     # ...to avoid lengthy if statements
49     # so each type must have a function here.
50
51     def ARMATURE(self, layout, ob, md):
52         split = layout.split()
53
54         col = split.column()
55         col.label(text="Object:")
56         col.prop(md, "object", text="")
57         col.prop(md, "use_deform_preserve_volume")
58
59         col = split.column()
60         col.label(text="Bind To:")
61         col.prop(md, "use_vertex_groups", text="Vertex Groups")
62         col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
63
64         layout.separator()
65
66         row = layout.row()
67         row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
68         sub = row.row()
69         sub.active = bool(md.vertex_group)
70         sub.prop(md, "invert_vertex_group")
71
72         layout.prop(md, "use_multi_modifier")
73
74     def ARRAY(self, layout, ob, md):
75         layout.prop(md, "fit_type")
76
77         if md.fit_type == 'FIXED_COUNT':
78             layout.prop(md, "count")
79         elif md.fit_type == 'FIT_LENGTH':
80             layout.prop(md, "fit_length")
81         elif md.fit_type == 'FIT_CURVE':
82             layout.prop(md, "curve")
83
84         layout.separator()
85
86         split = layout.split()
87
88         col = split.column()
89         col.prop(md, "use_constant_offset")
90         sub = col.column()
91         sub.active = md.use_constant_offset
92         sub.prop(md, "constant_offset_displace", text="")
93
94         col.separator()
95
96         col.prop(md, "use_merge_vertices", text="Merge")
97         sub = col.column()
98         sub.active = md.use_merge_vertices
99         sub.prop(md, "use_merge_vertices_cap", text="First Last")
100         sub.prop(md, "merge_threshold", text="Distance")
101
102         col = split.column()
103         col.prop(md, "use_relative_offset")
104         sub = col.column()
105         sub.active = md.use_relative_offset
106         sub.prop(md, "relative_offset_displace", text="")
107
108         col.separator()
109
110         col.prop(md, "use_object_offset")
111         sub = col.column()
112         sub.active = md.use_object_offset
113         sub.prop(md, "offset_object", text="")
114
115         layout.separator()
116
117         layout.prop(md, "start_cap")
118         layout.prop(md, "end_cap")
119
120     def BEVEL(self, layout, ob, md):
121         split = layout.split()
122
123         split.prop(md, "width")
124         split.prop(md, "use_only_vertices")
125
126         # -- new modifier only, this may be reverted in favor of 2.62 mod.
127         '''
128         split = layout.split()
129         split.prop(md, "use_even_offset")
130         split.prop(md, "use_distance_offset")
131         '''
132         # -- end
133
134         layout.label(text="Limit Method:")
135         layout.row().prop(md, "limit_method", expand=True)
136         if md.limit_method == 'ANGLE':
137             layout.prop(md, "angle_limit")
138         elif md.limit_method == 'WEIGHT':
139             layout.row().prop(md, "edge_weight_method", expand=True)
140
141     def BOOLEAN(self, layout, ob, md):
142         split = layout.split()
143
144         col = split.column()
145         col.label(text="Operation:")
146         col.prop(md, "operation", text="")
147
148         col = split.column()
149         col.label(text="Object:")
150         col.prop(md, "object", text="")
151
152     def BUILD(self, layout, ob, md):
153         split = layout.split()
154
155         col = split.column()
156         col.prop(md, "frame_start")
157         col.prop(md, "frame_duration")
158
159         col = split.column()
160         col.prop(md, "use_random_order")
161         sub = col.column()
162         sub.active = md.use_random_order
163         sub.prop(md, "seed")
164
165     def CAST(self, layout, ob, md):
166         split = layout.split(percentage=0.25)
167
168         split.label(text="Cast Type:")
169         split.prop(md, "cast_type", text="")
170
171         split = layout.split(percentage=0.25)
172
173         col = split.column()
174         col.prop(md, "use_x")
175         col.prop(md, "use_y")
176         col.prop(md, "use_z")
177
178         col = split.column()
179         col.prop(md, "factor")
180         col.prop(md, "radius")
181         col.prop(md, "size")
182         col.prop(md, "use_radius_as_size")
183
184         split = layout.split()
185
186         col = split.column()
187         col.label(text="Vertex Group:")
188         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
189         col = split.column()
190         col.label(text="Control Object:")
191         col.prop(md, "object", text="")
192         if md.object:
193             col.prop(md, "use_transform")
194
195     def CLOTH(self, layout, ob, md):
196         layout.label(text="Settings can be found inside the Physics context")
197
198     def COLLISION(self, layout, ob, md):
199         layout.label(text="Settings can be found inside the Physics context")
200
201     def CURVE(self, layout, ob, md):
202         split = layout.split()
203
204         col = split.column()
205         col.label(text="Object:")
206         col.prop(md, "object", text="")
207         col = split.column()
208         col.label(text="Vertex Group:")
209         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
210         layout.label(text="Deformation Axis:")
211         layout.row().prop(md, "deform_axis", expand=True)
212
213     def DECIMATE(self, layout, ob, md):
214         layout.prop(md, "ratio")
215         layout.label(text="Face Count" + ": %d" % md.face_count)
216
217     def DISPLACE(self, layout, ob, md):
218         split = layout.split()
219
220         col = split.column()
221         col.label(text="Texture:")
222         col.template_ID(md, "texture", new="texture.new")
223         col.label(text="Vertex Group:")
224         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
225
226         col = split.column()
227         col.label(text="Direction:")
228         col.prop(md, "direction", text="")
229         col.label(text="Texture Coordinates:")
230         col.prop(md, "texture_coords", text="")
231         if md.texture_coords == 'OBJECT':
232             layout.prop(md, "texture_coords_object", text="Object")
233         elif md.texture_coords == 'UV' and ob.type == 'MESH':
234             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
235
236         layout.separator()
237
238         row = layout.row()
239         row.prop(md, "mid_level")
240         row.prop(md, "strength")
241
242     def DYNAMIC_PAINT(self, layout, ob, md):
243         layout.label(text="Settings can be found inside the Physics context")
244
245     def EDGE_SPLIT(self, layout, ob, md):
246         split = layout.split()
247
248         col = split.column()
249         col.prop(md, "use_edge_angle", text="Edge Angle")
250         sub = col.column()
251         sub.active = md.use_edge_angle
252         sub.prop(md, "split_angle")
253
254         split.prop(md, "use_edge_sharp", text="Sharp Edges")
255
256     def EXPLODE(self, layout, ob, md):
257         split = layout.split()
258
259         col = split.column()
260         col.label(text="Vertex group:")
261         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
262         sub = col.column()
263         sub.active = bool(md.vertex_group)
264         sub.prop(md, "protect")
265         col.label(text="Particle UV")
266         col.prop_search(md, "particle_uv", ob.data, "uv_textures", text="")
267
268         col = split.column()
269         col.prop(md, "use_edge_cut")
270         col.prop(md, "show_unborn")
271         col.prop(md, "show_alive")
272         col.prop(md, "show_dead")
273         col.prop(md, "use_size")
274
275         layout.operator("object.explode_refresh", text="Refresh")
276
277     def FLUID_SIMULATION(self, layout, ob, md):
278         layout.label(text="Settings can be found inside the Physics context")
279
280     def HOOK(self, layout, ob, md):
281         split = layout.split()
282
283         col = split.column()
284         col.label(text="Object:")
285         col.prop(md, "object", text="")
286         if md.object and md.object.type == 'ARMATURE':
287             col.label(text="Bone:")
288             col.prop_search(md, "subtarget", md.object.data, "bones", text="")
289         col = split.column()
290         col.label(text="Vertex Group:")
291         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
292
293         layout.separator()
294
295         split = layout.split()
296
297         col = split.column()
298         col.prop(md, "falloff")
299         col.prop(md, "force", slider=True)
300
301         col = split.column()
302         col.operator("object.hook_reset", text="Reset")
303         col.operator("object.hook_recenter", text="Recenter")
304
305         if ob.mode == 'EDIT':
306             layout.separator()
307             row = layout.row()
308             row.operator("object.hook_select", text="Select")
309             row.operator("object.hook_assign", text="Assign")
310
311     def LATTICE(self, layout, ob, md):
312         split = layout.split()
313
314         col = split.column()
315         col.label(text="Object:")
316         col.prop(md, "object", text="")
317
318         col = split.column()
319         col.label(text="Vertex Group:")
320         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
321
322         layout.separator()
323         layout.prop(md, "strength", slider=True)
324
325     def MASK(self, layout, ob, md):
326         split = layout.split()
327
328         col = split.column()
329         col.label(text="Mode:")
330         col.prop(md, "mode", text="")
331         col = split.column()
332         if md.mode == 'ARMATURE':
333             col.label(text="Armature:")
334             col.prop(md, "armature", text="")
335         elif md.mode == 'VERTEX_GROUP':
336             col.label(text="Vertex Group:")
337             col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
338
339         sub = col.column()
340         sub.active = bool(md.vertex_group)
341         sub.prop(md, "invert_vertex_group")
342
343     def MESH_DEFORM(self, layout, ob, md):
344         split = layout.split()
345
346         col = split.column()
347         sub = col.column()
348         sub.label(text="Object:")
349         sub.prop(md, "object", text="")
350         sub.active = not md.is_bound
351         col = split.column()
352         col.label(text="Vertex Group:")
353         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
354
355         sub = col.column()
356         sub.active = bool(md.vertex_group)
357         sub.prop(md, "invert_vertex_group")
358
359         layout.separator()
360
361         if md.is_bound:
362             layout.operator("object.meshdeform_bind", text="Unbind")
363         else:
364             layout.operator("object.meshdeform_bind", text="Bind")
365
366             row = layout.row()
367             row.prop(md, "precision")
368             row.prop(md, "use_dynamic_bind")
369
370     def MIRROR(self, layout, ob, md):
371         split = layout.split(percentage=0.25)
372
373         col = split.column()
374         col.label(text="Axis:")
375         col.prop(md, "use_x")
376         col.prop(md, "use_y")
377         col.prop(md, "use_z")
378
379         col = split.column()
380         col.label(text="Options:")
381         col.prop(md, "use_mirror_merge", text="Merge")
382         col.prop(md, "use_clip", text="Clipping")
383         col.prop(md, "use_mirror_vertex_groups", text="Vertex Groups")
384
385         col = split.column()
386         col.label(text="Textures:")
387         col.prop(md, "use_mirror_u", text="U")
388         col.prop(md, "use_mirror_v", text="V")
389
390         col = layout.column()
391
392         if md.use_mirror_merge == True:
393             col.prop(md, "merge_threshold")
394         col.label(text="Mirror Object:")
395         col.prop(md, "mirror_object", text="")
396
397     def MULTIRES(self, layout, ob, md):
398         layout.row().prop(md, "subdivision_type", expand=True)
399
400         split = layout.split()
401         col = split.column()
402         col.prop(md, "levels", text="Preview")
403         col.prop(md, "sculpt_levels", text="Sculpt")
404         col.prop(md, "render_levels", text="Render")
405
406         col = split.column()
407
408         col.enabled = ob.mode != 'EDIT'
409         col.operator("object.multires_subdivide", text="Subdivide")
410         col.operator("object.multires_higher_levels_delete", text="Delete Higher")
411         col.operator("object.multires_reshape", text="Reshape")
412         col.operator("object.multires_base_apply", text="Apply Base")
413         col.prop(md, "use_subsurf_uv")
414         col.prop(md, "show_only_control_edges")
415
416         layout.separator()
417
418         col = layout.column()
419         row = col.row()
420         if md.is_external:
421             row.operator("object.multires_external_pack", text="Pack External")
422             row.label()
423             row = col.row()
424             row.prop(md, "filepath", text="")
425         else:
426             row.operator("object.multires_external_save", text="Save External...")
427             row.label()
428
429     def OCEAN(self, layout, ob, md):
430         if not md.is_build_enabled:
431             layout.label("Built without OceanSim modifier")
432             return
433
434         layout.prop(md, "geometry_mode")
435
436         if md.geometry_mode == 'GENERATE':
437             row = layout.row()
438             row.prop(md, "repeat_x")
439             row.prop(md, "repeat_y")
440
441         layout.separator()
442
443         split = layout.split()
444
445         col = split.column()
446         col.prop(md, "time")
447         col.prop(md, "resolution")
448
449         col = split.column()
450         col.prop(md, "spatial_size")
451         col.prop(md, "depth")
452
453         layout.label("Waves:")
454
455         split = layout.split()
456
457         col = split.column()
458         col.prop(md, "choppiness")
459         col.prop(md, "wave_scale", text="Scale")
460         col.prop(md, "wave_scale_min")
461         col.prop(md, "wind_velocity")
462
463         col = split.column()
464         col.prop(md, "wave_alignment", text="Alignment")
465         sub = col.column()
466         sub.active = md.wave_alignment > 0
467         sub.prop(md, "wave_direction", text="Direction")
468         sub.prop(md, "damping")
469
470         layout.separator()
471
472         layout.prop(md, "use_normals")
473
474         split = layout.split()
475
476         col = split.column()
477         col.prop(md, "use_foam")
478         sub = col.row()
479         sub.active = md.use_foam
480         sub.prop(md, "foam_coverage", text="Coverage")
481
482         col = split.column()
483         col.active = md.use_foam
484         col.label("Foam Data Layer Name:")
485         col.prop(md, "foam_layer_name", text="")
486
487         layout.separator()
488
489         if md.is_cached:
490             layout.operator("object.ocean_bake", text="Free Bake").free = True
491         else:
492             layout.operator("object.ocean_bake")
493
494         split = layout.split()
495         split.enabled = not md.is_cached
496
497         col = split.column(align=True)
498         col.prop(md, "frame_start", text="Start")
499         col.prop(md, "frame_end", text="End")
500
501         col = split.column(align=True)
502         col.label(text="Cache path:")
503         col.prop(md, "filepath", text="")
504
505         #col.prop(md, "bake_foam_fade")
506
507     def PARTICLE_INSTANCE(self, layout, ob, md):
508         layout.prop(md, "object")
509         layout.prop(md, "particle_system_index", text="Particle System")
510
511         split = layout.split()
512         col = split.column()
513         col.label(text="Create From:")
514         col.prop(md, "use_normal")
515         col.prop(md, "use_children")
516         col.prop(md, "use_size")
517
518         col = split.column()
519         col.label(text="Show Particles When:")
520         col.prop(md, "show_alive")
521         col.prop(md, "show_unborn")
522         col.prop(md, "show_dead")
523
524         layout.separator()
525
526         layout.prop(md, "use_path", text="Create Along Paths")
527
528         split = layout.split()
529         split.active = md.use_path
530         col = split.column()
531         col.row().prop(md, "axis", expand=True)
532         col.prop(md, "use_preserve_shape")
533
534         col = split.column()
535         col.prop(md, "position", slider=True)
536         col.prop(md, "random_position", text="Random", slider=True)
537
538     def PARTICLE_SYSTEM(self, layout, ob, md):
539         layout.label(text="Settings can be found inside the Particle context")
540
541     def SCREW(self, layout, ob, md):
542         split = layout.split()
543
544         col = split.column()
545         col.prop(md, "axis")
546         col.prop(md, "object", text="AxisOb")
547         col.prop(md, "angle")
548         col.prop(md, "steps")
549         col.prop(md, "render_steps")
550         col.prop(md, "use_smooth_shade")
551
552         col = split.column()
553         row = col.row()
554         row.active = (md.object is None or md.use_object_screw_offset == False)
555         row.prop(md, "screw_offset")
556         row = col.row()
557         row.active = (md.object is not None)
558         row.prop(md, "use_object_screw_offset")
559         col.prop(md, "use_normal_calculate")
560         col.prop(md, "use_normal_flip")
561         col.prop(md, "iterations")
562
563     def SHRINKWRAP(self, layout, ob, md):
564         split = layout.split()
565         col = split.column()
566         col.label(text="Target:")
567         col.prop(md, "target", text="")
568         col = split.column()
569         col.label(text="Vertex Group:")
570         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
571
572         split = layout.split()
573
574         col = split.column()
575         col.prop(md, "offset")
576         col.prop(md, "subsurf_levels")
577
578         col = split.column()
579         col.label(text="Mode:")
580         col.prop(md, "wrap_method", text="")
581
582         if md.wrap_method == 'PROJECT':
583             split = layout.split(percentage=0.25)
584
585             col = split.column()
586             col.label(text="Axis:")
587             col.prop(md, "use_project_x")
588             col.prop(md, "use_project_y")
589             col.prop(md, "use_project_z")
590
591             col = split.column()
592             col.label(text="Direction:")
593             col.prop(md, "use_negative_direction")
594             col.prop(md, "use_positive_direction")
595
596             col = split.column()
597             col.label(text="Cull Faces:")
598             col.prop(md, "cull_face", expand=True)
599
600             layout.label(text="Auxiliary Target:")
601             layout.prop(md, "auxiliary_target", text="")
602
603         elif md.wrap_method == 'NEAREST_SURFACEPOINT':
604             layout.prop(md, "use_keep_above_surface")
605
606     def SIMPLE_DEFORM(self, layout, ob, md):
607
608         layout.row().prop(md, "deform_method", expand=True)
609
610         split = layout.split()
611
612         col = split.column()
613         col.label(text="Vertex Group:")
614         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
615
616         split = layout.split()
617
618         col = split.column()
619         col.label(text="Origin:")
620         col.prop(md, "origin", text="")
621         sub = col.column()
622         sub.active = (md.origin is not None)
623         sub.prop(md, "use_relative")
624
625         col = split.column()
626         col.label(text="Deform:")
627         col.prop(md, "factor")
628         col.prop(md, "limits", slider=True)
629         if md.deform_method in {'TAPER', 'STRETCH', 'TWIST'}:
630             col.prop(md, "lock_x")
631             col.prop(md, "lock_y")
632
633     def SMOKE(self, layout, ob, md):
634         layout.label(text="Settings can be found inside the Physics context")
635
636     def SMOOTH(self, layout, ob, md):
637         split = layout.split(percentage=0.25)
638
639         col = split.column()
640         col.label(text="Axis:")
641         col.prop(md, "use_x")
642         col.prop(md, "use_y")
643         col.prop(md, "use_z")
644
645         col = split.column()
646         col.prop(md, "factor")
647         col.prop(md, "iterations")
648         col.label(text="Vertex Group:")
649         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
650
651     def SOFT_BODY(self, layout, ob, md):
652         layout.label(text="Settings can be found inside the Physics context")
653
654     def SOLIDIFY(self, layout, ob, md):
655         split = layout.split()
656
657         col = split.column()
658         col.prop(md, "thickness")
659         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
660
661         col.label(text="Crease:")
662         col.prop(md, "edge_crease_inner", text="Inner")
663         col.prop(md, "edge_crease_outer", text="Outer")
664         col.prop(md, "edge_crease_rim", text="Rim")
665         col.label(text="Material Index Offset:")
666
667         col = split.column()
668
669         col.prop(md, "offset")
670         sub = col.column()
671         sub.active = bool(md.vertex_group)
672         sub.prop(md, "invert_vertex_group", text="Invert")
673         sub.prop(md, "thickness_vertex_group", text="Factor")
674
675         col.prop(md, "use_even_offset")
676         col.prop(md, "use_quality_normals")
677         col.prop(md, "use_rim")
678
679         sub = col.column()
680         row = sub.split(align=True, percentage=0.4)
681         row.prop(md, "material_offset", text="")
682         row = row.row()
683         row.active = md.use_rim
684         row.prop(md, "material_offset_rim", text="Rim")
685         sub.prop(md, "use_flip_normals")
686
687     def SUBSURF(self, layout, ob, md):
688         layout.row().prop(md, "subdivision_type", expand=True)
689
690         split = layout.split()
691         col = split.column()
692         col.label(text="Subdivisions:")
693         col.prop(md, "levels", text="View")
694         col.prop(md, "render_levels", text="Render")
695
696         col = split.column()
697         col.label(text="Options:")
698         col.prop(md, "use_subsurf_uv")
699         col.prop(md, "show_only_control_edges")
700
701     def SURFACE(self, layout, ob, md):
702         layout.label(text="Settings can be found inside the Physics context")
703
704     def UV_PROJECT(self, layout, ob, md):
705         split = layout.split()
706
707         col = split.column()
708         col.label(text="Image:")
709         col.prop(md, "image", text="")
710
711         col = split.column()
712         col.label(text="UV Map:")
713         col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
714
715         split = layout.split()
716         col = split.column()
717         col.prop(md, "use_image_override")
718         col.prop(md, "projector_count", text="Projectors")
719         for proj in md.projectors:
720             col.prop(proj, "object", text="")
721
722         col = split.column()
723         sub = col.column(align=True)
724         sub.prop(md, "aspect_x", text="Aspect X")
725         sub.prop(md, "aspect_y", text="Aspect Y")
726
727         sub = col.column(align=True)
728         sub.prop(md, "scale_x", text="Scale X")
729         sub.prop(md, "scale_y", text="Scale Y")
730
731     def WARP(self, layout, ob, md):
732         use_falloff = (md.falloff_type != 'NONE')
733         split = layout.split()
734
735         col = split.column()
736         col.label(text="From:")
737         col.prop(md, "object_from", text="")
738
739         col.prop(md, "use_volume_preserve")
740
741         col = split.column()
742         col.label(text="To:")
743         col.prop(md, "object_to", text="")
744         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
745
746         col = layout.column()
747
748         row = col.row(align=True)
749         row.prop(md, "strength")
750         if use_falloff:
751             row.prop(md, "falloff_radius")
752
753         col.prop(md, "falloff_type")
754         if use_falloff:
755             if md.falloff_type == 'CURVE':
756                 col.template_curve_mapping(md, "falloff_curve")
757
758         # 2 new columns
759         split = layout.split()
760         col = split.column()
761         col.label(text="Texture:")
762         col.template_ID(md, "texture", new="texture.new")
763
764         col = split.column()
765         col.label(text="Texture Coordinates:")
766         col.prop(md, "texture_coords", text="")
767
768         if md.texture_coords == 'OBJECT':
769             layout.prop(md, "texture_coords_object", text="Object")
770         elif md.texture_coords == 'UV' and ob.type == 'MESH':
771             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
772
773     def WAVE(self, layout, ob, md):
774         split = layout.split()
775
776         col = split.column()
777         col.label(text="Motion:")
778         col.prop(md, "use_x")
779         col.prop(md, "use_y")
780         col.prop(md, "use_cyclic")
781
782         col = split.column()
783         col.prop(md, "use_normal")
784         sub = col.column()
785         sub.active = md.use_normal
786         sub.prop(md, "use_normal_x", text="X")
787         sub.prop(md, "use_normal_y", text="Y")
788         sub.prop(md, "use_normal_z", text="Z")
789
790         split = layout.split()
791
792         col = split.column()
793         col.label(text="Time:")
794         sub = col.column(align=True)
795         sub.prop(md, "time_offset", text="Offset")
796         sub.prop(md, "lifetime", text="Life")
797         col.prop(md, "damping_time", text="Damping")
798
799         col = split.column()
800         col.label(text="Position:")
801         sub = col.column(align=True)
802         sub.prop(md, "start_position_x", text="X")
803         sub.prop(md, "start_position_y", text="Y")
804         col.prop(md, "falloff_radius", text="Falloff")
805
806         layout.separator()
807
808         layout.prop(md, "start_position_object")
809         layout.prop_search(md, "vertex_group", ob, "vertex_groups")
810         split = layout.split(percentage=0.33)
811         col = split.column()
812         col.label(text="Texture")
813         col = split.column()
814         col.template_ID(md, "texture", new="texture.new")
815         layout.prop(md, "texture_coords")
816         if md.texture_coords == 'MAP_UV' and ob.type == 'MESH':
817             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
818         elif md.texture_coords == 'OBJECT':
819             layout.prop(md, "texture_coords_object")
820
821         layout.separator()
822
823         split = layout.split()
824
825         col = split.column()
826         col.prop(md, "speed", slider=True)
827         col.prop(md, "height", slider=True)
828
829         col = split.column()
830         col.prop(md, "width", slider=True)
831         col.prop(md, "narrowness", slider=True)
832
833     def REMESH(self, layout, ob, md):
834         layout.prop(md, "mode")
835
836         row = layout.row()
837         row.prop(md, "octree_depth")
838         row.prop(md, "scale")
839
840         if md.mode == 'SHARP':
841             layout.prop(md, "sharpness")
842
843         layout.prop(md, "use_smooth_shade")
844         layout.prop(md, "remove_disconnected_pieces")
845         row = layout.row()
846         row.active = md.remove_disconnected_pieces
847         row.prop(md, "threshold")
848
849     @staticmethod
850     def vertex_weight_mask(layout, ob, md):
851         layout.label(text="Influence/Mask Options:")
852
853         split = layout.split(percentage=0.4)
854         split.label(text="Global Influence:")
855         split.prop(md, "mask_constant", text="")
856
857         if not md.mask_texture:
858             split = layout.split(percentage=0.4)
859             split.label(text="Vertex Group Mask:")
860             split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
861
862         if not md.mask_vertex_group:
863             split = layout.split(percentage=0.4)
864             split.label(text="Texture Mask:")
865             split.template_ID(md, "mask_texture", new="texture.new")
866             if md.mask_texture:
867                 split = layout.split()
868
869                 col = split.column()
870                 col.label(text="Texture Coordinates:")
871                 col.prop(md, "mask_tex_mapping", text="")
872
873                 col = split.column()
874                 col.label(text="Use Channel:")
875                 col.prop(md, "mask_tex_use_channel", text="")
876
877                 if md.mask_tex_mapping == 'OBJECT':
878                     layout.prop(md, "mask_tex_map_object", text="Object")
879                 elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
880                     layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
881
882     def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
883         split = layout.split()
884         col = split.column()
885         col.label(text="Vertex Group:")
886         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
887
888         col = split.column()
889         col.label(text="Default Weight:")
890         col.prop(md, "default_weight", text="")
891
892         layout.prop(md, "falloff_type")
893         if md.falloff_type == 'CURVE':
894             col = layout.column()
895             col.template_curve_mapping(md, "map_curve")
896
897         split = layout.split(percentage=0.4)
898         split.prop(md, "use_add")
899         row = split.row()
900         row.active = md.use_add
901         row.prop(md, "add_threshold")
902
903         split = layout.split(percentage=0.4)
904         split.prop(md, "use_remove")
905         row = split.row()
906         row.active = md.use_remove
907         row.prop(md, "remove_threshold")
908
909         # Common mask options
910         layout.separator()
911         self.vertex_weight_mask(layout, ob, md)
912
913     def VERTEX_WEIGHT_MIX(self, layout, ob, md):
914         split = layout.split()
915
916         col = split.column()
917         col.label(text="Vertex Group A:")
918         col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
919         col.label(text="Default Weight A:")
920         col.prop(md, "default_weight_a", text="")
921
922         col.label(text="Mix Mode:")
923         col.prop(md, "mix_mode", text="")
924
925         col = split.column()
926         col.label(text="Vertex Group B:")
927         col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
928         col.label(text="Default Weight B:")
929         col.prop(md, "default_weight_b", text="")
930
931         col.label(text="Mix Set:")
932         col.prop(md, "mix_set", text="")
933
934         # Common mask options
935         layout.separator()
936         self.vertex_weight_mask(layout, ob, md)
937
938     def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
939         split = layout.split()
940
941         col = split.column()
942         col.label(text="Vertex Group:")
943         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
944
945         col = split.column()
946         col.label(text="Target Object:")
947         col.prop(md, "target", text="")
948
949         layout.row().prop(md, "proximity_mode", expand=True)
950         if md.proximity_mode == 'GEOMETRY':
951             layout.row().prop(md, "proximity_geometry", expand=True)
952
953         row = layout.row()
954         row.prop(md, "min_dist")
955         row.prop(md, "max_dist")
956
957         layout.prop(md, "falloff_type")
958
959         # Common mask options
960         layout.separator()
961         self.vertex_weight_mask(layout, ob, md)
962
963     def SKIN(self, layout, ob, md):
964         layout.operator("object.skin_armature_create", text="Create Armature")
965
966         layout.separator()
967         layout.prop(md, "branch_smoothing")
968         layout.prop(md, "use_smooth_shade")
969
970         layout.label(text="Selected Vertices:")
971         split = layout.split()
972
973         col = split.column(align=True)
974         col.operator("object.skin_loose_mark_clear", text="Mark Loose").action = 'MARK'
975         col.operator("object.skin_loose_mark_clear", text="Clear Loose").action = 'CLEAR'
976
977         col = split.column()
978         col.operator("object.skin_root_mark", text="Mark Root")
979         col.operator("object.skin_radii_equalize", text="Equalize Radii")
980
981         layout.label(text="Symmetry Axes:")
982         col = layout.column()
983         col.prop(md, "use_x_symmetry")
984         col.prop(md, "use_y_symmetry")
985         col.prop(md, "use_z_symmetry")
986
987 if __name__ == "__main__":  # only for live edit.
988     bpy.utils.register_module(__name__)