79846df14aef27404e8a6858b08e94548dbdb018
[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 MESH_CACHE(self, layout, ob, md):
166         layout.prop(md, "cache_format")
167         layout.prop(md, "filepath")
168
169         layout.label(text="Evaluation:")
170         layout.prop(md, "factor", slider=True)
171         layout.prop(md, "interpolation")
172
173         layout.label(text="Time Mapping:")
174
175         row = layout.row()
176         row.prop(md, "time_mode", expand=True)
177         row = layout.row()
178         row.prop(md, "play_mode", expand=True)
179         if md.play_mode == 'SCENE':
180             layout.prop(md, "frame_start")
181             layout.prop(md, "frame_scale")
182         else:
183             time_mode = md.time_mode
184             if time_mode == 'FRAME':
185                 layout.prop(md, "eval_frame")
186             elif time_mode == 'TIME':
187                 layout.prop(md, "eval_time")
188             elif time_mode == 'FACTOR':
189                 layout.prop(md, "eval_factor")
190
191         layout.label(text="Axis Mapping:")
192         split = layout.split(percentage=0.5, align=True)
193         split.alert = (md.forward_axis[-1] == md.up_axis[-1])
194         split.label("Forward/Up Axis:")
195         split.prop(md, "forward_axis", text="")
196         split.prop(md, "up_axis", text="")
197         split = layout.split(percentage=0.5)
198         split.label(text="Flip Axis:")
199         row = split.row()
200         row.prop(md, "flip_axis")
201
202     def CAST(self, layout, ob, md):
203         split = layout.split(percentage=0.25)
204
205         split.label(text="Cast Type:")
206         split.prop(md, "cast_type", text="")
207
208         split = layout.split(percentage=0.25)
209
210         col = split.column()
211         col.prop(md, "use_x")
212         col.prop(md, "use_y")
213         col.prop(md, "use_z")
214
215         col = split.column()
216         col.prop(md, "factor")
217         col.prop(md, "radius")
218         col.prop(md, "size")
219         col.prop(md, "use_radius_as_size")
220
221         split = layout.split()
222
223         col = split.column()
224         col.label(text="Vertex Group:")
225         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
226         col = split.column()
227         col.label(text="Control Object:")
228         col.prop(md, "object", text="")
229         if md.object:
230             col.prop(md, "use_transform")
231
232     def CLOTH(self, layout, ob, md):
233         layout.label(text="Settings can be found inside the Physics context")
234
235     def COLLISION(self, layout, ob, md):
236         layout.label(text="Settings can be found inside the Physics context")
237
238     def CURVE(self, layout, ob, md):
239         split = layout.split()
240
241         col = split.column()
242         col.label(text="Object:")
243         col.prop(md, "object", text="")
244         col = split.column()
245         col.label(text="Vertex Group:")
246         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
247         layout.label(text="Deformation Axis:")
248         layout.row().prop(md, "deform_axis", expand=True)
249
250     def DECIMATE(self, layout, ob, md):
251         row = layout.row()
252         row.prop(md, "decimate_type", expand=True)
253         decimate_type = md.decimate_type
254
255         if decimate_type == 'COLLAPSE':
256             layout.prop(md, "ratio")
257             row = layout.row()
258             row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
259             row.prop(md, "invert_vertex_group")
260             layout.prop(md, "use_collapse_triangulate")
261         elif decimate_type == 'UNSUBDIV':
262             layout.prop(md, "iterations")
263         else:  # decimate_type == 'DISSOLVE':
264             layout.prop(md, "angle_limit")
265             layout.prop(md, "use_dissolve_boundaries")
266
267         layout.label(text="Face Count" + ": %d" % md.face_count)
268
269     def DISPLACE(self, layout, ob, md):
270         has_texture = (md.texture is not None)
271
272         split = layout.split()
273
274         col = split.column()
275         col.label(text="Texture:")
276         col.template_ID(md, "texture", new="texture.new")
277         col.label(text="Vertex Group:")
278         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
279
280         col = split.column()
281         col.label(text="Direction:")
282         col.prop(md, "direction", text="")
283         colsub = col.column()
284         colsub.active = has_texture
285         colsub.label(text="Texture Coordinates:")
286         colsub.prop(md, "texture_coords", text="")
287         if md.texture_coords == 'OBJECT':
288             row = layout.row()
289             row.active = has_texture
290             row.prop(md, "texture_coords_object", text="Object")
291         elif md.texture_coords == 'UV' and ob.type == 'MESH':
292             row = layout.row()
293             row.active = has_texture
294             row.prop_search(md, "uv_layer", ob.data, "uv_textures")
295
296         layout.separator()
297
298         row = layout.row()
299         row.prop(md, "mid_level")
300         row.prop(md, "strength")
301
302     def DYNAMIC_PAINT(self, layout, ob, md):
303         layout.label(text="Settings can be found inside the Physics context")
304
305     def EDGE_SPLIT(self, layout, ob, md):
306         split = layout.split()
307
308         col = split.column()
309         col.prop(md, "use_edge_angle", text="Edge Angle")
310         sub = col.column()
311         sub.active = md.use_edge_angle
312         sub.prop(md, "split_angle")
313
314         split.prop(md, "use_edge_sharp", text="Sharp Edges")
315
316     def EXPLODE(self, layout, ob, md):
317         split = layout.split()
318
319         col = split.column()
320         col.label(text="Vertex group:")
321         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
322         sub = col.column()
323         sub.active = bool(md.vertex_group)
324         sub.prop(md, "protect")
325         col.label(text="Particle UV")
326         col.prop_search(md, "particle_uv", ob.data, "uv_textures", text="")
327
328         col = split.column()
329         col.prop(md, "use_edge_cut")
330         col.prop(md, "show_unborn")
331         col.prop(md, "show_alive")
332         col.prop(md, "show_dead")
333         col.prop(md, "use_size")
334
335         layout.operator("object.explode_refresh", text="Refresh")
336
337     def FLUID_SIMULATION(self, layout, ob, md):
338         layout.label(text="Settings can be found inside the Physics context")
339
340     def HOOK(self, layout, ob, md):
341         split = layout.split()
342
343         col = split.column()
344         col.label(text="Object:")
345         col.prop(md, "object", text="")
346         if md.object and md.object.type == 'ARMATURE':
347             col.label(text="Bone:")
348             col.prop_search(md, "subtarget", md.object.data, "bones", text="")
349         col = split.column()
350         col.label(text="Vertex Group:")
351         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
352
353         layout.separator()
354
355         split = layout.split()
356
357         col = split.column()
358         col.prop(md, "falloff")
359         col.prop(md, "force", slider=True)
360
361         col = split.column()
362         col.operator("object.hook_reset", text="Reset")
363         col.operator("object.hook_recenter", text="Recenter")
364
365         if ob.mode == 'EDIT':
366             layout.separator()
367             row = layout.row()
368             row.operator("object.hook_select", text="Select")
369             row.operator("object.hook_assign", text="Assign")
370
371     def LAPLACIANSMOOTH(self, layout, ob, md):
372         layout.prop(md, "iterations")
373
374         split = layout.split(percentage=0.25)
375
376         col = split.column()
377         col.label(text="Axis:")
378         col.prop(md, "use_x")
379         col.prop(md, "use_y")
380         col.prop(md, "use_z")
381
382         col = split.column()
383         col.label(text="Lambda:")
384         col.prop(md, "lambda_factor", text="Factor")
385         col.prop(md, "lambda_border", text="Border")
386
387         col.separator()
388         col.prop(md, "use_volume_preserve")
389         col.prop(md, "use_normalized")
390
391         layout.label(text="Vertex Group:")
392         layout.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
393
394     def LATTICE(self, layout, ob, md):
395         split = layout.split()
396
397         col = split.column()
398         col.label(text="Object:")
399         col.prop(md, "object", text="")
400
401         col = split.column()
402         col.label(text="Vertex Group:")
403         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
404
405         layout.separator()
406         layout.prop(md, "strength", slider=True)
407
408     def MASK(self, layout, ob, md):
409         split = layout.split()
410
411         col = split.column()
412         col.label(text="Mode:")
413         col.prop(md, "mode", text="")
414         col = split.column()
415         if md.mode == 'ARMATURE':
416             col.label(text="Armature:")
417             col.prop(md, "armature", text="")
418         elif md.mode == 'VERTEX_GROUP':
419             col.label(text="Vertex Group:")
420             col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
421
422         sub = col.column()
423         sub.active = bool(md.vertex_group)
424         sub.prop(md, "invert_vertex_group")
425
426     def MESH_DEFORM(self, layout, ob, md):
427         split = layout.split()
428
429         col = split.column()
430         sub = col.column()
431         sub.label(text="Object:")
432         sub.prop(md, "object", text="")
433         sub.active = not md.is_bound
434         col = split.column()
435         col.label(text="Vertex Group:")
436         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
437
438         sub = col.column()
439         sub.active = bool(md.vertex_group)
440         sub.prop(md, "invert_vertex_group")
441
442         layout.separator()
443
444         if md.is_bound:
445             layout.operator("object.meshdeform_bind", text="Unbind")
446         else:
447             layout.operator("object.meshdeform_bind", text="Bind")
448
449             row = layout.row()
450             row.prop(md, "precision")
451             row.prop(md, "use_dynamic_bind")
452
453     def MIRROR(self, layout, ob, md):
454         split = layout.split(percentage=0.25)
455
456         col = split.column()
457         col.label(text="Axis:")
458         col.prop(md, "use_x")
459         col.prop(md, "use_y")
460         col.prop(md, "use_z")
461
462         col = split.column()
463         col.label(text="Options:")
464         col.prop(md, "use_mirror_merge", text="Merge")
465         col.prop(md, "use_clip", text="Clipping")
466         col.prop(md, "use_mirror_vertex_groups", text="Vertex Groups")
467
468         col = split.column()
469         col.label(text="Textures:")
470         col.prop(md, "use_mirror_u", text="U")
471         col.prop(md, "use_mirror_v", text="V")
472
473         col = layout.column()
474
475         if md.use_mirror_merge is True:
476             col.prop(md, "merge_threshold")
477         col.label(text="Mirror Object:")
478         col.prop(md, "mirror_object", text="")
479
480     def MULTIRES(self, layout, ob, md):
481         layout.row().prop(md, "subdivision_type", expand=True)
482
483         split = layout.split()
484         col = split.column()
485         col.prop(md, "levels", text="Preview")
486         col.prop(md, "sculpt_levels", text="Sculpt")
487         col.prop(md, "render_levels", text="Render")
488
489         col = split.column()
490
491         col.enabled = ob.mode != 'EDIT'
492         col.operator("object.multires_subdivide", text="Subdivide")
493         col.operator("object.multires_higher_levels_delete", text="Delete Higher")
494         col.operator("object.multires_reshape", text="Reshape")
495         col.operator("object.multires_base_apply", text="Apply Base")
496         col.prop(md, "use_subsurf_uv")
497         col.prop(md, "show_only_control_edges")
498
499         layout.separator()
500
501         col = layout.column()
502         row = col.row()
503         if md.is_external:
504             row.operator("object.multires_external_pack", text="Pack External")
505             row.label()
506             row = col.row()
507             row.prop(md, "filepath", text="")
508         else:
509             row.operator("object.multires_external_save", text="Save External...")
510             row.label()
511
512     def OCEAN(self, layout, ob, md):
513         if not md.is_build_enabled:
514             layout.label("Built without OceanSim modifier")
515             return
516
517         layout.prop(md, "geometry_mode")
518
519         if md.geometry_mode == 'GENERATE':
520             row = layout.row()
521             row.prop(md, "repeat_x")
522             row.prop(md, "repeat_y")
523
524         layout.separator()
525
526         split = layout.split()
527
528         col = split.column()
529         col.prop(md, "time")
530         col.prop(md, "depth")
531         col.prop(md, "random_seed")
532
533         col = split.column()
534         col.prop(md, "resolution")
535         col.prop(md, "size")
536         col.prop(md, "spatial_size")
537
538         layout.label("Waves:")
539
540         split = layout.split()
541
542         col = split.column()
543         col.prop(md, "choppiness")
544         col.prop(md, "wave_scale", text="Scale")
545         col.prop(md, "wave_scale_min")
546         col.prop(md, "wind_velocity")
547
548         col = split.column()
549         col.prop(md, "wave_alignment", text="Alignment")
550         sub = col.column()
551         sub.active = md.wave_alignment > 0
552         sub.prop(md, "wave_direction", text="Direction")
553         sub.prop(md, "damping")
554
555         layout.separator()
556
557         layout.prop(md, "use_normals")
558
559         split = layout.split()
560
561         col = split.column()
562         col.prop(md, "use_foam")
563         sub = col.row()
564         sub.active = md.use_foam
565         sub.prop(md, "foam_coverage", text="Coverage")
566
567         col = split.column()
568         col.active = md.use_foam
569         col.label("Foam Data Layer Name:")
570         col.prop(md, "foam_layer_name", text="")
571
572         layout.separator()
573
574         if md.is_cached:
575             layout.operator("object.ocean_bake", text="Free Bake").free = True
576         else:
577             layout.operator("object.ocean_bake").free = False
578
579         split = layout.split()
580         split.enabled = not md.is_cached
581
582         col = split.column(align=True)
583         col.prop(md, "frame_start", text="Start")
584         col.prop(md, "frame_end", text="End")
585
586         col = split.column(align=True)
587         col.label(text="Cache path:")
588         col.prop(md, "filepath", text="")
589
590         split = layout.split()
591         split.enabled = not md.is_cached
592
593         col = split.column()
594         col.active = md.use_foam
595         col.prop(md, "bake_foam_fade")
596
597         col = split.column()
598
599     def PARTICLE_INSTANCE(self, layout, ob, md):
600         layout.prop(md, "object")
601         layout.prop(md, "particle_system_index", text="Particle System")
602
603         split = layout.split()
604         col = split.column()
605         col.label(text="Create From:")
606         col.prop(md, "use_normal")
607         col.prop(md, "use_children")
608         col.prop(md, "use_size")
609
610         col = split.column()
611         col.label(text="Show Particles When:")
612         col.prop(md, "show_alive")
613         col.prop(md, "show_unborn")
614         col.prop(md, "show_dead")
615
616         layout.separator()
617
618         layout.prop(md, "use_path", text="Create Along Paths")
619
620         split = layout.split()
621         split.active = md.use_path
622         col = split.column()
623         col.row().prop(md, "axis", expand=True)
624         col.prop(md, "use_preserve_shape")
625
626         col = split.column()
627         col.prop(md, "position", slider=True)
628         col.prop(md, "random_position", text="Random", slider=True)
629
630     def PARTICLE_SYSTEM(self, layout, ob, md):
631         layout.label(text="Settings can be found inside the Particle context")
632
633     def SCREW(self, layout, ob, md):
634         split = layout.split()
635
636         col = split.column()
637         col.prop(md, "axis")
638         col.prop(md, "object", text="AxisOb")
639         col.prop(md, "angle")
640         col.prop(md, "steps")
641         col.prop(md, "render_steps")
642         col.prop(md, "use_smooth_shade")
643
644         col = split.column()
645         row = col.row()
646         row.active = (md.object is None or md.use_object_screw_offset is False)
647         row.prop(md, "screw_offset")
648         row = col.row()
649         row.active = (md.object is not None)
650         row.prop(md, "use_object_screw_offset")
651         col.prop(md, "use_normal_calculate")
652         col.prop(md, "use_normal_flip")
653         col.prop(md, "iterations")
654
655     def SHRINKWRAP(self, layout, ob, md):
656         split = layout.split()
657         col = split.column()
658         col.label(text="Target:")
659         col.prop(md, "target", text="")
660         col = split.column()
661         col.label(text="Vertex Group:")
662         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
663
664         split = layout.split()
665
666         col = split.column()
667         col.prop(md, "offset")
668         col.prop(md, "subsurf_levels")
669
670         col = split.column()
671         col.label(text="Mode:")
672         col.prop(md, "wrap_method", text="")
673
674         if md.wrap_method == 'PROJECT':
675             col.prop(md, "project_limit", text="Limit")
676             split = layout.split(percentage=0.25)
677
678             col = split.column()
679             col.label(text="Axis:")
680             col.prop(md, "use_project_x")
681             col.prop(md, "use_project_y")
682             col.prop(md, "use_project_z")
683
684             col = split.column()
685             col.label(text="Direction:")
686             col.prop(md, "use_negative_direction")
687             col.prop(md, "use_positive_direction")
688
689             col = split.column()
690             col.label(text="Cull Faces:")
691             col.prop(md, "cull_face", expand=True)
692
693             layout.prop(md, "auxiliary_target")
694
695         elif md.wrap_method == 'NEAREST_SURFACEPOINT':
696             layout.prop(md, "use_keep_above_surface")
697
698     def SIMPLE_DEFORM(self, layout, ob, md):
699
700         layout.row().prop(md, "deform_method", expand=True)
701
702         split = layout.split()
703
704         col = split.column()
705         col.label(text="Vertex Group:")
706         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
707
708         split = layout.split()
709
710         col = split.column()
711         col.label(text="Origin:")
712         col.prop(md, "origin", text="")
713         sub = col.column()
714         sub.active = (md.origin is not None)
715         sub.prop(md, "use_relative")
716
717         col = split.column()
718         col.label(text="Deform:")
719         col.prop(md, "factor")
720         col.prop(md, "limits", slider=True)
721         if md.deform_method in {'TAPER', 'STRETCH', 'TWIST'}:
722             col.prop(md, "lock_x")
723             col.prop(md, "lock_y")
724
725     def SMOKE(self, layout, ob, md):
726         layout.label(text="Settings can be found inside the Physics context")
727
728     def SMOOTH(self, layout, ob, md):
729         split = layout.split(percentage=0.25)
730
731         col = split.column()
732         col.label(text="Axis:")
733         col.prop(md, "use_x")
734         col.prop(md, "use_y")
735         col.prop(md, "use_z")
736
737         col = split.column()
738         col.prop(md, "factor")
739         col.prop(md, "iterations")
740         col.label(text="Vertex Group:")
741         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
742
743     def SOFT_BODY(self, layout, ob, md):
744         layout.label(text="Settings can be found inside the Physics context")
745
746     def SOLIDIFY(self, layout, ob, md):
747         split = layout.split()
748
749         col = split.column()
750         col.prop(md, "thickness")
751         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
752
753         col.label(text="Crease:")
754         col.prop(md, "edge_crease_inner", text="Inner")
755         col.prop(md, "edge_crease_outer", text="Outer")
756         col.prop(md, "edge_crease_rim", text="Rim")
757         col.label(text="Material Index Offset:")
758
759         col = split.column()
760
761         col.prop(md, "offset")
762         sub = col.column()
763         sub.active = bool(md.vertex_group)
764         sub.prop(md, "invert_vertex_group", text="Invert")
765         sub.prop(md, "thickness_vertex_group", text="Factor")
766
767         col.prop(md, "use_even_offset")
768         col.prop(md, "use_quality_normals")
769         col.prop(md, "use_rim")
770
771         sub = col.column()
772         row = sub.split(align=True, percentage=0.4)
773         row.prop(md, "material_offset", text="")
774         row = row.row()
775         row.active = md.use_rim
776         row.prop(md, "material_offset_rim", text="Rim")
777         sub.prop(md, "use_flip_normals")
778
779     def SUBSURF(self, layout, ob, md):
780         layout.row().prop(md, "subdivision_type", expand=True)
781
782         split = layout.split()
783         col = split.column()
784         col.label(text="Subdivisions:")
785         col.prop(md, "levels", text="View")
786         col.prop(md, "render_levels", text="Render")
787
788         col = split.column()
789         col.label(text="Options:")
790         col.prop(md, "use_subsurf_uv")
791         col.prop(md, "show_only_control_edges")
792
793     def SURFACE(self, layout, ob, md):
794         layout.label(text="Settings can be found inside the Physics context")
795
796     def UV_PROJECT(self, layout, ob, md):
797         split = layout.split()
798
799         col = split.column()
800         col.label(text="Image:")
801         col.prop(md, "image", text="")
802
803         col = split.column()
804         col.label(text="UV Map:")
805         col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
806
807         split = layout.split()
808         col = split.column()
809         col.prop(md, "use_image_override")
810         col.prop(md, "projector_count", text="Projectors")
811         for proj in md.projectors:
812             col.prop(proj, "object", text="")
813
814         col = split.column()
815         sub = col.column(align=True)
816         sub.prop(md, "aspect_x", text="Aspect X")
817         sub.prop(md, "aspect_y", text="Aspect Y")
818
819         sub = col.column(align=True)
820         sub.prop(md, "scale_x", text="Scale X")
821         sub.prop(md, "scale_y", text="Scale Y")
822
823     def WARP(self, layout, ob, md):
824         use_falloff = (md.falloff_type != 'NONE')
825         split = layout.split()
826
827         col = split.column()
828         col.label(text="From:")
829         col.prop(md, "object_from", text="")
830
831         col.prop(md, "use_volume_preserve")
832
833         col = split.column()
834         col.label(text="To:")
835         col.prop(md, "object_to", text="")
836         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
837
838         col = layout.column()
839
840         row = col.row(align=True)
841         row.prop(md, "strength")
842         if use_falloff:
843             row.prop(md, "falloff_radius")
844
845         col.prop(md, "falloff_type")
846         if use_falloff:
847             if md.falloff_type == 'CURVE':
848                 col.template_curve_mapping(md, "falloff_curve")
849
850         # 2 new columns
851         split = layout.split()
852         col = split.column()
853         col.label(text="Texture:")
854         col.template_ID(md, "texture", new="texture.new")
855
856         col = split.column()
857         col.label(text="Texture Coordinates:")
858         col.prop(md, "texture_coords", text="")
859
860         if md.texture_coords == 'OBJECT':
861             layout.prop(md, "texture_coords_object", text="Object")
862         elif md.texture_coords == 'UV' and ob.type == 'MESH':
863             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
864
865     def WAVE(self, layout, ob, md):
866         split = layout.split()
867
868         col = split.column()
869         col.label(text="Motion:")
870         col.prop(md, "use_x")
871         col.prop(md, "use_y")
872         col.prop(md, "use_cyclic")
873
874         col = split.column()
875         col.prop(md, "use_normal")
876         sub = col.column()
877         sub.active = md.use_normal
878         sub.prop(md, "use_normal_x", text="X")
879         sub.prop(md, "use_normal_y", text="Y")
880         sub.prop(md, "use_normal_z", text="Z")
881
882         split = layout.split()
883
884         col = split.column()
885         col.label(text="Time:")
886         sub = col.column(align=True)
887         sub.prop(md, "time_offset", text="Offset")
888         sub.prop(md, "lifetime", text="Life")
889         col.prop(md, "damping_time", text="Damping")
890
891         col = split.column()
892         col.label(text="Position:")
893         sub = col.column(align=True)
894         sub.prop(md, "start_position_x", text="X")
895         sub.prop(md, "start_position_y", text="Y")
896         col.prop(md, "falloff_radius", text="Falloff")
897
898         layout.separator()
899
900         layout.prop(md, "start_position_object")
901         layout.prop_search(md, "vertex_group", ob, "vertex_groups")
902         split = layout.split(percentage=0.33)
903         col = split.column()
904         col.label(text="Texture")
905         col = split.column()
906         col.template_ID(md, "texture", new="texture.new")
907         layout.prop(md, "texture_coords")
908         if md.texture_coords == 'MAP_UV' and ob.type == 'MESH':
909             layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
910         elif md.texture_coords == 'OBJECT':
911             layout.prop(md, "texture_coords_object")
912
913         layout.separator()
914
915         split = layout.split()
916
917         col = split.column()
918         col.prop(md, "speed", slider=True)
919         col.prop(md, "height", slider=True)
920
921         col = split.column()
922         col.prop(md, "width", slider=True)
923         col.prop(md, "narrowness", slider=True)
924
925     def REMESH(self, layout, ob, md):
926         layout.prop(md, "mode")
927
928         row = layout.row()
929         row.prop(md, "octree_depth")
930         row.prop(md, "scale")
931
932         if md.mode == 'SHARP':
933             layout.prop(md, "sharpness")
934
935         layout.prop(md, "use_smooth_shade")
936         layout.prop(md, "remove_disconnected_pieces")
937         row = layout.row()
938         row.active = md.remove_disconnected_pieces
939         row.prop(md, "threshold")
940
941     @staticmethod
942     def vertex_weight_mask(layout, ob, md):
943         layout.label(text="Influence/Mask Options:")
944
945         split = layout.split(percentage=0.4)
946         split.label(text="Global Influence:")
947         split.prop(md, "mask_constant", text="")
948
949         if not md.mask_texture:
950             split = layout.split(percentage=0.4)
951             split.label(text="Vertex Group Mask:")
952             split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
953
954         if not md.mask_vertex_group:
955             split = layout.split(percentage=0.4)
956             split.label(text="Texture Mask:")
957             split.template_ID(md, "mask_texture", new="texture.new")
958             if md.mask_texture:
959                 split = layout.split()
960
961                 col = split.column()
962                 col.label(text="Texture Coordinates:")
963                 col.prop(md, "mask_tex_mapping", text="")
964
965                 col = split.column()
966                 col.label(text="Use Channel:")
967                 col.prop(md, "mask_tex_use_channel", text="")
968
969                 if md.mask_tex_mapping == 'OBJECT':
970                     layout.prop(md, "mask_tex_map_object", text="Object")
971                 elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
972                     layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
973
974     def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
975         split = layout.split()
976         col = split.column()
977         col.label(text="Vertex Group:")
978         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
979
980         col = split.column()
981         col.label(text="Default Weight:")
982         col.prop(md, "default_weight", text="")
983
984         layout.prop(md, "falloff_type")
985         if md.falloff_type == 'CURVE':
986             col = layout.column()
987             col.template_curve_mapping(md, "map_curve")
988
989         split = layout.split(percentage=0.4)
990         split.prop(md, "use_add")
991         row = split.row()
992         row.active = md.use_add
993         row.prop(md, "add_threshold")
994
995         split = layout.split(percentage=0.4)
996         split.prop(md, "use_remove")
997         row = split.row()
998         row.active = md.use_remove
999         row.prop(md, "remove_threshold")
1000
1001         # Common mask options
1002         layout.separator()
1003         self.vertex_weight_mask(layout, ob, md)
1004
1005     def VERTEX_WEIGHT_MIX(self, layout, ob, md):
1006         split = layout.split()
1007
1008         col = split.column()
1009         col.label(text="Vertex Group A:")
1010         col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
1011         col.label(text="Default Weight A:")
1012         col.prop(md, "default_weight_a", text="")
1013
1014         col.label(text="Mix Mode:")
1015         col.prop(md, "mix_mode", text="")
1016
1017         col = split.column()
1018         col.label(text="Vertex Group B:")
1019         col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
1020         col.label(text="Default Weight B:")
1021         col.prop(md, "default_weight_b", text="")
1022
1023         col.label(text="Mix Set:")
1024         col.prop(md, "mix_set", text="")
1025
1026         # Common mask options
1027         layout.separator()
1028         self.vertex_weight_mask(layout, ob, md)
1029
1030     def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
1031         split = layout.split()
1032
1033         col = split.column()
1034         col.label(text="Vertex Group:")
1035         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
1036
1037         col = split.column()
1038         col.label(text="Target Object:")
1039         col.prop(md, "target", text="")
1040
1041         layout.row().prop(md, "proximity_mode", expand=True)
1042         if md.proximity_mode == 'GEOMETRY':
1043             layout.row().prop(md, "proximity_geometry", expand=True)
1044
1045         row = layout.row()
1046         row.prop(md, "min_dist")
1047         row.prop(md, "max_dist")
1048
1049         layout.prop(md, "falloff_type")
1050
1051         # Common mask options
1052         layout.separator()
1053         self.vertex_weight_mask(layout, ob, md)
1054
1055     def SKIN(self, layout, ob, md):
1056         layout.operator("object.skin_armature_create", text="Create Armature")
1057
1058         layout.separator()
1059         layout.prop(md, "branch_smoothing")
1060         layout.prop(md, "use_smooth_shade")
1061
1062         layout.label(text="Selected Vertices:")
1063         split = layout.split()
1064
1065         col = split.column(align=True)
1066         col.operator("object.skin_loose_mark_clear", text="Mark Loose").action = 'MARK'
1067         col.operator("object.skin_loose_mark_clear", text="Clear Loose").action = 'CLEAR'
1068
1069         col = split.column()
1070         col.operator("object.skin_root_mark", text="Mark Root")
1071         col.operator("object.skin_radii_equalize", text="Equalize Radii")
1072
1073         layout.label(text="Symmetry Axes:")
1074         col = layout.column()
1075         col.prop(md, "use_x_symmetry")
1076         col.prop(md, "use_y_symmetry")
1077         col.prop(md, "use_z_symmetry")
1078
1079     def TRIANGULATE(self, layout, ob, md):
1080         layout.prop(md, "use_beauty")
1081
1082     def UV_WARP(self, layout, ob, md):
1083         split = layout.split()
1084         col = split.column()
1085         col.prop(md, "center")
1086
1087         col = split.column()
1088         col.label(text="UV Axis:")
1089         col.prop(md, "axis_u", text="")
1090         col.prop(md, "axis_v", text="")
1091
1092         split = layout.split()
1093         col = split.column()
1094         col.label(text="From:")
1095         col.prop(md, "object_from", text="")
1096
1097         col = split.column()
1098         col.label(text="To:")
1099         col.prop(md, "object_to", text="")
1100
1101         split = layout.split()
1102         col = split.column()
1103         obj = md.object_from
1104         if obj and obj.type == 'ARMATURE':
1105             col.label(text="Bone:")
1106             col.prop_search(md, "bone_from", obj.data, "bones", text="")
1107
1108         col = split.column()
1109         obj = md.object_to
1110         if obj and obj.type == 'ARMATURE':
1111             col.label(text="Bone:")
1112             col.prop_search(md, "bone_to", obj.data, "bones", text="")
1113
1114         split = layout.split()
1115
1116         col = split.column()
1117         col.label(text="Vertex Group:")
1118         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
1119
1120         col = split.column()
1121         col.label(text="UV Map:")
1122         col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
1123
1124 if __name__ == "__main__":  # only for live edit.
1125     bpy.utils.register_module(__name__)