4 class PhysicButtonsPanel(bpy.types.Panel):
5 __space_type__ = "BUTTONS_WINDOW"
6 __region_type__ = "WINDOW"
7 __context__ = "physics"
9 def poll(self, context):
11 return (ob and ob.type == 'MESH')
13 class PHYSICS_PT_fluid(PhysicButtonsPanel):
14 __idname__ = "PHYSICS_PT_fluid"
17 def draw(self, context):
22 split = layout.split()
23 split.operator_context = "EXEC_DEFAULT"
26 # remove modifier + settings
27 split.set_context_pointer("modifier", md)
28 split.itemO("OBJECT_OT_modifier_remove", text="Remove")
30 row = split.row(align=True)
31 row.itemR(md, "render", text="")
32 row.itemR(md, "realtime", text="")
35 split.item_enumO("OBJECT_OT_modifier_add", "type", "FLUID_SIMULATION", text="Add")
41 col = layout.column(align=True)
43 row.item_enumR(fluid, "type", "DOMAIN")
44 row.item_enumR(fluid, "type", "FLUID")
45 row.item_enumR(fluid, "type", "OBSTACLE")
47 row.item_enumR(fluid, "type", "INFLOW")
48 row.item_enumR(fluid, "type", "OUTFLOW")
49 row.item_enumR(fluid, "type", "PARTICLE")
50 row.item_enumR(fluid, "type", "CONTROL")
52 if fluid.type == 'DOMAIN':
53 layout.itemO("FLUID_OT_bake", text="BAKE")
54 layout.itemL(text="Required Memory: " + fluid.memory_estimate)
56 layout.itemL(text="Resolution:")
58 split = layout.split()
61 colsub = col.column(align=True)
62 colsub.itemR(fluid, "resolution", text="Final")
63 colsub.itemR(fluid, "render_display_mode", text="")
64 colsub = col.column(align=True)
65 colsub.itemL(text="Time:")
66 colsub.itemR(fluid, "start_time", text="Start")
67 colsub.itemR(fluid, "end_time", text="End")
70 colsub = col.column(align=True)
71 colsub.itemR(fluid, "preview_resolution", text="Preview", slider=True)
72 colsub.itemR(fluid, "viewport_display_mode", text="")
74 colsub.itemR(fluid, "reverse_frames")
75 colsub.itemR(fluid, "generate_speed_vectors")
76 colsub.itemR(fluid, "path", text="")
78 if fluid.type in ('FLUID', 'OBSTACLE', 'INFLOW', 'OUTFLOW'):
79 layout.itemR(fluid, "volume_initialization")
81 if fluid.type == 'FLUID':
83 row.column().itemR(fluid, "initial_velocity")
84 row.itemR(fluid, "export_animated_mesh")
86 if fluid.type == 'OBSTACLE':
89 row.itemR(fluid, "export_animated_mesh")
90 layout.itemR(fluid, "slip_type", expand=True)
91 if fluid.slip_type == 'PARTIALSLIP':
92 layout.itemR(fluid, "partial_slip_amount", text="Amount")
94 layout.itemR(fluid, "impact_factor")
96 if fluid.type == 'INFLOW':
98 row.column().itemR(fluid, "inflow_velocity")
99 row.itemR(fluid, "export_animated_mesh")
100 layout.itemR(fluid, "local_coordinates")
102 if fluid.type == 'OUTFLOW':
105 row.itemR(fluid, "export_animated_mesh")
107 if fluid.type == 'PARTICLE':
108 split = layout.split()
111 col.itemL(text="Type:")
112 col.itemR(fluid, "drops")
113 col.itemR(fluid, "floats")
114 col.itemR(fluid, "tracer")
117 col.itemL(text="Influence:")
118 col.itemR(fluid, "particle_influence", text="Particle")
119 col.itemR(fluid, "alpha_influence", text="Alpha")
121 layout.itemR(fluid, "path")
123 if fluid.type == 'CONTROL':
124 split = layout.split()
127 col.itemL(text="Time:")
128 col.itemR(fluid, "start_time", text="Start")
129 col.itemR(fluid, "end_time", text="End")
132 col.itemR(fluid, "quality", slider=True)
133 col.itemR(fluid, "reverse_frames")
135 split = layout.split()
138 col.itemL(text="Attraction:")
139 col.itemR(fluid, "attraction_strength", text="Strength")
140 col.itemR(fluid, "attraction_radius", text="Radius")
143 col.itemL(text="Velocity:")
144 col.itemR(fluid, "velocity_strength", text="Strength")
145 col.itemR(fluid, "velocity_radius", text="Radius")
147 class PHYSICS_PT_domain_gravity(PhysicButtonsPanel):
148 __idname__ = "PHYSICS_PT_domain_gravity"
149 __label__ = "Domain World/Gravity"
150 __default_closed__ = True
152 def poll(self, context):
155 return (md.settings.type == 'DOMAIN')
157 def draw(self, context):
159 fluid = context.fluid.settings
161 split = layout.split()
164 col.itemR(fluid, "gravity")
166 col = split.column(align=True)
167 col.itemL(text="Viscosity:")
168 col.itemR(fluid, "viscosity_preset", text="")
169 if fluid.viscosity_preset == 'MANUAL':
170 col.itemR(fluid, "viscosity_base", text="Base")
171 col.itemR(fluid, "viscosity_exponent", text="Exponent")
173 col = layout.column_flow()
174 col.itemR(fluid, "real_world_size")
175 col.itemR(fluid, "grid_levels")
176 col.itemR(fluid, "compressibility")
178 class PHYSICS_PT_domain_boundary(PhysicButtonsPanel):
179 __idname__ = "PHYSICS_PT_domain_boundary"
180 __label__ = "Domain Boundary"
181 __default_closed__ = True
183 def poll(self, context):
186 return (md.settings.type == 'DOMAIN')
188 def draw(self, context):
190 fluid = context.fluid.settings
192 layout.itemL(text="Slip:")
194 layout.itemR(fluid, "slip_type", expand=True)
195 if fluid.slip_type == 'PARTIALSLIP':
196 layout.itemR(fluid, "partial_slip_amount", text="Amount")
198 layout.itemL(text="Surface:")
200 row.itemR(fluid, "surface_smoothing", text="Smoothing")
201 row.itemR(fluid, "surface_subdivisions", text="Subdivisions")
203 class PHYSICS_PT_domain_particles(PhysicButtonsPanel):
204 __idname__ = "PHYSICS_PT_domain_particles"
205 __label__ = "Domain Particles"
206 __default_closed__ = True
208 def poll(self, context):
211 return (md.settings.type == 'DOMAIN')
213 def draw(self, context):
215 fluid = context.fluid.settings
217 layout.itemR(fluid, "tracer_particles")
218 layout.itemR(fluid, "generate_particles")
220 bpy.types.register(PHYSICS_PT_fluid)
221 bpy.types.register(PHYSICS_PT_domain_gravity)
222 bpy.types.register(PHYSICS_PT_domain_boundary)
223 bpy.types.register(PHYSICS_PT_domain_particles)