From 29fd16c2796b27b93bc82f7506877e4d22f30293 Mon Sep 17 00:00:00 2001 From: Ryan G Date: Mon, 20 May 2024 13:21:52 -0700 Subject: [PATCH] new demo version 0.8.0! --- __init__.py | 2 +- cmake/CMakeLists.txt | 6 +- src/addon/__init__.py.in | 2 +- src/addon/objects/flip_fluid_cache.py | 382 ++--- src/addon/operators/__init__.py | 6 + src/addon/operators/command_line_operators.py | 1248 +++++++++++++++++ src/addon/operators/helper_operators.py | 1203 ++++------------ src/addon/operators/preferences_operators.py | 16 +- src/addon/operators/render_passes.py | 170 +++ src/addon/operators/support_operators.py | 5 - src/addon/properties/__init__.py | 1 + .../properties/domain_materials_properties.py | 73 +- src/addon/properties/domain_properties.py | 120 +- .../properties/domain_render_properties.py | 173 +-- .../properties/domain_surface_properties.py | 1 + src/addon/properties/helper_properties.py | 143 +- src/addon/properties/obstacle_properties.py | 8 +- .../properties/preferences_properties.py | 260 ++-- src/addon/render.py | 256 +--- .../command_line_scripts/alembic_export.py | 7 - .../render_animation_render_passes.py | 53 + ...un_simulation_and_render_sequence_batch.py | 2 +- .../geometry_nodes_library.blend | Bin 1358470 -> 1641133 bytes src/addon/types.py | 15 +- src/addon/ui/cache_object_ui.py | 256 +--- src/addon/ui/domain_advanced_ui.py | 2 +- src/addon/ui/domain_cache_ui.py | 2 +- src/addon/ui/domain_debug_ui.py | 2 +- src/addon/ui/domain_display_ui.py | 325 ++--- src/addon/ui/domain_materials_ui.py | 2 +- src/addon/ui/domain_particles_ui.py | 49 +- src/addon/ui/domain_presets_ui.py | 2 +- src/addon/ui/domain_simulation_ui.py | 2 +- src/addon/ui/domain_stats_ui.py | 2 +- src/addon/ui/domain_surface_ui.py | 15 +- src/addon/ui/domain_tabbed_ui.py | 2 +- src/addon/ui/domain_whitewater_ui.py | 147 +- src/addon/ui/domain_world_ui.py | 2 +- src/addon/ui/helper_ui.py | 158 ++- src/addon/utils/api_workaround_utils.py | 23 +- src/engine/forcefieldcurve.cpp | 4 +- src/engine/forcefieldgravityscalegrid.h | 21 +- src/engine/forcefieldpoint.cpp | 4 +- src/engine/forcefieldsurface.cpp | 4 +- src/engine/forcefieldvolume.cpp | 6 +- 45 files changed, 2723 insertions(+), 2459 deletions(-) create mode 100644 src/addon/operators/command_line_operators.py create mode 100644 src/addon/operators/render_passes.py create mode 100644 src/addon/resources/command_line_scripts/render_animation_render_passes.py diff --git a/__init__.py b/__init__.py index 3807815a..12881bcd 100644 --- a/__init__.py +++ b/__init__.py @@ -25,7 +25,7 @@ "description": "The file you have installed is not an addon. Enable for more info.", "author" : "The FLIP Fluids Development Team", "version" : (0, 0, 0), - "blender" : (2, 81, 0), + "blender" : (3, 1, 0), "location" : "", "warning" : "", "wiki_url" : "https://github.com/rlguy/Blender-FLIP-Fluids", diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index ade34e36..3e9f91f9 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -52,9 +52,9 @@ set(CMAKE_BUILD_TYPE Release) set(FLUIDENGINE_VERSION_TYPE_IS_STABLE_BUILD TRUE) set(FLUIDENGINE_VERSION_MAJOR 0) -set(FLUIDENGINE_VERSION_MINOR 7) -set(FLUIDENGINE_VERSION_REVISION 5) -set(FLUIDENGINE_VERSION_DATE "12-MAR-2024") +set(FLUIDENGINE_VERSION_MINOR 8) +set(FLUIDENGINE_VERSION_REVISION 0) +set(FLUIDENGINE_VERSION_DATE "21-MAY-2024") if(FLUIDENGINE_VERSION_TYPE_IS_STABLE_BUILD) set(FLUIDENGINE_VERSION_TYPE_LABEL "Demo") diff --git a/src/addon/__init__.py.in b/src/addon/__init__.py.in index 1908b636..bc657c4e 100644 --- a/src/addon/__init__.py.in +++ b/src/addon/__init__.py.in @@ -19,7 +19,7 @@ bl_info = { "description": "A FLIP Fluid Simulation Tool for Blender (v@FLUIDENGINE_VERSION_LABEL@)", "author" : "Ryan Guy & Dennis Fassbaender ", "version" : (@FLUIDENGINE_VERSION_MAJOR@, @FLUIDENGINE_VERSION_MINOR@, @FLUIDENGINE_VERSION_REVISION@), - "blender" : (2, 81, 0), + "blender" : (3, 1, 0), "location" : "Properties > Physics > FLIP Fluid", "warning" : "", "wiki_url" : "https://github.com/rlguy/Blender-FLIP-Fluids/wiki", diff --git a/src/addon/objects/flip_fluid_cache.py b/src/addon/objects/flip_fluid_cache.py index e52cd8b4..b1cf8295 100644 --- a/src/addon/objects/flip_fluid_cache.py +++ b/src/addon/objects/flip_fluid_cache.py @@ -98,9 +98,6 @@ class FlipFluidLoadedMeshData(bpy.types.PropertyGroup): ffp3_surface_import_percentage = FloatProperty(default=0); exec(conv("ffp3_surface_import_percentage")) ffp3_boundary_import_percentage = FloatProperty(default=0); exec(conv("ffp3_boundary_import_percentage")) ffp3_interior_import_percentage = FloatProperty(default=0); exec(conv("ffp3_interior_import_percentage")) - duplivert_scale = FloatProperty(default=1.0); exec(conv("duplivert_scale")) - duplivert_vertices = IntProperty(default=-1); exec(conv("duplivert_vertices")) - duplivert_faces = IntProperty(default=-1); exec(conv("duplivert_faces")) is_rendering = BoolProperty(default=True); exec(conv("is_rendering")) frame = IntProperty(default=-1); exec(conv("frame")) @@ -123,7 +120,6 @@ def reset(self): self.property_unset("ffp3_surface_import_percentage") self.property_unset("ffp3_boundary_import_percentage") self.property_unset("ffp3_interior_import_percentage") - self.property_unset("duplivert_scale") self.property_unset("is_rendering") self.property_unset("frame") @@ -156,57 +152,68 @@ class FlipFluidMeshCache(bpy.types.PropertyGroup): ffp3_surface_import_percentage = FloatProperty(default=0); exec(conv("ffp3_surface_import_percentage")) ffp3_boundary_import_percentage = FloatProperty(default=0); exec(conv("ffp3_boundary_import_percentage")) ffp3_interior_import_percentage = FloatProperty(default=0); exec(conv("ffp3_interior_import_percentage")) - duplivert_scale = FloatProperty(default=1.0); exec(conv("duplivert_scale")) cache_object_type = StringProperty(default="CACHE_OBJECT_TYPE_NONE"); exec(conv("cache_object_type")) - # Duplivert properties - current_duplivert_loaded_frame = IntProperty(default=-1); exec(conv("current_duplivert_loaded_frame")) - duplivert_object_default_name = StringProperty(default="_particle"); exec(conv("duplivert_object_default_name")) - duplivert_object = PointerProperty(type=bpy.types.Object); exec(conv("duplivert_object")) - # Loaded data properties - loaded_frame_data = PointerProperty(type=FlipFluidLoadedMeshData); exec(conv("loaded_frame_data")) - loaded_duplivert_frame_data = PointerProperty(type=FlipFluidLoadedMeshData); exec(conv("loaded_duplivert_frame_data")) - bounds = PointerProperty(type=FLIPFluidMeshBounds); exec(conv("bounds")) + loaded_frame_data = PointerProperty(type=FlipFluidLoadedMeshData); exec(conv("loaded_frame_data")) + bounds = PointerProperty(type=FLIPFluidMeshBounds); exec(conv("bounds")) - # Deprecated properties - only needed to migrate FLIP Fluids v1.0.6 or lower to newer versions - # These properties should not be used unless for updating scene for newer versions - cache_object_name = StringProperty(default=""); exec(conv("cache_object_name")) - duplivert_object_name = StringProperty(default=""); exec(conv("duplivert_object_name")) - is_duplivert_object_set = BoolProperty(default=False); exec(conv("is_duplivert_object_set")) + def _initialize_cache_object_fluid_particles(self, bl_cache_object): + parent_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + blend_resource_filename = "geometry_nodes_library.blend" + resource_filepath = os.path.join(parent_path, "resources", "geometry_nodes", blend_resource_filename) + gn_modifier = helper_operators.add_geometry_node_modifier(bl_cache_object, resource_filepath, "FF_MotionBlurFluidParticles") - def update_deprecated_mesh_storage(self): - # In FLIP Fluids version 1.0.6 or lower, mesh cache objects were stored by name - # In later versions, these objects are stored in a PointerProperty. The purpose - # of this method is to update older .blend files to the new system by initializing - # the PointerProperty if necessary. + # Depending on FLIP Fluids version, the GN set up may not + # have these inputs. Available in FLIP Fluids 1.7.2 or later. + try: + # Input flip_velocity + gn_modifier["Input_2_use_attribute"] = 1 + gn_modifier["Input_2_attribute_name"] = 'flip_velocity' + except: + pass - domain_object = self._get_domain_object() - if domain_object is None: - return + try: + # Output velocity + gn_modifier["Output_3_attribute_name"] = 'velocity' + except: + pass - if self.cache_object_name != "" and self.cache_object is None: - cache_name = self.cache_object_name - cache_object = None - for obj in bpy.data.objects: - if obj.name == cache_name and obj.parent == domain_object: - cache_object = obj - break - if cache_object is not None: - self.cache_object = cache_object + try: + # Material + gn_modifier["Input_5"] = bl_cache_object.active_material + except: + pass - if self.is_duplivert_object_set and self.duplivert_object is None: - duplivert_object = bpy.data.objects.get(self.duplivert_object_name) - if duplivert_object is not None: - self.duplivert_object = duplivert_object + try: + # Enable Motion Blur + gn_modifier["Input_8"] = False + except: + pass + try: + # Enable Point Cloud + gn_modifier["Input_9"] = True + except: + pass - def _initialize_cache_object_fluid_particles(self, bl_cache_object): + + def _initialize_cache_object_whitewater_particles(self, bl_cache_object): parent_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) blend_resource_filename = "geometry_nodes_library.blend" resource_filepath = os.path.join(parent_path, "resources", "geometry_nodes", blend_resource_filename) - gn_modifier = helper_operators.add_geometry_node_modifier(bl_cache_object, resource_filepath, "FF_MotionBlurFluidParticles") + + if self.cache_object_type == 'CACHE_OBJECT_TYPE_FOAM': + resource_name = "FF_MotionBlurWhitewaterFoam" + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_BUBBLE': + resource_name = "FF_MotionBlurWhitewaterBubble" + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_SPRAY': + resource_name = "FF_MotionBlurWhitewaterSpray" + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_DUST': + resource_name = "FF_MotionBlurWhitewaterDust" + + gn_modifier = helper_operators.add_geometry_node_modifier(bl_cache_object, resource_filepath, resource_name) # Depending on FLIP Fluids version, the GN set up may not # have these inputs. Available in FLIP Fluids 1.7.2 or later. @@ -241,6 +248,12 @@ def _initialize_cache_object_fluid_particles(self, bl_cache_object): except: pass + try: + # Enable Instancing + gn_modifier["Input_10"] = False + except: + pass + def initialize_cache_object(self): if not self._is_domain_set() or self._is_cache_object_initialized(): @@ -276,6 +289,29 @@ def initialize_cache_object(self): if self.cache_object_type == 'CACHE_OBJECT_TYPE_FLUID_PARTICLES' and vcu.is_blender_31(): self._initialize_cache_object_fluid_particles(cache_object) + if (self.cache_object_type == 'CACHE_OBJECT_TYPE_FOAM' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_BUBBLE' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_SPRAY' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_DUST') and vcu.is_blender_31(): + self._initialize_cache_object_whitewater_particles(cache_object) + + self.cache_object = cache_object + + + def initialize_cache_object_geometry_nodes(self): + cache_object = self.get_cache_object() + if cache_object is None: + return + + if self.cache_object_type == 'CACHE_OBJECT_TYPE_FLUID_PARTICLES' and vcu.is_blender_31(): + self._initialize_cache_object_fluid_particles(cache_object) + + if (self.cache_object_type == 'CACHE_OBJECT_TYPE_FOAM' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_BUBBLE' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_SPRAY' or + self.cache_object_type == 'CACHE_OBJECT_TYPE_DUST') and vcu.is_blender_31(): + self._initialize_cache_object_whitewater_particles(cache_object) + self.cache_object = cache_object @@ -284,7 +320,6 @@ def delete_cache_object(self): return if not bpy.context.scene.flip_fluid.is_domain_in_active_scene(): return - self.unload_duplivert_object() cache_object = self.cache_object vcu.delete_object(cache_object) self.cache_object = None @@ -795,207 +830,10 @@ def update_transforms(self): cache_object.location = domain_pos - def apply_duplivert_object_material(self): - duplivert_object = self.get_duplivert_object() - if duplivert_object is None: - return - - cache_object = self.get_cache_object() - cache_object_materials = cache_object.data.materials - duplivert_materials = duplivert_object.data.materials - duplivert_materials.clear() - if len(cache_object_materials) == 0: - return - - material = cache_object_materials[cache_object.active_material_index] - duplivert_materials.append(material) - duplivert_object.active_material_index = 0 - - - def _is_loaded_duplivert_frame_up_to_date(self, frameno): - d = self.loaded_duplivert_frame_data - return not (self.mesh_prefix != d.mesh_prefix or - self.enable_motion_blur != d.enable_motion_blur or - self.motion_blur_scale != d.motion_blur_scale or - self.enable_velocity_attribute != d.enable_velocity_attribute or - self.enable_vorticity_attribute != d.enable_vorticity_attribute or - self.enable_speed_attribute != d.enable_speed_attribute or - self.enable_age_attribute != d.enable_age_attribute or - self.enable_color_attribute != d.enable_color_attribute or - self.enable_source_id_attribute != d.enable_source_id_attribute or - self.enable_viscosity_attribute != d.enable_viscosity_attribute or - self.enable_id_attribute != d.enable_id_attribute or - self.enable_lifetime_attribute != d.enable_lifetime_attribute or - self.enable_whitewater_proximity_attribute != d.enable_whitewater_proximity_attribute or - self.wwp_import_percentage != d.wwp_import_percentage or - self.ffp3_surface_import_percentage != d.ffp3_surface_import_percentage or - self.ffp3_boundary_import_percentage != d.ffp3_boundary_import_percentage or - self.ffp3_interior_import_percentage != d.ffp3_interior_import_percentage or - self.duplivert_scale != d.duplivert_scale or - self.duplivert_vertices != d.duplivert_vertices or - self.duplivert_faces != d.duplivert_faces or - render.is_rendering() != d.is_rendering or - self.current_loaded_frame != frameno) - - - def _commit_loaded_duplivert_frame_data(self, frameno): - d = self.loaded_duplivert_frame_data - d.mesh_prefix = self.mesh_prefix - d.enable_motion_blur = self.enable_motion_blur - d.motion_blur_scale = self.motion_blur_scale - d.enable_velocity_attribute = self.enable_velocity_attribute - d.enable_vorticity_attribute = self.enable_vorticity_attribute - d.enable_speed_attribute = self.enable_speed_attribute - d.enable_age_attribute = self.enable_age_attribute - d.enable_color_attribute = self.enable_color_attribute - d.enable_source_id_attribute = self.enable_source_id_attribute - d.enable_viscosity_attribute = self.enable_viscosity_attribute - d.enable_id_attribute = self.enable_id_attribute - d.enable_lifetime_attribute = self.enable_lifetime_attribute - d.enable_whitewater_proximity_attribute = self.enable_whitewater_proximity_attribute - d.wwp_import_percentage = self.wwp_import_percentage - d.ffp3_surface_import_percentage = self.ffp3_surface_import_percentage - d.ffp3_boundary_import_percentage = self.ffp3_boundary_import_percentage - d.ffp3_interior_import_percentage = self.ffp3_interior_import_percentage - d.duplivert_scale = self.duplivert_scale - d.duplivert_vertices = self.duplivert_vertices - d.duplivert_faces = self.duplivert_faces - d.is_rendering = render.is_rendering() - d.current_loaded_frame = frameno - - - def _is_load_duplivert_object_valid(self, force_load=False): - if not self._is_domain_set(): - return False - current_frame = render.get_current_render_frame() - if current_frame == self.current_duplivert_loaded_frame and not force_load: - return False - if self._is_loaded_duplivert_frame_up_to_date(current_frame): - return False - return True - - def _is_octane_available(self): return hasattr(bpy.context.scene, 'octane') - def _initialize_duplivert_object_octane(self, cache_object, duplivert_object): - if not self._is_octane_available(): - return - duplivert_object.octane.object_mesh_type = cache_object.octane.object_mesh_type - - - def set_duplivert_instance_type(self, instance_type): - cache_object = self.get_cache_object() - if not cache_object: - return - vcu.set_object_instance_type(cache_object, instance_type) - - - def set_duplivert_hide_viewport(self, display_bool): - duplivert_object = self.get_duplivert_object() - if not duplivert_object: - return - vcu.set_object_hide_viewport(duplivert_object, display_bool) - - - def initialize_duplivert_object(self, vertices=[], polygons=[], scale=1.0, instance_type='VERTS'): - if not self._is_cache_object_initialized(): - self.initialize_cache_object() - cache_object = self.get_cache_object() - - if self._is_duplivert_object_initialized(): - return - - duplivert_object_name = cache_object.name + self.duplivert_object_default_name - duplivert_mesh_name = duplivert_object_name + "_mesh" - duplivert_mesh_data = bpy.data.meshes.new(duplivert_mesh_name) - duplivert_mesh_data.from_pydata(vertices, [], polygons) - duplivert_object = bpy.data.objects.new(duplivert_object_name, duplivert_mesh_data) - duplivert_object.scale = (scale, scale, scale) - duplivert_object.parent = cache_object - vcu.link_fluid_mesh_object(duplivert_object) - - self._initialize_duplivert_object_octane(cache_object, duplivert_object) - vcu.set_object_instance_type(cache_object, instance_type) - vcu.set_object_hide_viewport(duplivert_object, True) - - # Motion blur not supported. Leaving motion blur enabled can cause - # slow render in versions of Blender 2.91+. Workaround is to - # automatically disable motion blur on the object. - try: - # Cycles may not be enabled in the user's preferences - duplivert_object.cycles.use_motion_blur = False - except: - pass - - self.duplivert_object = duplivert_object - - - def load_duplivert_object(self, vertices, faces, scale=1.0, force_load=False, depsgraph=None): - self.duplivert_scale = scale - self.duplivert_vertices = len(vertices) - self.duplivert_faces = len(faces) - if not self._is_load_duplivert_object_valid(force_load): - return - - if not self._is_cache_object_initialized(): - self.initialize_cache_object() - if not self._is_duplivert_object_initialized(): - self.initialize_duplivert_object() - - cache_object = self.get_cache_object() - duplivert_object = self.get_duplivert_object() - duplivert_mesh_name = cache_object.name + self.duplivert_object_default_name + "_mesh" - is_smooth = True - octane_mesh_type = self._get_octane_mesh_type(cache_object) - - vcu.swap_object_mesh_data_geometry( - duplivert_object, - vertices, faces, - duplivert_mesh_name, - is_smooth, - octane_mesh_type - ) - - self.duplivert_object = duplivert_object - - duplivert_object.location = (0, 0, 0) - duplivert_object.scale[0] = scale - duplivert_object.scale[1] = scale - duplivert_object.scale[2] = scale - - self.apply_duplivert_object_material() - vcu.set_object_instance_type(cache_object, 'VERTS') - - current_frame = render.get_current_render_frame() - self.current_duplivert_loaded_frame = current_frame - self._commit_loaded_duplivert_frame_data(current_frame) - - if vcu.is_blender_279() or render.is_rendering(): - # This statement causes crashes if exporting Alembic in Blender 2.8x. - if depsgraph is not None: - depsgraph.update() - else: - vcu.depsgraph_update() - - - def unload_duplivert_object(self): - if not self._is_duplivert_object_initialized(): - return - - duplivert_object = self.get_duplivert_object() - if duplivert_object is not None: - vcu.delete_object(duplivert_object) - - cache_object = self.get_cache_object() - vcu.set_object_instance_type(cache_object, 'NONE') - - self.duplivert_object = None - self.current_duplivert_loaded_frame = -1 - self.loaded_duplivert_frame_data.reset() - - def get_cache_object(self): if not bpy.context.scene.flip_fluid.is_domain_in_active_scene(): return None @@ -1012,14 +850,6 @@ def get_cache_object(self): return self.cache_object - def _is_duplivert_object_initialized(self): - return self.duplivert_object is not None - - - def get_duplivert_object(self): - return self.duplivert_object - - def import_bobj(self, filename, generate_flat_array=False): with open(filename, "rb") as f: bobj_data = f.read() @@ -2279,7 +2109,7 @@ def disable_simulation_mesh_load(self, mesh_name): def load_post(self): - self._update_deprecated_mesh_storage() + pass def initialize_cache_objects(self, enabled_mesh_cache_objects=None): @@ -2312,22 +2142,42 @@ def initialize_cache_objects(self, enabled_mesh_cache_objects=None): self.spray.initialize_cache_object() self.dust.initialize_cache_object() - foam_vertices, foam_polygons = render.get_whitewater_particle_object_geometry('FOAM') - bubble_vertices, bubble_polygons = render.get_whitewater_particle_object_geometry('BUBBLE') - spray_vertices, spray_polygons = render.get_whitewater_particle_object_geometry('SPRAY') - dust_vertices, dust_polygons = render.get_whitewater_particle_object_geometry('DUST') - foam_scale = render.get_whitewater_particle_object_scale('FOAM') - bubble_scale = render.get_whitewater_particle_object_scale('BUBBLE') - spray_scale = render.get_whitewater_particle_object_scale('SPRAY') - dust_scale = render.get_whitewater_particle_object_scale('DUST') + if enable_debug_obstacle and dprops.debug.export_internal_obstacle_mesh: + self.obstacle.initialize_cache_object() - self.foam.initialize_duplivert_object(vertices=foam_vertices, polygons=foam_polygons, scale=foam_scale, instance_type='NONE') - self.bubble.initialize_duplivert_object(vertices=bubble_vertices, polygons=bubble_polygons, scale=bubble_scale, instance_type='NONE') - self.spray.initialize_duplivert_object(vertices=spray_vertices, polygons=spray_polygons, scale=spray_scale, instance_type='NONE') - self.dust.initialize_duplivert_object(vertices=dust_vertices, polygons=dust_polygons, scale=dust_scale, instance_type='NONE') + + def initialize_cache_objects_geometry_nodes(self, enabled_mesh_cache_objects=None): + self.initialize_cache_settings() + if not self._is_domain_set(): + return + if not bpy.context.scene.flip_fluid.is_domain_in_active_scene(): + return + + enable_fluid_surface = True + enable_fluid_particles = True + enable_whitewater_particles = True + enable_debug_obstacle = True + if enabled_mesh_cache_objects is not None: + enable_fluid_surface = enabled_mesh_cache_objects.fluid_surface + enable_fluid_particles = enabled_mesh_cache_objects.fluid_particles + enable_whitewater_particles = enabled_mesh_cache_objects.whitewater_particles + enable_debug_obstacle = enabled_mesh_cache_objects.debug_obstacle + + dprops = self._get_domain_properties() + if enable_fluid_surface and dprops.surface.enable_surface_mesh_generation: + self.surface.initialize_cache_object_geometry_nodes() + + if enable_fluid_particles and dprops.particles.enable_fluid_particle_output: + self.particles.initialize_cache_object_geometry_nodes() + + if enable_whitewater_particles and dprops.whitewater.enable_whitewater_simulation: + self.foam.initialize_cache_object_geometry_nodes() + self.bubble.initialize_cache_object_geometry_nodes() + self.spray.initialize_cache_object_geometry_nodes() + self.dust.initialize_cache_object_geometry_nodes() if enable_debug_obstacle and dprops.debug.export_internal_obstacle_mesh: - self.obstacle.initialize_cache_object() + self.obstacle.initialize_cache_object_geometry_nodes() def delete_cache_objects(self): @@ -2427,16 +2277,6 @@ def _get_cache_directory(self): return os.path.normpath(dprops.cache.get_cache_abspath()) - def _update_deprecated_mesh_storage(self): - self.surface.update_deprecated_mesh_storage() - self.particles.update_deprecated_mesh_storage() - self.foam.update_deprecated_mesh_storage() - self.bubble.update_deprecated_mesh_storage() - self.spray.update_deprecated_mesh_storage() - self.dust.update_deprecated_mesh_storage() - self.obstacle.update_deprecated_mesh_storage() - - def register(): bpy.utils.register_class(FLIPFluidMeshBounds) bpy.utils.register_class(FlipFluidLoadedMeshData) diff --git a/src/addon/operators/__init__.py b/src/addon/operators/__init__.py index 560f3769..94f04da4 100644 --- a/src/addon/operators/__init__.py +++ b/src/addon/operators/__init__.py @@ -32,7 +32,9 @@ 'draw_particles_operators', 'draw_force_field_operators', 'helper_operators', + 'command_line_operators', 'support_operators' + ] for module_name in reloadable_modules: if module_name in locals(): @@ -56,7 +58,9 @@ draw_particles_operators, draw_force_field_operators, helper_operators, + command_line_operators, support_operators + ) @@ -76,6 +80,7 @@ def register(): draw_particles_operators.register() draw_force_field_operators.register() helper_operators.register() + command_line_operators.register() support_operators.register() @@ -95,4 +100,5 @@ def unregister(): draw_particles_operators.unregister() draw_force_field_operators.unregister() helper_operators.unregister() + command_line_operators.unregister() support_operators.unregister() diff --git a/src/addon/operators/command_line_operators.py b/src/addon/operators/command_line_operators.py new file mode 100644 index 00000000..90a0ed5d --- /dev/null +++ b/src/addon/operators/command_line_operators.py @@ -0,0 +1,1248 @@ +# Blender FLIP Fluids Add-on +# Copyright (C) 2022 Ryan L. Guy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import bpy, os, pathlib, stat, subprocess, platform, random, shutil, traceback +from bpy.props import ( + BoolProperty, + ) + +from ..utils import version_compatibility_utils as vcu +from . import render_passes + + +### PREPARE VISIBLITY SETTINGS FOR PASSES ### + +def apply_visibility_settings_for_pass(pass_name): + visibility_settings = render_passes.visibility_settings + settings = visibility_settings.get(pass_name, {}) + hprops = bpy.context.scene.flip_fluid_helper + + print(f"Applying settings for pass: {pass_name}") + print(f"Settings being applied: {settings}") + + # World- and rendersettings + if 'world' in settings: + apply_visibility_settings_for_world(bpy.context.scene.world, settings['world']) + if 'film_transparent' in settings: + apply_film_transparency(settings['film_transparent']) + if 'transparent_glass' in settings: + apply_transparent_glass_settings(settings['transparent_glass']) + if 'denoiser' in settings: + apply_denoiser(settings['denoiser']) + + # Objectsettings + for obj_name, obj_visibility in settings.items(): + if obj_name in ["selected_objects", "world", "film_transparent", "transparent_glass"]: + continue + obj = bpy.data.objects.get(obj_name) + if obj: + print(f"Applying general settings to {obj_name}: {obj_visibility}") + apply_visibility_settings_for_object(obj, obj_visibility) + else: + print(f"Object not found in Blender: {obj_name}") + + if "selected_objects" in settings: + object_list_settings = settings["selected_objects"] + print(f"Settings for 'selected_objects' in pass '{pass_name}': {object_list_settings}") + for obj_prop in hprops.render_passes_objectlist: + obj = bpy.data.objects.get(obj_prop.name) + if obj: + print(f"Applying '{pass_name}' settings to selected object {obj_prop.name}") + apply_visibility_settings_for_object(obj, object_list_settings) + else: + print(f"Selected object not found in Blender: {obj_prop.name}") + +def apply_film_transparency(film_transparent): + bpy.context.scene.render.film_transparent = film_transparent + print(f"Film transparency set to: {film_transparent}") + +def apply_transparent_glass_settings(transparent_glass): + bpy.context.scene.cycles.film_transparent_glass = transparent_glass + print(f"Transparent glass set to: {transparent_glass}") + +def apply_denoiser(denoiser): + bpy.context.scene.cycles.use_denoising = denoiser + print(f"Denoiser set to: {denoiser}") + +def apply_visibility_settings_for_world(world, world_settings): + if not world: + print("No world found in the current scene.") + return + + # Visiblitysettings for the world + visibility_attributes = ['camera', 'diffuse', 'glossy', 'transmission', 'scatter', 'shadow'] + for attr in visibility_attributes: + if attr in world_settings: + setattr(world.cycles_visibility, attr, world_settings[attr]) + print(f"Set world ray visibility for {attr} to {world_settings[attr]}") + +def apply_visibility_settings_for_object(obj, obj_visibility): + obj.visible_camera = obj_visibility["camera"] + obj.visible_diffuse = obj_visibility["diffuse"] + obj.visible_glossy = obj_visibility["glossy"] + obj.visible_transmission = obj_visibility["transmission"] + obj.visible_volume_scatter = obj_visibility["scatter"] + obj.visible_shadow = obj_visibility["shadow"] + + if "is_shadow_catcher" in obj_visibility: + obj.is_shadow_catcher = obj_visibility["is_shadow_catcher"] + + if "is_holdout" in obj_visibility: + obj.is_holdout = obj_visibility["is_holdout"] + +#def apply_render_output_path_for_pass(suffix): +# render_output = bpy.context.scene.render.filepath +# render_output = render_output.replace('\\', '/') +# render_output_prefix = bpy.path.basename(render_output) +# render_output_directory = render_output.removesuffix(render_output_prefix) +# new_render_output_path = render_output_directory + suffix + "/" + render_output_prefix +# if render_output_prefix: +# new_render_output_path += suffix + "_" +# bpy.context.scene.render.filepath = new_render_output_path + +def prepare_render_passes_blend_files(): + props = bpy.context.scene.flip_fluid_helper + + if not props.render_passes: + return + + blend_file_directory = os.path.dirname(bpy.data.filepath) + base_file_name = pathlib.Path(bpy.path.basename(bpy.data.filepath)).stem + + pass_suffixes = [ + ("objects_only", props.render_passes_objects_only), + ("fluidparticles_only", props.render_passes_fluidparticles_only), + ("fluid_only", props.render_passes_fluid_only), + ("fluid_shadows_only", props.render_passes_fluid_shadows_only), + ("reflr_only", props.render_passes_reflr_only), + ("bubblesanddust_only", props.render_passes_bubblesanddust_only), + ("foamandspray_only", props.render_passes_foamandspray_only), + # ("object_shadows_only", props.render_passes_object_shadows_only), # Disabled for now + ] + + clear_simulation_meshes_before_saving = True + if clear_simulation_meshes_before_saving: + # The simulation meshes can be cleared of data to reduce filesize + # and speed up saving Blend files + dprops = bpy.context.scene.flip_fluid.get_domain_properties() + dprops.mesh_cache.reset_cache_objects() + + enabled_passes = [suffix for suffix, enabled in pass_suffixes if enabled] + + original_render_output_path = bpy.context.scene.render.filepath + + # Create a set of currently existing .blend and .blend1 files with the naming convention + existing_files = {f for f in os.listdir(blend_file_directory) + if f.endswith(('.blend', '.blend1')) and + any(f.startswith(f"{i+1}_{base_file_name}_") for i in range(len(pass_suffixes)))} + + expected_render_pass_files = set() + for idx, (suffix, is_active) in enumerate(pass_suffixes): + if is_active: + number = enabled_passes.index(suffix) + 1 + apply_visibility_settings_for_pass(suffix) + apply_render_output_path_for_pass(suffix, number, base_file_name) + + blend_name = f"{number}_{base_file_name}_{suffix}.blend" + blend_path = os.path.join(blend_file_directory, blend_name) + bpy.ops.wm.save_as_mainfile(filepath=blend_path, copy=True) + + # Add the generated file names to the expected set + expected_render_pass_files.add(blend_name) + expected_render_pass_files.add(blend_name + "1") + + bpy.context.scene.render.filepath = original_render_output_path + + # Calculate the difference to find out which files should be removed + files_to_remove = existing_files - expected_render_pass_files + + # Remove the files + for filename in files_to_remove: + blend_filepath = os.path.join(blend_file_directory, filename) + + # Disabled for the FLIP Fluids 1.8.0 release - just in case an unfound bug could + # delete an incorrect Blend file. + # All calls to os.remove should be implemented and checked in + # filesystem/filesystem_protection_layer.py + # According to the file and data protection guidelines: + # https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Domain-Cache-Settings#file-and-data-protection-features + # + # TODO: update this later - Ryan + """ + os.remove(blend_filepath) + print(f"Removed file: {blend_filepath}") + """ + +def apply_render_output_path_for_pass(suffix, number, base_file_name): + # Der Pfad zum Render-Verzeichnis + original_output_folder = bpy.path.abspath(bpy.context.scene.render.filepath) + # Entfernen Sie den Dateinamen, um nur das Verzeichnis zu erhalten + output_folder = os.path.dirname(original_output_folder) + + # Erstellen des Unterverzeichnisses für den Pass + render_output_subfolder = f"{number}_{suffix}" + full_output_path = os.path.join(output_folder, render_output_subfolder) + if not os.path.exists(full_output_path): + os.makedirs(full_output_path) + + # Erstellen des neuen Dateinamens + output_filename = os.path.basename(original_output_folder) + bpy.context.scene.render.filepath = os.path.join(full_output_path, f"{number}_{output_filename}_{suffix}") + + +### END OF PREPARE VISIBLITY SETTINGS FOR PASSES ### + + +def get_command_line_script_filepath(script_filename): + script_path = os.path.dirname(os.path.realpath(__file__)) + script_path = os.path.dirname(script_path) + script_path = os.path.join(script_path, "resources", "command_line_scripts", script_filename) + if not os.path.isfile(script_path): + errmsg = "Unable to locate script <" + script_path + ">. Please contact the developers with this error." + raise Exception(errmsg) + return script_path + + +def save_blend_file_before_launch(override_preferences=False): + prefs = vcu.get_addon_preferences() + if prefs.cmd_save_blend_file_before_launch or override_preferences: + bpy.ops.wm.save_mainfile() + + +def get_render_output_directory(): + frame_path = bpy.context.scene.render.frame_path() + render_path = os.path.dirname(frame_path) + return render_path + + +def is_render_output_directory_createable(): + render_path = get_render_output_directory() + try: + os.makedirs(render_path, exist_ok=True) + except: + return False + return True + + +def restore_blender_original_cwd(): + # Restore Blender's original CWD in case another addon has changed this path + # The command line launch features rely on the CWD being the default location + # of the folder containing the Blender executable. + # If the location is modified, the command line window will open to + # the modified location and launching Blender may fail. + os.chdir(os.path.dirname(bpy.app.binary_path)) + + +def get_blender_app_binary_path_windows(): + if vcu.is_blender_28(): + blender_exe_path = bpy.app.binary_path + if " " in blender_exe_path: + # Some versions of Blender 2.8+ don't support spaces in the executable path + blender_exe_path = "blender.exe" + else: + # subproccess.call() in Blender 2.79 Python does not seem to support spaces in the + # executable path, so we'll just use blender.exe and hope that no other addon has + # changed Blender's working directory + blender_exe_path = "blender.exe" + return blender_exe_path + + +def launch_command_darwin_or_linux(command_text, script_prefix_string): + script_text = "#!/bin/bash\n" + command_text + script_name = script_prefix_string + bpy.path.basename(bpy.context.blend_data.filepath) + ".sh" + script_filepath = os.path.join(os.path.dirname(bpy.data.filepath), script_name) + with open(script_filepath, 'w') as f: + f.write(script_text) + + st = os.stat(script_filepath) + os.chmod(script_filepath, st.st_mode | stat.S_IEXEC) + + system = platform.system() + if system == "Darwin": + subprocess.call(["open", "-a", "Terminal", script_filepath]) + elif system == "Linux": + if shutil.which("gnome-terminal") is not None and shutil.which("bash") is not None: + # Required to escape spaces for the script_filepath + "; exec bash" command to run + script_filepath = script_filepath.replace(" ", "\\ ") + subprocess.call(["gnome-terminal", "--", "bash", "-c", script_filepath + "; exec bash"]) + elif shutil.which("xterm") is not None: + subprocess.call(["xterm", "-hold", "-e", script_filepath]) + else: + errmsg = "This feature requires the (GNOME Terminal and Bash Shell), or the XTERM terminal emulator to be" + errmsg += " installed and to be accessible on the system path. Either install these programs, restart Blender, and try again or use the" + errmsg += " Copy Command to Clipboard operator and paste into a terminal program of your choice." + bpy.ops.flip_fluid_operators.display_error( + 'INVOKE_DEFAULT', + error_message="Linux: Unable to launch new terminal window", + error_description=errmsg, + popup_width=600 + ) + + +def get_command_line_baking_script_filepath(): + hprops = bpy.context.scene.flip_fluid_helper + script_name = "run_simulation.py" + if hprops.cmd_bake_and_render: + if hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_SEQUENCE': + system = platform.system() + render_mode = hprops.cmd_launch_render_after_bake_mode + if system != "Windows": + render_mode = 'CMD_RENDER_MODE_NORMAL' + if render_mode == 'CMD_RENDER_MODE_NORMAL': + script_name = "run_simulation_and_render_sequence.py" + elif render_mode == 'CMD_RENDER_MODE_BATCH': + script_name = "run_simulation_and_render_sequence_batch.py" + elif hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': + script_name = "run_simulation_and_render_interleaved.py" + return get_command_line_script_filepath(script_name) + + +def get_command_line_bake_subprocess_command_list(): + hprops = bpy.context.scene.flip_fluid_helper + blender_exe_path = get_blender_app_binary_path_windows() + script_filepath = get_command_line_baking_script_filepath() + command_list = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "--python", script_filepath] + if hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': + num_instance_string = str(hprops.cmd_bake_and_render_interleaved_instances) + use_overwrite_string = "0" if hprops.cmd_bake_and_render_interleaved_no_overwrite else "1" + command_list += ["--", num_instance_string, use_overwrite_string] + return command_list + + +def get_command_line_bake_command_text(): + hprops = bpy.context.scene.flip_fluid_helper + script_filepath = get_command_line_baking_script_filepath() + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_filepath + "\"" + if hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': + num_instance_string = str(hprops.cmd_bake_and_render_interleaved_instances) + use_overwrite_string = "0" if hprops.cmd_bake_and_render_interleaved_no_overwrite else "1" + command_text += " -- " + num_instance_string + " " + use_overwrite_string + return command_text + + +class FlipFluidHelperCommandLineBake(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_bake" + bl_label = "Launch Bake" + bl_description = ("Launch a new command line window and start baking." + + " The .blend file will need to be saved for before using" + + " this operator for changes to take effect") + + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + + def is_render_output_format_image_required(self, context): + hprops = context.scene.flip_fluid_helper + is_bake_and_render_interleaved = hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED' + is_bake_and_render_batch = (hprops.cmd_bake_and_render and + hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_SEQUENCE' and + hprops.cmd_launch_render_after_bake_mode == 'CMD_RENDER_MODE_BATCH') + return is_bake_and_render_interleaved or is_bake_and_render_batch + + + def check_and_report_operator_context_errors(self, context): + hprops = context.scene.flip_fluid_helper + + domain = context.scene.flip_fluid.get_domain_object() + if domain is None: + return {'CANCELLED'} + + if not context.scene.flip_fluid.is_domain_in_active_scene(): + self.report({"ERROR"}, + "Active scene must contain domain object to launch bake. Select the scene that contains the domain object, save, and try again.") + return {'CANCELLED'} + + if hprops.cmd_bake_and_render and not is_render_output_directory_createable(): + errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if self.is_render_output_format_image_required(context) and not is_render_output_format_image(): + self.report({'ERROR'}, "Render output format must be an image format for this render mode. Change render output to an image, save, and try again.") + return {'CANCELLED'} + + if platform.system() not in ["Windows", "Darwin", "Linux"]: + self.report({'ERROR'}, "System platform <" + platform.system() + "> not supported. This feature only supports Windows, MacOS, or Linux system platforms.") + return {'CANCELLED'} + + + def generate_bake_batch_file(self): + # Launch using .bat file that can re-launch after crash is detected + bat_template_path = get_command_line_script_filepath("cmd_bake_template.bat") + with open(bat_template_path, 'r') as f: + bat_text = f.read() + + prefs = vcu.get_addon_preferences() + launch_attempts = prefs.cmd_bake_max_attempts + launch_attempts_text = str(launch_attempts + 1) + + command_text = get_command_line_bake_command_text() + bat_text = bat_text.replace("MAX_LAUNCH_ATTEMPTS", launch_attempts_text) + bat_text = bat_text.replace("COMMAND_OPERATION", command_text) + + dprops = bpy.context.scene.flip_fluid.get_domain_properties() + cache_directory = dprops.cache.get_cache_abspath() + cache_scripts_directory = os.path.join(cache_directory, "scripts") + if not os.path.exists(cache_scripts_directory): + os.makedirs(cache_scripts_directory) + + cmd_bake_script_filepath = os.path.join(cache_scripts_directory, "cmd_bake.bat") + with open(cmd_bake_script_filepath, 'w') as f: + f.write(bat_text) + + return cmd_bake_script_filepath + + + def execute(self, context): + hprops = context.scene.flip_fluid_helper + + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + save_blend_file_before_launch(override_preferences=False) + restore_blender_original_cwd() + + command_list = get_command_line_bake_subprocess_command_list() + command_text = get_command_line_bake_command_text() + + system = platform.system() + if system == "Windows": + if vcu.get_addon_preferences().cmd_bake_max_attempts == 0: + # Launch with a single command + subprocess.call(command_list, shell=True) + else: + cmd_bake_script_filepath = self.generate_bake_batch_file() + os.startfile(cmd_bake_script_filepath) + elif system == "Darwin" or system == "Linux": + launch_command_darwin_or_linux(command_text, "BAKE_") + + info_msg = "Launched command line baking window. If the baking process did not begin," + info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" + info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line baking, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-bake" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +class FlipFluidHelperCommandLineBakeToClipboard(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_bake_to_clipboard" + bl_label = "Copy Bake Command to Clipboard" + bl_description = ("Copy command for baking to your system clipboard." + + " The .blend file will need to be saved before running this command for changes to take effect") + + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + + def execute(self, context): + hprops = bpy.context.scene.flip_fluid_helper + + command_text = get_command_line_bake_command_text() + bpy.context.window_manager.clipboard = command_text + + info_msg = "Copied the following baking command to your clipboard:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line baking, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-bake" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + +### DF Add Passes here: + +class FlipFluidPassesResetSettings(bpy.types.Operator): + """Reset all visiblity settings to default""" + bl_idname = "flip_fluid_operators.reset_passes_settings" + bl_label = "Reset Passes Settings" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + apply_visibility_settings_for_pass('reset') + self.report({'INFO'}, "Pass settings have been reset.") + return {'FINISHED'} + +class FlipFluidHelperCommandLineRender(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_render" + bl_label = "Launch Render" + bl_description = ("Launch a new command line window and start rendering the animation." + + " The .blend file will need to be saved before using this operator for changes to take effect") + + use_turbo_tools = BoolProperty(False) + exec(vcu.convert_attribute_to_28("use_turbo_tools")) + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def check_and_report_operator_context_errors(self, context): + if not is_render_output_directory_createable(): + errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if platform.system() not in ["Windows", "Darwin", "Linux"]: + self.report({'ERROR'}, "System platform <" + platform.system() + "> not supported. This feature only supports Windows, MacOS, or Linux system platforms.") + return {'CANCELLED'} + + + def execute(self, context): + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + save_blend_file_before_launch(override_preferences=False) + restore_blender_original_cwd() + + blender_exe_path = get_blender_app_binary_path_windows() + command_list = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "-a"] + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" -a" + + if self.use_turbo_tools: + command_list = ["start", "cmd", "/k", blender_exe_path, "-b", bpy.data.filepath, "--python-expr", "import bpy; bpy.ops.threedi.render_animation()"] + command_text = "\"" + bpy.app.binary_path + "\" -b \"" + bpy.data.filepath + "\" --python-expr \"import bpy; bpy.ops.threedi.render_animation()\"" + else: + command_list = ["start", "cmd", "/k", blender_exe_path, "-b", bpy.data.filepath, "-a"] + command_text = "\"" + bpy.app.binary_path + "\" -b \"" + bpy.data.filepath + "\" -a" + + system = platform.system() + if system == "Windows": + subprocess.call(command_list, shell=True) + elif system == "Darwin" or system == "Linux": + launch_command_darwin_or_linux(command_text, "RENDER_ANIMATION_") + + info_msg = "Launched command line render window. If the render process did not begin," + info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" + info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + + +class FlipFluidHelperCommandLineRenderToClipboard(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_render_to_clipboard" + bl_label = "Launch Render" + bl_description = ("Copy command for rendering to your system clipboard." + + " The .blend file will need to be saved before running this command for changes to take effect") + + use_turbo_tools = BoolProperty(False) + exec(vcu.convert_attribute_to_28("use_turbo_tools")) + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def execute(self, context): + if self.use_turbo_tools: + command_text = "\"" + bpy.app.binary_path + "\" -b \"" + bpy.data.filepath + "\" --python-expr \"import bpy; bpy.ops.threedi.render_animation()\"" + else: + command_text = "\"" + bpy.app.binary_path + "\" -b \"" + bpy.data.filepath + "\" -a" + + bpy.context.window_manager.clipboard = command_text + + info_msg = "Copied the following render command to your clipboard:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +### RENDER SINGLE FRAME ### +class FlipFluidHelperCommandLineRenderFrame(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_render_frame" + bl_label = "Launch Frame Render" + bl_description = ("Launch a new command line window and start rendering the current timeline frame." + + " The .blend file will need to be saved before using this operator for changes to take effect") + + use_turbo_tools = BoolProperty(False) + exec(vcu.convert_attribute_to_28("use_turbo_tools")) + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def check_and_report_operator_context_errors(self, context): + if not is_render_output_directory_createable(): + errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if not is_render_output_format_image(): + self.report({'ERROR'}, "Render output format must be an image format. Change render output to an image, save, and try again.") + return {'CANCELLED'} + + if platform.system() not in ["Windows", "Darwin", "Linux"]: + self.report({'ERROR'}, "System platform <" + platform.system() + "> not supported. This feature only supports Windows, MacOS, or Linux system platforms.") + return {'CANCELLED'} + + + def execute(self, context): + hprops = context.scene.flip_fluid_helper + + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + save_blend_file_before_launch(override_preferences=True) + restore_blender_original_cwd() + + frame_string = str(bpy.context.scene.frame_current) + + open_image_after = "0" + if hprops.cmd_open_image_after_render: + open_image_after = "1" + + cmd_start_flag = "/k" + if hprops.cmd_close_window_after_render: + cmd_start_flag = "/c" + + script_path = get_command_line_script_filepath("render_single_frame.py") + if self.use_turbo_tools: + script_path = get_command_line_script_filepath("render_single_frame_turbo_tools.py") + + blender_exe_path = get_blender_app_binary_path_windows() + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after + command_list = ["start", "cmd", cmd_start_flag, blender_exe_path, "--background", bpy.data.filepath, "--python", script_path, "--", frame_string, open_image_after] + + system = platform.system() + if system == "Windows": + subprocess.call(command_list, shell=True) + elif system == "Darwin" or system == "Linux": + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after + launch_command_darwin_or_linux(command_text, "RENDER_FRAME_") + + info_msg = "Launched command line render window. If the render process did not begin," + info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" + info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-frame-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + + +class FlipFluidHelperCmdRenderFrameToClipboard(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_cmd_render_frame_to_clipboard" + bl_label = "Launch Frame Render" + bl_description = ("Copy command for frame rendering to your system clipboard." + + " The .blend file will need to be saved before running this command for changes to take effect") + + use_turbo_tools = BoolProperty(False) + exec(vcu.convert_attribute_to_28("use_turbo_tools")) + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def execute(self, context): + hprops = context.scene.flip_fluid_helper + + frame_string = str(bpy.context.scene.frame_current) + open_image_after = "0" + if hprops.cmd_open_image_after_render: + open_image_after = "1" + + script_path = get_command_line_script_filepath("render_single_frame.py") + if self.use_turbo_tools: + script_path = get_command_line_script_filepath("render_single_frame_turbo_tools.py") + + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after + bpy.context.window_manager.clipboard = command_text + + info_msg = "Copied the following render command to your clipboard:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-frame-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +class FlipFluidHelperCommandLineAlembicExport(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_command_line_alembic_export" + bl_label = "Launch Alembic Export" + bl_description = ("Launch a new command line window and start exporting the simulation meshes to the Alembic (.abc) format." + + " The .blend file will need to be saved before using this operator for changes to take effect") + + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + + def execute(self, context): + save_blend_file_before_launch(override_preferences=False) + restore_blender_original_cwd() + + script_path = get_command_line_script_filepath("alembic_export.py") + blender_exe_path = get_blender_app_binary_path_windows() + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + command_list = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "--python", script_path] + + system = platform.system() + if system == "Windows": + subprocess.call(command_list, shell=True) + elif system == "Darwin" or system == "Linux": + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + launch_command_darwin_or_linux(command_text, "ALEMBIC_EXPORT_") + + info_msg = "Launched command line Alembic export window. If the Alembic export process did not begin," + info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" + info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line operators, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-alembic-export" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +class FlipFluidHelperCmdAlembicExportToClipboard(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_cmd_alembic_export_to_clipboard" + bl_label = "Launch Alembic Export" + bl_description = ("Copy command for Alembic export to your system clipboard." + + " The .blend file will need to be saved before running this command for changes to take effect") + + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + + def execute(self, context): + script_path = get_command_line_script_filepath("alembic_export.py") + frame_string = str(bpy.context.scene.frame_current) + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + bpy.context.window_manager.clipboard = command_text + + info_msg = "Copied the following Alembic export command to your clipboard:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line tools, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-alembic-export" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +def get_render_output_info(): + full_path = bpy.path.abspath(bpy.context.scene.render.filepath) + directory_path = full_path + + file_prefix = os.path.basename(directory_path) + if file_prefix: + directory_path = os.path.dirname(directory_path) + + file_format_to_suffix = { + "BMP" : ".bmp", + "IRIS" : ".rgb", + "PNG" : ".png", + "JPEG" : ".jpg", + "JPEG2000" : ".jp2", + "TARGA" : ".tga", + "TARGA_RAW" : ".tga", + "CINEON" : ".cin", + "DPX" : ".dpx", + "OPEN_EXR_MULTILAYER" : ".exr", + "OPEN_EXR" : ".exr", + "HDR" : ".hdr", + "TIFF" : ".tif", + "WEBP" : ".webp", + "AVI_JPEG" : ".avi", + "AVI_RAW" : ".avi", + "FFMPEG" : ".mp4" + } + + file_format = bpy.context.scene.render.image_settings.file_format + file_suffix = file_format_to_suffix[file_format] + + return directory_path, file_prefix, file_suffix + + +def is_render_output_format_image(): + image_file_format_to_suffix = { + "BMP" : ".bmp", + "IRIS" : ".rgb", + "PNG" : ".png", + "JPEG" : ".jpg", + "JPEG2000" : ".jp2", + "TARGA" : ".tga", + "TARGA_RAW" : ".tga", + "CINEON" : ".cin", + "DPX" : ".dpx", + "OPEN_EXR_MULTILAYER" : ".exr", + "OPEN_EXR" : ".exr", + "HDR" : ".hdr", + "TIFF" : ".tif", + "WEBP" : ".webp", + } + + file_format = bpy.context.scene.render.image_settings.file_format + return file_format in image_file_format_to_suffix + + +def is_render_output_format_image_with_transparency(): + image_file_format_to_suffix = { + "IRIS" : ".rgb", + "PNG" : ".png", + "JPEG2000" : ".jp2", + "TARGA" : ".tga", + "TARGA_RAW" : ".tga", + "DPX" : ".dpx", + "OPEN_EXR_MULTILAYER" : ".exr", + "OPEN_EXR" : ".exr", + "TIFF" : ".tif", + "WEBP" : ".webp", + } + + file_format = bpy.context.scene.render.image_settings.file_format + return file_format in image_file_format_to_suffix + + +def is_render_output_format_image_set_to_RGBA_color_mode(): + color_mode = bpy.context.scene.render.image_settings.color_mode + return color_mode == 'RGBA' + + +class FlipFluidHelperCommandLineRenderToScriptfile(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_cmd_render_to_scriptfile" + bl_label = "Generate Batch File" + bl_description = ("Generates a Windows batch file to render all frames one-by-one." + + " The .blend file will need to be saved before using this operator for changes to take effect") + + + @classmethod + def poll(cls, context): + system = platform.system() + return bool(bpy.data.filepath) and system == "Windows" + + + def get_missing_frames(self): + directory_path, file_prefix, file_suffix = get_render_output_info() + + filenames = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))] + filenames = [f for f in filenames if f.startswith(file_prefix) and f.endswith(file_suffix)] + frame_numbers = [] + for f in filenames: + try: + f = f[len(file_prefix):-len(file_suffix)] + frame_numbers.append(int(f)) + except: + pass + + frame_exists = {} + for n in frame_numbers: + frame_exists[n] = True + + frame_start = bpy.context.scene.frame_start + frame_end = bpy.context.scene.frame_end + missing_frames = [] + for i in range(frame_start, frame_end + 1): + if not i in frame_exists: + missing_frames.append(i) + + return missing_frames + + + def generate_file_string(self, missing_frames): + blender_exe_path = "\"" + bpy.app.binary_path + "\"" + blend_path = "\"" + bpy.data.filepath + "\"" + + file_text = "echo.\n" + for n in missing_frames: + command_text = blender_exe_path + " -b " + blend_path + " -f " + str(n) + file_text += command_text + "\n" + file_text += "pause\n" + + return file_text + + + def check_and_report_operator_context_errors(self, context): + if not is_render_output_directory_createable(): + errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if not is_render_output_format_image(): + self.report({'ERROR'}, "Render output format must be an image format. Change render output to an image, save, and try again.") + return {'CANCELLED'} + + directory_path, file_prefix, file_suffix = get_render_output_info() + if not directory_path: + return {'CANCELLED'} + + if platform.system() not in ["Windows", "Darwin", "Linux"]: + self.report({'ERROR'}, "System platform <" + platform.system() + "> not supported. This feature only supports Windows, MacOS, or Linux system platforms.") + return {'CANCELLED'} + + + def execute(self, context): + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + directory_path, file_prefix, file_suffix = get_render_output_info() + + more_info_string = "For more information on batch rendering, visit our documentation:\n" + more_info_string += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render\n" + render_output_info_string = "View the rendered files at <" + directory_path + ">\n" + + if not os.path.exists(directory_path): + os.makedirs(directory_path) + + missing_frames = self.get_missing_frames() + if not missing_frames: + info_msg = "No batch file generated! All frames have already been rendered.\n" + info_msg += render_output_info_string + "\n" + info_msg += more_info_string + self.report({'INFO'}, info_msg) + return {'CANCELLED'} + + file_text = self.generate_file_string(missing_frames) + blend_directory = os.path.dirname(bpy.data.filepath) + batch_filename = "RENDER_" + bpy.path.basename(bpy.context.blend_data.filepath) + ".bat" + batch_filepath = os.path.join(blend_directory, batch_filename) + with open(batch_filepath, "w") as renderscript_file: + renderscript_file.write(file_text) + + total_frames = bpy.context.scene.frame_end - bpy.context.scene.frame_start + 1 + info_msg = "\nA batch file has been generated here: <" + batch_filepath + ">\n" + info_msg += render_output_info_string + "\n" + info_msg += str(total_frames - len(missing_frames)) + " frames in the " + file_suffix + " file format have already been rendered!\n" + info_msg += str(len(missing_frames)) + " frames are not yet rendered!\n\n" + info_msg += more_info_string + + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + +class FlipFluidHelperRunScriptfile(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_run_batch_render_scriptfile" + bl_label = "Launch Batch File Render" + bl_description = ("Runs the generated batch file. If no batch file has been generated, one will be created automatically." + + " The .blend file will need to be saved before using this operator for changes to take effect") + + + regenerate_batch_file = BoolProperty(False) + exec(vcu.convert_attribute_to_28("regenerate_batch_file")) + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def execute(self, context): + directory = os.path.dirname(bpy.data.filepath) + blend_filename = bpy.path.basename(bpy.context.blend_data.filepath) + script_filename = "RENDER_" + blend_filename + ".bat" + batch_filepath = os.path.join(directory, script_filename) + + if self.regenerate_batch_file or not os.path.isfile(batch_filepath): + bpy.ops.flip_fluid_operators.helper_cmd_render_to_scriptfile() + if not os.path.isfile(batch_filepath): + self.report({'ERROR'}, "Unable to generate the render script.") + + os.startfile(batch_filepath) + + info_msg = "Beginning to run the batch render script!\n\n" + info_msg += "For more information on batch file rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render" + self.report({'INFO'}, info_msg) + return {'FINISHED'} + + +class FlipFluidHelperOpenOutputFolder(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_open_outputfolder" + bl_label = "Opens The Output Folder" + bl_description = ("Opens the output-folder that is set in the output settings. If the folder does not exist, it will be created." + + " The .blend file will need to be saved before using this operator") + + + @classmethod + def poll(cls, context): + return bool(bpy.data.filepath) + + + def execute(self, context): + directory_path, file_prefix, file_suffix = get_render_output_info() + if not os.path.exists(directory_path): + os.makedirs(directory_path) + os.startfile(directory_path) + return {'FINISHED'} + + +class FlipFluidHelperCommandLineRenderPassAnimation(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_cmd_render_pass_animation" + bl_label = "Launch Render Pass Animation" + bl_description = ("Description: todo - launch render pass animation script") + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + def cleanup_object_list(self, object_list): + indices_to_remove = [index for index, obj in enumerate(object_list) if not bpy.data.objects.get(obj.name)] + + for index in reversed(indices_to_remove): + object_list.remove(index) + + if indices_to_remove: + print(f"Removed {len(indices_to_remove)} non-existent objects from the object list.") + + def check_and_report_operator_context_errors(self, context): + domain = context.scene.flip_fluid.get_domain_object() + if domain is None: + return {'CANCELLED'} + + if not context.scene.flip_fluid.is_domain_in_active_scene(): + self.report({"ERROR"}, + "Active scene must contain domain object to launch render. Select the scene that contains the domain object, save, and try again.") + return {'CANCELLED'} + + if not is_render_output_directory_createable(): + errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if context.scene.render.engine == 'BLENDER_EEVEE': + self.report({'ERROR'}, "The EEVEE render engine is not supported for this feature. Set the render engine to Cycles, save, and try again.") + return {'CANCELLED'} + if context.scene.render.engine == 'BLENDER_WORKBENCH': + self.report({'ERROR'}, "The Workbench render engine is not supported for this feature. Set the render engine to Cycles, save, and try again.") + return {'CANCELLED'} + + if not is_render_output_format_image_with_transparency(): + errmsg = "Render output format must be an image format that supports transparency." + errmsg += " The OpenEXR format is recommended." + errmsg += " Change render output to an image format with transparency, save, and try again." + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if not is_render_output_format_image_set_to_RGBA_color_mode(): + errmsg = "Render output format color mode must be set to RGBA for transparency." + errmsg += " The current color mode is set to <" + bpy.context.scene.render.image_settings.color_mode + ">." + errmsg += " Change render output color mode to RGBA, save, and try again." + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + if platform.system() not in ["Windows", "Darwin", "Linux"]: + self.report({'ERROR'}, "System platform <" + platform.system() + "> not supported. This feature only supports Windows, MacOS, or Linux system platforms.") + return {'CANCELLED'} + + def execute(self, context): + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + save_blend_file_before_launch(override_preferences=False) + restore_blender_original_cwd() + + script_path = get_command_line_script_filepath("render_animation_render_passes.py") + blender_exe_path = get_blender_app_binary_path_windows() + + ### EXECUTE PREPARE RENDERPASSES ### + prepare_render_passes_blend_files() + + # Clean object list if objects were deleted + hprops = bpy.context.scene.flip_fluid_helper + self.cleanup_object_list(hprops.render_passes_objectlist) + + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + command_list = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "--python", script_path] + + system = platform.system() + if system == "Windows": + subprocess.call(command_list, shell=True) + elif system == "Darwin" or system == "Linux": + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + launch_command_darwin_or_linux(command_text, "RENDER_PASS_ANIMATION_") + + info_msg = "Launched command line render window. If the render process did not begin," + info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" + info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + +class FlipFluidHelperCommandLineRenderPassAnimationToClipboard(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_cmd_render_pass_anim_clipboard" + bl_label = "Copy Render Pass Animation Command to Clipboard" + bl_description = ("Description: todo - launch render pass animation script to clipboard") + + @classmethod + def poll(cls, context): + return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) + + def execute(self, context): + ### EXECUTE PREPARE RENDERPASSES ### + prepare_render_passes_blend_files() + + # Clean object list if objects were deleted + hprops = bpy.context.scene.flip_fluid_helper + self.cleanup_object_list(hprops.render_passes_objectlist) + + script_path = get_command_line_script_filepath("render_animation_render_passes.py") + frame_string = str(bpy.context.scene.frame_current) + command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + bpy.context.window_manager.clipboard = command_text + + info_msg = "Copied the following render command to your clipboard:\n\n" + info_msg += command_text + "\n\n" + info_msg += "For more information on command line rendering, visit our documentation:\n" + info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-animation-render" + self.report({'INFO'}, info_msg) + + return {'FINISHED'} + + def cleanup_object_list(self, object_list): + indices_to_remove = [index for index, obj in enumerate(object_list) if not bpy.data.objects.get(obj.name)] + + for index in reversed(indices_to_remove): + object_list.remove(index) + + if indices_to_remove: + print(f"Removed {len(indices_to_remove)} non-existent objects from the object list.") + + +class FLIPFLUIDS_MT_render_menu(bpy.types.Menu): + bl_label = "FLIP Fluids CMD Render" + bl_idname = "FLIPFLUIDS_MT_render_menu" + + def draw(self, context): + render_frame_text = "Shift F12" + render_animation_text = "Shift Ctrl F12" + render_batch_animation_text = "Shift Ctrl B" + + system = platform.system() + + row1 = self.layout.row() + row2 = self.layout.row() + if system == "Windows": + row3 = self.layout.row() + + row1.operator(FlipFluidHelperCommandLineRenderFrame.bl_idname, icon="RENDER_STILL").use_turbo_tools=False + row2.operator(FlipFluidHelperCommandLineRender.bl_idname, text="Launch Animation Render", icon="RENDER_ANIMATION").use_turbo_tools=False + if system == "Windows": + row3.operator(FlipFluidHelperRunScriptfile.bl_idname, text="Launch Batch Render", icon="CONSOLE").regenerate_batch_file=True + + row1.label(text=render_frame_text) + row2.label(text=render_animation_text) + if system == "Windows": + row3.label(text=render_batch_animation_text) + + +def draw_flip_fluids_render_menu(self, context): + self.layout.separator() + self.layout.menu(FLIPFLUIDS_MT_render_menu.bl_idname, icon="CONSOLE") + + +ADDON_KEYMAPS = [] + +def register(): + bpy.utils.register_class(FlipFluidHelperCommandLineBake) + bpy.utils.register_class(FlipFluidHelperCommandLineBakeToClipboard) + bpy.utils.register_class(FlipFluidHelperCommandLineRender) + bpy.utils.register_class(FlipFluidHelperCommandLineRenderToClipboard) + bpy.utils.register_class(FlipFluidHelperCommandLineRenderFrame) + bpy.utils.register_class(FlipFluidHelperCmdRenderFrameToClipboard) + bpy.utils.register_class(FlipFluidHelperCommandLineAlembicExport) + bpy.utils.register_class(FlipFluidHelperCmdAlembicExportToClipboard) + bpy.utils.register_class(FlipFluidHelperCommandLineRenderToScriptfile) + bpy.utils.register_class(FlipFluidHelperRunScriptfile) + bpy.utils.register_class(FlipFluidHelperOpenOutputFolder) + bpy.utils.register_class(FlipFluidPassesResetSettings) + bpy.utils.register_class(FlipFluidHelperCommandLineRenderPassAnimation) + bpy.utils.register_class(FlipFluidHelperCommandLineRenderPassAnimationToClipboard) + + bpy.utils.register_class(FLIPFLUIDS_MT_render_menu) + try: + # Blender 2.8+ + bpy.types.TOPBAR_MT_render.append(draw_flip_fluids_render_menu) + except Exception as e: + print(traceback.format_exc()) + print(e) + + # Add Shortcuts + wm = bpy.context.window_manager + kc = wm.keyconfigs.addon + if kc: + km = wm.keyconfigs.addon.keymaps.new(name='3D View', space_type='VIEW_3D', region_type='WINDOW') + kmi = km.keymap_items.new(FlipFluidHelperCommandLineRenderFrame.bl_idname, type='F12', value='PRESS', shift=True) + ADDON_KEYMAPS.append((km, kmi)) + + kmi = km.keymap_items.new(FlipFluidHelperCommandLineRender.bl_idname, type='F12', value='PRESS', shift=True, ctrl=True) + ADDON_KEYMAPS.append((km, kmi)) + + system = platform.system() + if system == "Windows": + kmi = km.keymap_items.new(FlipFluidHelperRunScriptfile.bl_idname, type='B', value='PRESS', shift=True, ctrl=True) + ADDON_KEYMAPS.append((km, kmi)) + + +def unregister(): + bpy.utils.unregister_class(FlipFluidHelperCommandLineBake) + bpy.utils.unregister_class(FlipFluidHelperCommandLineBakeToClipboard) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRender) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderToClipboard) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderFrame) + bpy.utils.unregister_class(FlipFluidHelperCmdRenderFrameToClipboard) + bpy.utils.unregister_class(FlipFluidHelperCommandLineAlembicExport) + bpy.utils.unregister_class(FlipFluidHelperCmdAlembicExportToClipboard) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderToScriptfile) + bpy.utils.unregister_class(FlipFluidHelperRunScriptfile) + bpy.utils.unregister_class(FlipFluidHelperOpenOutputFolder) + bpy.utils.unregister_class(FlipFluidPassesResetSettings) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderPassAnimation) + bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderPassAnimationToClipboard) + + bpy.utils.unregister_class(FLIPFLUIDS_MT_render_menu) + try: + # Blender 2.8+ + bpy.types.TOPBAR_MT_render.remove(draw_flip_fluids_render_menu) + except: + pass + + # Remove shortcuts + for km, kmi in ADDON_KEYMAPS: + km.keymap_items.remove(kmi) + ADDON_KEYMAPS.clear() diff --git a/src/addon/operators/helper_operators.py b/src/addon/operators/helper_operators.py index 3489cee6..1810ff57 100644 --- a/src/addon/operators/helper_operators.py +++ b/src/addon/operators/helper_operators.py @@ -14,10 +14,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import bpy, os, stat, subprocess, platform, math, mathutils, fnmatch, random, mathutils, datetime, shutil, traceback +import bpy, os, pathlib, stat, subprocess, platform, math, mathutils, fnmatch, random, mathutils, datetime, shutil, traceback, re +from bpy_extras.io_utils import ImportHelper from bpy.props import ( BoolProperty, - StringProperty + StringProperty, + CollectionProperty ) from ..utils import version_compatibility_utils as vcu @@ -1171,38 +1173,6 @@ def execute(self, context): if dust_object.name in mesh_collection.objects: mesh_collection.objects.unlink(dust_object) - particle_object = dprops.mesh_cache.foam.get_duplivert_object() - if particle_object is not None: - collection = self.initialize_child_collection(context, "WHITEWATER", mesh_collection) - if not particle_object.name in collection.objects: - collection.objects.link(particle_object) - if particle_object.name in mesh_collection.objects: - mesh_collection.objects.unlink(particle_object) - - particle_object = dprops.mesh_cache.bubble.get_duplivert_object() - if particle_object is not None: - collection = self.initialize_child_collection(context, "WHITEWATER", mesh_collection) - if not particle_object.name in collection.objects: - collection.objects.link(particle_object) - if particle_object.name in mesh_collection.objects: - mesh_collection.objects.unlink(particle_object) - - particle_object = dprops.mesh_cache.spray.get_duplivert_object() - if particle_object is not None: - collection = self.initialize_child_collection(context, "WHITEWATER", mesh_collection) - if not particle_object.name in collection.objects: - collection.objects.link(particle_object) - if particle_object.name in mesh_collection.objects: - mesh_collection.objects.unlink(particle_object) - - particle_object = dprops.mesh_cache.dust.get_duplivert_object() - if particle_object is not None: - collection = self.initialize_child_collection(context, "WHITEWATER", mesh_collection) - if not particle_object.name in collection.objects: - collection.objects.link(particle_object) - if particle_object.name in mesh_collection.objects: - mesh_collection.objects.unlink(particle_object) - return {'FINISHED'} @@ -1665,611 +1635,6 @@ def execute(self, context): return {'FINISHED'} -def get_render_output_directory(): - frame_path = bpy.context.scene.render.frame_path() - render_path = os.path.dirname(frame_path) - return render_path - - -def is_render_output_directory_createable(): - render_path = get_render_output_directory() - try: - os.makedirs(render_path, exist_ok=True) - except: - return False - return True - - -def restore_blender_original_cwd(): - # Restore Blender's original CWD in case another addon has changed this path - # The command line launch features rely on the CWD being the default location - # of the folder containing the Blender executable. - # If the location is modified, the command line window will open to - # the modified location and launching Blender may fail. - os.chdir(os.path.dirname(bpy.app.binary_path)) - - -class FlipFluidHelperCommandLineBake(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_bake" - bl_label = "Launch Bake" - bl_description = ("Launch a new command line window and start baking." + - " The .blend file will need to be saved for before using" + - " this operator for changes to take effect") - - - @classmethod - def poll(cls, context): - return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) - - - def execute(self, context): - domain = context.scene.flip_fluid.get_domain_object() - if domain is None: - return {'CANCELLED'} - - if not context.scene.flip_fluid.is_domain_in_active_scene(): - self.report({"ERROR"}, - "Active scene must contain domain object to launch bake. Select the scene that contains the domain object, save, and try again.") - return {'CANCELLED'} - - hprops = context.scene.flip_fluid_helper - if hprops.cmd_bake_and_render and not is_render_output_directory_createable(): - errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" - self.report({'ERROR'}, errmsg) - return {'CANCELLED'} - - is_bake_and_render_interleaved = hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED' - is_bake_and_render_batch = (hprops.cmd_bake_and_render and - hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_SEQUENCE' and - hprops.cmd_launch_render_after_bake_mode == 'CMD_RENDER_MODE_BATCH') - if is_bake_and_render_interleaved or is_bake_and_render_batch: - if not is_render_output_format_image(): - self.report({'ERROR'}, "Render output format must be an image format for this render mode. Change render output to an image, save, and try again.") - return {'CANCELLED'} - - prefs = vcu.get_addon_preferences() - if prefs.cmd_save_before_launch: - bpy.ops.wm.save_mainfile() - - script_name = "run_simulation.py" - if hprops.cmd_bake_and_render: - if hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_SEQUENCE': - system = platform.system() - render_mode = hprops.cmd_launch_render_after_bake_mode - if system != "Windows": - render_mode = 'CMD_RENDER_MODE_NORMAL' - if render_mode == 'CMD_RENDER_MODE_NORMAL': - script_name = "run_simulation_and_render_sequence.py" - elif render_mode == 'CMD_RENDER_MODE_BATCH': - script_name = "run_simulation_and_render_sequence_batch.py" - elif hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': - script_name = "run_simulation_and_render_interleaved.py" - - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", script_name) - - system = platform.system() - if system == "Windows": - restore_blender_original_cwd() - if vcu.is_blender_28(): - blender_exe_path = bpy.app.binary_path - if " " in blender_exe_path: - # Some versions of Blender 2.8+ don't support spaces in the executable path - blender_exe_path = "blender.exe" - else: - # subproccess.call() in Blender 2.79 Python does not seem to support spaces in the - # executable path, so we'll just use blender.exe and hope that no other addon has - # changed Blender's working directory - blender_exe_path = "blender.exe" - - command = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "--python", script_path] - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - if hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': - num_instance_string = str(hprops.cmd_bake_and_render_interleaved_instances) - use_overwrite_string = "0" if hprops.cmd_bake_and_render_interleaved_no_overwrite else "1" - command += ["--", num_instance_string, use_overwrite_string] - command_text += " -- " + num_instance_string + " " + use_overwrite_string - - prefs = vcu.get_addon_preferences() - launch_attempts = prefs.cmd_bake_max_attempts - launch_attempts_text = str(launch_attempts + 1) - - if launch_attempts == 0: - # Launch with a single command - subprocess.call(command, shell=True) - else: - # Launch using .bat file that can re-launch after crash is detected - bat_template_path = os.path.dirname(os.path.realpath(__file__)) - bat_template_path = os.path.dirname(bat_template_path) - bat_template_path = script_path = os.path.join(bat_template_path, "resources", "command_line_scripts", "cmd_bake_template.bat") - with open(bat_template_path, 'r') as f: - bat_text = f.read() - - bat_text = bat_text.replace("MAX_LAUNCH_ATTEMPTS", launch_attempts_text) - bat_text = bat_text.replace("COMMAND_OPERATION", command_text) - - dprops = context.scene.flip_fluid.get_domain_properties() - cache_directory = dprops.cache.get_cache_abspath() - cache_scripts_directory = os.path.join(cache_directory, "scripts") - if not os.path.exists(cache_scripts_directory): - os.makedirs(cache_scripts_directory) - - cmd_bake_script_filepath = os.path.join(cache_scripts_directory, "cmd_bake.bat") - with open(cmd_bake_script_filepath, 'w') as f: - f.write(bat_text) - - os.startfile(cmd_bake_script_filepath) - - elif system == "Darwin" or system == "Linux": - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - if hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': - num_instance_string = str(hprops.cmd_bake_and_render_interleaved_instances) - use_overwrite_string = "0" if hprops.cmd_bake_and_render_interleaved_no_overwrite else "1" - command_text += " -- " + num_instance_string + " " + use_overwrite_string - - script_text = "#!/bin/bash\n" + command_text - script_name = "BAKE_" + bpy.path.basename(context.blend_data.filepath) + ".sh" - script_filepath = os.path.join(os.path.dirname(bpy.data.filepath), script_name) - with open(script_filepath, 'w') as f: - f.write(script_text) - - st = os.stat(script_filepath) - os.chmod(script_filepath, st.st_mode | stat.S_IEXEC) - - if system == "Darwin": - subprocess.call(["open", "-a", "Terminal", script_filepath]) - else: - if shutil.which("gnome-terminal") is not None and shutil.which("bash") is not None: - # Required to escape spaces for the script_filepath + "; exec bash" command to run - script_filepath = script_filepath.replace(" ", "\\ ") - subprocess.call(["gnome-terminal", "--", "bash", "-c", script_filepath + "; exec bash"]) - elif shutil.which("xterm") is not None: - subprocess.call(["xterm", "-hold", "-e", script_filepath]) - else: - errmsg = "This feature requires the Xterm program to be installed and to be accessible on the" - errmsg += " system path. Either install Xterm, restart Blender, and try again or use the" - errmsg += " Copy Command to Clipboard operator and paste into a terminal program of your choice." - bpy.ops.flip_fluid_operators.display_error( - 'INVOKE_DEFAULT', - error_message="Linux: Unable to launch new terminal window", - error_description=errmsg, - popup_width=600 - ) - - else: - # Platform not found - return {'CANCELLED'} - - info_msg = "Launched command line baking window. If the baking process did not begin," - info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" - info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line baking, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Baking-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCommandLineBakeToClipboard(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_bake_to_clipboard" - bl_label = "Copy Bake Command to Clipboard" - bl_description = ("Copy command for baking to your system clipboard." + - " The .blend file will need to be saved before running this command for changes to take effect") - - - @classmethod - def poll(cls, context): - return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) - - - def execute(self, context): - domain = context.scene.flip_fluid.get_domain_object() - if domain is None: - return {'CANCELLED'} - - hprops = context.scene.flip_fluid_helper - script_name = "run_simulation.py" - if hprops.cmd_bake_and_render: - if hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_SEQUENCE': - system = platform.system() - render_mode = hprops.cmd_launch_render_after_bake_mode - if system != "Windows": - render_mode = 'CMD_RENDER_MODE_NORMAL' - if render_mode == 'CMD_RENDER_MODE_NORMAL': - script_name = "run_simulation_and_render_sequence.py" - elif render_mode == 'CMD_RENDER_MODE_BATCH': - script_name = "run_simulation_and_render_sequence_batch.py" - elif hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': - script_name = "run_simulation_and_render_interleaved.py" - - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", script_name) - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - if hprops.cmd_bake_and_render and hprops.cmd_bake_and_render_mode == 'CMD_BAKE_AND_RENDER_MODE_INTERLEAVED': - num_instance_string = str(hprops.cmd_bake_and_render_interleaved_instances) - command_text += " -- " + num_instance_string - - bpy.context.window_manager.clipboard = command_text - - info_msg = "Copied the following baking command to your clipboard:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line baking, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Baking-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCommandLineRender(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_render" - bl_label = "Launch Render" - bl_description = ("Launch a new command line window and start rendering the animation." + - " The .blend file will need to be saved before using this operator for changes to take effect") - - - @classmethod - def poll(cls, context): - return bool(bpy.data.filepath) - - - def execute(self, context): - if not is_render_output_directory_createable(): - errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" - self.report({'ERROR'}, errmsg) - return {'CANCELLED'} - - prefs = vcu.get_addon_preferences() - if prefs.cmd_save_before_launch: - bpy.ops.wm.save_mainfile() - - system = platform.system() - if system == "Windows": - restore_blender_original_cwd() - if vcu.is_blender_28(): - blender_exe_path = bpy.app.binary_path - if " " in blender_exe_path: - # Some versions of Blender 2.8+ don't support spaces in the executable path - blender_exe_path = "blender.exe" - else: - # subproccess.call() in Blender 2.79 Python does not seem to support spaces in the - # executable path, so we'll just use blender.exe and hope that no other addon has - # changed Blender's working directory - blender_exe_path = "blender.exe" - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" -a" - command = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "-a"] - subprocess.call(command, shell=True) - - elif system == "Darwin" or system == "Linux": - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" -a" - script_text = "#!/bin/bash\n" + command_text - script_name = "RENDER_ANIMATION_" + bpy.path.basename(context.blend_data.filepath) + ".sh" - script_filepath = os.path.join(os.path.dirname(bpy.data.filepath), script_name) - with open(script_filepath, 'w') as f: - f.write(script_text) - - st = os.stat(script_filepath) - os.chmod(script_filepath, st.st_mode | stat.S_IEXEC) - - if system == "Darwin": - subprocess.call(["open", "-a", "Terminal", script_filepath]) - else: - if shutil.which("gnome-terminal") is not None and shutil.which("bash") is not None: - # Required to escape spaces for the script_filepath + "; exec bash" command to run - script_filepath = script_filepath.replace(" ", "\\ ") - subprocess.call(["gnome-terminal", "--", "bash", "-c", script_filepath + "; exec bash"]) - elif shutil.which("xterm") is not None: - subprocess.call(["xterm", "-hold", "-e", script_filepath]) - else: - errmsg = "This feature requires the Xterm program to be installed and to be accessible on the" - errmsg += " system path. Either install Xterm, restart Blender, and try again or use the" - errmsg += " Copy Command to Clipboard operator and paste into a terminal program of your choice." - bpy.ops.flip_fluid_operators.display_error( - 'INVOKE_DEFAULT', - error_message="Linux: Unable to launch new terminal window", - error_description=errmsg, - popup_width=600 - ) - else: - # Platform not found - return {'CANCELLED'} - - info_msg = "Launched command line render window. If the render process did not begin," - info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" - info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line rendering, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Rendering-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - - -class FlipFluidHelperCommandLineRenderToClipboard(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_render_to_clipboard" - bl_label = "Launch Render" - bl_description = ("Copy command for rendering to your system clipboard." + - " The .blend file will need to be saved before running this command for changes to take effect") - - - @classmethod - def poll(cls, context): - return bool(bpy.data.filepath) - - - def execute(self, context): - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" -a" - bpy.context.window_manager.clipboard = command_text - - info_msg = "Copied the following render command to your clipboard:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line rendering, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Rendering-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCommandLineRenderFrame(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_render_frame" - bl_label = "Launch Frame Render" - bl_description = ("Launch a new command line window and start rendering the current timeline frame." + - " The .blend file will need to be saved before using this operator for changes to take effect") - - - @classmethod - def poll(cls, context): - return bool(bpy.data.filepath) - - - def execute(self, context): - if not is_render_output_directory_createable(): - errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" - self.report({'ERROR'}, errmsg) - return {'CANCELLED'} - - if not is_render_output_format_image(): - self.report({'ERROR'}, "Render output format must be an image format. Change render output to an image, save, and try again.") - return {'CANCELLED'} - - prefs = vcu.get_addon_preferences() - if prefs.cmd_save_before_launch: - bpy.ops.wm.save_mainfile() - - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", "render_single_frame.py") - - frame_string = str(bpy.context.scene.frame_current) - - hprops = context.scene.flip_fluid_helper - open_image_after = "0" - if hprops.cmd_open_image_after_render: - open_image_after = "1" - - cmd_start_flag = "/k" - if hprops.cmd_close_window_after_render: - cmd_start_flag = "/c" - - system = platform.system() - if system == "Windows": - restore_blender_original_cwd() - if vcu.is_blender_28(): - blender_exe_path = bpy.app.binary_path - if " " in blender_exe_path: - # Some versions of Blender 2.8+ don't support spaces in the executable path - blender_exe_path = "blender.exe" - else: - # subproccess.call() in Blender 2.79 Python does not seem to support spaces in the - # executable path, so we'll just use blender.exe and hope that no other addon has - # changed Blender's working directory - blender_exe_path = "blender.exe" - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after - command = ["start", "cmd", cmd_start_flag, blender_exe_path, "--background", bpy.data.filepath, "--python", script_path, "--", frame_string, open_image_after] - subprocess.call(command, shell=True) - - elif system == "Darwin" or system == "Linux": - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after - script_text = "#!/bin/bash\n" + command_text - script_name = "RENDER_FRAME_" + bpy.path.basename(context.blend_data.filepath) + ".sh" - script_filepath = os.path.join(os.path.dirname(bpy.data.filepath), script_name) - with open(script_filepath, 'w') as f: - f.write(script_text) - - st = os.stat(script_filepath) - os.chmod(script_filepath, st.st_mode | stat.S_IEXEC) - - if system == "Darwin": - subprocess.call(["open", "-a", "Terminal", script_filepath]) - else: - if shutil.which("gnome-terminal") is not None and shutil.which("bash") is not None: - # Required to escape spaces for the script_filepath + "; exec bash" command to run - script_filepath = script_filepath.replace(" ", "\\ ") - subprocess.call(["gnome-terminal", "--", "bash", "-c", script_filepath + "; exec bash"]) - elif shutil.which("xterm") is not None: - subprocess.call(["xterm", "-hold", "-e", script_filepath]) - else: - errmsg = "This feature requires the Xterm program to be installed and to be accessible on the" - errmsg += " system path. Either install Xterm, restart Blender, and try again or use the" - errmsg += " Copy Command to Clipboard operator and paste into a terminal program of your choice." - bpy.ops.flip_fluid_operators.display_error( - 'INVOKE_DEFAULT', - error_message="Linux: Unable to launch new terminal window", - error_description=errmsg, - popup_width=600 - ) - - else: - # Platform not found - return {'CANCELLED'} - - info_msg = "Launched command line render window. If the render process did not begin," - info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" - info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line rendering, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Rendering-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCmdRenderFrameToClipboard(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_cmd_render_frame_to_clipboard" - bl_label = "Launch Frame Render" - bl_description = ("Copy command for frame rendering to your system clipboard." + - " The .blend file will need to be saved before running this command for changes to take effect") - - - @classmethod - def poll(cls, context): - return bool(bpy.data.filepath) - - - def execute(self, context): - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", "render_single_frame.py") - frame_string = str(bpy.context.scene.frame_current) - hprops = context.scene.flip_fluid_helper - open_image_after = "0" - if hprops.cmd_open_image_after_render: - open_image_after = "1" - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" + " -- " + frame_string + " " + open_image_after - bpy.context.window_manager.clipboard = command_text - - info_msg = "Copied the following render command to your clipboard:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line rendering, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Rendering-from-the-Command-Line" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCommandLineAlembicExport(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_command_line_alembic_export" - bl_label = "Launch Alembic Export" - bl_description = ("Launch a new command line window and start exporting the simulation meshes to the Alembic (.abc) format." + - " The .blend file will need to be saved before using this operator for changes to take effect") - - - @classmethod - def poll(cls, context): - return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) - - - def execute(self, context): - prefs = vcu.get_addon_preferences() - if prefs.cmd_save_before_launch: - bpy.ops.wm.save_mainfile() - - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", "alembic_export.py") - - system = platform.system() - if system == "Windows": - restore_blender_original_cwd() - if vcu.is_blender_28(): - blender_exe_path = bpy.app.binary_path - if " " in blender_exe_path: - # Some versions of Blender 2.8+ don't support spaces in the executable path - blender_exe_path = "blender.exe" - else: - # subproccess.call() in Blender 2.79 Python does not seem to support spaces in the - # executable path, so we'll just use blender.exe and hope that no other addon has - # changed Blender's working directory - blender_exe_path = "blender.exe" - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - command = ["start", "cmd", "/k", blender_exe_path, "--background", bpy.data.filepath, "--python", script_path] - subprocess.call(command, shell=True) - - elif system == "Darwin" or system == "Linux": - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - script_text = "#!/bin/bash\n" + command_text - script_name = "ALEMBIC_EXPORT_" + bpy.path.basename(context.blend_data.filepath) + ".sh" - script_filepath = os.path.join(os.path.dirname(bpy.data.filepath), script_name) - with open(script_filepath, 'w') as f: - f.write(script_text) - - st = os.stat(script_filepath) - os.chmod(script_filepath, st.st_mode | stat.S_IEXEC) - - if system == "Darwin": - subprocess.call(["open", "-a", "Terminal", script_filepath]) - else: - if shutil.which("gnome-terminal") is not None and shutil.which("bash") is not None: - # Required to escape spaces for the script_filepath + "; exec bash" command to run - script_filepath = script_filepath.replace(" ", "\\ ") - subprocess.call(["gnome-terminal", "--", "bash", "-c", script_filepath + "; exec bash"]) - elif shutil.which("xterm") is not None: - subprocess.call(["xterm", "-hold", "-e", script_filepath]) - else: - errmsg = "This feature requires the Xterm program to be installed and to be accessible on the" - errmsg += " system path. Either install Xterm, restart Blender, and try again or use the" - errmsg += " Copy Command to Clipboard operator and paste into a terminal program of your choice." - bpy.ops.flip_fluid_operators.display_error( - 'INVOKE_DEFAULT', - error_message="Linux: Unable to launch new terminal window", - error_description=errmsg, - popup_width=600 - ) - - else: - # Platform not found - return {'CANCELLED'} - - info_msg = "Launched command line Alembic export window. If the Alembic export process did not begin," - info_msg += " this may be caused by a conflict with another addon or a security feature of your OS that restricts" - info_msg += " automatic command execution. You may try copying the following command manually into a command line window:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line operators, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-tools" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - -class FlipFluidHelperCmdAlembicExportToClipboard(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_cmd_alembic_export_to_clipboard" - bl_label = "Launch Alembic Export" - bl_description = ("Copy command for Alembic export to your system clipboard." + - " The .blend file will need to be saved before running this command for changes to take effect") - - - @classmethod - def poll(cls, context): - return context.scene.flip_fluid.get_domain_object() is not None and bool(bpy.data.filepath) - - - def execute(self, context): - script_path = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.dirname(script_path) - script_path = os.path.join(script_path, "resources", "command_line_scripts", "alembic_export.py") - frame_string = str(bpy.context.scene.frame_current) - - command_text = "\"" + bpy.app.binary_path + "\" --background \"" + bpy.data.filepath + "\" --python \"" + script_path + "\"" - bpy.context.window_manager.clipboard = command_text - - info_msg = "Copied the following Alembic export command to your clipboard:\n\n" - info_msg += command_text + "\n\n" - info_msg += "For more information on command line tools, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-tools" - self.report({'INFO'}, info_msg) - - return {'FINISHED'} - - def is_geometry_node_point_cloud_detected(bl_mesh_cache_object=None): if not vcu.is_blender_31(): return False @@ -2356,7 +1721,7 @@ class FlipFluidHelperInitializeMotionBlur(bpy.types.Operator): bl_label = "Initialize Motion Blur" bl_description = ("Initialize all settings and Geometry Node groups required for motion blur rendering." + " This will be applied to the fluid surface, fluid particles, and whitewater particles if enabled." + - " Node groups can be customized in the geometry nodes editor and modifier") + " Node groups can be viewed in the geometry nodes editor and modifier") resource_prefix = StringProperty(default="FF_MotionBlur") exec(vcu.convert_attribute_to_28("resource_prefix")) @@ -2403,6 +1768,12 @@ def apply_modifier_settings(self, target_object, gn_modifier): except: pass + try: + # Enable Instancing + gn_modifier["Input_10"] = False + except: + pass + def execute(self, context): if not vcu.is_blender_31(): @@ -2505,6 +1876,8 @@ def execute(self, context): info_msg = "Enabled motion blur rendering on " + target_object.name + " object" self.report({'INFO'}, info_msg) + self.report({'INFO'}, "Finished initializing motion blur geometry node groups and settings") + return {'FINISHED'} @@ -2587,217 +1960,97 @@ def execute(self, context): return {'FINISHED'} -def get_render_output_info(): - full_path = bpy.path.abspath(bpy.context.scene.render.filepath) - directory_path = full_path - - file_prefix = os.path.basename(directory_path) - if file_prefix: - directory_path = os.path.dirname(directory_path) - - file_format_to_suffix = { - "BMP" : ".bmp", - "IRIS" : ".rgb", - "PNG" : ".png", - "JPEG" : ".jpg", - "JPEG2000" : ".jp2", - "TARGA" : ".tga", - "TARGA_RAW" : ".tga", - "CINEON" : ".cin", - "DPX" : ".dpx", - "OPEN_EXR_MULTILAYER" : ".exr", - "OPEN_EXR" : ".exr", - "HDR" : ".hdr", - "TIFF" : ".tif", - "WEBP" : ".webp", - "AVI_JPEG" : ".avi", - "AVI_RAW" : ".avi", - "FFMPEG" : ".mp4" - } - - file_format = bpy.context.scene.render.image_settings.file_format - file_suffix = file_format_to_suffix[file_format] - - return directory_path, file_prefix, file_suffix - - -def is_render_output_format_image(): - image_file_format_to_suffix = { - "BMP" : ".bmp", - "IRIS" : ".rgb", - "PNG" : ".png", - "JPEG" : ".jpg", - "JPEG2000" : ".jp2", - "TARGA" : ".tga", - "TARGA_RAW" : ".tga", - "CINEON" : ".cin", - "DPX" : ".dpx", - "OPEN_EXR_MULTILAYER" : ".exr", - "OPEN_EXR" : ".exr", - "HDR" : ".hdr", - "TIFF" : ".tif", - "WEBP" : ".webp", - } - - file_format = bpy.context.scene.render.image_settings.file_format - return file_format in image_file_format_to_suffix - - - -class FlipFluidHelperCommandLineRenderToScriptfile(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_cmd_render_to_scriptfile" - bl_label = "Generate Batch File" - bl_description = ("Generates a Windows batch file to render all frames one-by-one." + - " The .blend file will need to be saved before using this operator for changes to take effect") +class FlipFluidHelperToggleMotionBlurRendering(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_toggle_motion_blur_rendering" + bl_label = "Toggle Motion Blur Rendering" + bl_description = ("Toggle motion blur rendering for the simulation meshes on or off. This operator will enable or" + + " disable the simulations mesh object and geometry node settings for motion blur rendering") + + enable_motion_blur_rendering = BoolProperty(default=True) + exec(vcu.convert_attribute_to_28("enable_motion_blur_rendering")) @classmethod def poll(cls, context): - system = platform.system() - return bool(bpy.data.filepath) and system == "Windows" - - - def get_missing_frames(self): - directory_path, file_prefix, file_suffix = get_render_output_info() - - filenames = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))] - filenames = [f for f in filenames if f.startswith(file_prefix) and f.endswith(file_suffix)] - frame_numbers = [] - for f in filenames: - try: - f = f[len(file_prefix):-len(file_suffix)] - frame_numbers.append(int(f)) - except: - pass - - frame_exists = {} - for n in frame_numbers: - frame_exists[n] = True - - frame_start = bpy.context.scene.frame_start - frame_end = bpy.context.scene.frame_end - missing_frames = [] - for i in range(frame_start, frame_end + 1): - if not i in frame_exists: - missing_frames.append(i) - - return missing_frames - - - def generate_file_string(self, missing_frames): - blender_exe_path = "\"" + bpy.app.binary_path + "\"" - blend_path = "\"" + bpy.data.filepath + "\"" + return context.scene.flip_fluid.get_domain_object() is not None - file_text = "echo.\n" - for n in missing_frames: - command_text = blender_exe_path + " -b " + blend_path + " -f " + str(n) - file_text += command_text + "\n" - file_text += "pause\n" - return file_text + def get_motion_blur_geometry_node_modifier(self, bl_object): + if bl_object is None: + return None + for mod in bl_object.modifiers: + if mod.type == "NODES" and mod.node_group and mod.node_group.name.startswith("FF_MotionBlur"): + return mod def execute(self, context): - if not is_render_output_directory_createable(): - errmsg = "Render output directory is not valid or writeable: <" + get_render_output_directory() + ">" - self.report({'ERROR'}, errmsg) - return {'CANCELLED'} - - if not is_render_output_format_image(): - self.report({'ERROR'}, "Render output format must be an image format. Change render output to an image, save, and try again.") - return {'CANCELLED'} - - directory_path, file_prefix, file_suffix = get_render_output_info() - if not directory_path: - return {'CANCELLED'} - - more_info_string = "For more information on batch rendering, visit our documentation:\n" - more_info_string += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-tools\n" - render_output_info_string = "View the rendered files at <" + directory_path + ">\n" - - if not os.path.exists(directory_path): - os.makedirs(directory_path) + dprops = context.scene.flip_fluid.get_domain_properties() + enable_status = self.enable_motion_blur_rendering + enable_string = "ON" if self.enable_motion_blur_rendering else "OFF" + + mesh_caches = [ + dprops.mesh_cache.surface.get_cache_object(), + dprops.mesh_cache.particles.get_cache_object(), + dprops.mesh_cache.foam.get_cache_object(), + dprops.mesh_cache.bubble.get_cache_object(), + dprops.mesh_cache.spray.get_cache_object(), + dprops.mesh_cache.dust.get_cache_object() + ] + mesh_caches = [bl_object for bl_object in mesh_caches if bl_object is not None] - missing_frames = self.get_missing_frames() - if not missing_frames: - info_msg = "No batch file generated! All frames have already been rendered.\n" - info_msg += render_output_info_string + "\n" - info_msg += more_info_string - self.report({'INFO'}, info_msg) - return {'CANCELLED'} + for bl_object in mesh_caches: + if bl_object.cycles.use_motion_blur != enable_status: + bl_object.cycles.use_motion_blur = enable_status + self.report({'INFO'}, "Toggled Cycles motion blur rendering on <" + bl_object.name + "> object to " + enable_string) - file_text = self.generate_file_string(missing_frames) - blend_directory = os.path.dirname(bpy.data.filepath) - batch_filename = "RENDER_" + bpy.path.basename(bpy.context.blend_data.filepath) + ".bat" - batch_filepath = os.path.join(blend_directory, batch_filename) - with open(batch_filepath, "w") as renderscript_file: - renderscript_file.write(file_text) + for bl_object in mesh_caches: + gn_modifier = self.get_motion_blur_geometry_node_modifier(bl_object) + if gn_modifier is None: + continue + if "Input_8" in gn_modifier: + if gn_modifier["Input_8"] != enable_status: + gn_modifier["Input_8"] = enable_status + self.report({'INFO'}, "Toggled motion blur on <" + gn_modifier.name + "> geometry node modifier to " + enable_string) - total_frames = bpy.context.scene.frame_end - bpy.context.scene.frame_start + 1 - info_msg = "\nA batch file has been generated here: <" + batch_filepath + ">\n" - info_msg += render_output_info_string + "\n" - info_msg += str(total_frames - len(missing_frames)) + " frames in the " + file_suffix + " file format have already been rendered!\n" - info_msg += str(len(missing_frames)) + " frames are not yet rendered!\n\n" - info_msg += more_info_string + self.report({'INFO'}, "Finished toggling motion blur rendering on simulation meshes " + enable_string) - self.report({'INFO'}, info_msg) - return {'FINISHED'} -class FlipFluidHelperRunScriptfile(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_run_batch_render_scriptfile" - bl_label = "Launch Batch File Render" - bl_description = ("Runs the generated batch file. If no batch file has been generated, one will be created automatically." + - " The .blend file will need to be saved before using this operator for changes to take effect") +class FlipFluidHelperInitializeCacheObjects(bpy.types.Operator): + bl_idname = "flip_fluid_operators.helper_initialize_cache_objects" + bl_label = "Initialize Cache Objects" + bl_description = ("Initialize simulation meshes, modifiers, and data") - - regenerate_batch_file = BoolProperty(False) - exec(vcu.convert_attribute_to_28("regenerate_batch_file")) + cache_object_type = StringProperty(default="CACHE_OBJECT_TYPE_NONE") + exec(vcu.convert_attribute_to_28("cache_object_type")) @classmethod def poll(cls, context): - return bool(bpy.data.filepath) + return context.scene.flip_fluid.get_domain_object() is not None def execute(self, context): - directory = os.path.dirname(bpy.data.filepath) - blend_filename = bpy.path.basename(bpy.context.blend_data.filepath) - script_filename = "RENDER_" + blend_filename + ".bat" - batch_filepath = os.path.join(directory, script_filename) - - if self.regenerate_batch_file or not os.path.isfile(batch_filepath): - bpy.ops.flip_fluid_operators.helper_cmd_render_to_scriptfile() - if not os.path.isfile(batch_filepath): - self.report({'ERROR'}, "Unable to generate the render script.") - - os.startfile(batch_filepath) - - info_msg = "Beginning to run the batch render script!\n\n" - info_msg += "For more information on batch file rendering, visit our documentation:\n" - info_msg += "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Helper-Menu-Settings#command-line-tools" - self.report({'INFO'}, info_msg) - return {'FINISHED'} - - -class FlipFluidHelperOpenOutputFolder(bpy.types.Operator): - bl_idname = "flip_fluid_operators.helper_open_outputfolder" - bl_label = "Opens The Output Folder" - bl_description = ("Opens the output-folder that is set in the output settings. If the folder does not exist, it will be created." + - " The .blend file will need to be saved before using this operator") - - - @classmethod - def poll(cls, context): - return bool(bpy.data.filepath) + objects_to_initialize = flip_fluid_cache.EnabledMeshCacheObjects() + if self.cache_object_type == 'CACHE_OBJECT_TYPE_FLUID_SURFACE': + objects_to_initialize.fluid_surface = True + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_FLUID_PARTICLES': + objects_to_initialize.fluid_particles = True + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_WHITEWATER_PARTICLES': + objects_to_initialize.whitewater_particles = True + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_DEBUG_OBSTACLE': + objects_to_initialize.debug_obstacle = True + elif self.cache_object_type == 'CACHE_OBJECT_TYPE_ALL': + objects_to_initialize.fluid_surface = True + objects_to_initialize.fluid_particles = True + objects_to_initialize.whitewater_particles = True + objects_to_initialize.debug_obstacle = True + dprops = context.scene.flip_fluid.get_domain_properties() + dprops.mesh_cache.initialize_cache_objects(objects_to_initialize) + dprops.mesh_cache.initialize_cache_objects_geometry_nodes(objects_to_initialize) - def execute(self, context): - directory_path, file_prefix, file_suffix = get_render_output_info() - if not os.path.exists(directory_path): - os.makedirs(directory_path) - os.startfile(directory_path) return {'FINISHED'} @@ -3534,43 +2787,223 @@ def execute(self, context): self.report({'INFO'}, info_msg) return {'FINISHED'} + +class FlipFluidPassesAddItemToList(bpy.types.Operator): + """Add selected items to the list of objects for rendering""" + bl_idname = "flip_fluid_operators.add_item_to_list" + bl_label = "Add Item to List" + + def execute(self, context): + hprops = context.scene.flip_fluid_helper + for obj in bpy.context.selected_objects: + item = hprops.render_passes_objectlist.add() + item.name = obj.name -class FLIPFLUIDS_MT_render_menu(bpy.types.Menu): - bl_label = "FLIP Fluids CMD Render" - bl_idname = "FLIPFLUIDS_MT_render_menu" + hprops.render_passes_objectlist_index = len(hprops.render_passes_objectlist) - 1 - def draw(self, context): - render_frame_text = "Shift F12" - render_animation_text = "Shift Ctrl F12" - render_batch_animation_text = "Shift Ctrl B" + return {'FINISHED'} - system = platform.system() - row1 = self.layout.row() - row2 = self.layout.row() - if system == "Windows": - row3 = self.layout.row() +class FlipFluidPassesRemoveItemFromList(bpy.types.Operator): + """Remove an item from the list of objects for rendering""" + bl_idname = "flip_fluid_operators.remove_item_from_list" + bl_label = "Remove Item from List" + + index: bpy.props.IntProperty() + + def execute(self, context): + hprops = context.scene.flip_fluid_helper + hprops.render_passes_objectlist_index = self.index + hprops.render_passes_objectlist.remove(self.index) - row1.operator(FlipFluidHelperCommandLineRenderFrame.bl_idname, icon="RENDER_STILL") - row2.operator(FlipFluidHelperCommandLineRender.bl_idname, text="Launch Animation Render", icon="RENDER_ANIMATION") - if system == "Windows": - row3.operator(FlipFluidHelperRunScriptfile.bl_idname, text="Launch Batch Render", icon="CONSOLE").regenerate_batch_file=True + if hprops.render_passes_objectlist_index < 0: + hprops.render_passes_objectlist_index = 0 + if hprops.render_passes_objectlist_index >= len(hprops.render_passes_objectlist): + hprops.render_passes_objectlist_index = len(hprops.render_passes_objectlist) - 1 - row1.label(text=render_frame_text) - row2.label(text=render_animation_text) - if system == "Windows": - row3.label(text=render_batch_animation_text) + return {'FINISHED'} - +# Subclass of bpy.types.UIList is required to have an all uppercase prefix before _UL_ +# to prevent these types of warnings when registering the addon classes: +# Warning: 'FlipFluidPasses_UL_items' doesn't have upper case alpha-numeric prefix +class FLIPFLUID_UL_passes_items(bpy.types.UIList): + """Custom UI List to display objects""" + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + split = layout.split(factor=0.80, align=True) + column1 = split.column(align=True) + column1.label(text=item.name, icon='MESH_CUBE') + column2 = split.column(align=True) + column2.alignment = "RIGHT" + remove_op = column2.operator("flip_fluid_operators.remove_item_from_list", text="", icon='X') + remove_op.index = index + + +# Runs every time the scene changes +def update_camera_screen_scale(bl_camera_screen, bl_camera): + depth = bpy.context.scene.flip_fluid_helper.render_passes_camerascreen_distance + camera_angle = bl_camera.data.angle + camera_type = bl_camera.data.type + camera_ortho_scale = bl_camera.data.ortho_scale + + resolution_x = bpy.context.scene.render.resolution_x + resolution_y = bpy.context.scene.render.resolution_y + pixel_aspect_x = bpy.context.scene.render.pixel_aspect_x + pixel_aspect_y = bpy.context.scene.render.pixel_aspect_y + aspect_ratio = (resolution_x * pixel_aspect_x) / (resolution_y * pixel_aspect_y) + + x_scale = y_scale = 1.0 + if camera_type == 'PERSP' or camera_type == 'PANO': + x_scale = y_scale = -depth * math.tan(0.5 * camera_angle) + elif camera_type == 'ORTHO': + x_scale = y_scale = 0.5 * camera_ortho_scale + + if aspect_ratio < 1.0: + x_scale *= aspect_ratio + else: + y_scale *= (1.0 / aspect_ratio) -def draw_flip_fluids_render_menu(self, context): - self.layout.separator() - self.layout.menu(FLIPFLUIDS_MT_render_menu.bl_idname, icon="CONSOLE") + bl_camera_screen.location = (0.0, 0.0, -depth / bl_camera.scale[2]) + bl_camera_screen.scale = (abs(x_scale / bl_camera.scale[0]), abs(y_scale / bl_camera.scale[1]), 1.0) -ADDON_KEYMAPS = [] +class FlipFluidPassesAddCameraScreen(bpy.types.Operator, ImportHelper): + """Add a Camera Screen plane linked to the selected camera with an image or video texture""" + bl_idname = "flip_fluid_operators.add_camera_screen" + bl_label = "Add CameraScreen" + bl_options = {'REGISTER', 'UNDO'} + + filter_glob: StringProperty( + default='*.png;*.jpg;*.jpeg;*.jp2;*.tif;*.exr;*.hdr;*.bmp;*.rgb;*.tga;*.cin;*.dpx;*.webp', + options={'HIDDEN'} + ) + + directory: StringProperty() + files: CollectionProperty( + type=bpy.types.OperatorFileListElement, + options={'HIDDEN', 'SKIP_SAVE'}, + ) + + + def check_and_report_operator_context_errors(self, context): + valid_file_types = ('.png', '.jpg', '.jpeg', '.jp2', '.tif', '.exr', '.hdr', '.bmp', '.rgb', '.tga', '.cin', '.dpx', '.webp') + for file in self.files: + if not file.name.lower().endswith(valid_file_types): + filepath = os.path.join(self.directory, file.name) + valid_types_string = " ".join(valid_file_types) + errmsg = "Invalid file type selected: <" + filepath + ">." + errmsg += " Supported file types: " + valid_types_string + self.report({'ERROR'}, errmsg) + return {'CANCELLED'} + + hprops = context.scene.flip_fluid_helper + bl_camera = bpy.data.objects.get(hprops.render_passes_cameraselection) + if bl_camera is None: + self.report({'ERROR'}, "Camera object <" + str(hprops.render_passes_cameraselection) + "> not found") + return {'CANCELLED'} + + + def initialize_camera_screen_object(self, context): + hprops = context.scene.flip_fluid_helper + + # Create and size camera screen plane + bl_camera = bpy.data.objects.get(hprops.render_passes_cameraselection) + bpy.ops.mesh.primitive_plane_add() + bl_camera_screen = context.active_object + bl_camera_screen.name = "ff_camera_screen" + bl_camera_screen.lock_location = (True, True, True) + bpy.ops.object.parent_set(type='OBJECT', keep_transform=False) + + depth = hprops.render_passes_camerascreen_distance + bl_camera_screen.location = (0, 0, -depth) + bl_camera_screen.parent = bl_camera + + update_camera_screen_scale(bl_camera_screen, bl_camera) + + return bl_camera_screen + + + def initialize_image_texture_material(self, bl_camera_screen): + # Initialize material and nodes + mat = bpy.data.materials.new(name="ff_camera_screen") + mat.use_nodes = True + nodes = mat.node_tree.nodes + nodes.remove(nodes.get('Principled BSDF')) + + output = nodes['Material Output'] + + emission = nodes.new('ShaderNodeEmission') + emission.location.x = output.location.x - 200 + emission.location.y = output.location.y + + texture = nodes.new('ShaderNodeTexImage') + texture.location.x = emission.location.x - 300 + texture.location.y = output.location.y + + mat.node_tree.links.new(emission.inputs['Color'], texture.outputs['Color']) + mat.node_tree.links.new(output.inputs['Surface'], emission.outputs['Emission']) + bl_camera_screen.data.materials.append(mat) + + def get_trailing_number_from_string(s): + m = re.search(r'\d+$', s) + return int(m.group()) if m else None + + # Find first frame number in image sequence if it exists + is_frame_sequence_found = False + frame_start = 2**32 + frame_start_filepath = None + image_filepaths = [] + for f in self.files: + filepath = os.path.join(self.directory, f.name) + image_filepaths.append(filepath) + + basename = pathlib.Path(f.name).stem + frame_number = get_trailing_number_from_string(basename) + if frame_number is not None and frame_number < frame_start: + is_frame_sequence_found = True + frame_start = frame_number + frame_start_filepath = filepath + + # Load selected files as image datablocks + frame_start_image = None + for filepath in image_filepaths: + image = bpy.data.images.load(filepath) + if frame_start_image is None: + frame_start_image = image + if filepath == frame_start_filepath: + frame_start_image = image + + # Set texture node image sequence or single image + if len(image_filepaths) > 1 and is_frame_sequence_found: + texture.image = frame_start_image + texture.image.source = 'SEQUENCE' + texture.image_user.frame_duration = len(image_filepaths) + texture.image_user.frame_start = frame_start + texture.image_user.frame_offset = frame_start - 1 + texture.image_user.use_cyclic = True + texture.image_user.use_auto_refresh = True + else: + texture.image = frame_start_image + + + def invoke(self, context, event): + self.filepath = "" # Clear the filepath field + if 'ff_camera_screen' in context.scene.objects: + self.report({'ERROR'}, "ff_camera_screen object already exists.") + return {'CANCELLED'} + return context.window_manager.fileselect_add(self) or {'RUNNING_MODAL'} + + + def execute(self, context): + error_return = self.check_and_report_operator_context_errors(context) + if error_return: + return error_return + + bl_camera_screen = self.initialize_camera_screen_object(context) + self.initialize_image_texture_material(bl_camera_screen) + return {'FINISHED'} + def register(): classes = [ @@ -3597,19 +3030,10 @@ def register(): FlipFluidHelperSetObjectViewportDisplay, FlipFluidHelperSetObjectRenderDisplay, FlipFluidHelperLoadLastFrame, - FlipFluidHelperCommandLineBake, - FlipFluidHelperCommandLineBakeToClipboard, - FlipFluidHelperCommandLineRender, - FlipFluidHelperCommandLineRenderToClipboard, - FlipFluidHelperCommandLineRenderFrame, - FlipFluidHelperCommandLineAlembicExport, - FlipFluidHelperCmdAlembicExportToClipboard, - FlipFluidHelperCmdRenderFrameToClipboard, - FlipFluidHelperCommandLineRenderToScriptfile, - FlipFluidHelperRunScriptfile, - FlipFluidHelperOpenOutputFolder, FlipFluidHelperInitializeMotionBlur, FlipFluidHelperRemoveMotionBlur, + FlipFluidHelperToggleMotionBlurRendering, + FlipFluidHelperInitializeCacheObjects, FlipFluidHelperStableRendering279, FlipFluidHelperStableRendering28, FlipFluidHelperSetLinearOverrideKeyframes, @@ -3644,7 +3068,10 @@ def register(): FlipFluidClearMeasureObjectSpeed, FlipFluidDisableAddonInBlendFile, FlipFluidEnableAddonInBlendFile, - FLIPFLUIDS_MT_render_menu, + FlipFluidPassesAddItemToList, + FlipFluidPassesRemoveItemFromList, + FLIPFLUID_UL_passes_items, + FlipFluidPassesAddCameraScreen, ] # Workaround for a bug in FLIP Fluids 1.6.0 @@ -3659,29 +3086,6 @@ def register(): bpy.utils.unregister_class(c) bpy.utils.register_class(c) - try: - # Blender 2.8+ - bpy.types.TOPBAR_MT_render.append(draw_flip_fluids_render_menu) - except Exception as e: - print(traceback.format_exc()) - print(e) - - # Add Shortcuts - wm = bpy.context.window_manager - kc = wm.keyconfigs.addon - if kc: - km = wm.keyconfigs.addon.keymaps.new(name='3D View', space_type='VIEW_3D', region_type='WINDOW') - kmi = km.keymap_items.new(FlipFluidHelperCommandLineRenderFrame.bl_idname, type='F12', value='PRESS', shift=True) - ADDON_KEYMAPS.append((km, kmi)) - - kmi = km.keymap_items.new(FlipFluidHelperCommandLineRender.bl_idname, type='F12', value='PRESS', shift=True, ctrl=True) - ADDON_KEYMAPS.append((km, kmi)) - - system = platform.system() - if system == "Windows": - kmi = km.keymap_items.new(FlipFluidHelperRunScriptfile.bl_idname, type='B', value='PRESS', shift=True, ctrl=True) - ADDON_KEYMAPS.append((km, kmi)) - def unregister(): bpy.utils.unregister_class(FlipFluidHelperRemesh) @@ -3707,19 +3111,10 @@ def unregister(): bpy.utils.unregister_class(FlipFluidHelperSetObjectViewportDisplay) bpy.utils.unregister_class(FlipFluidHelperSetObjectRenderDisplay) bpy.utils.unregister_class(FlipFluidHelperLoadLastFrame) - bpy.utils.unregister_class(FlipFluidHelperCommandLineBake) - bpy.utils.unregister_class(FlipFluidHelperCommandLineBakeToClipboard) - bpy.utils.unregister_class(FlipFluidHelperCommandLineRender) - bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderToClipboard) - bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderFrame) - bpy.utils.unregister_class(FlipFluidHelperCmdRenderFrameToClipboard) - bpy.utils.unregister_class(FlipFluidHelperCommandLineAlembicExport) - bpy.utils.unregister_class(FlipFluidHelperCmdAlembicExportToClipboard) - bpy.utils.unregister_class(FlipFluidHelperCommandLineRenderToScriptfile) - bpy.utils.unregister_class(FlipFluidHelperRunScriptfile) - bpy.utils.unregister_class(FlipFluidHelperOpenOutputFolder) bpy.utils.unregister_class(FlipFluidHelperInitializeMotionBlur) bpy.utils.unregister_class(FlipFluidHelperRemoveMotionBlur) + bpy.utils.unregister_class(FlipFluidHelperToggleMotionBlurRendering) + bpy.utils.unregister_class(FlipFluidHelperInitializeCacheObjects) bpy.utils.unregister_class(FlipFluidHelperStableRendering279) bpy.utils.unregister_class(FlipFluidHelperStableRendering28) bpy.utils.unregister_class(FlipFluidHelperSetLinearOverrideKeyframes) @@ -3754,16 +3149,8 @@ def unregister(): bpy.utils.unregister_class(FlipFluidClearMeasureObjectSpeed) bpy.utils.unregister_class(FlipFluidDisableAddonInBlendFile) bpy.utils.unregister_class(FlipFluidEnableAddonInBlendFile) - - bpy.utils.unregister_class(FLIPFLUIDS_MT_render_menu) - try: - # Blender 2.8+ - bpy.types.TOPBAR_MT_render.remove(draw_flip_fluids_render_menu) - except: - pass - - # Remove shortcuts - for km, kmi in ADDON_KEYMAPS: - km.keymap_items.remove(kmi) - ADDON_KEYMAPS.clear() + bpy.utils.unregister_class(FlipFluidPassesAddItemToList) + bpy.utils.unregister_class(FlipFluidPassesRemoveItemFromList) + bpy.utils.unregister_class(FLIPFLUID_UL_passes_items) + bpy.utils.unregister_class(FlipFluidPassesAddCameraScreen) diff --git a/src/addon/operators/preferences_operators.py b/src/addon/operators/preferences_operators.py index 2c8a8dbc..e953ab68 100644 --- a/src/addon/operators/preferences_operators.py +++ b/src/addon/operators/preferences_operators.py @@ -1455,12 +1455,26 @@ class FlipFluidOpenPreferences(bpy.types.Operator): bl_label = "FLIP Fluids Preferences" bl_description = ("Open the FLIP Fluids addon preferences menu") + view_mode = StringProperty(default="NONE") + exec(vcu.convert_attribute_to_28("view_mode")) + def execute(self, context): return {'FINISHED'} def invoke(self, context, event): + valid_view_modes = [ + 'PREFERENCES_MENU_VIEW_GENERAL', + 'PREFERENCES_MENU_VIEW_MIXBOX', + 'PREFERENCES_MENU_VIEW_PRESETS', + 'PREFERENCES_MENU_VIEW_SUPPORT' + ] + + if self.view_mode in valid_view_modes: + prefs = vcu.get_addon_preferences() + prefs.preferences_menu_view_mode = self.view_mode + bpy.ops.preferences.addon_show(module=installation_utils.get_module_name()) return {'FINISHED'} @@ -1491,7 +1505,7 @@ def draw(self, context): self.layout.operator("flip_fluid_operators.copy_system_info", icon="COPYDOWN") if vcu.is_blender_28(): - self.layout.operator("flip_fluid_operators.open_preferences", icon="PREFERENCES") + self.layout.operator("flip_fluid_operators.open_preferences", icon="PREFERENCES").view_mode = 'NONE' def draw_flip_fluids_help_menu(self, context): diff --git a/src/addon/operators/render_passes.py b/src/addon/operators/render_passes.py new file mode 100644 index 00000000..de722e00 --- /dev/null +++ b/src/addon/operators/render_passes.py @@ -0,0 +1,170 @@ +# Blender FLIP Fluids Add-on +# Copyright (C) 2024 Dennis Fassbaender +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import bpy +import os + +# Define visibility settings and render settings for each setup +visibility_settings = { + "fluid_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "fluid_particles": {"camera": False, "diffuse": False, "glossy": True, "transmission": True, "scatter": False, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_bubble": {"camera": False, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_dust": {"camera": False, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_foam": {"camera": False, "diffuse": False, "glossy": True, "transmission": True, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_spray": {"camera": False, "diffuse": False, "glossy": True, "transmission": True, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "world": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "film_transparent": True, + "transparent_glass": False, + }, + + "fluidparticles_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_bubble": {"camera": True, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_dust": {"camera": True, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_foam": {"camera": True, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_spray": {"camera": True, "diffuse": False, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "world": {"camera": False, "diffuse": True, "glossy": False, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "film_transparent": True, + "transparent_glass": True, + }, + + "bubblesanddust_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_bubble": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_dust": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_foam": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_spray": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False}, + #"Ground": {"camera": False, "diffuse": False, "glossy": True, "transmission": True, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "world": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": True, + "denoiser": True, + }, + + + "foamandspray_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_bubble": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_dust": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_foam": {"camera": True, "diffuse": True, "glossy": False, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_spray": {"camera": True, "diffuse": True, "glossy": False, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False}, + #"Ground": {"camera": False, "diffuse": False, "glossy": True, "transmission": True, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "world": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": True, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": True, + "denoiser": True, + }, + + "reflr_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "fluid_particles": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_bubble": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_dust": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_foam": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "whitewater_spray": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": False, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "world": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": True}, + "film_transparent": True, + "transparent_glass": True, + # Combine with "color" or "vivid" as example + }, + + "objects_only": { + #"fluid_surface_material": DefaultShader, + "fluid_surface": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "fluid_particles": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_bubble": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_dust": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_foam": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_spray": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "world": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": False, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": True, + }, + + "fluid_shadows_only": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": True}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_bubble": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_dust": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_foam": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_spray": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": True, "is_holdout": False}, + "world": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": False}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": True, + }, + + "object_shadows_only": { + #"fluid_surface_material": DefaultShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": False, "is_shadow_catcher": True, "is_holdout": False}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_bubble": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_dust": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_foam": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "whitewater_spray": {"camera": True, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": True, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False, "is_shadow_catcher": True, "is_holdout": False}, + "world": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True}, + "selected_objects": {"camera": False, "diffuse": True, "glossy": False, "transmission": False, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": True, + }, + + "reset": { + #"fluid_surface_material": CompShader, + "fluid_surface": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "fluid_particles": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_bubble": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_dust": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_foam": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "whitewater_spray": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "ff_camera_screen": {"camera": False, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": False}, + #"Ground": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "world": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True}, + "selected_objects": {"camera": True, "diffuse": True, "glossy": True, "transmission": True, "scatter": True, "shadow": True, "is_shadow_catcher": False, "is_holdout": False}, + "film_transparent": True, + "transparent_glass": False, + } +} + diff --git a/src/addon/operators/support_operators.py b/src/addon/operators/support_operators.py index e0a89522..0a17744c 100644 --- a/src/addon/operators/support_operators.py +++ b/src/addon/operators/support_operators.py @@ -170,11 +170,6 @@ def execute(self, context): if obj is not None: obj.select_set(True) - for obj_props in whitewater_cache_props: - obj = obj_props.get_duplivert_object() - if obj is not None: - obj.select_set(True) - domain_obj = context.scene.flip_fluid.get_domain_object() if domain_obj is not None: vcu.set_active_object(domain_obj) diff --git a/src/addon/properties/__init__.py b/src/addon/properties/__init__.py index 92c9f2dc..164c0793 100644 --- a/src/addon/properties/__init__.py +++ b/src/addon/properties/__init__.py @@ -44,6 +44,7 @@ def scene_update_post(scene): object_properties.scene_update_post(scene) + helper_properties.scene_update_post(scene) def frame_change_post(scene, depsgraph=None): diff --git a/src/addon/properties/domain_materials_properties.py b/src/addon/properties/domain_materials_properties.py index c6a12a36..d231b337 100644 --- a/src/addon/properties/domain_materials_properties.py +++ b/src/addon/properties/domain_materials_properties.py @@ -124,7 +124,7 @@ def scene_update_post(self, scene): def save_pre(self): - self._save_unused_materials_with_fake_user() + pass def _is_domain_set(self): @@ -178,7 +178,6 @@ def _update_whitewater_foam_material(self, context): foam_object, 'whitewater_foam_material', 'last_whitewater_foam_material' ) - dprops.mesh_cache.foam.apply_duplivert_object_material() helper_operators.update_geometry_node_material(foam_object, "FF_MotionBlurWhitewaterFoam") @@ -194,7 +193,6 @@ def _update_whitewater_bubble_material(self, context): bubble_object, 'whitewater_bubble_material', 'last_whitewater_bubble_material' ) - dprops.mesh_cache.bubble.apply_duplivert_object_material() helper_operators.update_geometry_node_material(bubble_object, "FF_MotionBlurWhitewaterBubble") @@ -210,7 +208,6 @@ def _update_whitewater_spray_material(self, context): spray_object, 'whitewater_spray_material', 'last_whitewater_spray_material' ) - dprops.mesh_cache.spray.apply_duplivert_object_material() helper_operators.update_geometry_node_material(spray_object, "FF_MotionBlurWhitewaterSpray") @@ -226,7 +223,6 @@ def _update_whitewater_dust_material(self, context): dust_object, 'whitewater_dust_material', 'last_whitewater_dust_material' ) - dprops.mesh_cache.dust.apply_duplivert_object_material() helper_operators.update_geometry_node_material(dust_object, "FF_MotionBlurWhitewaterDust") @@ -395,82 +391,27 @@ def _check_dust_material(self): def _check_whitewater_material(self, mesh_cache_object, material_prop): dprops = self._get_domain_properties() - new_duplivert_material = None new_object_material = None - duplivert_object = mesh_cache_object.get_duplivert_object() - if duplivert_object is not None: - if len(duplivert_object.data.materials) == 0: - new_duplivert_material = 'MATERIAL_NONE' - else: - material_idx = duplivert_object.active_material_index - material = duplivert_object.data.materials[material_idx] - if material is not None: - material_enums = material_library.get_whitewater_material_enums_ui() - material_id = self._get_material_identifier_from_name(material.name, material_enums) - new_duplivert_material = material_id - - foam_object = mesh_cache_object.get_cache_object() - if foam_object is None: + whitewater_object = mesh_cache_object.get_cache_object() + if whitewater_object is None: return - if len(foam_object.data.materials) == 0: + if len(whitewater_object.data.materials) == 0: new_object_material = 'MATERIAL_NONE' else: - material_idx = foam_object.active_material_index - material = foam_object.data.materials[material_idx] + material_idx = whitewater_object.active_material_index + material = whitewater_object.data.materials[material_idx] if material is not None: material_enums = material_library.get_whitewater_material_enums_ui() material_id = self._get_material_identifier_from_name(material.name, material_enums) new_object_material = material_id - if (new_duplivert_material == getattr(self, material_prop) and - new_object_material == getattr(self, material_prop)): - return - - if new_duplivert_material is None: - if new_object_material is not None and getattr(self, material_prop) != new_object_material: - setattr(self, material_prop, new_object_material) - return - - if new_object_material is None: - if getattr(self, material_prop) != new_duplivert_material: - setattr(self, material_prop, new_duplivert_material) - return - - if getattr(self, material_prop) != new_duplivert_material: - setattr(self, material_prop, new_duplivert_material) - return - - if getattr(self, material_prop) != new_object_material: + if new_object_material is not None and getattr(self, material_prop) != new_object_material: setattr(self, material_prop, new_object_material) return - def _save_unused_materials_with_fake_user(self): - """ - TODO: Remove - - material_ids = [ - self.surface_material, - self.whitewater_foam_material, - self.whitewater_bubble_material, - self.whitewater_spray_material, - self.whitewater_dust_material - ] - material_ids = [x for x in material_ids if x is not 'MATERIAL_NONE'] - for mid in material_ids: - mname = material_library.material_identifier_to_name(mid) - if mname is None: - mname = mid - for m in bpy.data.materials: - if m.name == mname and m.users == 0: - m.use_fake_user = True - m.flip_fluid.is_fake_use_set_by_addon = True - break - """ - - def register(): bpy.utils.register_class(DomainMaterialsProperties) diff --git a/src/addon/properties/domain_properties.py b/src/addon/properties/domain_properties.py index 7999e8c1..82655bd2 100644 --- a/src/addon/properties/domain_properties.py +++ b/src/addon/properties/domain_properties.py @@ -60,10 +60,11 @@ domain_advanced_properties, domain_stats_properties, domain_debug_properties, - preset_properties + preset_properties, ) from .. import types from ..objects import flip_fluid_cache +from ..operators import helper_operators from ..utils import version_compatibility_utils as vcu from ..utils import api_workaround_utils @@ -155,6 +156,9 @@ class FlipFluidDomainProperties(bpy.types.PropertyGroup): options={'HIDDEN'}, ); exec(conv("domain_settings_tabbed_panel_view")) + is_updated_to_flip_fluids_version_180 = BoolProperty(default=False) + exec(conv("is_updated_to_flip_fluids_version_180")); + def initialize(self): self.simulation.initialize() @@ -165,6 +169,8 @@ def initialize(self): self._initialize_property_registry() self.presets.initialize() + self.is_updated_to_flip_fluids_version_180 = True + def dummy_initialize(self): self.simulation.initialize() @@ -276,6 +282,117 @@ def _validate_property_registry(self): continue + def _update_to_flip_fluids_version_180(self): + dprops = bpy.context.scene.flip_fluid.get_domain_properties() + if dprops is None: + return + + if self.is_updated_to_flip_fluids_version_180: + return + + print("\n*** Begin updating FLIP Domain to FLIP Fluids version 1.8.0+ ***") + + rprops = dprops.render + if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': + viewport_whitewater_pct = rprops.viewport_whitewater_pct + render_whitewater_pct = rprops.render_whitewater_pct + + print("\tSetting viewport whitewater foam display percent to " + str(viewport_whitewater_pct) + "%") + rprops.viewport_foam_pct = viewport_whitewater_pct + print("\tSetting viewport whitewater bubble display percent to " + str(viewport_whitewater_pct) + "%") + rprops.viewport_bubble_pct = viewport_whitewater_pct + print("\tSetting viewport whitewater spray display percent to " + str(viewport_whitewater_pct) + "%") + rprops.viewport_spray_pct = viewport_whitewater_pct + print("\tSetting viewport whitewater dust display percent to " + str(viewport_whitewater_pct) + "%") + rprops.viewport_dust_pct = viewport_whitewater_pct + print("\tSetting render whitewater foam display percent to " + str(render_whitewater_pct) + "%") + rprops.render_foam_pct = render_whitewater_pct + print("\tSetting render whitewater bubble display percent to " + str(render_whitewater_pct) + "%") + rprops.render_bubble_pct = render_whitewater_pct + print("\tSetting render whitewater spray display percent to " + str(render_whitewater_pct) + "%") + rprops.render_spray_pct = render_whitewater_pct + print("\tSetting render whitewater dust display percent to " + str(render_whitewater_pct) + "%") + rprops.render_dust_pct = render_whitewater_pct + + parent_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + blend_resource_filename = "geometry_nodes_library.blend" + resource_filepath = os.path.join(parent_path, "resources", "geometry_nodes", blend_resource_filename) + + if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': + foam_scale = bubble_scale = spray_scale = dust_scale = rprops.whitewater_particle_scale + else: + foam_scale = rprops.foam_particle_scale + bubble_scale = rprops.bubble_particle_scale + spray_scale = rprops.spray_particle_scale + dust_scale = rprops.dust_particle_scale + particle_scales = [foam_scale, bubble_scale, spray_scale, dust_scale] + + mesh_cache_foam = dprops.mesh_cache.foam.get_cache_object() + mesh_cache_bubble = dprops.mesh_cache.bubble.get_cache_object() + mesh_cache_spray = dprops.mesh_cache.spray.get_cache_object() + mesh_cache_dust = dprops.mesh_cache.dust.get_cache_object() + mesh_caches = [mesh_cache_foam, mesh_cache_bubble, mesh_cache_spray, mesh_cache_dust] + + resource_names = [ + "FF_MotionBlurWhitewaterFoam", + "FF_MotionBlurWhitewaterBubble", + "FF_MotionBlurWhitewaterSpray", + "FF_MotionBlurWhitewaterDust" + ] + + for idx, mesh_cache in enumerate(mesh_caches): + if mesh_cache is None: + continue + if helper_operators.is_geometry_node_point_cloud_detected(mesh_cache): + continue + + print("\tInitializing geometry node modifier on <" + mesh_cache.name + ">") + gn_modifier = helper_operators.add_geometry_node_modifier(mesh_cache, resource_filepath, resource_names[idx]) + if gn_modifier: + try: + # Material + if mesh_cache.active_material is not None: + print("\t\tSetting point cloud material to <" + mesh_cache.active_material.name + ">") + gn_modifier["Input_5"] = mesh_cache.active_material + except: + pass + + try: + # Input flip_velocity + gn_modifier["Input_2_use_attribute"] = 1 + gn_modifier["Input_2_attribute_name"] = 'flip_velocity' + except: + pass + + try: + # Output velocity + gn_modifier["Output_3_attribute_name"] = 'velocity' + except: + pass + + try: + # Particle Scale + print("\t\tSetting point cloud particle scale to " + str(particle_scales[idx])) + gn_modifier["Input_6"] = particle_scales[idx] + except: + pass + + try: + # Enable Point Cloud + gn_modifier["Input_9"] = True + except: + pass + + try: + # Enable Instancing + gn_modifier["Input_10"] = False + except: + pass + + print("*** Finished updating FLIP Domain to FLIP Fluids version 1.8.0+ ***\n") + self.is_updated_to_flip_fluids_version_180 = True + + def scene_update_post(self, scene): self.render.scene_update_post(scene) self.simulation.scene_update_post(scene) @@ -310,6 +427,7 @@ def load_post(self): self._initialize_property_registry() api_workaround_utils.load_post_update_cycles_visibility_forward_compatibility_from_blender_3() + self._update_to_flip_fluids_version_180() def save_pre(self): diff --git a/src/addon/properties/domain_render_properties.py b/src/addon/properties/domain_render_properties.py index ad2a0835..db040283 100644 --- a/src/addon/properties/domain_render_properties.py +++ b/src/addon/properties/domain_render_properties.py @@ -242,107 +242,16 @@ class DomainRenderProperties(bpy.types.PropertyGroup): items=types.whitewater_view_settings_modes, default='VIEW_SETTINGS_WHITEWATER', ); exec(conv("whitewater_view_settings_mode")) - whitewater_particle_object = PointerProperty( - name="Whitewater", - description="Show this mesh object in place of whitewater particles", - type=bpy.types.Object, - poll=object_is_mesh_type_poll, - ); exec(conv("whitewater_particle_object")) - foam_particle_object = PointerProperty( - name="Foam", - description="Show this mesh object in place of foam particles", - type=bpy.types.Object, - poll=object_is_mesh_type_poll, - ); exec(conv("foam_particle_object")) - bubble_particle_object = PointerProperty( - name="Bubble", - description="Show this mesh object in place of bubble particles", - type=bpy.types.Object, - poll=object_is_mesh_type_poll, - ); exec(conv("bubble_particle_object")) - spray_particle_object = PointerProperty( - name="Spray", - description="Show this mesh object in place of spray particles", - type=bpy.types.Object, - poll=object_is_mesh_type_poll, - ); exec(conv("spray_particle_object")) - dust_particle_object = PointerProperty( - name="Dust", - description="Show this mesh object in place of dust particles", - type=bpy.types.Object, - poll=object_is_mesh_type_poll, - ); exec(conv("dust_particle_object")) - whitewater_particle_object_mode = EnumProperty( - name="Particle Object Settings Mode", - description="Type of whitewater particle geometry to use for rendering", - items=types.whitewater_particle_object_modes, - default='WHITEWATER_PARTICLE_ICOSPHERE', - options = {'HIDDEN'}, - ); exec(conv("whitewater_particle_object_mode")) - foam_particle_object_mode = EnumProperty( - name="Particle Object Settings Mode", - description="Type of foam particle geometry to use for rendering", - items=types.whitewater_particle_object_modes, - default='WHITEWATER_PARTICLE_ICOSPHERE', - options = {'HIDDEN'}, - ); exec(conv("foam_particle_object_mode")) - bubble_particle_object_mode = EnumProperty( - name="Particle Object Settings Mode", - description="Type of bubble particle geometry to use for rendering", - items=types.whitewater_particle_object_modes, - default='WHITEWATER_PARTICLE_ICOSPHERE', - options = {'HIDDEN'}, - ); exec(conv("bubble_particle_object_mode")) - spray_particle_object_mode = EnumProperty( - name="Particle Object Settings Mode", - description="Type of spray particle geometry to use for rendering", - items=types.whitewater_particle_object_modes, - default='WHITEWATER_PARTICLE_ICOSPHERE', - options = {'HIDDEN'}, - ); exec(conv("spray_particle_object_mode")) - dust_particle_object_mode = EnumProperty( + whitewater_particle_object_settings_mode = EnumProperty( name="Particle Object Settings Mode", - description="Type of dust particle geometry to use for rendering", - items=types.whitewater_particle_object_modes, - default='WHITEWATER_PARTICLE_ICOSPHERE', - options = {'HIDDEN'}, - ); exec(conv("dust_particle_object_mode")) - only_display_whitewater_in_render = BoolProperty( - name="Render Only", - description="Only display whitewater particle object during render and" - " hide in viewport. Hiding particle geometry in viewport will improve" - " viewport performance", - default = True, - ); exec(conv("only_display_whitewater_in_render")) - only_display_foam_in_render = BoolProperty( - name="Render Only", - description="Only display foam particle object during render and" - " hide in viewport. Hiding particle geometry in viewport will improve" - " viewport performance", - default=True, - ); exec(conv("only_display_foam_in_render")) - only_display_bubble_in_render = BoolProperty( - name="Render Only", - description="Only display bubble particle object during render and" - " hide in viewport. Hiding particle geometry in viewport will improve" - " viewport performance", - default=True, - ); exec(conv("only_display_bubble_in_render")) - only_display_spray_in_render = BoolProperty( - name="Render Only", - description="Only display spray particle object during render and" - " hide in viewport. Hiding particle geometry in viewport will improve" - " viewport performance", - default=True, - ); exec(conv("only_display_spray_in_render")) - only_display_dust_in_render = BoolProperty( - name="Render Only", - description="Only display dust particle object during render and" - " hide in viewport. Hiding particle geometry in viewport will improve" - " viewport performance", - default=True, - ); exec(conv("only_display_dust_in_render")) + description="How particle object settings will be applied to whitewater particles", + items=types.whitewater_object_settings_modes, + default='WHITEWATER_OBJECT_SETTINGS_WHITEWATER', + ); exec(conv("whitewater_particle_object_settings_mode")) + # Particle scale settings are no longer used in FLIP Fluids 1.8.0+ + # Only used to update Blend files created in FLIP Fluids 1.7.5 and earlier + # to newer addon versions. whitewater_particle_scale = FloatProperty( name="Scale", description="Scale of the whitewater particle object", @@ -384,13 +293,6 @@ class DomainRenderProperties(bpy.types.PropertyGroup): precision=4, ); exec(conv("dust_particle_scale")) - whitewater_particle_object_settings_mode = EnumProperty( - name="Particle Object Settings Mode", - description="How particle object settings will be applied to whitewater particles", - items=types.whitewater_object_settings_modes, - default='WHITEWATER_OBJECT_SETTINGS_WHITEWATER', - ); exec(conv("whitewater_particle_object_settings_mode")) - simulation_playback_mode = EnumProperty( name="Simulation Playback Mode", description="How to playback the simulation animation", @@ -425,49 +327,32 @@ def register_preset_properties(self, registry, path): add = registry.add_property add(path + ".render_display", "Surface Render", group_id=0) add(path + ".viewport_display", "Surface Viewport", group_id=0) - add(path + ".fluid_particle_render_display", "Particle Render", group_id=0) - add(path + ".fluid_particle_viewport_display", "Particle Viewport", group_id=0) + add(path + ".fluid_particle_render_display", "Particle Render", group_id=0) + add(path + ".fluid_particle_viewport_display", "Particle Viewport", group_id=0) add(path + ".whitewater_render_display", "Whitewater Render", group_id=0) add(path + ".whitewater_viewport_display", "Whitewater Viewport", group_id=0) add(path + ".render_surface_motion_blur", "Render Motion Blur", group_id=0) add(path + ".override_frame", "Override Frame", group_id=0) - add(path + ".whitewater_view_settings_mode", "Whitewater View Mode", group_id=1, is_key=True) - key_path = path + ".whitewater_view_settings_mode" - value1 = "VIEW_SETTINGS_WHITEWATER" - value2 = "VIEW_SETTINGS_FOAM_BUBBLE_SPRAY" - - add(path + ".render_whitewater_pct", "Whitewater Render Pct", group_id=1, key_path=key_path, key_value=value1) - add(path + ".viewport_whitewater_pct", "Whitewater Viewport Pct", group_id=1, key_path=key_path, key_value=value1) - add(path + ".render_foam_pct", "Foam Render Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".render_bubble_pct", "Bubble Render Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".render_spray_pct", "Spray Render Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".render_dust_pct", "Dust Render Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".viewport_foam_pct", "Foam Viewport Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".viewport_bubble_pct", "Bubble Viewport Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".viewport_spray_pct", "Spray Viewport Pct", group_id=1, key_path=key_path, key_value=value2) - add(path + ".viewport_dust_pct", "Dust Viewport Pct", group_id=1, key_path=key_path, key_value=value2) - - add(path + ".whitewater_particle_object_settings_mode", "Whitewater Particle Mode", group_id=2, is_key=True) - key_path = path + ".whitewater_particle_object_settings_mode" - value1 = "WHITEWATER_OBJECT_SETTINGS_WHITEWATER" - value2 = "WHITEWATER_OBJECT_SETTINGS_FOAM_BUBBLE_SPRAY" - - add(path + ".whitewater_particle_object_mode", "Whitewater Particle", group_id=2, key_path=key_path, key_value=value1) - add(path + ".only_display_whitewater_in_render", "Whitewater Render Only", group_id=2, key_path=key_path, key_value=value1) - add(path + ".whitewater_particle_scale", "Whitewater Particle Scale", group_id=2, key_path=key_path, key_value=value1) - add(path + ".foam_particle_object_mode", "Foam Particle", group_id=2, key_path=key_path, key_value=value2) - add(path + ".bubble_particle_object_mode", "Bubble Particle", group_id=2, key_path=key_path, key_value=value2) - add(path + ".spray_particle_object_mode", "Spray Particle", group_id=2, key_path=key_path, key_value=value2) - add(path + ".dust_particle_object_mode", "Dust Particle", group_id=2, key_path=key_path, key_value=value2) - add(path + ".only_display_foam_in_render", "Foam Render Only", group_id=2, key_path=key_path, key_value=value2) - add(path + ".only_display_bubble_in_render", "Bubble Render Only", group_id=2, key_path=key_path, key_value=value2) - add(path + ".only_display_spray_in_render", "Spray Render Only", group_id=2, key_path=key_path, key_value=value2) - add(path + ".only_display_dust_in_render", "Dust Render Only", group_id=2, key_path=key_path, key_value=value2) - add(path + ".foam_particle_scale", "Foam Particle Scale", group_id=2, key_path=key_path, key_value=value2) - add(path + ".bubble_particle_scale", "Bubble Particle Scale", group_id=2, key_path=key_path, key_value=value2) - add(path + ".spray_particle_scale", "Spray Particle Scale", group_id=2, key_path=key_path, key_value=value2) - add(path + ".dust_particle_scale", "Dust Particle Scale", group_id=2, key_path=key_path, key_value=value2) + add(path + ".whitewater_view_settings_mode", "Whitewater View Mode", group_id=1) + add(path + ".whitewater_particle_object_settings_mode", "Whitewater View Mode", group_id=1) + + add(path + ".render_whitewater_pct", "Whitewater Render Pct", group_id=1) + add(path + ".viewport_whitewater_pct", "Whitewater Viewport Pct", group_id=1) + add(path + ".render_foam_pct", "Foam Render Pct", group_id=1) + add(path + ".render_bubble_pct", "Bubble Render Pct", group_id=1) + add(path + ".render_spray_pct", "Spray Render Pct", group_id=1) + add(path + ".render_dust_pct", "Dust Render Pct", group_id=1) + add(path + ".viewport_foam_pct", "Foam Viewport Pct", group_id=1) + add(path + ".viewport_bubble_pct", "Bubble Viewport Pct", group_id=1) + add(path + ".viewport_spray_pct", "Spray Viewport Pct", group_id=1) + add(path + ".viewport_dust_pct", "Dust Viewport Pct", group_id=1) + + add(path + ".whitewater_particle_scale", "Whitewater Particle Scale", group_id=2) + add(path + ".foam_particle_scale", "Foam Particle Scale", group_id=2) + add(path + ".bubble_particle_scale", "Bubble Particle Scale", group_id=2) + add(path + ".spray_particle_scale", "Spray Particle Scale", group_id=2) + add(path + ".dust_particle_scale", "Dust Particle Scale", group_id=2) def scene_update_post(self, scene): diff --git a/src/addon/properties/domain_surface_properties.py b/src/addon/properties/domain_surface_properties.py index e195890f..cdeb6617 100644 --- a/src/addon/properties/domain_surface_properties.py +++ b/src/addon/properties/domain_surface_properties.py @@ -353,6 +353,7 @@ class DomainSurfaceProperties(bpy.types.PropertyGroup): meshing_volume_expanded = BoolProperty(default=False); exec(conv("meshing_volume_expanded")) meshing_against_boundary_expanded = BoolProperty(default=False); exec(conv("meshing_against_boundary_expanded")) meshing_against_obstacles_expanded = BoolProperty(default=False); exec(conv("meshing_against_obstacles_expanded")) + surface_display_settings_expanded = BoolProperty(default=False); exec(conv("surface_display_settings_expanded")) geometry_attributes_expanded = BoolProperty(default=False); exec(conv("geometry_attributes_expanded")) velocity_attributes_expanded = BoolProperty(default=False); exec(conv("velocity_attributes_expanded")) color_attributes_expanded = BoolProperty(default=False); exec(conv("color_attributes_expanded")) diff --git a/src/addon/properties/helper_properties.py b/src/addon/properties/helper_properties.py index 700d78b6..53bbcd50 100644 --- a/src/addon/properties/helper_properties.py +++ b/src/addon/properties/helper_properties.py @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import bpy, os, platform +import bpy, os, platform, math, mathutils from bpy.props import ( IntProperty, FloatProperty, @@ -30,11 +30,35 @@ from . import preset_properties from .. import types +from ..operators import helper_operators from ..utils import version_compatibility_utils as vcu DISABLE_FRAME_CHANGE_POST_HANDLER = False - +#def update_camerascreen_position(self, context): +# """Aktualisiert die Position und Skalierung der CameraScreen-Plane""" +# hprops = context.scene.flip_fluid_helper +# camera_screen = bpy.data.objects.get("CameraScreen") +# camera = bpy.data.objects.get(hprops.render_passes_cameraselection) +# +# if camera and camera_screen: +# # Holen der Matrix der Kamera inklusive Elternobjekte +# camera_matrix = camera.matrix_world +# +# if camera.parent: +# parent_matrix = camera.parent.matrix_world +# camera_matrix = parent_matrix @ camera.matrix_basis +# +# # Berechne Position entlang der Blickachse +# direction = camera_matrix.to_quaternion() @ mathutils.Vector((0.0, 0.0, -1.0)) +# distance = hprops.render_passes_camerascreen_distance +# new_location = camera_matrix.to_translation() + direction * distance +# +# # Setze Position und Rotation der Plane +# camera_screen.matrix_parent_inverse = camera_matrix.inverted() +# camera_screen.location = new_location +# camera_screen.rotation_euler = camera_matrix.to_euler() + class FlipFluidHelperProperties(bpy.types.PropertyGroup): conv = vcu.convert_attribute_to_28 @@ -107,6 +131,90 @@ class FlipFluidHelperProperties(bpy.types.PropertyGroup): description="After the command line render process is finished, open the image in your default OS image program", default=False, ); exec(conv("cmd_close_window_after_render")) + + + ### NEW RENDER PASSES ### + + # Disabled by default for the release of FLIP Fluids 1.8.0 + display_compositing_tools_in_ui = BoolProperty(default=False); exec(conv("display_compositing_tools_in_ui")) + + render_passes = BoolProperty( + name="Activate Passes Rendering", + description="Activate rendering of selected passes", + default=False + ); exec(conv("render_passes")) + + render_passes_objectlist = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup); exec(conv("render_passes_objectlist")) + render_passes_objectlist_index = bpy.props.IntProperty(); exec(conv("render_passes_objectlist_index")) + + def get_camera_items(self, context): + return [(cam.name, cam.name, "") for cam in bpy.data.objects if cam.type == 'CAMERA'] + + render_passes_cameraselection: bpy.props.EnumProperty( + items=get_camera_items, + name="Camera Selection", + description="Select a camera for rendering" + ) + + render_passes_camerascreen_distance: bpy.props.FloatProperty( + name="CameraScreen Distance", + description="Controls the distance to the selected camera", + default=10.0, + min=0.0, + max=10000.0, + #update=update_camerascreen_position + ) + + render_passes_fluid_only: bpy.props.BoolProperty( + name="Fluid Surface Only", + description="Only the fluid_surface with reflections from the background only", + default=False + ) + + render_passes_fluidparticles_only: bpy.props.BoolProperty( + name="Fluid Particles Only", + description="Only the fluidparticles with reflections from the background only", + default=False + ) + + render_passes_fluid_shadows_only: bpy.props.BoolProperty( + name="Fluid Surface Shadows Only", + description="Only the Shadow of the fluid_surface", + default=False + ) + + render_passes_reflr_only: bpy.props.BoolProperty( + name="Reflections And Refractions Only", + description="Only reflections and refractions (except the background)", + default=False + ) + + render_passes_objects_only: bpy.props.BoolProperty( + name="Objects Only", + description="Only visible objects", + default=False + ) + + render_passes_object_shadows_only: bpy.props.BoolProperty( + name="Object Shadows Only", + description="Only the shadows of visible objects", + default=False + ) + + render_passes_bubblesanddust_only: bpy.props.BoolProperty( + name="Bubbles And Dust Only", + description="Bubbles And Dust Only", + default=False + ) + + + render_passes_foamandspray_only: bpy.props.BoolProperty( + name="Foam And Spray Only", + description="Foam And Spray Only", + default=False + ) + + ### END OF PASSES ### alembic_export_surface = BoolProperty( name="Surface", @@ -191,6 +299,14 @@ class FlipFluidHelperProperties(bpy.types.PropertyGroup): default=True, ); exec(conv("unsaved_blend_file_tooltip")) + turbo_tools_render_tooltip = BoolProperty( + name="Turbo Tools command line rendering support", + description="An installation of the Turbo Tools addon has been detected. Use these operators to launch" + " a Turbo Tools render process or copy the render command. Refer to the Turbo Tools documentation for more info" + " on command line rendering", + default=True, + ); exec(conv("turbo_tools_render_tooltip")) + flip_fluids_remesh_skip_hide_render_objects = BoolProperty( name="Skip Hidden Render Objects", description="Skip remeshing objects in the collection that are hidden from render (outliner camera icon)", @@ -263,8 +379,10 @@ class FlipFluidHelperProperties(bpy.types.PropertyGroup): command_line_tools_expanded = BoolProperty(default=True); exec(conv("command_line_tools_expanded")) command_line_bake_expanded = BoolProperty(default=False); exec(conv("command_line_bake_expanded")) + command_line_render_passes_expanded = BoolProperty(default=False); exec(conv("command_line_render_passes_expanded")) command_line_render_expanded = BoolProperty(default=False); exec(conv("command_line_render_expanded")) command_line_render_frame_expanded = BoolProperty(default=False); exec(conv("command_line_render_frame_expanded")) + command_line_render_turbo_tools_expanded = BoolProperty(default=False); exec(conv("command_line_render_turbo_tools_expanded")) command_line_alembic_export_expanded = BoolProperty(default=False); exec(conv("command_line_alembic_export_expanded")) geometry_node_tools_expanded = BoolProperty(default=False); exec(conv("geometry_node_tools_expanded")) @@ -299,6 +417,10 @@ def load_post(self): self.check_alembic_output_filepath() + def scene_update_post(self, scene): + self._update_render_passes_camera_screen(scene) + + def save_post(self): self.check_alembic_output_filepath() @@ -367,6 +489,19 @@ def _update_alembic_output_filepath(self, context): self["alembic_output_filepath"] = default_cache_directory_str + def _update_render_passes_camera_screen(self, scene): + bl_camera_screen = bpy.data.objects.get("ff_camera_screen") + if bl_camera_screen is None: + return + + hprops = scene.flip_fluid_helper + bl_camera = bpy.data.objects.get(hprops.render_passes_cameraselection) + if bl_camera is None: + return + + helper_operators.update_camera_screen_scale(bl_camera_screen, bl_camera) + + def check_alembic_output_filepath(self): if self.is_alembic_output_filepath_set: return @@ -408,6 +543,10 @@ def load_post(): bpy.context.scene.flip_fluid_helper.load_post() +def scene_update_post(scene): + scene.flip_fluid_helper.scene_update_post(scene) + + def frame_change_post(scene, depsgraph=None): global DISABLE_FRAME_CHANGE_POST_HANDLER if DISABLE_FRAME_CHANGE_POST_HANDLER: diff --git a/src/addon/properties/obstacle_properties.py b/src/addon/properties/obstacle_properties.py index 3492cbb1..b6853bdb 100644 --- a/src/addon/properties/obstacle_properties.py +++ b/src/addon/properties/obstacle_properties.py @@ -35,10 +35,10 @@ class FlipFluidObstacleProperties(bpy.types.PropertyGroup): ); exec(conv("is_enabled")) is_inversed = BoolProperty( name="Inverse", - description="Turn the obstacle 'inside-out'. Enabling this option will" - " make the inside of the object empty while everything outside of the" - " object will become solid. Useful for creating perfect containers to" - " hold liquid", + description="Turn the obstacle 'inside-out'. Enabling this option will make the inside solid parts" + " of this obstacle empty while everything outside of the obstacle will become solid." + " This option is useful for turning a closed shape into a perfect container to hold" + " liquid without leakage", default=False, options={'HIDDEN'}, ); exec(conv("is_inversed")) diff --git a/src/addon/properties/preferences_properties.py b/src/addon/properties/preferences_properties.py index 939d0f15..b3325f7f 100644 --- a/src/addon/properties/preferences_properties.py +++ b/src/addon/properties/preferences_properties.py @@ -92,6 +92,14 @@ class FLIPFluidAddonPreferences(bpy.types.AddonPreferences): global FAKE_PREFERENCES bl_idname = __name__.split(".")[0] + preferences_menu_view_mode = EnumProperty( + name="Preferences Menu View", + description="Select the preferences category to view", + items=types.preferences_menu_view_modes, + default='PREFERENCES_MENU_VIEW_GENERAL', + options={'HIDDEN'}, + ); exec(vcu.convert_attribute_to_28("preferences_menu_view_mode")) + enable_helper = BoolProperty( name="Enable Helper Sidebar", description="Enable the FLIP Fluid helper menu in the 3D view sidebar." @@ -185,15 +193,15 @@ class FLIPFluidAddonPreferences(bpy.types.AddonPreferences): exec(vcu.convert_attribute_to_28("enable_support_tools")) FAKE_PREFERENCES.enable_support_tools = False - cmd_save_before_launch = BoolProperty( - name="Autosave Blend file before launching command line operators (Recommended)", + cmd_save_blend_file_before_launch = BoolProperty( + name="Autosave Blend file before launching command line operators", description="Command line operators require the Blend file to be saved for changes to take effect when using command" " line operators. If enabled, the Blend file will be automatically saved when using command line operators so that" " manual saving is not necessary", - default=False, + default=True, ); - exec(vcu.convert_attribute_to_28("cmd_save_before_launch")) - FAKE_PREFERENCES.cmd_save_before_launch = False + exec(vcu.convert_attribute_to_28("cmd_save_blend_file_before_launch")) + FAKE_PREFERENCES.cmd_save_blend_file_before_launch = True cmd_bake_max_attempts = IntProperty( name="Max Attempts", @@ -370,15 +378,16 @@ class FLIPFluidAddonPreferences(bpy.types.AddonPreferences): exec(vcu.convert_attribute_to_28("dismiss_export_animated_mesh_parented_relation_hint")) FAKE_PREFERENCES.dismiss_export_animated_mesh_parented_relation_hint = False - enable_tabbed_domain_settings = BoolProperty( - name="Enable Tabbed Domain Settings (Recommended)", + enable_tabbed_domain_settings_view = BoolProperty( + name="Enable Tabbed Domain Settings", description="Enable tabbed domain settings view. If enabled, domain panel categories will be displayed" - " using a tab header selector. If disabled, the classic view will display all domain panel categories in a vertical stack", - default=False, + " using a tab header selector. If disabled, the classic view will display all domain panel categories" + " in a vertical stack", + default=True, options={'HIDDEN'}, ) - exec(vcu.convert_attribute_to_28("enable_tabbed_domain_settings")) - FAKE_PREFERENCES.enable_tabbed_domain_settings = False + exec(vcu.convert_attribute_to_28("enable_tabbed_domain_settings_view")) + FAKE_PREFERENCES.enable_tabbed_domain_settings_view = True def is_developer_tools_enabled(self): @@ -767,7 +776,7 @@ def draw_preset_library_menu(self, context): row.label(text=" Path: " + path) - def draw(self, context): + def draw_preferences_notifications(self, context): is_installation_complete = installation_utils.is_installation_complete() column = self.layout.column(align=True) if not is_installation_complete: @@ -778,80 +787,22 @@ def draw(self, context): row.label(text="To complete installation of the FLIP Fluids addon, click here: ") row.operator("flip_fluid_operators.complete_installation", icon='MOD_FLUIDSIM') box.label(text="Or you may restart Blender to complete installation") - box.label(text="Preferences will become available after the installation is complete") - - if installation_utils.is_mixbox_supported(): - box.label(text="Optional: The Mixbox color blending plugin may be installed below now or after completing installation", icon="INFO") - + box.label(text="Full preferences menu will become available after the installation is complete") box.operator( "wm.url_open", text="FLIP Fluids Addon Installation Instructions", icon="URL" ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Addon-Installation-and-Uninstallation" - if installation_utils.is_mixbox_supported(): - box.operator( - "wm.url_open", - text="Mixbox Plugin Installation Instructions", - icon="URL" - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Mixbox-Installation-and-Uninstallation" - - show_rtx_driver_warning = False # Fixed in recent drivers (~January 2023) - if not self.dismiss_rtx_driver_warning and show_rtx_driver_warning: - model_search_string = "RTX" - gpu_model_string = preferences_operators.get_gpu_string() - if model_search_string in gpu_model_string: - column = self.layout.column(align=True) - box = column.box() - column = box.column(align=True) - column.alert = True - column.label(text="Warning: Potential NVIDIA GeForce RTX Driver Incompatibility", icon='ERROR') - column = box.column(align=True) - column.label(text="GPU Model: " + gpu_model_string, icon="INFO") - column.label(text=" A recent NVIDIA RTX 'Game Ready Driver' update may cause frequent Blender crashes.") - column.label(text=" It is recommented to update to the NVIDIA RTX 'Studio Drivers' that are typically more stable") - column.label(text=" when using content creation software.") - column.label(text=" If you are already running the Studio Drivers, ignore this message.") - column.separator() - box.operator( - "wm.url_open", - text="Click for more information about this issue", - icon="URL" - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/issues/599" - box.operator( - "wm.url_open", - text="Download NVIDIA Drivers", - icon="URL" - ).url = "https://www.nvidia.com/en-us/geforce/drivers/" - box.prop(self, "dismiss_rtx_driver_warning", text="Dismiss this warning", toggle=1, icon='X') - - if vcu.is_blender_28() and not vcu.is_blender_281(): - box = column.box() - box.label(text="WARNING: Blender 2.80 contains bugs that can cause frequent crashes", icon='ERROR') - box.label(text=" during render, Alembic export, and rigid/cloth simulation baking.") - box.separator() - box.label(text=" Blender version 2.81 or higher is recommended.") - box.separator() - box.operator( - "wm.url_open", - text="Blender 2.80 Known Issues and Workarounds", - icon="URL" - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Blender-2.8-Support#known-issues" - column.separator() - column.separator() - """ - if vcu.is_blender_28(): - box = column.box() - box.label(text="Reminder: It is necessary to lock the Blender interface during render to ", icon='INFO') - box.label(text=" prevent crashes (Blender > Render > Lock Interface).") - """ + def draw_general_preferences_menu(self, context): + is_installation_complete = installation_utils.is_installation_complete() box = self.layout.box() box.enabled = is_installation_complete helper_column = box.column(align=True) helper_column.label(text="UI Options:") - helper_column.prop(self, "enable_tabbed_domain_settings") + helper_column.prop(self, "enable_tabbed_domain_settings_view") helper_column.prop(self, "show_documentation_in_ui") row = helper_column.row() @@ -868,7 +819,7 @@ def draw(self, context): helper_column = box.column(align=True) helper_column.label(text="Command Line Tools:") row = helper_column.row(align=True) - row.prop(self, "cmd_save_before_launch") + row.prop(self, "cmd_save_blend_file_before_launch") row = helper_column.row(align=True) row.alignment = 'LEFT' row.label(text="Re-launch bake after crash:", icon='FILE_REFRESH') @@ -889,7 +840,7 @@ def draw(self, context): box = self.layout.box() box.enabled = is_installation_complete helper_column = box.column(align=True) - helper_column.label(text="Experimental & Debug Tools:") + helper_column.label(text="Experimental and Extra Features:") if installation_utils.is_experimental_build(): helper_column.prop(self, "enable_experimental_build_warning") @@ -908,25 +859,53 @@ def draw(self, context): helper_column.prop(self, "enable_blend_file_logging") helper_column.prop(self, "enable_support_tools") - self.draw_mixbox_menu(context) - self.draw_preset_library_menu(context) + box = self.layout.box() + box.enabled = is_installation_complete + column = box.column() + column.label(text="Warnings and Errors:") - """ - helper_column.separator() - helper_column.label(text="Deprecated Features:") - helper_column.prop(self, "enable_presets") + split = vcu.ui_split(column, factor=0.666, align=True) + column_left = split.column(align=True) + column_right = split.column(align=True) + + row = column_left.row(align=True) + row.alignment = 'LEFT' + row.prop(self, "dismiss_T88811_crash_warning") + + row = column_left.row(align=True) + row.alignment = 'LEFT' + row.prop(self, "dismiss_persistent_data_render_warning") - helper_column.operator( + row = column_right.row(align=True) + row.alignment = 'EXPAND' + row.operator( "wm.url_open", - text="Why Are Preset Features Deprecated?", - icon="WORLD" - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Domain-Preset-Settings" - """ + text="Bug Report: T88811", + ).url = "https://projects.blender.org/blender/blender/issues/88811" + + row = column_right.row(align=True) + row.alignment = 'EXPAND' + row.operator( + "wm.url_open", + text="Related Bug Reports", + ).url = "https://projects.blender.org/blender/blender/issues?type=all&state=open&labels=&milestone=0&project=0&assignee=0&poster=0&q=Persistent+Data" + + row = column_left.row(align=True) + row.alignment = 'LEFT' + row.prop(self, "dismiss_export_animated_mesh_parented_relation_hint") + + row = column_right.row(align=True) + row.alignment = 'EXPAND' + row.operator( + "wm.url_open", + text="Mesh Export Documentation", + ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Obstacle-Object-Settings#mesh-data-export" + + def draw_support_preferences_menu(self, context): box = self.layout.box() - box.enabled = is_installation_complete column = box.column(align=True) - split = column.split() + split = column.split(factor=0.7) column_left = split.column(align=True) column_right = split.column() @@ -951,7 +930,27 @@ def draw(self, context): text="Tutorials and Learning Resources", icon="URL" ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Video-Learning-Series" + column_left.separator() + + row = column_left.row(align=True) + row.operator( + "wm.url_open", + text="Support Form", + icon="URL" + ).url = "https://flipfluids.com/support/" + row = row.row(align=True) + row.alignment = 'RIGHT' + row.operator( + "wm.url_open", + text="Support Tips Guide", + icon="RENDER_ANIMATION" + ).url = "https://youtu.be/tZegjrdYJts" + box = self.layout.box() + column = box.column(align=True) + split = column.split(factor=0.7) + column_left = split.column(align=True) + column_right = split.column() column_left.label(text="Report a Bug:") column_left.operator( "wm.url_open", @@ -965,9 +964,8 @@ def draw(self, context): column.label(text="Reports can also be sent through official marketplaces or to support@flipfluids.com") box = self.layout.box() - box.enabled = is_installation_complete column = box.column(align=True) - split = column.split() + split = column.split(factor=0.7) column_left = split.column(align=True) column_right = split.column() @@ -992,75 +990,43 @@ def draw(self, context): row = column_left.row(align=True) row.operator( "wm.url_open", - text="Facebook", - ).url = "https://www.facebook.com/FLIPFluids" - row.operator( - "wm.url_open", - text="Twitter", - ).url = "https://twitter.com/flipfluids" + text="YouTube", + ).url = "https://www.youtube.com/FLIPFluids" row.operator( "wm.url_open", text="Instagram", ).url = "https://www.instagram.com/flip.fluids/" row.operator( "wm.url_open", - text="YouTube", - ).url = "https://www.youtube.com/FLIPFluids" - - box = self.layout.box() - box.enabled = is_installation_complete - column = box.column() - column.label(text="Warnings and Errors:") - - split = vcu.ui_split(column, factor=0.666, align=True) - column_left = split.column(align=True) - column_right = split.column(align=True) - - row = column_left.row(align=True) - row.alignment = 'LEFT' - row.prop(self, "dismiss_T88811_crash_warning") - - row = column_left.row(align=True) - row.alignment = 'LEFT' - row.prop(self, "dismiss_persistent_data_render_warning") - - if show_rtx_driver_warning: - row = column_left.row(align=True) - row.alignment = 'LEFT' - row.prop(self, "dismiss_rtx_driver_warning") - - row = column_right.row(align=True) - row.alignment = 'EXPAND' + text="Twitter", + ).url = "https://twitter.com/flipfluids" row.operator( "wm.url_open", - text="Bug Report: T88811", - ).url = "https://projects.blender.org/blender/blender/issues/88811" - - row = column_right.row(align=True) - row.alignment = 'EXPAND' + text="Facebook", + ).url = "https://www.facebook.com/FLIPFluids" + + row = column_left.row(align=True) row.operator( "wm.url_open", - text="Related Bug Reports", - ).url = "https://projects.blender.org/blender/blender/issues?type=all&state=open&labels=&milestone=0&project=0&assignee=0&poster=0&q=Persistent+Data" + text="Discord Server", + ).url = "https://discord.gg/FLIPFluids" - row = column_left.row(align=True) - row.alignment = 'LEFT' - row.prop(self, "dismiss_export_animated_mesh_parented_relation_hint") - if show_rtx_driver_warning: - row = column_right.row(align=True) - row.alignment = 'EXPAND' - row.operator( - "wm.url_open", - text="Click for More Info", - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/issues/599" - row = column_right.row(align=True) - row.alignment = 'EXPAND' - row.operator( - "wm.url_open", - text="Mesh Export Documentation", - ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Obstacle-Object-Settings#mesh-data-export" + def draw(self, context): + self.draw_preferences_notifications(context) + + row = self.layout.row(align=True) + row.prop(self, "preferences_menu_view_mode", expand=True) + + if self.preferences_menu_view_mode == 'PREFERENCES_MENU_VIEW_GENERAL': + self.draw_general_preferences_menu(context) + elif self.preferences_menu_view_mode == 'PREFERENCES_MENU_VIEW_MIXBOX': + self.draw_mixbox_menu(context) + elif self.preferences_menu_view_mode == 'PREFERENCES_MENU_VIEW_PRESETS': + self.draw_preset_library_menu(context) + elif self.preferences_menu_view_mode == 'PREFERENCES_MENU_VIEW_SUPPORT': + self.draw_support_preferences_menu(context) def _get_gpu_device_enums(self, context=None): diff --git a/src/addon/render.py b/src/addon/render.py index 7be613ab..a2309791 100644 --- a/src/addon/render.py +++ b/src/addon/render.py @@ -342,8 +342,8 @@ def __update_fluid_particle_display_mode(): particle_cache.mesh_prefix = "fluidparticles" particle_cache.mesh_display_name_prefix = "final_" particle_cache.enable_velocity_attribute = particle_props.enable_fluid_particle_velocity_vector_attribute - particle_cache.enable_vorticity_attribute = particle_props.enable_fluid_particle_speed_attribute - particle_cache.enable_speed_attribute = particle_props.enable_fluid_particle_vorticity_vector_attribute + particle_cache.enable_vorticity_attribute = particle_props.enable_fluid_particle_vorticity_vector_attribute + particle_cache.enable_speed_attribute = particle_props.enable_fluid_particle_speed_attribute particle_cache.enable_age_attribute = particle_props.enable_fluid_particle_age_attribute particle_cache.enable_lifetime_attribute = particle_props.enable_fluid_particle_lifetime_attribute particle_cache.enable_whitewater_proximity_attribute = particle_props.enable_fluid_particle_whitewater_proximity_attribute @@ -355,8 +355,8 @@ def __update_fluid_particle_display_mode(): particle_cache.mesh_prefix = "fluidparticles" particle_cache.mesh_display_name_prefix = "preview_" particle_cache.enable_velocity_attribute = particle_props.enable_fluid_particle_velocity_vector_attribute - particle_cache.enable_vorticity_attribute = particle_props.enable_fluid_particle_speed_attribute - particle_cache.enable_speed_attribute = particle_props.enable_fluid_particle_vorticity_vector_attribute + particle_cache.enable_vorticity_attribute = particle_props.enable_fluid_particle_vorticity_vector_attribute + particle_cache.enable_speed_attribute = particle_props.enable_fluid_particle_speed_attribute particle_cache.enable_age_attribute = particle_props.enable_fluid_particle_age_attribute particle_cache.enable_lifetime_attribute = particle_props.enable_fluid_particle_lifetime_attribute particle_cache.enable_whitewater_proximity_attribute = particle_props.enable_fluid_particle_whitewater_proximity_attribute @@ -419,27 +419,18 @@ def __get_whitewater_display_percentages(): rprops = dprops.render display_mode = __get_whitewater_display_mode() - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - if display_mode == 'DISPLAY_FINAL': - pct = rprops.render_whitewater_pct - elif display_mode == 'DISPLAY_PREVIEW': - pct = rprops.viewport_whitewater_pct - elif display_mode == 'DISPLAY_NONE': - pct = 0 - foam_pct = bubble_pct = spray_pct = dust_pct = pct - else: - if display_mode == 'DISPLAY_FINAL': - foam_pct = rprops.render_foam_pct - bubble_pct = rprops.render_bubble_pct - spray_pct = rprops.render_spray_pct - dust_pct = rprops.render_dust_pct - elif display_mode == 'DISPLAY_PREVIEW': - foam_pct = rprops.viewport_foam_pct - bubble_pct = rprops.viewport_bubble_pct - spray_pct = rprops.viewport_spray_pct - dust_pct = rprops.viewport_dust_pct - elif display_mode == 'DISPLAY_NONE': - foam_pct = bubble_pct = spray_pct = dust_pct = 0 + if display_mode == 'DISPLAY_FINAL': + foam_pct = rprops.render_foam_pct + bubble_pct = rprops.render_bubble_pct + spray_pct = rprops.render_spray_pct + dust_pct = rprops.render_dust_pct + elif display_mode == 'DISPLAY_PREVIEW': + foam_pct = rprops.viewport_foam_pct + bubble_pct = rprops.viewport_bubble_pct + spray_pct = rprops.viewport_spray_pct + dust_pct = rprops.viewport_dust_pct + elif display_mode == 'DISPLAY_NONE': + foam_pct = bubble_pct = spray_pct = dust_pct = 0 return foam_pct, bubble_pct, spray_pct, dust_pct @@ -645,96 +636,7 @@ def __load_whitewater_particle_frame(frameno, force_reload=False, depsgraph=None dprops.mesh_cache.dust.load_frame(frameno, force_load, depsgraph) -def __generate_icosphere_geometry(): - # Icosphere with 1 subdivision (20 sides) centred at origin - verts = [ - (0.0000, 0.0000, -1.0000), (0.7236, -0.5257, -0.4472), (-0.2764, -0.8506, -0.4472), - (-0.8944, 0.0000, -0.4472), (-0.2764, 0.8506, -0.4472), (0.7236, 0.5257, -0.4472), - (0.2764, -0.8506, 0.4472), (-0.7236, -0.5257, 0.4472), (-0.7236, 0.5257, 0.4472), - (0.2764, 0.8506, 0.4472), (0.8944, 0.0000, 0.4472), (0.0000, 0.0000, 1.0000) - ] - tris = [ - (0, 1, 2), (1, 0, 5), (0, 2, 3), (0, 3, 4), (0, 4, 5), (1, 5, 10), (2, 1, 6), (3, 2, 7), - (4, 3, 8), (5, 4, 9), (1, 10, 6), (2, 6, 7), (3, 7, 8), (4, 8, 9), (5, 9, 10), (6, 10, 11), - (7, 6, 11), (8, 7, 11), (9, 8, 11), (10, 9, 11) - ] - return verts, tris - - -def __generate_cube_geometry(): - # cube with 6 sides centred at origin - h = 0.5 - verts = [ - (h, h, -h), (h, -h, -h), (-h, -h, -h), (-h, h, -h), (h, h, h), (h, -h, h), (-h, -h, h), (-h, h, h) - ] - tris = [ - (0, 1, 2, 3), (4, 7, 6, 5), (0, 4, 5, 1), (1, 5, 6, 2), (2, 6, 7, 3), (4, 0, 3, 7) - ] - return verts, tris - - -def __get_object_geometry(bl_object): - verts, faces = [], [] - for v in bl_object.data.vertices: - verts.append((v.co.x, v.co.y, v.co.z)) - for p in bl_object.data.polygons: - face = [] - for idx in p.vertices: - face.append(idx) - faces.append(tuple(face)) - return verts, faces - - -def __get_whitewater_particle_object_geometry(whitewater_type): - dprops = __get_domain_properties() - rprops = dprops.render - - if whitewater_type == 'FOAM': - particle_mode = rprops.foam_particle_object_mode - particle_object = rprops.foam_particle_object - elif whitewater_type == 'BUBBLE': - particle_mode = rprops.bubble_particle_object_mode - particle_object = rprops.bubble_particle_object - elif whitewater_type == 'SPRAY': - particle_mode = rprops.spray_particle_object_mode - particle_object = rprops.spray_particle_object - elif whitewater_type == 'DUST': - particle_mode = rprops.dust_particle_object_mode - particle_object = rprops.dust_particle_object - - merge_settings = rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER' - if merge_settings: - use_builtin_object = rprops.whitewater_particle_object_mode != 'WHITEWATER_PARTICLE_CUSTOM' - particle_mode = rprops.whitewater_particle_object_mode - else: - use_builtin_object = particle_mode != 'WHITEWATER_PARTICLE_CUSTOM' - - if use_builtin_object: - if particle_mode == 'WHITEWATER_PARTICLE_ICOSPHERE': - return __generate_icosphere_geometry() - elif particle_mode == 'WHITEWATER_PARTICLE_CUBE': - return __generate_cube_geometry() - else: - if merge_settings: - particle_object = rprops.whitewater_particle_object - - if particle_object is None: - # No custom particle object has been set - return [], [] - - bl_object = bpy.data.objects.get(particle_object.name) - - if bl_object is not None: - return __get_object_geometry(bl_object) - else: - return [], [] - - -def get_whitewater_particle_object_geometry(whitewater_type): - return __get_whitewater_particle_object_geometry(whitewater_type) - - -def __get_whitewater_particle_object_scale(whitewater_type): +def get_whitewater_particle_object_scale(whitewater_type): dprops = __get_domain_properties() rprops = dprops.render @@ -753,122 +655,6 @@ def __get_whitewater_particle_object_scale(whitewater_type): return particle_object_scale -def get_whitewater_particle_object_scale(whitewater_type): - return __get_whitewater_particle_object_scale(whitewater_type) - -def __get_whitewater_particle_object_display_bool(whitewater_type): - global IS_RENDERING - dprops = __get_domain_properties() - rprops = dprops.render - - if whitewater_type == 'FOAM': - particle_object_viewport_display = not rprops.only_display_foam_in_render - elif whitewater_type == 'BUBBLE': - particle_object_viewport_display = not rprops.only_display_bubble_in_render - elif whitewater_type == 'SPRAY': - particle_object_viewport_display = not rprops.only_display_spray_in_render - elif whitewater_type == 'DUST': - particle_object_viewport_display = not rprops.only_display_dust_in_render - - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - return (not rprops.only_display_whitewater_in_render) or IS_RENDERING - else: - return particle_object_viewport_display or IS_RENDERING - - -def __load_whitewater_particle_object_frame(frameno, force_reload=False, depsgraph=None): - global IS_RENDERING - if not __is_domain_set(): - return - - dprops = __get_domain_properties() - if not dprops.whitewater.enable_whitewater_simulation: - return - - foam_verts, foam_tris = __get_whitewater_particle_object_geometry("FOAM") - bubble_verts, bubble_tris = __get_whitewater_particle_object_geometry("BUBBLE") - spray_verts, spray_tris = __get_whitewater_particle_object_geometry("SPRAY") - dust_verts, dust_tris = __get_whitewater_particle_object_geometry("DUST") - - foam_scale = __get_whitewater_particle_object_scale('FOAM') - bubble_scale = __get_whitewater_particle_object_scale('BUBBLE') - spray_scale = __get_whitewater_particle_object_scale('SPRAY') - dust_scale = __get_whitewater_particle_object_scale('DUST') - - display_foam_particle = __get_whitewater_particle_object_display_bool('FOAM') - display_bubble_particle = __get_whitewater_particle_object_display_bool('BUBBLE') - display_spray_particle = __get_whitewater_particle_object_display_bool('SPRAY') - display_dust_particle = __get_whitewater_particle_object_display_bool('DUST') - - force_load = force_reload or IS_RENDERING - if foam_verts and display_foam_particle and is_simulation_mesh_load_enabled('FOAM'): - dprops.mesh_cache.foam.load_duplivert_object( - foam_verts, foam_tris, - foam_scale, - force_load, - depsgraph - ) - dprops.mesh_cache.foam.set_duplivert_instance_type('VERTS') - if vcu.is_blender_279(): - # In Blender 2.79, the duplivert object must not be hidden - # in the viewport in order to be displayed in the viewport. - dprops.mesh_cache.foam.set_duplivert_hide_viewport(False) - else: - dprops.mesh_cache.foam.set_duplivert_instance_type('NONE') - if vcu.is_blender_279(): - dprops.mesh_cache.foam.set_duplivert_hide_viewport(True) - - if bubble_verts and display_bubble_particle and is_simulation_mesh_load_enabled('BUBBLE'): - dprops.mesh_cache.bubble.load_duplivert_object( - bubble_verts, bubble_tris, - bubble_scale, - force_load, - depsgraph - ) - dprops.mesh_cache.bubble.set_duplivert_instance_type('VERTS') - if vcu.is_blender_279(): - dprops.mesh_cache.bubble.set_duplivert_hide_viewport(False) - else: - dprops.mesh_cache.bubble.set_duplivert_instance_type('NONE') - if vcu.is_blender_279(): - dprops.mesh_cache.bubble.set_duplivert_hide_viewport(True) - - if spray_verts and display_spray_particle and is_simulation_mesh_load_enabled('SPRAY'): - dprops.mesh_cache.spray.load_duplivert_object( - spray_verts, spray_tris, - spray_scale, - force_load, - depsgraph - ) - dprops.mesh_cache.spray.set_duplivert_instance_type('VERTS') - if vcu.is_blender_279(): - dprops.mesh_cache.spray.set_duplivert_hide_viewport(False) - else: - dprops.mesh_cache.spray.set_duplivert_instance_type('NONE') - if vcu.is_blender_279(): - dprops.mesh_cache.spray.set_duplivert_hide_viewport(True) - - if dust_verts and display_dust_particle and is_simulation_mesh_load_enabled('DUST'): - dprops.mesh_cache.dust.load_duplivert_object( - dust_verts, dust_tris, - dust_scale, - force_load, - depsgraph - ) - dprops.mesh_cache.dust.set_duplivert_instance_type('VERTS') - if vcu.is_blender_279(): - dprops.mesh_cache.dust.set_duplivert_hide_viewport(False) - else: - dprops.mesh_cache.dust.set_duplivert_instance_type('NONE') - if vcu.is_blender_279(): - dprops.mesh_cache.dust.set_duplivert_hide_viewport(True) - - -def __load_whitewater_frame(frameno, force_reload=False, depsgraph=None): - __load_whitewater_particle_frame(frameno, force_reload, depsgraph) - __load_whitewater_particle_object_frame(frameno, force_reload, depsgraph) - - def __load_fluid_particle_debug_frame(frameno, force_reload=False): global IS_RENDERING if not __is_domain_set(): @@ -926,7 +712,7 @@ def __load_frame(frameno, force_reload=False, depsgraph=None): __load_surface_frame(frameno, force_reload, depsgraph) __load_fluid_particle_frame(frameno, force_reload, depsgraph) - __load_whitewater_frame(frameno, force_reload, depsgraph) + __load_whitewater_particle_frame(frameno, force_reload, depsgraph) __load_fluid_particle_debug_frame(frameno, force_reload) __load_force_field_debug_frame(frameno, force_reload) __load_obstacle_debug_frame(frameno, force_reload) @@ -952,12 +738,6 @@ def render_init(scene): dprops = __get_domain_properties() dprops.mesh_cache.initialize_cache_objects() - if dprops.whitewater.enable_whitewater_simulation: - dprops.mesh_cache.foam.initialize_duplivert_object() - dprops.mesh_cache.bubble.initialize_duplivert_object() - dprops.mesh_cache.spray.initialize_duplivert_object() - dprops.mesh_cache.dust.initialize_duplivert_object() - def render_complete(scene): if not __is_domain_set(): diff --git a/src/addon/resources/command_line_scripts/alembic_export.py b/src/addon/resources/command_line_scripts/alembic_export.py index c467d157..1a41fd99 100644 --- a/src/addon/resources/command_line_scripts/alembic_export.py +++ b/src/addon/resources/command_line_scripts/alembic_export.py @@ -103,13 +103,6 @@ def initialize_simulation_mesh_selection(): dprops.mesh_cache.disable_simulation_mesh_load('DUST') print("Whitewater dust export disabled, skipping...") - # Prevent whitewater instances from being loaded and exported - dprops.render.only_display_whitewater_in_render = True - dprops.render.only_display_foam_in_render = True - dprops.render.only_display_bubble_in_render = True - dprops.render.only_display_spray_in_render = True - dprops.render.only_display_dust_in_render = True - dprops.mesh_cache.disable_simulation_mesh_load('OBSTACLE_DEBUG') dprops.mesh_cache.disable_simulation_mesh_load('PARTICLE_DEBUG') dprops.mesh_cache.disable_simulation_mesh_load('FORCE_FIELD_DEBUG') diff --git a/src/addon/resources/command_line_scripts/render_animation_render_passes.py b/src/addon/resources/command_line_scripts/render_animation_render_passes.py new file mode 100644 index 00000000..4047bfbe --- /dev/null +++ b/src/addon/resources/command_line_scripts/render_animation_render_passes.py @@ -0,0 +1,53 @@ +import bpy, sys, os, platform, subprocess, pathlib + +_USE_OVERWRITE = False # TODO + +def render_script(): + hprops = bpy.context.scene.flip_fluid_helper + + blend_file_directory = os.path.dirname(bpy.data.filepath) + base_file_name = pathlib.Path(bpy.path.basename(bpy.data.filepath)).stem + + pass_suffixes = [ + ("objects_only", hprops.render_passes_objects_only), + ("fluidparticles_only", hprops.render_passes_fluidparticles_only), + ("fluid_only", hprops.render_passes_fluid_only), + ("fluid_shadows_only", hprops.render_passes_fluid_shadows_only), + ("reflr_only", hprops.render_passes_reflr_only), + ("bubblesanddust_only", hprops.render_passes_bubblesanddust_only), + ("foamandspray_only", hprops.render_passes_foamandspray_only), + # ("object_shadows_only", hprops.render_passes_object_shadows_only), # Disabled for now + ] + + render_pass_blend_filepaths = [] + enabled_passes = [suffix for suffix, enabled in pass_suffixes if enabled] + + for idx, (render_pass, enabled) in enumerate(pass_suffixes): + if not enabled: + continue + number = enabled_passes.index(render_pass) + 1 + render_pass_blend_filename = f"{number}_{base_file_name}_{render_pass}.blend" + blend_filepath = os.path.join(blend_file_directory, render_pass_blend_filename) + if not os.path.isfile(blend_filepath): + print(f"Warning: {render_pass} is enabled, but the blend file was not found: <{blend_filepath}>. This file will be skipped.") + continue + render_pass_blend_filepaths.append(blend_filepath) + + blender_binary_path = bpy.app.binary_path + frame_start = bpy.context.scene.frame_start + frame_end = bpy.context.scene.frame_end + frame_step = bpy.context.scene.frame_step + + render_command_queue = [] + for frameno in range(frame_start, frame_end + 1, frame_step): + for blend_filepath in render_pass_blend_filepaths: + command = [blender_binary_path, "-b", blend_filepath, "-f", str(frameno)] + render_command_queue.append(command) + + for command in render_command_queue: + print(f"Executing render command: {command}") + subprocess.call(command, shell=False) + print(f"Render command completed: {command}") + +render_script() + diff --git a/src/addon/resources/command_line_scripts/run_simulation_and_render_sequence_batch.py b/src/addon/resources/command_line_scripts/run_simulation_and_render_sequence_batch.py index e44d143a..b2a1b713 100644 --- a/src/addon/resources/command_line_scripts/run_simulation_and_render_sequence_batch.py +++ b/src/addon/resources/command_line_scripts/run_simulation_and_render_sequence_batch.py @@ -35,7 +35,7 @@ def play_sound(json_audio_filepath, block=False): bpy.ops.flip_fluid_operators.bake_fluid_simulation_cmd() retcode = bpy.ops.flip_fluid_operators.helper_cmd_render_to_scriptfile() if retcode != {'CANCELLED'}: - bpy.ops.flip_fluid_operators.helper_run_batch_render_scriptfile().regenerate_batch_file=False + bpy.ops.flip_fluid_operators.helper_run_batch_render_scriptfile(regenerate_batch_file=False) resources_directory = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) audio_json_filepath = os.path.join(resources_directory, "sounds", "alarm", "sound_data.json") diff --git a/src/addon/resources/geometry_nodes/geometry_nodes_library.blend b/src/addon/resources/geometry_nodes/geometry_nodes_library.blend index 5c931fc12a4439f169d4e2883d947519e993ba35..fc8e1ea63a5da7238f6792a6a857b3514bed9617 100644 GIT binary patch literal 1641133 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

-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�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 literal 1358470 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°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 F{{h1DQSJZ$ diff --git a/src/addon/types.py b/src/addon/types.py index 011bb096..240c408c 100644 --- a/src/addon/types.py +++ b/src/addon/types.py @@ -133,12 +133,6 @@ def object_types(self, context): ('WHITEWATER_OBJECT_SETTINGS_FOAM_BUBBLE_SPRAY', "Foam Bubble Spray Dust", "Adjust particle object settings for foam, bubble, spray, and dust particles separately") ) -whitewater_particle_object_modes = ( - ('WHITEWATER_PARTICLE_ICOSPHERE', "Icosphere", "Render whitewater particles as a 20 sided icosphere"), - ('WHITEWATER_PARTICLE_CUBE', "Cube", "Render whitewater particles as a 6 sided cube"), - ('WHITEWATER_PARTICLE_CUSTOM', "Custom", "Render whitewater particles as a custom blender object") - ) - whitewater_ui_modes = ( ('WHITEWATER_UI_MODE_BASIC', "Basic", "Display only the basic and most important whitewater simulation parameters"), ('WHITEWATER_UI_MODE_ADVANCED', "Advanced", "Display all whitewater simulation parameters. Advanced settings will be highlighted in red by default. For most simulations, you will not need to change these settings from their defaults.") @@ -262,4 +256,11 @@ def object_types(self, context): measurement_units_mode = ( ('MEASUREMENT_UNITS_MODE_METRIC', "Metric", "Display measurements in metric units"), ('MEASUREMENT_UNITS_MODE_IMPERIAL', "Imperial", "Display measurements in imperial units") - ) \ No newline at end of file + ) + +preferences_menu_view_modes = ( + ('PREFERENCES_MENU_VIEW_GENERAL', "General", "General preferences settings"), + ('PREFERENCES_MENU_VIEW_MIXBOX', "Mixbox Installation", "Install the Mixbox color blending plugin"), + ('PREFERENCES_MENU_VIEW_PRESETS', "Presets Installation", "Install the asset browser preset library"), + ('PREFERENCES_MENU_VIEW_SUPPORT', "Help & Support", "Info and links for help and support"), + ) diff --git a/src/addon/ui/cache_object_ui.py b/src/addon/ui/cache_object_ui.py index 0a9b5d2d..f8345e74 100644 --- a/src/addon/ui/cache_object_ui.py +++ b/src/addon/ui/cache_object_ui.py @@ -52,11 +52,11 @@ def draw_surface_viewport_render_display(self): column = box.column() split = vcu.ui_split(column, factor=0.5) column_left = split.column() - column_left.label(text="Surface Render Display:") + column_left.label(text="Render Display Mode:") column_left.prop(rprops, "render_display", expand=True) column_right = split.column() - column_right.label(text="Surface Viewport Display:") + column_right.label(text="Viewport Display Mode:") column_right.prop(rprops, "viewport_display", expand=True) @@ -68,11 +68,11 @@ def draw_fluid_particle_viewport_render_display(self): column = box.column() split = vcu.ui_split(column, factor=0.5) column_left = split.column() - column_left.label(text="Fluid Particle Render Display:") + column_left.label(text="Render Display Mode:") column_left.prop(rprops, "fluid_particle_render_display", expand=True) column_right = split.column() - column_right.label(text="Fluid Particle Viewport Display:") + column_right.label(text="Viewport Display Mode:") column_right.prop(rprops, "fluid_particle_viewport_display", expand=True) box = self.layout.box() @@ -96,20 +96,13 @@ def draw_fluid_particle_viewport_render_display(self): box = self.layout.box() column = box.column(align=True) column.label(text="Particle Object Settings:") + column.separator() - if point_cloud_detected: - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the fluid particles object geometry nodes modifier", icon="INFO") - column.separator() - - bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_fluid_particles_mesh_cache) - row = column.row(align=True) - row.alignment = 'LEFT' - row.label(text="Fluid Particles:") - domain_display_ui.draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - column.label(text="FLIP Fluids Geometry Nodes Modifier not found on fluid particles object.", icon="INFO") - column.label(text="Fluid particle settings will be unavailable in this menu.", icon="INFO") + bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_fluid_particles_mesh_cache) + row = column.row(align=True) + row.alignment = 'LEFT' + row.label(text="Fluid Particles:") + domain_display_ui.draw_fluid_particles_motion_blur_geometry_node_properties(row, bl_mod) def draw_whitewater_viewport_render_display(self): @@ -120,11 +113,11 @@ def draw_whitewater_viewport_render_display(self): column = box.column() split = vcu.ui_split(column, factor=0.5) column_left = split.column() - column_left.label(text="Whitewater Render Display:") + column_left.label(text="Render Display Mode:") column_left.prop(rprops, "whitewater_render_display", expand=True) column_right = split.column() - column_right.label(text="Whitewater Viewport Display:") + column_right.label(text="Viewport Display Mode:") column_right.prop(rprops, "whitewater_viewport_display", expand=True) @@ -133,81 +126,48 @@ def draw_whitewater_viewport_render_settings(self, render_pct_prop, viewport_pct rprops = dprops.render box = self.layout.box() - box.label(text="Display Settings Mode:") - row = box.row() - row.prop(rprops, "whitewater_view_settings_mode", expand=True) - column = box.column(align=True) split = column.split() column = split.column(align = True) - column.label(text="Final Display Settings:") + column.label(text="Final Display Amount:") column.prop(rprops, render_pct_prop, slider = True) column = split.column(align = True) - column.label(text="Preview Display Settings:") + column.label(text="Preview Display Amount:") column.prop(rprops, viewport_pct_prop, slider = True) - def draw_whitewater_particle_object_settings(self, - label_str, - object_prop, - scale_prop, - particle_object_mode_prop, - render_display_prop): + def draw_whitewater_particle_object_settings(self, prop_str, material_prop): dprops = self.get_domain_properties() rprops = dprops.render bl_object = vcu.get_active_object() - point_cloud_detected = helper_operators.is_geometry_node_point_cloud_detected(bl_object) box = self.layout.box() - box.label(text="Particle Object Settings Mode:") - if point_cloud_detected: - column = box.column(align=True) - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the whitewater object geometry nodes modifier", icon="INFO") - column.separator() - split = vcu.ui_split(column, factor=0.1) - column1 = split.column(align=True) - column2 = split.column(align=True) - - cache_props = dprops.mesh_cache.get_mesh_cache_from_blender_object(bl_object) - if cache_props is not None: - if cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_FOAM': - whitewater_label = "Foam:" - elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_BUBBLE': - whitewater_label = "Bubble:" - elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_SPRAY': - whitewater_label = "Spray:" - elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_DUST': - whitewater_label = "Dust:" - - bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_object) - row = column1.row(align=True) - row.label(text=whitewater_label) - row = column2.row(align=True) - domain_display_ui.draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - row = box.row() - row.prop(rprops, "whitewater_particle_object_settings_mode", expand=True) - - box = box.box() - column = box.column() - column.label(text=label_str) - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) + box.label(text="Particle Display Settings:") + column = box.column(align=True) + column.separator() + split = vcu.ui_split(column, factor=0.1) + column1 = split.column(align=True) + column2 = split.column(align=True) + + cache_props = dprops.mesh_cache.get_mesh_cache_from_blender_object(bl_object) + if cache_props is not None: + if cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_FOAM': + whitewater_label = "Foam:" + elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_BUBBLE': + whitewater_label = "Bubble:" + elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_SPRAY': + whitewater_label = "Spray:" + elif cache_props.cache_object_type == 'CACHE_OBJECT_TYPE_DUST': + whitewater_label = "Dust:" + + bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_object) row = column1.row(align=True) - row.prop(rprops, particle_object_mode_prop, expand=True) + row.label(text=whitewater_label) row = column2.row(align=True) - row.enabled = getattr(rprops, particle_object_mode_prop) == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, object_prop, text="") - row = column.row() - row.prop(rprops, scale_prop, text="Particle Scale") - row.prop(rprops, render_display_prop, text="Hide particles in viewport") + domain_display_ui.draw_whitewater_particles_motion_blur_geometry_node_properties(row, bl_mod) - - def draw_whitewater_material_settings(self, domain_props, prop_str, material_prop): dprops = self.get_domain_properties() self.layout.separator() @@ -269,40 +229,8 @@ def draw_foam(self, cache_props, domain_props): column.separator() self.draw_whitewater_viewport_render_display() - - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - self.draw_whitewater_viewport_render_settings( - 'render_whitewater_pct', - 'viewport_whitewater_pct' - ) - else: - self.draw_whitewater_viewport_render_settings( - 'render_foam_pct', - 'viewport_foam_pct' - ) - - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - self.draw_whitewater_particle_object_settings( - "Whitewater Particle Object:", - 'whitewater_particle_object', - 'whitewater_particle_scale', - 'whitewater_particle_object_mode', - 'only_display_whitewater_in_render' - ) - else: - self.draw_whitewater_particle_object_settings( - "Foam Particle Object:", - 'foam_particle_object', - 'foam_particle_scale', - 'foam_particle_object_mode', - 'only_display_foam_in_render' - ) - - self.draw_whitewater_material_settings( - domain_props, - "Foam", - 'whitewater_foam_material' - ) + self.draw_whitewater_viewport_render_settings('render_foam_pct', 'viewport_foam_pct') + self.draw_whitewater_particle_object_settings("Foam", 'whitewater_foam_material') self.layout.separator() column = self.layout.column() @@ -324,40 +252,8 @@ def draw_bubble(self, cache_props, domain_props): column.separator() self.draw_whitewater_viewport_render_display() - - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - self.draw_whitewater_viewport_render_settings( - 'render_whitewater_pct', - 'viewport_whitewater_pct' - ) - else: - self.draw_whitewater_viewport_render_settings( - 'render_bubble_pct', - 'viewport_bubble_pct' - ) - - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - self.draw_whitewater_particle_object_settings( - "Whitewater Particle Object:", - 'whitewater_particle_object', - 'whitewater_particle_scale', - 'whitewater_particle_object_mode', - 'only_display_whitewater_in_render' - ) - else: - self.draw_whitewater_particle_object_settings( - "Bubble Particle Object:", - 'bubble_particle_object', - 'bubble_particle_scale', - 'bubble_particle_object_mode', - 'only_display_bubble_in_render' - ) - - self.draw_whitewater_material_settings( - domain_props, - "Bubble", - 'whitewater_bubble_material' - ) + self.draw_whitewater_viewport_render_settings('render_bubble_pct', 'viewport_bubble_pct') + self.draw_whitewater_particle_object_settings("Bubble", 'whitewater_bubble_material') self.layout.separator() column = self.layout.column() @@ -379,40 +275,8 @@ def draw_spray(self, cache_props, domain_props): column.separator() self.draw_whitewater_viewport_render_display() - - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - self.draw_whitewater_viewport_render_settings( - 'render_whitewater_pct', - 'viewport_whitewater_pct' - ) - else: - self.draw_whitewater_viewport_render_settings( - 'render_spray_pct', - 'viewport_spray_pct' - ) - - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - self.draw_whitewater_particle_object_settings( - "Whitewater Particle Object:", - 'whitewater_particle_object', - 'whitewater_particle_scale', - 'whitewater_particle_object_mode', - 'only_display_whitewater_in_render' - ) - else: - self.draw_whitewater_particle_object_settings( - "Spray Particle Object:", - 'spray_particle_object', - 'spray_particle_scale', - 'spray_particle_object_mode', - 'only_display_spray_in_render' - ) - - self.draw_whitewater_material_settings( - domain_props, - "Spray", - 'whitewater_spray_material' - ) + self.draw_whitewater_viewport_render_settings('render_spray_pct', 'viewport_spray_pct') + self.draw_whitewater_particle_object_settings("Spray", 'whitewater_spray_material') self.layout.separator() column = self.layout.column() @@ -434,40 +298,8 @@ def draw_dust(self, cache_props, domain_props): column.separator() self.draw_whitewater_viewport_render_display() - - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - self.draw_whitewater_viewport_render_settings( - 'render_whitewater_pct', - 'viewport_whitewater_pct' - ) - else: - self.draw_whitewater_viewport_render_settings( - 'render_dust_pct', - 'viewport_dust_pct' - ) - - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - self.draw_whitewater_particle_object_settings( - "Whitewater Particle Object:", - 'whitewater_particle_object', - 'whitewater_particle_scale', - 'whitewater_particle_object_mode', - 'only_display_whitewater_in_render' - ) - else: - self.draw_whitewater_particle_object_settings( - "Dust Particle Object:", - 'dust_particle_object', - 'dust_particle_scale', - 'dust_particle_object_mode', - 'only_display_dust_in_render' - ) - - self.draw_whitewater_material_settings( - domain_props, - "Dust", - 'whitewater_dust_material' - ) + self.draw_whitewater_viewport_render_settings('render_dust_pct', 'viewport_dust_pct') + self.draw_whitewater_particle_object_settings("Dust", 'whitewater_dust_material') self.layout.separator() column = self.layout.column() diff --git a/src/addon/ui/domain_advanced_ui.py b/src/addon/ui/domain_advanced_ui.py index 80ba7d34..d85fc96a 100644 --- a/src/addon/ui/domain_advanced_ui.py +++ b/src/addon/ui/domain_advanced_ui.py @@ -29,7 +29,7 @@ class FLIPFLUID_PT_DomainTypeAdvancedPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_cache_ui.py b/src/addon/ui/domain_cache_ui.py index 9e4ccb30..4cd62ac0 100644 --- a/src/addon/ui/domain_cache_ui.py +++ b/src/addon/ui/domain_cache_ui.py @@ -47,7 +47,7 @@ class FLIPFLUID_PT_DomainTypeCachePanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_debug_ui.py b/src/addon/ui/domain_debug_ui.py index ce04e7d5..b0ebb2ae 100644 --- a/src/addon/ui/domain_debug_ui.py +++ b/src/addon/ui/domain_debug_ui.py @@ -29,7 +29,7 @@ class FLIPFLUID_PT_DomainTypeDebugPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_display_ui.py b/src/addon/ui/domain_display_ui.py index 6a94398f..2d9934a4 100644 --- a/src/addon/ui/domain_display_ui.py +++ b/src/addon/ui/domain_display_ui.py @@ -20,34 +20,6 @@ from ..utils import version_compatibility_utils as vcu -def draw_render_settings(self, context): - pass - - """ - box = self.layout.box() - box.label(text="Render Tools:") - column = box.column(align=True) - if vcu.is_blender_28(): - lock_interface = context.scene.render.use_lock_interface - status = "Enabled" if lock_interface else 'Disabled' - icon = 'FUND' if lock_interface else 'ERROR' - - if lock_interface: - column.operator("flip_fluid_operators.helper_stable_rendering_28", text="Disable Stable Rendering").enable_state = False - else: - column.operator("flip_fluid_operators.helper_stable_rendering_28", text="Enable Stable Rendering").enable_state = True - - row = column.row(align=True) - if not lock_interface: - row.alert = True - row.label(text="Current status: " + status, icon=icon) - else: - status = "Enabled" if context.scene.render.display_mode == 'SCREEN' else 'Disabled' - icon = 'FILE_TICK' if context.scene.render.display_mode == 'SCREEN' else 'ERROR' - column.operator("flip_fluid_operators.helper_stable_rendering_279") - column.label(text="Current status: " + status, icon=icon) - """ - def draw_simulation_display_settings(self, context): domain_object = vcu.get_active_object(context) rprops = domain_object.flip_fluid.domain.render @@ -75,10 +47,12 @@ def draw_simulation_display_settings(self, context): row = row.row(align=True) row.alert = True + row.alignment = 'RIGHT' row.label(text=visibility_text, icon="CANCEL") if scene_props.show_viewport and scene_props.show_render: row = row.row(align=True) + row.alignment = 'RIGHT' row.label(text="Visibility Enabled", icon="CHECKMARK") if not rprops.simulation_display_settings_expanded: @@ -92,7 +66,7 @@ def draw_simulation_display_settings(self, context): column_right.prop(scene_props, "show_viewport", text="Show In Viewport", icon="RESTRICT_VIEW_OFF") -def draw_surface_display_settings(self, context): +def draw_surface_display_settings(self, context, menu_expand_prop_group=None): domain_object = vcu.get_active_object(context) rprops = domain_object.flip_fluid.domain.render mprops = domain_object.flip_fluid.domain.materials @@ -101,14 +75,14 @@ def draw_surface_display_settings(self, context): column = box.column() row = column.row(align=True) - row.prop(rprops, "surface_display_settings_expanded", - icon="TRIA_DOWN" if rprops.surface_display_settings_expanded else "TRIA_RIGHT", + row.prop(menu_expand_prop_group, "surface_display_settings_expanded", + icon="TRIA_DOWN" if getattr(menu_expand_prop_group, "surface_display_settings_expanded") else "TRIA_RIGHT", icon_only=True, emboss=False ) - row.label(text="Surface Display:") + row.label(text="Surface Display and Render:") - if not rprops.surface_display_settings_expanded: + if not getattr(menu_expand_prop_group, "surface_display_settings_expanded"): info_text = "" if rprops.render_display == 'DISPLAY_FINAL': info_text += "Render Final" @@ -130,18 +104,18 @@ def draw_surface_display_settings(self, context): split = vcu.ui_split(column, factor=0.5) column_left = split.column() - column_left.label(text="Surface Render Display:") + column_left.label(text="Render Display Mode:") column_left.prop(rprops, "render_display", expand=True) column_right = split.column() - column_right.label(text="Surface Viewport Display:") + column_right.label(text="Viewport Display Mode:") column_right.prop(rprops, "viewport_display", expand=True) column_left.label(text="Surface Material:") column_right.prop(mprops, "surface_material", text="") -def draw_fluid_particle_display_settings(self, context): +def draw_fluid_particle_display_settings(self, context, menu_expand_prop_group=None): domain_object = vcu.get_active_object(context) dprops = domain_object.flip_fluid.domain rprops = domain_object.flip_fluid.domain.render @@ -153,22 +127,22 @@ def draw_fluid_particle_display_settings(self, context): if is_fluid_particles_enabled: row = column.row(align=True) - row.prop(rprops, "fluid_particle_display_settings_expanded", - icon="TRIA_DOWN" if rprops.fluid_particle_display_settings_expanded else "TRIA_RIGHT", + row.prop(menu_expand_prop_group, "fluid_particle_display_settings_expanded", + icon="TRIA_DOWN" if getattr(menu_expand_prop_group, "fluid_particle_display_settings_expanded") else "TRIA_RIGHT", icon_only=True, emboss=False ) - row.label(text="Fluid Particle Display:") + row.label(text="Fluid Particle Display and Render:") else: split = column.split() left_column = split.column() row = left_column.row(align=True) - row.prop(rprops, "fluid_particle_display_settings_expanded", - icon="TRIA_DOWN" if rprops.fluid_particle_display_settings_expanded else "TRIA_RIGHT", + row.prop(menu_expand_prop_group, "fluid_particle_display_settings_expanded", + icon="TRIA_DOWN" if getattr(menu_expand_prop_group, "fluid_particle_display_settings_expanded") else "TRIA_RIGHT", icon_only=True, emboss=False ) - row.label(text="Fluid Particle Display:") + row.label(text="Fluid Particle Display and Render:") right_column = split.column() row = right_column.row() @@ -180,7 +154,7 @@ def draw_fluid_particle_display_settings(self, context): row.operator("flip_fluid_operators.display_enable_fluid_particles_tooltip", text="", icon="QUESTION", emboss=False) - if not rprops.fluid_particle_display_settings_expanded: + if not getattr(menu_expand_prop_group, "fluid_particle_display_settings_expanded"): if is_fluid_particles_enabled: info_text = "" if rprops.fluid_particle_render_display == 'DISPLAY_FINAL': @@ -201,17 +175,17 @@ def draw_fluid_particle_display_settings(self, context): row.label(text=info_text) return - if rprops.fluid_particle_display_settings_expanded: + if getattr(menu_expand_prop_group, "fluid_particle_display_settings_expanded"): subbox = box.box() column = subbox.column(align=True) column.enabled = is_fluid_particles_enabled split = vcu.ui_split(column, factor=0.5) column_left = split.column() - column_left.label(text="Particle Render Display:") + column_left.label(text="Render Display Mode:") column_left.prop(rprops, "fluid_particle_render_display", expand=True) column_right = split.column() - column_right.label(text="Particle Viewport Display:") + column_right.label(text="Viewport Display Mode:") column_right.prop(rprops, "fluid_particle_viewport_display", expand=True) subbox = box.box() @@ -219,38 +193,30 @@ def draw_fluid_particle_display_settings(self, context): column.enabled = is_fluid_particles_enabled split = vcu.ui_split(column, factor=0.5) column_left = split.column(align=True) - column_left.label(text="Final Display Settings:") + column_left.label(text="Final Display Amount:") column_left.prop(rprops, "render_fluid_particle_surface_pct", slider=True) column_left.prop(rprops, "render_fluid_particle_boundary_pct", slider=True) column_left.prop(rprops, "render_fluid_particle_interior_pct", slider=True) column_right = split.column(align=True) - column_right.label(text="Preview Display Settings:") + column_right.label(text="Preview Display Amount:") column_right.prop(rprops, "viewport_fluid_particle_surface_pct", slider=True) column_right.prop(rprops, "viewport_fluid_particle_boundary_pct", slider=True) column_right.prop(rprops, "viewport_fluid_particle_interior_pct", slider=True) bl_fluid_particles_mesh_cache = dprops.mesh_cache.particles.get_cache_object() - point_cloud_detected = helper_operators.is_geometry_node_point_cloud_detected(bl_fluid_particles_mesh_cache) subbox = box.box() subbox.enabled = is_fluid_particles_enabled column = subbox.column(align=True) - column.label(text="Particle Object Settings:") - - if point_cloud_detected: - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the fluid particles object geometry nodes modifier", icon="INFO") - column.separator() - - bl_mod = get_motion_blur_geometry_node_modifier(bl_fluid_particles_mesh_cache) - row = column.row(align=True) - row.alignment = 'LEFT' - row.label(text="Fluid Particles:") - draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - column.label(text="FLIP Fluids Geometry Nodes Modifier not found on fluid particles object.", icon="INFO") - column.label(text="Fluid particle settings will be unavailable in this menu.", icon="INFO") + column.label(text="Particle Display Settings:") + column.separator() + + bl_mod = get_motion_blur_geometry_node_modifier(bl_fluid_particles_mesh_cache) + row = column.row(align=True) + row.alignment = 'LEFT' + row.label(text="Fluid Particles:") + draw_fluid_particles_motion_blur_geometry_node_properties(row, bl_mod) subbox = box.box() column = subbox.column(align=True) @@ -266,25 +232,53 @@ def get_motion_blur_geometry_node_modifier(bl_object): if bl_object is None: return None for mod in bl_object.modifiers: - if mod.type == "NODES" and mod.node_group.name.startswith("FF_MotionBlur"): + if mod.type == "NODES" and mod.node_group and mod.node_group.name.startswith("FF_MotionBlur"): return mod -def draw_whitewater_motion_blur_geometry_node_properties(ui_row, bl_mod): +def draw_whitewater_particles_motion_blur_geometry_node_properties(ui_row, bl_mod): if bl_mod is None: - ui_row.label(text="Missing FF_MotionBlur modifier") + ui_row.alert = True + ui_row.operator( + "flip_fluid_operators.helper_initialize_cache_objects", + text="Initialize Geometry Nodes - Missing FF_MotionBlurWhitewater modifier", + icon="ERROR" + ).cache_object_type = 'CACHE_OBJECT_TYPE_WHITEWATER_PARTICLES' return ui_row.alignment = 'LEFT' if "Input_6" in bl_mod: - ui_row.prop(bl_mod, '["Input_6"]', text="Particle Scale") + ui_row.prop(bl_mod, '["Input_6"]', text="Scale") if "Input_4" in bl_mod: - ui_row.prop(bl_mod, '["Input_4"]', text="Motion Blur Scale") + ui_row.prop(bl_mod, '["Input_4"]', text="Blur Scale") if "Input_8" in bl_mod: ui_row.prop(bl_mod, '["Input_8"]', text="Motion Blur") + if "Input_9" in bl_mod: + ui_row.prop(bl_mod, '["Input_9"]', text="Point Cloud") -def draw_whitewater_display_settings(self, context): +def draw_fluid_particles_motion_blur_geometry_node_properties(ui_row, bl_mod): + if bl_mod is None: + ui_row.alert = True + ui_row.operator( + "flip_fluid_operators.helper_initialize_cache_objects", + text="Initialize Geometry Nodes - Missing FF_MotionBlurFluidParticles modifier", + icon="ERROR" + ).cache_object_type = 'CACHE_OBJECT_TYPE_FLUID_PARTICLES' + return + + ui_row.alignment = 'LEFT' + if "Input_6" in bl_mod: + ui_row.prop(bl_mod, '["Input_6"]', text="Scale") + if "Input_4" in bl_mod: + ui_row.prop(bl_mod, '["Input_4"]', text="Blur Scale") + if "Input_8" in bl_mod: + ui_row.prop(bl_mod, '["Input_8"]', text="Motion Blur") + if "Input_9" in bl_mod: + ui_row.prop(bl_mod, '["Input_9"]', text="Point Cloud") + + +def draw_whitewater_display_settings(self, context, menu_expand_prop_group=None): obj = vcu.get_active_object(context) dprops = obj.flip_fluid.domain rprops = dprops.render @@ -295,22 +289,22 @@ def draw_whitewater_display_settings(self, context): if is_whitewater_enabled: row = column.row(align=True) - row.prop(rprops, "whitewater_display_settings_expanded", - icon="TRIA_DOWN" if rprops.whitewater_display_settings_expanded else "TRIA_RIGHT", + row.prop(menu_expand_prop_group, "whitewater_display_settings_expanded", + icon="TRIA_DOWN" if getattr(menu_expand_prop_group, "whitewater_display_settings_expanded") else "TRIA_RIGHT", icon_only=True, emboss=False ) - row.label(text="Whitewater Display:") + row.label(text="Whitewater Display and Render:") else: split = column.split() left_column = split.column() row = left_column.row(align=True) - row.prop(rprops, "whitewater_display_settings_expanded", - icon="TRIA_DOWN" if rprops.whitewater_display_settings_expanded else "TRIA_RIGHT", + row.prop(menu_expand_prop_group, "whitewater_display_settings_expanded", + icon="TRIA_DOWN" if getattr(menu_expand_prop_group, "whitewater_display_settings_expanded") else "TRIA_RIGHT", icon_only=True, emboss=False ) - row.label(text="Whitewater Display:") + row.label(text="Whitewater Display and Render:") right_column = split.column() row = right_column.row() @@ -322,7 +316,7 @@ def draw_whitewater_display_settings(self, context): row.operator("flip_fluid_operators.display_enable_whitewater_tooltip", text="", icon="QUESTION", emboss=False) - if not rprops.whitewater_display_settings_expanded: + if not getattr(menu_expand_prop_group, "whitewater_display_settings_expanded"): if is_whitewater_enabled: info_text = "" if rprops.whitewater_render_display == 'DISPLAY_FINAL': @@ -343,18 +337,18 @@ def draw_whitewater_display_settings(self, context): row.label(text=info_text) return - if rprops.whitewater_display_settings_expanded: + if getattr(menu_expand_prop_group, "whitewater_display_settings_expanded"): box = master_box.box() box.enabled = is_whitewater_enabled column = box.column(align=True) split = column.split() column = split.column(align=True) - column.label(text="Whitewater Render Display:") + column.label(text="Render Display Mode:") column.prop(rprops, "whitewater_render_display", expand=True) column = split.column(align=True) - column.label(text="Whitewater Viewport Display:") + column.label(text="Viewport Display Mode:") column.prop(rprops, "whitewater_viewport_display", expand=True) # Whitewater motion blur rendering is currently too resource intensive @@ -374,145 +368,47 @@ def draw_whitewater_display_settings(self, context): box = master_box.box() box.enabled = is_whitewater_enabled - column = box.column(align=True) - column.label(text="Display Settings Mode:") - row = column.row() - row.prop(rprops, "whitewater_view_settings_mode", expand=True) - column = box.column(align=True) split = column.split() column = split.column(align=True) - column.label(text="Final Display Settings:") - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - column.prop(rprops, "render_whitewater_pct", slider=True) - else: - column.prop(rprops, "render_foam_pct", slider=True) - column.prop(rprops, "render_bubble_pct", slider=True) - column.prop(rprops, "render_spray_pct", slider=True) - column.prop(rprops, "render_dust_pct", slider=True) + column.label(text="Final Display Amount:") + column.prop(rprops, "render_foam_pct", slider=True) + column.prop(rprops, "render_bubble_pct", slider=True) + column.prop(rprops, "render_spray_pct", slider=True) + column.prop(rprops, "render_dust_pct", slider=True) column = split.column(align=True) - column.label(text="Preview Display Settings:") - if rprops.whitewater_view_settings_mode == 'VIEW_SETTINGS_WHITEWATER': - column.prop(rprops, "viewport_whitewater_pct", slider=True) - else: - column.prop(rprops, "viewport_foam_pct", slider=True) - column.prop(rprops, "viewport_bubble_pct", slider=True) - column.prop(rprops, "viewport_spray_pct", slider=True) - column.prop(rprops, "viewport_dust_pct", slider=True) - - point_cloud_detected = False - if is_whitewater_enabled: - point_cloud_detected = helper_operators.is_geometry_node_point_cloud_detected() + column.label(text="Preview Display Amount:") + column.prop(rprops, "viewport_foam_pct", slider=True) + column.prop(rprops, "viewport_bubble_pct", slider=True) + column.prop(rprops, "viewport_spray_pct", slider=True) + column.prop(rprops, "viewport_dust_pct", slider=True) box = master_box.box() box.enabled = is_whitewater_enabled column = box.column(align=True) - column.label(text="Particle Object Settings:") - - if point_cloud_detected: - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the whitewater object geometry nodes modifier", icon="INFO") - column.separator() - split = vcu.ui_split(column, factor=0.1) - column1 = split.column(align=True) - column2 = split.column(align=True) - - whitewater_labels = ["Foam:", "Bubble:", "Spray:", "Dust:"] - mesh_cache_objects = [ - dprops.mesh_cache.foam.get_cache_object(), - dprops.mesh_cache.bubble.get_cache_object(), - dprops.mesh_cache.spray.get_cache_object(), - dprops.mesh_cache.dust.get_cache_object() - ] - - for idx, bl_object in enumerate(mesh_cache_objects): - bl_mod = get_motion_blur_geometry_node_modifier(bl_object) - row = column1.row(align=True) - row.label(text=whitewater_labels[idx]) - row = column2.row(align=True) - draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - row = column.row() - row.prop(rprops, "whitewater_particle_object_settings_mode", expand=True) - column = box.column() - - box_column = box.column() - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - column = box_column.column() - column.label(text="Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "whitewater_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.whitewater_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, "whitewater_particle_object", text="") - row = column.row() - row.prop(rprops, "whitewater_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_whitewater_in_render", text="Hide particles in viewport") - else: - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Foam Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "foam_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.foam_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, "foam_particle_object", text="") - row = column.row() - row.prop(rprops, "foam_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_foam_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Bubble Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "bubble_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.bubble_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, "bubble_particle_object", text="") - row = column.row() - row.prop(rprops, "bubble_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_bubble_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Spray Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "spray_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.spray_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, "spray_particle_object", text="") - row = column.row() - row.prop(rprops, "spray_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_spray_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Dust Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "dust_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.dust_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop(rprops, "dust_particle_object", text="") - row = column.row() - row.prop(rprops, "dust_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_dust_in_render", text="Hide particles in viewport") + column.label(text="Particle Display Settings:") + + column.separator() + split = vcu.ui_split(column, factor=0.1) + column1 = split.column(align=True) + column2 = split.column(align=True) + + whitewater_labels = ["Foam:", "Bubble:", "Spray:", "Dust:"] + mesh_cache_objects = [ + dprops.mesh_cache.foam.get_cache_object(), + dprops.mesh_cache.bubble.get_cache_object(), + dprops.mesh_cache.spray.get_cache_object(), + dprops.mesh_cache.dust.get_cache_object() + ] + + for idx, bl_object in enumerate(mesh_cache_objects): + bl_mod = get_motion_blur_geometry_node_modifier(bl_object) + row = column1.row(align=True) + row.label(text=whitewater_labels[idx]) + row = column2.row(align=True) + draw_whitewater_particles_motion_blur_geometry_node_properties(row, bl_mod) box = master_box.box() box.enabled = is_whitewater_enabled @@ -531,13 +427,13 @@ class FLIPFLUID_PT_DomainTypeDisplayPanel(bpy.types.Panel): bl_region_type = "WINDOW" bl_context = "physics" bl_category = "FLIP Fluid" - bl_label = "FLIP Fluid Display Settings" + bl_label = "FLIP Fluid Display and Render Settings" bl_options = {'DEFAULT_CLOSED'} @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() @@ -578,10 +474,9 @@ def draw(self, context): ).url = "https://github.com/rlguy/Blender-FLIP-Fluids/wiki/Scene-Troubleshooting#simulation-meshes-are-not-appearing-in-the-viewport-andor-render" draw_simulation_display_settings(self, context) - draw_surface_display_settings(self, context) - draw_fluid_particle_display_settings(self, context) - draw_whitewater_display_settings(self, context) - draw_render_settings(self, context) + draw_surface_display_settings(self, context, rprops) + draw_fluid_particle_display_settings(self, context, rprops) + draw_whitewater_display_settings(self, context, rprops) def register(): diff --git a/src/addon/ui/domain_materials_ui.py b/src/addon/ui/domain_materials_ui.py index f34e4d90..31775672 100644 --- a/src/addon/ui/domain_materials_ui.py +++ b/src/addon/ui/domain_materials_ui.py @@ -30,7 +30,7 @@ class FLIPFLUID_PT_DomainTypeMaterialsPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_particles_ui.py b/src/addon/ui/domain_particles_ui.py index 8695118b..d929fc60 100644 --- a/src/addon/ui/domain_particles_ui.py +++ b/src/addon/ui/domain_particles_ui.py @@ -22,6 +22,12 @@ from ..utils import installation_utils +def _draw_fluid_particle_display_settings(self, context): + obj = vcu.get_active_object(context) + dprops = obj.flip_fluid.domain + domain_display_ui.draw_fluid_particle_display_settings(self, context, dprops.particles) + + def _draw_geometry_attributes_menu(self, context): obj = vcu.get_active_object(context) pprops = obj.flip_fluid.domain.particles @@ -120,7 +126,10 @@ def _draw_geometry_attributes_menu(self, context): else: column.label(text="Install the Mixbox plugin in the", icon="INFO") column.label(text="FLIP Fluids Addon preferences", icon="INFO") - column.operator("flip_fluid_operators.open_preferences", text="Open Preferences", icon="PREFERENCES") + column.operator( + "flip_fluid_operators.open_preferences", + text="Open Preferences", icon="PREFERENCES" + ).view_mode = 'PREFERENCES_MENU_VIEW_MIXBOX' else: row = row.row(align=True) row.alignment = 'RIGHT' @@ -182,7 +191,7 @@ class FLIPFLUID_PT_DomainTypeFluidParticlesPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() @@ -262,41 +271,7 @@ def draw(self, context): row.prop(aprops, "particle_jitter_factor", slider=True) row.prop(aprops, "jitter_surface_particles") - box = self.layout.box() - row = box.row(align=True) - row.prop(pprops, "fluid_particle_display_settings_expanded", - icon="TRIA_DOWN" if pprops.fluid_particle_display_settings_expanded else "TRIA_RIGHT", - icon_only=True, - emboss=False - ) - row.label(text="Fluid Particle Display and Render Settings:") - - if pprops.fluid_particle_display_settings_expanded: - bl_fluid_particles_mesh_cache = dprops.mesh_cache.particles.get_cache_object() - point_cloud_detected = helper_operators.is_geometry_node_point_cloud_detected(bl_fluid_particles_mesh_cache) - - column = box.column(align=True) - column.label(text="More display settings can be found in the FLIP Fluid Display Settings panel") - - subbox = box.box() - subbox.enabled = pprops.enable_fluid_particle_output - column = subbox.column(align=True) - column.label(text="Particle Object Settings:") - - if point_cloud_detected: - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the fluid particles object geometry nodes modifier", icon="INFO") - column.separator() - - bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_fluid_particles_mesh_cache) - row = column.row(align=True) - row.alignment = 'LEFT' - row.label(text="Fluid Particles:") - domain_display_ui.draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - column.label(text="FLIP Fluids Geometry Nodes Modifier not found on fluid particles object.", icon="INFO") - column.label(text="Fluid particle settings will be unavailable in this menu.", icon="INFO") - + _draw_fluid_particle_display_settings(self, context) _draw_geometry_attributes_menu(self, context) self.layout.separator() diff --git a/src/addon/ui/domain_presets_ui.py b/src/addon/ui/domain_presets_ui.py index 38a46f9c..a551be05 100644 --- a/src/addon/ui/domain_presets_ui.py +++ b/src/addon/ui/domain_presets_ui.py @@ -31,7 +31,7 @@ class FLIPFLUID_PT_DomainTypePresetsPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid return obj_props.is_active and obj_props.object_type == "TYPE_DOMAIN" diff --git a/src/addon/ui/domain_simulation_ui.py b/src/addon/ui/domain_simulation_ui.py index 95fffe53..881e97c4 100644 --- a/src/addon/ui/domain_simulation_ui.py +++ b/src/addon/ui/domain_simulation_ui.py @@ -699,7 +699,7 @@ class FLIPFLUID_PT_DomainTypePanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_stats_ui.py b/src/addon/ui/domain_stats_ui.py index 89237ed8..4a316c20 100644 --- a/src/addon/ui/domain_stats_ui.py +++ b/src/addon/ui/domain_stats_ui.py @@ -1212,7 +1212,7 @@ class FLIPFLUID_PT_DomainTypeStatsPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_surface_ui.py b/src/addon/ui/domain_surface_ui.py index 80e70ba1..0aafc7f9 100644 --- a/src/addon/ui/domain_surface_ui.py +++ b/src/addon/ui/domain_surface_ui.py @@ -16,10 +16,17 @@ import bpy +from ..ui import domain_display_ui from ..utils import version_compatibility_utils as vcu from ..utils import installation_utils +def _draw_fluid_surface_display_settings(self, context): + obj = vcu.get_active_object(context) + dprops = obj.flip_fluid.domain + domain_display_ui.draw_surface_display_settings(self, context, dprops.surface) + + def _draw_geometry_attributes_menu(self, context): obj = vcu.get_active_object(context) sprops = obj.flip_fluid.domain.surface @@ -168,7 +175,10 @@ def _draw_geometry_attributes_menu(self, context): else: column.label(text="Install the Mixbox plugin in the", icon="INFO") column.label(text="FLIP Fluids Addon preferences", icon="INFO") - column.operator("flip_fluid_operators.open_preferences", text="Open Preferences", icon="PREFERENCES") + column.operator( + "flip_fluid_operators.open_preferences", + text="Open Preferences", icon="PREFERENCES" + ).view_mode = 'PREFERENCES_MENU_VIEW_MIXBOX' else: row = row.row(align=True) row.alignment = 'RIGHT' @@ -240,7 +250,7 @@ class FLIPFLUID_PT_DomainTypeFluidSurfacePanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() @@ -406,6 +416,7 @@ def draw(self, context): #column.separator() #column.prop(sprops, "generate_motion_blur_data") + _draw_fluid_surface_display_settings(self, context) _draw_geometry_attributes_menu(self, context) self.layout.separator() diff --git a/src/addon/ui/domain_tabbed_ui.py b/src/addon/ui/domain_tabbed_ui.py index 0b86a5be..340e9d2f 100644 --- a/src/addon/ui/domain_tabbed_ui.py +++ b/src/addon/ui/domain_tabbed_ui.py @@ -40,7 +40,7 @@ class FLIPFLUID_PT_DomainTypeTabbedPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if not vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if not vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/domain_whitewater_ui.py b/src/addon/ui/domain_whitewater_ui.py index 171444f0..1af11f3c 100644 --- a/src/addon/ui/domain_whitewater_ui.py +++ b/src/addon/ui/domain_whitewater_ui.py @@ -21,148 +21,10 @@ from ..utils import version_compatibility_utils as vcu -def draw_whitewater_display_settings(self, context): +def _draw_whitewater_display_settings(self, context): obj = vcu.get_active_object(context) dprops = obj.flip_fluid.domain - rprops = dprops.render - wprops = dprops.whitewater - is_whitewater_enabled = dprops.whitewater.enable_whitewater_simulation - - master_box = self.layout.box() - column = master_box.column() - - row = column.row(align=True) - row.enabled = is_whitewater_enabled - row.prop(wprops, "whitewater_display_settings_expanded", - icon="TRIA_DOWN" if wprops.whitewater_display_settings_expanded else "TRIA_RIGHT", - icon_only=True, - emboss=False - ) - row.label(text="Particle Display and Render Settings:") - - if not wprops.whitewater_display_settings_expanded: - return - - column.label(text="More display settings can be found in the FLIP Fluid Display Settings panel") - - point_cloud_detected = False - if is_whitewater_enabled: - point_cloud_detected = helper_operators.is_geometry_node_point_cloud_detected() - - box = master_box.box() - box.enabled = is_whitewater_enabled - - column = box.column(align=True) - column.label(text="Particle Object Settings Mode:") - - if point_cloud_detected: - column = box.column(align=True) - column.label(text="Point cloud geometry nodes setup detected", icon="INFO") - column.label(text="More settings can be found in the whitewater object geometry nodes modifier", icon="INFO") - column.separator() - split = vcu.ui_split(column, factor=0.1) - column1 = split.column(align=True) - column2 = split.column(align=True) - - whitewater_labels = ["Foam:", "Bubble:", "Spray:", "Dust:"] - mesh_cache_objects = [ - dprops.mesh_cache.foam.get_cache_object(), - dprops.mesh_cache.bubble.get_cache_object(), - dprops.mesh_cache.spray.get_cache_object(), - dprops.mesh_cache.dust.get_cache_object() - ] - - for idx, bl_object in enumerate(mesh_cache_objects): - bl_mod = domain_display_ui.get_motion_blur_geometry_node_modifier(bl_object) - row = column1.row(align=True) - row.label(text=whitewater_labels[idx]) - row = column2.row(align=True) - domain_display_ui.draw_whitewater_motion_blur_geometry_node_properties(row, bl_mod) - else: - row = column.row() - row.prop(rprops, "whitewater_particle_object_settings_mode", expand=True) - column = box.column() - - box_column = box.column() - if rprops.whitewater_particle_object_settings_mode == 'WHITEWATER_OBJECT_SETTINGS_WHITEWATER': - column = box_column.column() - column.label(text="Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "whitewater_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.whitewater_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop_search(rprops, "whitewater_particle_object", - bpy.data, "objects", text="") - row = column.row() - row.prop(rprops, "whitewater_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_whitewater_in_render", text="Hide particles in viewport") - else: - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Foam Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "foam_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.foam_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop_search(rprops, "foam_particle_object", - bpy.data, "objects", text="") - row = column.row() - row.prop(rprops, "foam_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_foam_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Bubble Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "bubble_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.bubble_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop_search(rprops, "bubble_particle_object", - bpy.data, "objects", text="") - row = column.row() - row.prop(rprops, "bubble_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_bubble_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Spray Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "spray_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.spray_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop_search(rprops, "spray_particle_object", - bpy.data, "objects", text="") - row = column.row() - row.prop(rprops, "spray_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_spray_in_render", text="Hide particles in viewport") - - particle_box = box_column.box() - column = particle_box.column() - column.label(text="Dust Particle Object:") - split = vcu.ui_split(column, factor=0.75, align=True) - column1 = split.column(align=True) - column2 = split.column(align=True) - row = column1.row(align=True) - row.prop(rprops, "dust_particle_object_mode", expand=True) - row = column2.row(align=True) - row.enabled = rprops.dust_particle_object_mode == 'WHITEWATER_PARTICLE_CUSTOM' - row.prop_search(rprops, "dust_particle_object", - bpy.data, "objects", text="") - row = column.row() - row.prop(rprops, "dust_particle_scale", text="Particle Scale") - row.prop(rprops, "only_display_dust_in_render", text="Hide particles in viewport") + domain_display_ui.draw_whitewater_display_settings(self, context, dprops.whitewater) def _draw_geometry_attributes_menu(self, context): @@ -252,7 +114,7 @@ class FLIPFLUID_PT_DomainTypeWhitewaterPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() @@ -643,8 +505,7 @@ def draw(self, context): row.prop(pgroup, "whitewater_influence", text="influence") row.prop(pgroup, "dust_emission_strength", text="dust emission") - draw_whitewater_display_settings(self, context) - + _draw_whitewater_display_settings(self, context) _draw_geometry_attributes_menu(self, context) self.layout.separator() diff --git a/src/addon/ui/domain_world_ui.py b/src/addon/ui/domain_world_ui.py index e6a71377..da500c34 100644 --- a/src/addon/ui/domain_world_ui.py +++ b/src/addon/ui/domain_world_ui.py @@ -34,7 +34,7 @@ class FLIPFLUID_PT_DomainTypeFluidWorldPanel(bpy.types.Panel): @classmethod def poll(cls, context): - if vcu.get_addon_preferences(context).enable_tabbed_domain_settings: + if vcu.get_addon_preferences(context).enable_tabbed_domain_settings_view: return False obj_props = vcu.get_active_object(context).flip_fluid is_addon_disabled = context.scene.flip_fluid.is_addon_disabled_in_blend_file() diff --git a/src/addon/ui/helper_ui.py b/src/addon/ui/helper_ui.py index 33468b10..e4998c56 100644 --- a/src/addon/ui/helper_ui.py +++ b/src/addon/ui/helper_ui.py @@ -438,6 +438,86 @@ def draw_simulation_setup_panel(self, context): row.operator("flip_fluid_operators.helper_command_line_bake") row.operator("flip_fluid_operators.helper_command_line_bake_to_clipboard", text="", icon='COPYDOWN') + + ### Prepare Compositing Passes Rendering Panel ### + + # Disabled by default for the release of FLIP Fluids 1.8.0 + # Can be enabled in a Blend file by running the following script: + """ + import bpy + bpy.context.scene.flip_fluid_helper.display_compositing_tools_in_ui = True + """ + + if hprops.display_compositing_tools_in_ui: + subbox = box.box() + row = subbox.row(align=True) + row.prop(hprops, "command_line_render_passes_expanded", + icon="TRIA_DOWN" if hprops.command_line_render_passes_expanded else "TRIA_RIGHT", + icon_only=True, + emboss=False + ) + row.label(text="Compositing Tools:") + + if not hprops.command_line_render_passes_expanded: + row.operator("flip_fluid_operators.helper_cmd_render_pass_animation", text="Launch Render Passes") + row.operator("flip_fluid_operators.helper_cmd_render_pass_anim_clipboard", text="", icon='COPYDOWN') + + if hprops.command_line_render_passes_expanded: + + row = subbox.row(align=True) + row.prop(hprops, "render_passes") + + is_render_passes_active = hprops.render_passes + + row = subbox.row() + row.active = is_render_passes_active + row.alignment = 'LEFT' + row.prop(hprops, "render_passes_fluid_only") + row.prop(hprops, "render_passes_fluid_shadows_only") + row.prop(hprops, "render_passes_fluidparticles_only") + + row = subbox.row() + row.active = is_render_passes_active + row.alignment = 'LEFT' + row.prop(hprops, "render_passes_objects_only") + #row.prop(hprops, "render_passes_object_shadows_only") + row.prop(hprops, "render_passes_reflr_only") + + row = subbox.row() + row.active = is_render_passes_active + row.alignment = 'LEFT' + row.prop(hprops, "render_passes_foamandspray_only") + row.prop(hprops, "render_passes_bubblesanddust_only") + + column = subbox.column() + row = column.row(align=True) + row.operator("flip_fluid_operators.reset_passes_settings", text="Reset Settings", icon='FILE_REFRESH') + + # Hier fügen wir die neue Liste und die Bedienelemente für die Objekte hinzu + row = subbox.row() + row.label(text="Objects to render (no fluid objects):") + row = subbox.row() + row.template_list("FLIPFLUID_UL_passes_items", "", hprops, "render_passes_objectlist", hprops, "render_passes_objectlist_index") + + col = row.column(align=True) + col.operator("flip_fluid_operators.add_item_to_list", icon='ADD', text="") + col.operator("flip_fluid_operators.remove_item_from_list", icon='REMOVE', text="").index = hprops.render_passes_objectlist_index + + column = subbox.column() + row = column.row(align=True) + row = subbox.row() + row.label(text="Generate Background Plane (CameraScreen):") + row = subbox.row() + row.prop(hprops, 'render_passes_cameraselection', text="Select Camera") + row.operator("flip_fluid_operators.add_camera_screen", text="Add CameraScreen", icon='IMAGE_BACKGROUND') + row.prop(hprops, 'render_passes_camerascreen_distance', text="") + + + column = subbox.column() + row = column.row(align=True) + row.operator("flip_fluid_operators.helper_cmd_render_pass_animation", text="Launch Render Passes") + row.operator("flip_fluid_operators.helper_cmd_render_pass_anim_clipboard", text="", icon='COPYDOWN') + ### Command Line Render Animation ### subbox = box.box() @@ -448,12 +528,12 @@ def draw_simulation_setup_panel(self, context): emboss=False ) row.label(text="Render Animation:") - + if hprops.command_line_render_expanded: column = subbox.column(align=True) row = column.row(align=True) - row.operator("flip_fluid_operators.helper_command_line_render") - row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN') + row.operator("flip_fluid_operators.helper_command_line_render").use_turbo_tools = False + row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN').use_turbo_tools = False system = platform.system() if system == "Windows": @@ -463,8 +543,8 @@ def draw_simulation_setup_panel(self, context): row.operator("flip_fluid_operators.helper_open_outputfolder", text="", icon='FILE_FOLDER') else: row = row.row(align=True) - row.operator("flip_fluid_operators.helper_command_line_render") - row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN') + row.operator("flip_fluid_operators.helper_command_line_render").use_turbo_tools = False + row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN').use_turbo_tools = False ### Command Line Render Frame ### @@ -494,6 +574,44 @@ def draw_simulation_setup_panel(self, context): row.operator("flip_fluid_operators.helper_command_line_render_frame") row.operator("flip_fluid_operators.helper_cmd_render_frame_to_clipboard", text="", icon='COPYDOWN') + + ### Turbo Tools Command Line Render ### + + if installation_utils.is_turbo_tools_addon_enabled(): + subbox = box.box() + row = subbox.row(align=True) + row.prop(hprops, "command_line_render_turbo_tools_expanded", + icon="TRIA_DOWN" if hprops.command_line_render_turbo_tools_expanded else "TRIA_RIGHT", + icon_only=True, + emboss=False + ) + row.label(text="Turbo Tools Command Line Render:") + + if hprops.command_line_render_turbo_tools_expanded: + column = subbox.column(align=True) + row = subbox.row(align=True) + row.alignment = 'LEFT' + row.prop(hprops, "turbo_tools_render_tooltip", icon="QUESTION", emboss=False, text="") + row.label(text="Turbo Tools Addon Detected") + + column = subbox.column(align=True) + row = column.row(align=True) + row.operator("flip_fluid_operators.helper_command_line_render", text="Render Animation").use_turbo_tools = True + row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN').use_turbo_tools = True + row = column.row(align=True) + row.operator("flip_fluid_operators.helper_command_line_render_frame", text="Render Frame").use_turbo_tools = True + row.operator("flip_fluid_operators.helper_cmd_render_frame_to_clipboard", text="", icon='COPYDOWN').use_turbo_tools = True + row = column.row(align=True) + row.prop(hprops, "cmd_open_image_after_render") + + if platform.system() == "Windows": + row = column.row(align=True) + row.prop(hprops, "cmd_close_window_after_render") + else: + row = row.row(align=True) + row.operator("flip_fluid_operators.helper_command_line_render", text="Render Animation").use_turbo_tools = True + row.operator("flip_fluid_operators.helper_command_line_render_to_clipboard", text="", icon='COPYDOWN').use_turbo_tools = True + ### Command Line Alembic Export ### subbox = box.box() @@ -591,12 +709,32 @@ def draw_simulation_setup_panel(self, context): column = box.column(align=False) column.enabled = vcu.is_blender_31() and is_developer_mode - column.operator("flip_fluid_operators.helper_initialize_motion_blur", icon='ADD') - column.operator("flip_fluid_operators.helper_remove_motion_blur", icon='REMOVE') + + if vcu.is_blender_33(): + # Icon only available in Blender 3.3 or later + column.operator("flip_fluid_operators.helper_initialize_motion_blur", icon='GEOMETRY_NODES') + else: + column.operator("flip_fluid_operators.helper_initialize_motion_blur") + + row = column.row(align=True) + row.label(text="Toggle Motion Blur Rendering:") + row = row.row(align=True) + row.alignment = 'RIGHT' + row.operator("flip_fluid_operators.helper_toggle_motion_blur_rendering", + text="ON", + icon="CHECKMARK" + ).enable_motion_blur_rendering=True + row.operator("flip_fluid_operators.helper_toggle_motion_blur_rendering", + text="OFF", + icon="X" + ).enable_motion_blur_rendering=False else: if is_developer_mode and vcu.is_blender_31(): - row.operator("flip_fluid_operators.helper_initialize_motion_blur", icon='ADD') - + if vcu.is_blender_33(): + # Icon only available in Blender 3.3 or later + row.operator("flip_fluid_operators.helper_initialize_motion_blur", icon='GEOMETRY_NODES') + else: + row.operator("flip_fluid_operators.helper_initialize_motion_blur") # # Object Speed Measurement Tools @@ -999,7 +1137,6 @@ def draw(self, context): column.separator() column.operator("flip_fluid_operators.increment_and_save_file", icon='FILE_TICK') - def register(): # These panels will be registered in properties.preferences_properties.py # Small fix: It´s properties.helper_properties.py @@ -1011,5 +1148,6 @@ def unregister(): bpy.utils.unregister_class(FLIPFLUID_PT_HelperPanelMain) bpy.utils.unregister_class(FLIPFLUID_PT_HelperPanelDisplay) bpy.utils.unregister_class(FLIPFLUID_PT_HelperTechnicalSupport) + except: pass diff --git a/src/addon/utils/api_workaround_utils.py b/src/addon/utils/api_workaround_utils.py index 425c49d0..9cae79fa 100644 --- a/src/addon/utils/api_workaround_utils.py +++ b/src/addon/utils/api_workaround_utils.py @@ -54,6 +54,7 @@ def frame_change_post_apply_T71908_workaround(context, depsgraph=None): cache_objects = [ dprops.mesh_cache.surface.get_cache_object(), + dprops.mesh_cache.particles.get_cache_object(), dprops.mesh_cache.foam.get_cache_object(), dprops.mesh_cache.bubble.get_cache_object(), dprops.mesh_cache.spray.get_cache_object(), @@ -68,16 +69,28 @@ def frame_change_post_apply_T71908_workaround(context, depsgraph=None): obj.modifiers[i].time = obj_eval.modifiers[i].time # Apply to any FF_MotionBlur geometry node 'Motion Blur Scale' value on the mesh objects, another issue - # for this bug when adjusting motion blur for slow motion simulations + # for this bug when adjusting motion blur for slow motion simulations. + # Also apply to other FF_MotionBlur inputs in case the user wants to keyframe these values. + + input_name_list = [ + "Input_4", # Motion Blur Scale + "Input_6", # Particle Scale + "Input_8", # Enable Motion Blur + "Input_9", # Enable Point Cloud + "Input_10", # Enable Instancing + ] for obj in cache_objects: obj_eval = obj.evaluated_get(depsgraph) for i in range(len(obj.modifiers)): if obj.modifiers[i].type == 'NODES' and obj.modifiers[i].name.startswith("FF_MotionBlur"): - if obj.modifiers[i].name.startswith("FF_MotionBlurSurface"): - obj.modifiers[i]["Input_4"] = obj_eval.modifiers[i]["Input_4"] - elif obj.modifiers[i].name.startswith("FF_MotionBlurWhitewater"): - obj.modifiers[i]["Input_4"] = obj_eval.modifiers[i]["Input_4"] + for input_name in input_name_list: + if obj.modifiers[i].name.startswith("FF_MotionBlurSurface") and input_name in obj.modifiers[i]: + obj.modifiers[i][input_name] = obj_eval.modifiers[i][input_name] + if obj.modifiers[i].name.startswith("FF_MotionBlurFluidParticles") and input_name in obj.modifiers[i]: + obj.modifiers[i][input_name] = obj_eval.modifiers[i][input_name] + elif obj.modifiers[i].name.startswith("FF_MotionBlurWhitewater") and input_name in obj.modifiers[i]: + obj.modifiers[i][input_name] = obj_eval.modifiers[i][input_name] # In some versions of Blender the viewport rendered view is diff --git a/src/engine/forcefieldcurve.cpp b/src/engine/forcefieldcurve.cpp index a8b0b3b8..15f91773 100644 --- a/src/engine/forcefieldcurve.cpp +++ b/src/engine/forcefieldcurve.cpp @@ -87,7 +87,7 @@ void ForceFieldCurve::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGri vmath::vec3 vectToCurve = _vectorField(i, j, k); float distanceToCurve = vectToCurve.length(); if (distanceToCurve > scaleWidth) { - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f, 1.0f); continue; } @@ -96,7 +96,7 @@ void ForceFieldCurve::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGri if (distanceFactor > _gravityScaleFalloffThreshold) { scaleFactor = 1.0f - (distanceFactor - _gravityScaleFalloffThreshold) / (1.0f - _gravityScaleFalloffThreshold); } - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale, scaleFactor); } } } diff --git a/src/engine/forcefieldgravityscalegrid.h b/src/engine/forcefieldgravityscalegrid.h index fb1033f9..66360912 100644 --- a/src/engine/forcefieldgravityscalegrid.h +++ b/src/engine/forcefieldgravityscalegrid.h @@ -30,39 +30,40 @@ SOFTWARE. struct ForceFieldGravityScaleGrid { Array3d gravityScale; - Array3d gravityCount; + Array3d gravityWeight; ForceFieldGravityScaleGrid() { } ForceFieldGravityScaleGrid(int isize, int jsize, int ksize) { gravityScale = Array3d(isize, jsize, ksize, 0.0f); - gravityCount = Array3d(isize, jsize, ksize, 0); + gravityWeight = Array3d(isize, jsize, ksize, 0.0f); } void reset() { gravityScale.fill(0.0f); - gravityCount.fill(0); + gravityWeight.fill(0.0f); } - void addScale(int i, int j, int k, float scale) { + void addScale(int i, int j, int k, float scale, float weight) { gravityScale.add(i, j, k, scale); - gravityCount.add(i, j, k, 1); + gravityWeight.add(i, j, k, weight); } - void addScale(GridIndex g, float scale) { - addScale(g.i, g.j, g.k, scale); + void addScale(GridIndex g, float scale, float weight) { + addScale(g.i, g.j, g.k, scale, weight); } void normalize() { + float eps = 1e-6f; for (int k = 0; k < gravityScale.depth; k++) { for (int j = 0; j < gravityScale.height; j++) { for (int i = 0; i < gravityScale.width; i++) { - int count = gravityCount(i, j, k); - if (count == 0) { + float weight = gravityWeight(i, j, k); + if (weight < eps) { gravityScale.set(i, j, k, 1.0f); } else { - float avg = gravityScale(i, j, k) / count; + float avg = gravityScale(i, j, k) / weight; gravityScale.set(i, j, k, avg); } } diff --git a/src/engine/forcefieldpoint.cpp b/src/engine/forcefieldpoint.cpp index 2bd50f32..0de65fc3 100644 --- a/src/engine/forcefieldpoint.cpp +++ b/src/engine/forcefieldpoint.cpp @@ -67,7 +67,7 @@ void ForceFieldPoint::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGri vmath::vec3 v = gp - p; float distanceToPoint = vmath::length(v); if (distanceToPoint > scaleWidth) { - scaleGrid.addScale(i, j, k, 1.0f); + scaleGrid.addScale(i, j, k, 1.0f, 1.0f); continue; } @@ -76,7 +76,7 @@ void ForceFieldPoint::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGri if (distanceFactor > _gravityScaleFalloffThreshold) { scaleFactor = 1.0f - (distanceFactor - _gravityScaleFalloffThreshold) / (1.0f - _gravityScaleFalloffThreshold); } - scaleGrid.addScale(i, j, k, scaleFactor * _gravityScale); + scaleGrid.addScale(i, j, k, scaleFactor * _gravityScale, scaleFactor); } } } diff --git a/src/engine/forcefieldsurface.cpp b/src/engine/forcefieldsurface.cpp index c0ac7f4e..a0fa5b14 100644 --- a/src/engine/forcefieldsurface.cpp +++ b/src/engine/forcefieldsurface.cpp @@ -87,7 +87,7 @@ void ForceFieldSurface::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleG vmath::vec3 vectToSurface = _vectorField(i, j, k); float distanceToSurface = vectToSurface.length(); if (distanceToSurface > scaleWidth) { - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f, 1.0f); continue; } @@ -96,7 +96,7 @@ void ForceFieldSurface::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleG if (distanceFactor > _gravityScaleFalloffThreshold) { scaleFactor = 1.0f - (distanceFactor - _gravityScaleFalloffThreshold) / (1.0f - _gravityScaleFalloffThreshold); } - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale, scaleFactor); } } } diff --git a/src/engine/forcefieldvolume.cpp b/src/engine/forcefieldvolume.cpp index feaa25e3..46a64fac 100644 --- a/src/engine/forcefieldvolume.cpp +++ b/src/engine/forcefieldvolume.cpp @@ -85,12 +85,12 @@ void ForceFieldVolume::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGr for (int i = 0; i < _isizeSDF + 1; i++) { float d = _sdf(i, j, k); if (d < 0.0f) { - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, _gravityScale); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, _gravityScale, 1.0f); } else if (d > 0.0f) { vmath::vec3 vectToSurface = _vectorField(i, j, k); float distanceToSurface = vectToSurface.length(); if (distanceToSurface > scaleWidth) { - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, 1.0f, 1.0f); continue; } @@ -99,7 +99,7 @@ void ForceFieldVolume::addGravityScaleToGrid(ForceFieldGravityScaleGrid &scaleGr if (distanceFactor > _gravityScaleFalloffThreshold) { scaleFactor = 1.0f - (distanceFactor - _gravityScaleFalloffThreshold) / (1.0f - _gravityScaleFalloffThreshold); } - scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale); + scaleGrid.addScale(i + _ioffsetSDF, j + _joffsetSDF, k + _koffsetSDF, scaleFactor * _gravityScale, scaleFactor); } } }