Patch: [#30652] Influence slider for Lattice Modifier
[blender-staging.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, "influence", 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         flow = layout.column_flow()
444         flow.prop(md, "time")
445         flow.prop(md, "resolution")
446         flow.prop(md, "spatial_size")
447         flow.prop(md, "depth")
448
449         layout.label("Waves:")
450
451         split = layout.split()
452
453         col = split.column()
454         col.prop(md, "choppiness")
455         col.prop(md, "wave_scale", text="Scale")
456         col.prop(md, "wave_scale_min")
457         col.prop(md, "wind_velocity")
458
459         col = split.column()
460         col.prop(md, "wave_alignment", text="Alignment")
461         sub = col.column()
462         sub.active = md.wave_alignment > 0
463         sub.prop(md, "wave_direction", text="Direction")
464         sub.prop(md, "damping")
465
466         layout.separator()
467
468         layout.prop(md, "use_normals")
469
470         split = layout.split()
471
472         col = split.column()
473         col.prop(md, "use_foam")
474         sub = col.row()
475         sub.active = md.use_foam
476         sub.prop(md, "foam_coverage", text="Coverage")
477
478         col = split.column()
479         col.active = md.use_foam
480         col.label("Foam Data Layer Name:")
481         col.prop(md, "foam_layer_name", text="")
482
483         layout.separator()
484
485         if md.is_cached:
486             layout.operator("object.ocean_bake", text="Free Bake").free = True
487         else:
488             layout.operator("object.ocean_bake")
489
490         split = layout.split()
491         split.enabled = not md.is_cached
492
493         col = split.column(align=True)
494         col.prop(md, "frame_start", text="Start")
495         col.prop(md, "frame_end", text="End")
496
497         col = split.column(align=True)
498         col.label(text="Cache path:")
499         col.prop(md, "filepath", text="")
500
501         #col.prop(md, "bake_foam_fade")
502
503     def PARTICLE_INSTANCE(self, layout, ob, md):
504         layout.prop(md, "object")
505         layout.prop(md, "particle_system_index", text="Particle System")
506
507         split = layout.split()
508         col = split.column()
509         col.label(text="Create From:")
510         col.prop(md, "use_normal")
511         col.prop(md, "use_children")
512         col.prop(md, "use_size")
513
514         col = split.column()
515         col.label(text="Show Particles When:")
516         col.prop(md, "show_alive")
517         col.prop(md, "show_unborn")
518         col.prop(md, "show_dead")
519
520         layout.separator()
521
522         layout.prop(md, "use_path", text="Create Along Paths")
523
524         split = layout.split()
525         split.active = md.use_path
526         col = split.column()
527         col.row().prop(md, "axis", expand=True)
528         col.prop(md, "use_preserve_shape")
529
530         col = split.column()
531         col.prop(md, "position", slider=True)
532         col.prop(md, "random_position", text="Random", slider=True)
533
534     def PARTICLE_SYSTEM(self, layout, ob, md):
535         layout.label(text="Settings can be found inside the Particle context")
536
537     def SCREW(self, layout, ob, md):
538         split = layout.split()
539
540         col = split.column()
541         col.prop(md, "axis")
542         col.prop(md, "object", text="AxisOb")
543         col.prop(md, "angle")
544         col.prop(md, "steps")
545         col.prop(md, "render_steps")
546
547         col = split.column()
548         row = col.row()
549         row.active = (md.object is None or md.use_object_screw_offset == False)
550         row.prop(md, "screw_offset")
551         row = col.row()
552         row.active = (md.object is not None)
553         row.prop(md, "use_object_screw_offset")
554         col.prop(md, "use_normal_calculate")
555         col.prop(md, "use_normal_flip")
556         col.prop(md, "iterations")
557
558     def SHRINKWRAP(self, layout, ob, md):
559         split = layout.split()
560         col = split.column()
561         col.label(text="Target:")
562         col.prop(md, "target", text="")
563         col = split.column()
564         col.label(text="Vertex Group:")
565         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
566
567         split = layout.split()
568
569         col = split.column()
570         col.prop(md, "offset")
571         col.prop(md, "subsurf_levels")
572
573         col = split.column()
574         col.label(text="Mode:")
575         col.prop(md, "wrap_method", text="")
576
577         if md.wrap_method == 'PROJECT':
578             split = layout.split(percentage=0.25)
579
580             col = split.column()
581             col.label(text="Axis:")
582             col.prop(md, "use_project_x")
583             col.prop(md, "use_project_y")
584             col.prop(md, "use_project_z")
585
586             col = split.column()
587             col.label(text="Direction:")
588             col.prop(md, "use_negative_direction")
589             col.prop(md, "use_positive_direction")
590
591             col = split.column()
592             col.label(text="Cull Faces:")
593             col.prop(md, "cull_face", expand=True)
594
595             layout.label(text="Auxiliary Target:")
596             layout.prop(md, "auxiliary_target", text="")
597
598         elif md.wrap_method == 'NEAREST_SURFACEPOINT':
599             layout.prop(md, "use_keep_above_surface")
600
601     def SIMPLE_DEFORM(self, layout, ob, md):
602
603         layout.row().prop(md, "deform_method", expand=True)
604
605         split = layout.split()
606
607         col = split.column()
608         col.label(text="Vertex Group:")
609         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
610
611         split = layout.split()
612
613         col = split.column()
614         col.label(text="Origin:")
615         col.prop(md, "origin", text="")
616         sub = col.column()
617         sub.active = (md.origin is not None)
618         sub.prop(md, "use_relative")
619
620         col = split.column()
621         col.label(text="Deform:")
622         col.prop(md, "factor")
623         col.prop(md, "limits", slider=True)
624         if md.deform_method in {'TAPER', 'STRETCH', 'TWIST'}:
625             col.prop(md, "lock_x")
626             col.prop(md, "lock_y")
627
628     def SMOKE(self, layout, ob, md):
629         layout.label(text="Settings can be found inside the Physics context")
630
631     def SMOOTH(self, layout, ob, md):
632         split = layout.split(percentage=0.25)
633
634         col = split.column()
635         col.label(text="Axis:")
636         col.prop(md, "use_x")
637         col.prop(md, "use_y")
638         col.prop(md, "use_z")
639
640         col = split.column()
641         col.prop(md, "factor")
642         col.prop(md, "iterations")
643         col.label(text="Vertex Group:")
644         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
645
646     def SOFT_BODY(self, layout, ob, md):
647         layout.label(text="Settings can be found inside the Physics context")
648
649     def SOLIDIFY(self, layout, ob, md):
650         split = layout.split()
651
652         col = split.column()
653         col.prop(md, "thickness")
654         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
655
656         col.label(text="Crease:")
657         col.prop(md, "edge_crease_inner", text="Inner")
658         col.prop(md, "edge_crease_outer", text="Outer")
659         col.prop(md, "edge_crease_rim", text="Rim")
660         col.label(text="Material Index Offset:")
661
662         col = split.column()
663
664         col.prop(md, "offset")
665         sub = col.column()
666         sub.active = bool(md.vertex_group)
667         sub.prop(md, "invert_vertex_group", text="Invert")
668         sub.prop(md, "thickness_vertex_group", text="Factor")
669
670         col.prop(md, "use_even_offset")
671         col.prop(md, "use_quality_normals")
672         col.prop(md, "use_rim")
673
674         sub = col.column()
675         row = sub.split(align=True, percentage=0.4)
676         row.prop(md, "material_offset", text="")
677         row = row.row()
678         row.active = md.use_rim
679         row.prop(md, "material_offset_rim", text="Rim")
680
681     def SUBSURF(self, layout, ob, md):
682         layout.row().prop(md, "subdivision_type", expand=True)
683
684         split = layout.split()
685         col = split.column()
686         col.label(text="Subdivisions:")
687         col.prop(md, "levels", text="View")
688         col.prop(md, "render_levels", text="Render")
689
690         col = split.column()
691         col.label(text="Options:")
692         col.prop(md, "use_subsurf_uv")
693         col.prop(md, "show_only_control_edges")
694
695     def SURFACE(self, layout, ob, md):
696         layout.label(text="Settings can be found inside the Physics context")
697
698     def UV_PROJECT(self, layout, ob, md):
699         split = layout.split()
700
701         col = split.column()
702         col.label(text="Image:")
703         col.prop(md, "image", text="")
704
705         col = split.column()
706         col.label(text="UV Map:")
707         col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
708
709         split = layout.split()
710         col = split.column()
711         col.prop(md, "use_image_override")
712         col.prop(md, "projector_count", text="Projectors")
713         for proj in md.projectors:
714             col.prop(proj, "object", text="")
715
716         col = split.column()
717         sub = col.column(align=True)
718         sub.prop(md, "aspect_x", text="Aspect X")
719         sub.prop(md, "aspect_y", text="Aspect Y")
720
721         sub = col.column(align=True)
722         sub.prop(md, "scale_x", text="Scale X")
723         sub.prop(md, "scale_y", text="Scale Y")
724
725     def WARP(self, layout, ob, md):
726         use_falloff = (md.falloff_type != 'NONE')
727         split = layout.split()
728
729         col = split.column()
730         col.label(text="From:")
731         col.prop(md, "object_from", text="")
732
733         col.prop(md, "use_volume_preserve")
734
735         col = split.column()
736         col.label(text="To:")
737         col.prop(md, "object_to", text="")
738         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
739
740         col = layout.column()
741
742         row = col.row(align=True)
743         row.prop(md, "strength")
744         if use_falloff:
745             row.prop(md, "falloff_radius")
746
747         col.prop(md, "falloff_type")
748         if use_falloff:
749             if md.falloff_type == 'CURVE':
750                 col.template_curve_mapping(md, "falloff_curve")
751
752         # 2 new columns
753         split = layout.split()
754         col = split.column()
755         col.label(text="Texture:")
756         col.template_ID(md, "texture", new="texture.new")
757
758         col = split.column()
759         col.label(text="Texture Coordinates:")
760         col.prop(md, "texture_coords", text="")
761
762         if md.texture_coords == 'OBJECT':
763             layout.prop(md, "texture_coords_object", text="Object")
764         elif md.texture_coords == 'UV' and ob.type == 'MESH':
765             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
766
767     def WAVE(self, layout, ob, md):
768         split = layout.split()
769
770         col = split.column()
771         col.label(text="Motion:")
772         col.prop(md, "use_x")
773         col.prop(md, "use_y")
774         col.prop(md, "use_cyclic")
775
776         col = split.column()
777         col.prop(md, "use_normal")
778         sub = col.column()
779         sub.active = md.use_normal
780         sub.prop(md, "use_normal_x", text="X")
781         sub.prop(md, "use_normal_y", text="Y")
782         sub.prop(md, "use_normal_z", text="Z")
783
784         split = layout.split()
785
786         col = split.column()
787         col.label(text="Time:")
788         sub = col.column(align=True)
789         sub.prop(md, "time_offset", text="Offset")
790         sub.prop(md, "lifetime", text="Life")
791         col.prop(md, "damping_time", text="Damping")
792
793         col = split.column()
794         col.label(text="Position:")
795         sub = col.column(align=True)
796         sub.prop(md, "start_position_x", text="X")
797         sub.prop(md, "start_position_y", text="Y")
798         col.prop(md, "falloff_radius", text="Falloff")
799
800         layout.separator()
801
802         layout.prop(md, "start_position_object")
803         layout.prop_search(md, "vertex_group", ob, "vertex_groups")
804         split = layout.split(percentage=0.33)
805         col = split.column()
806         col.label(text="Texture")
807         col = split.column()
808         col.template_ID(md, "texture", new="texture.new")
809         layout.prop(md, "texture_coords")
810         if md.texture_coords == 'MAP_UV' and ob.type == 'MESH':
811             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
812         elif md.texture_coords == 'OBJECT':
813             layout.prop(md, "texture_coords_object")
814
815         layout.separator()
816
817         split = layout.split()
818
819         col = split.column()
820         col.prop(md, "speed", slider=True)
821         col.prop(md, "height", slider=True)
822
823         col = split.column()
824         col.prop(md, "width", slider=True)
825         col.prop(md, "narrowness", slider=True)
826
827     def REMESH(self, layout, ob, md):
828         layout.prop(md, "mode")
829
830         row = layout.row()
831         row.prop(md, "octree_depth")
832         row.prop(md, "scale")
833
834         if md.mode == 'SHARP':
835             layout.prop(md, "sharpness")
836
837         layout.prop(md, "remove_disconnected_pieces")
838         row = layout.row()
839         row.active = md.remove_disconnected_pieces
840         row.prop(md, "threshold")
841
842     @staticmethod
843     def vertex_weight_mask(layout, ob, md):
844         layout.label(text="Influence/Mask Options:")
845
846         split = layout.split(percentage=0.4)
847         split.label(text="Global Influence:")
848         split.prop(md, "mask_constant", text="")
849
850         if not md.mask_texture:
851             split = layout.split(percentage=0.4)
852             split.label(text="Vertex Group Mask:")
853             split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
854
855         if not md.mask_vertex_group:
856             split = layout.split(percentage=0.4)
857             split.label(text="Texture Mask:")
858             split.template_ID(md, "mask_texture", new="texture.new")
859             if md.mask_texture:
860                 split = layout.split()
861
862                 col = split.column()
863                 col.label(text="Texture Coordinates:")
864                 col.prop(md, "mask_tex_mapping", text="")
865
866                 col = split.column()
867                 col.label(text="Use Channel:")
868                 col.prop(md, "mask_tex_use_channel", text="")
869
870                 if md.mask_tex_mapping == 'OBJECT':
871                     layout.prop(md, "mask_tex_map_object", text="Object")
872                 elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
873                     layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
874
875     def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
876         split = layout.split()
877         col = split.column()
878         col.label(text="Vertex Group:")
879         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
880
881         col = split.column()
882         col.label(text="Default Weight:")
883         col.prop(md, "default_weight", text="")
884
885         layout.prop(md, "falloff_type")
886         if md.falloff_type == 'CURVE':
887             col = layout.column()
888             col.template_curve_mapping(md, "map_curve")
889
890         split = layout.split(percentage=0.4)
891         split.prop(md, "use_add")
892         row = split.row()
893         row.active = md.use_add
894         row.prop(md, "add_threshold")
895
896         split = layout.split(percentage=0.4)
897         split.prop(md, "use_remove")
898         row = split.row()
899         row.active = md.use_remove
900         row.prop(md, "remove_threshold")
901
902         # Common mask options
903         layout.separator()
904         self.vertex_weight_mask(layout, ob, md)
905
906     def VERTEX_WEIGHT_MIX(self, layout, ob, md):
907         split = layout.split()
908
909         col = split.column()
910         col.label(text="Vertex Group A:")
911         col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
912         col.label(text="Default Weight A:")
913         col.prop(md, "default_weight_a", text="")
914
915         col.label(text="Mix Mode:")
916         col.prop(md, "mix_mode", text="")
917
918         col = split.column()
919         col.label(text="Vertex Group B:")
920         col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
921         col.label(text="Default Weight B:")
922         col.prop(md, "default_weight_b", text="")
923
924         col.label(text="Mix Set:")
925         col.prop(md, "mix_set", text="")
926
927         # Common mask options
928         layout.separator()
929         self.vertex_weight_mask(layout, ob, md)
930
931     def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
932         split = layout.split()
933
934         col = split.column()
935         col.label(text="Vertex Group:")
936         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
937
938         col = split.column()
939         col.label(text="Target Object:")
940         col.prop(md, "target", text="")
941
942         layout.row().prop(md, "proximity_mode", expand=True)
943         if md.proximity_mode == 'GEOMETRY':
944             layout.row().prop(md, "proximity_geometry", expand=True)
945
946         row = layout.row()
947         row.prop(md, "min_dist")
948         row.prop(md, "max_dist")
949
950         layout.prop(md, "falloff_type")
951
952         # Common mask options
953         layout.separator()
954         self.vertex_weight_mask(layout, ob, md)
955
956 if __name__ == "__main__":  # only for live edit.
957     bpy.utils.register_module(__name__)