b4f54e687f3605f3a6c29e3835ecbf6f2f354a31
[blender-staging.git] / release / scripts / ui / properties_physics_common.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
21 import bpy
22
23 #cachetype can be 'PSYS' 'HAIR' 'SMOKE' etc
24
25
26 def point_cache_ui(self, context, cache, enabled, cachetype):
27     layout = self.layout
28
29     layout.set_context_pointer("point_cache", cache)
30
31     row = layout.row()
32     row.template_list(cache, "point_caches", cache, "active_point_cache_index", rows=2)
33     col = row.column(align=True)
34     col.operator("ptcache.add", icon='ZOOMIN', text="")
35     col.operator("ptcache.remove", icon='ZOOMOUT', text="")
36
37     row = layout.row()
38     if cachetype in ('PSYS', 'HAIR', 'SMOKE'):
39         row.prop(cache, "use_external")
40
41     if cache.use_external:
42         split = layout.split(percentage=0.80)
43         split.prop(cache, "name", text="File Name")
44         split.prop(cache, "index", text="")
45
46         row = layout.row()
47         row.label(text="File Path:")
48         row.prop(cache, "use_library_path", "Use Lib Path")
49         
50         layout.prop(cache, "filepath", text="")
51
52         layout.label(text=cache.info)
53     else:
54         layout.prop(cache, "name", text="File Name")
55
56         split = layout.split()
57         col = split.column(align=True)
58
59         if cachetype != 'PSYS':
60             col.enabled = enabled
61             col.prop(cache, "frame_start")
62             col.prop(cache, "frame_end")
63         if cachetype != 'SMOKE':
64             col.prop(cache, "frame_step")
65
66         col = split.column()
67
68         if cachetype != 'SMOKE':
69             sub = col.column()
70             sub.enabled = enabled
71             sub.prop(cache, "use_quick_cache")
72
73             sub = col.column()
74             sub.enabled = (not bpy.data.is_dirty)
75             sub.prop(cache, "use_disk_cache")
76             col.label(text=cache.info)
77
78             sub = col.column()
79             sub.prop(cache, "use_library_path", "Use Lib Path")
80
81         layout.separator()
82
83         split = layout.split()
84
85         col = split.column()
86
87         if cache.is_baked == True:
88             col.operator("ptcache.free_bake", text="Free Bake")
89         else:
90             col.operator("ptcache.bake", text="Bake").bake = True
91
92         sub = col.row()
93         sub.enabled = (cache.frames_skipped or cache.is_outdated) and enabled
94         sub.operator("ptcache.bake", text="Calculate To Frame").bake = False
95
96         sub = col.column()
97         sub.enabled = enabled
98         sub.operator("ptcache.bake_from_cache", text="Current Cache to Bake")
99
100
101         col = split.column()
102         col.operator("ptcache.bake_all", text="Bake All Dynamics").bake = True
103         col.operator("ptcache.free_bake_all", text="Free All Bakes")
104         col.operator("ptcache.bake_all", text="Update All To Frame").bake = False
105
106
107 def effector_weights_ui(self, context, weights):
108     layout = self.layout
109
110
111     layout.prop(weights, "group")
112
113     split = layout.split()
114
115     col = split.column()
116     col.prop(weights, "gravity", slider=True)
117
118     col = split.column()
119     col.prop(weights, "all", slider=True)
120
121     layout.separator()
122
123     split = layout.split()
124
125     col = split.column()
126     col.prop(weights, "force", slider=True)
127     col.prop(weights, "vortex", slider=True)
128     col.prop(weights, "magnetic", slider=True)
129     col.prop(weights, "wind", slider=True)
130     col.prop(weights, "curve_guide", slider=True)
131     col.prop(weights, "texture", slider=True)
132
133     col = split.column()
134     col.prop(weights, "harmonic", slider=True)
135     col.prop(weights, "charge", slider=True)
136     col.prop(weights, "lennardjones", slider=True)
137     col.prop(weights, "turbulence", slider=True)
138     col.prop(weights, "drag", slider=True)
139     col.prop(weights, "boid", slider=True)
140
141
142 def basic_force_field_settings_ui(self, context, field):
143     layout = self.layout
144
145
146     split = layout.split()
147
148     if not field or field.type == 'NONE':
149         return
150
151     col = split.column()
152
153     if field.type == 'DRAG':
154         col.prop(field, "linear_drag", text="Linear")
155     else:
156         col.prop(field, "strength")
157
158     if field.type == 'TURBULENCE':
159         col.prop(field, "size")
160         col.prop(field, "flow")
161     elif field.type == 'HARMONIC':
162         col.prop(field, "harmonic_damping", text="Damping")
163         col.prop(field, "rest_length")
164     elif field.type == 'VORTEX' and field.shape != 'POINT':
165         col.prop(field, "inflow")
166     elif field.type == 'DRAG':
167         col.prop(field, "quadratic_drag", text="Quadratic")
168     else:
169         col.prop(field, "flow")
170
171     col = split.column()
172     col.prop(field, "noise")
173     col.prop(field, "seed")
174     if field.type == 'TURBULENCE':
175         col.prop(field, "global_coordinates", text="Global")
176     elif field.type == 'HARMONIC':
177         col.prop(field, "multiple_springs")
178
179     split = layout.split()
180
181     col = split.column()
182     col.label(text="Effect point:")
183     col.prop(field, "do_location")
184     col.prop(field, "do_rotation")
185
186     col = split.column()
187     col.label(text="Collision:")
188     col.prop(field, "do_absorption")
189
190
191 def basic_force_field_falloff_ui(self, context, field):
192     layout = self.layout
193
194
195     # XXX: This doesn't update for some reason.
196     #split = layout.split()
197     split = layout.split(percentage=0.35)
198
199     if not field or field.type == 'NONE':
200         return
201
202     col = split.column()
203     col.prop(field, "z_direction", text="")
204     col.prop(field, "use_min_distance", text="Use Minimum")
205     col.prop(field, "use_max_distance", text="Use Maximum")
206
207     col = split.column()
208     col.prop(field, "falloff_power", text="Power")
209
210     sub = col.column()
211     sub.active = field.use_min_distance
212     sub.prop(field, "minimum_distance", text="Distance")
213
214     sub = col.column()
215     sub.active = field.use_max_distance
216     sub.prop(field, "maximum_distance", text="Distance")
217
218
219 def register():
220     pass
221
222
223 def unregister():
224     pass
225
226 if __name__ == "__main__":
227     register()