more ui api changes.
[blender.git] / release / scripts / ui / properties_physics_smoke.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21
22 narrowui = 180
23
24
25 from properties_physics_common import point_cache_ui
26 from properties_physics_common import effector_weights_ui
27
28
29 class PhysicButtonsPanel(bpy.types.Panel):
30     bl_space_type = 'PROPERTIES'
31     bl_region_type = 'WINDOW'
32     bl_context = "physics"
33
34     def poll(self, context):
35         ob = context.object
36         rd = context.scene.render_data
37         return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
38
39
40 class PHYSICS_PT_smoke(PhysicButtonsPanel):
41     bl_label = "Smoke"
42
43     def draw(self, context):
44         layout = self.layout
45
46         md = context.smoke
47         ob = context.object
48         wide_ui = context.region.width > narrowui
49
50         split = layout.split()
51         split.operator_context = 'EXEC_DEFAULT'
52
53         if md:
54             # remove modifier + settings
55             split.set_context_pointer("modifier", md)
56             split.operator("object.modifier_remove", text="Remove")
57
58             row = split.row(align=True)
59             row.prop(md, "render", text="")
60             row.prop(md, "realtime", text="")
61
62         else:
63             # add modifier
64             split.operator("object.modifier_add", text="Add").type = 'SMOKE'
65             if wide_ui:
66                 split.label()
67
68         if md:
69             if wide_ui:
70                 layout.prop(md, "smoke_type", expand=True)
71             else:
72                 layout.prop(md, "smoke_type", text="")
73
74             if md.smoke_type == 'TYPE_DOMAIN':
75
76                 domain = md.domain_settings
77
78                 split = layout.split()
79
80                 col = split.column()
81                 col.label(text="Resolution:")
82                 col.prop(domain, "maxres", text="Divisions")
83
84                 if wide_ui:
85                     col = split.column()
86                 col.label(text="Behavior:")
87                 col.prop(domain, "alpha")
88                 col.prop(domain, "beta")
89                 col.prop(domain, "dissolve_smoke", text="Dissolve")
90                 sub = col.column()
91                 sub.active = domain.dissolve_smoke
92                 sub.prop(domain, "dissolve_speed", text="Time")
93                 sub.prop(domain, "dissolve_smoke_log", text="Slow")
94
95             elif md.smoke_type == 'TYPE_FLOW':
96
97                 flow = md.flow_settings
98
99                 split = layout.split()
100
101                 col = split.column()
102                 col.prop(flow, "outflow")
103                 col.label(text="Particle System:")
104                 col.prop_object(flow, "psys", ob, "particle_systems", text="")
105
106                 if md.flow_settings.outflow:
107                     if wide_ui:
108                         col = split.column()
109                 else:
110                     if wide_ui:
111                         col = split.column()
112                     col.label(text="Behavior:")
113                     col.prop(flow, "temperature")
114                     col.prop(flow, "density")
115
116             #elif md.smoke_type == 'TYPE_COLL':
117             #   layout.separator()
118
119
120 class PHYSICS_PT_smoke_groups(PhysicButtonsPanel):
121     bl_label = "Smoke Groups"
122     bl_default_closed = True
123
124     def poll(self, context):
125         md = context.smoke
126         return md and (md.smoke_type == 'TYPE_DOMAIN')
127
128     def draw(self, context):
129         layout = self.layout
130
131         group = context.smoke.domain_settings
132         wide_ui = context.region.width > narrowui
133
134         split = layout.split()
135
136         col = split.column()
137         col.label(text="Flow Group:")
138         col.prop(group, "fluid_group", text="")
139
140         #col.label(text="Effector Group:")
141         #col.prop(group, "eff_group", text="")
142
143         if wide_ui:
144             col = split.column()
145         col.label(text="Collision Group:")
146         col.prop(group, "coll_group", text="")
147
148
149 class PHYSICS_PT_smoke_cache(PhysicButtonsPanel):
150     bl_label = "Smoke Cache"
151     bl_default_closed = True
152
153     def poll(self, context):
154         md = context.smoke
155         return md and (md.smoke_type == 'TYPE_DOMAIN')
156
157     def draw(self, context):
158         md = context.smoke.domain_settings
159         cache = md.point_cache_low
160
161         point_cache_ui(self, context, cache, (cache.baked is False), 0, 1)
162
163
164 class PHYSICS_PT_smoke_highres(PhysicButtonsPanel):
165     bl_label = "Smoke High Resolution"
166     bl_default_closed = True
167
168     def poll(self, context):
169         md = context.smoke
170         return md and (md.smoke_type == 'TYPE_DOMAIN')
171
172     def draw_header(self, context):
173         high = context.smoke.domain_settings
174
175         self.layout.prop(high, "highres", text="")
176
177     def draw(self, context):
178         layout = self.layout
179
180         md = context.smoke.domain_settings
181         wide_ui = context.region.width > narrowui
182
183         split = layout.split()
184
185         col = split.column()
186         col.label(text="Resolution:")
187         col.prop(md, "amplify", text="Divisions")
188         col.prop(md, "viewhighres")
189
190         if wide_ui:
191             col = split.column()
192         col.label(text="Noise Method:")
193         col.row().prop(md, "noise_type", text="")
194         col.prop(md, "strength")
195
196
197 class PHYSICS_PT_smoke_cache_highres(PhysicButtonsPanel):
198     bl_label = "Smoke High Resolution Cache"
199     bl_default_closed = True
200
201     def poll(self, context):
202         md = context.smoke
203         return md and (md.smoke_type == 'TYPE_DOMAIN') and md.domain_settings.highres
204
205     def draw(self, context):
206         md = context.smoke.domain_settings
207         cache = md.point_cache_high
208
209         point_cache_ui(self, context, cache, (cache.baked is False), 0, 1)
210
211
212 class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel):
213     bl_label = "Smoke Field Weights"
214     bl_default_closed = True
215
216     def poll(self, context):
217         smoke = context.smoke
218         return (smoke and smoke.smoke_type == 'TYPE_DOMAIN')
219
220     def draw(self, context):
221         domain = context.smoke.domain_settings
222         effector_weights_ui(self, context, domain.effector_weights)
223
224 bpy.types.register(PHYSICS_PT_smoke)
225 bpy.types.register(PHYSICS_PT_smoke_field_weights)
226 bpy.types.register(PHYSICS_PT_smoke_cache)
227 bpy.types.register(PHYSICS_PT_smoke_highres)
228 bpy.types.register(PHYSICS_PT_smoke_groups)
229 bpy.types.register(PHYSICS_PT_smoke_cache_highres)