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