From 1e8c92499081a5cf2eeaf0a1d60c2ec6e4eecc9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 16 Dec 2022 14:49:36 +0100 Subject: [PATCH] Add support for fluid simulation caches Add `eModifierType_Fluid` support, with non-pointcache caches. The entire cache directory is considered a dependency to list/pack. --- CHANGELOG.md | 4 +++ blender_asset_tracer/cdefs.py | 1 + .../trace/modifier_walkers.py | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cfcb22..52bebfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ This file logs the changes that are actually interesting to users (new features, changed functionality, fixed bugs). +# Version 1.15 (in development) + +- Add support for fluid simulation caches. + # Version 1.14 (2022-09-12) - While tracing dependencies, call the progress callback function before opening a blend file, instead of before iterating over its contents. The opening (and loading of SDNA) takes a significant amount of time, so this will make any UI (like the Flamenco add-on) report the right filename when waiting for big files. diff --git a/blender_asset_tracer/cdefs.py b/blender_asset_tracer/cdefs.py index 798782e..099a638 100644 --- a/blender_asset_tracer/cdefs.py +++ b/blender_asset_tracer/cdefs.py @@ -48,6 +48,7 @@ eModifierType_WeightVGProximity = 38 eModifierType_Ocean = 39 eModifierType_MeshCache = 46 eModifierType_MeshSequenceCache = 52 +eModifierType_Fluid = 56 eModifierType_Nodes = 57 # DNA_particle_types.h diff --git a/blender_asset_tracer/trace/modifier_walkers.py b/blender_asset_tracer/trace/modifier_walkers.py index 2143810..12a0468 100644 --- a/blender_asset_tracer/trace/modifier_walkers.py +++ b/blender_asset_tracer/trace/modifier_walkers.py @@ -278,6 +278,34 @@ def modifier_smoke_sim( ) +@mod_handler(cdefs.eModifierType_Fluid) +def modifier_fluid( + ctx: ModifierContext, modifier: blendfile.BlendFileBlock, block_name: bytes +) -> typing.Iterator[result.BlockUsage]: + my_log = log.getChild("modifier_fluid") + + domain = modifier.get_pointer(b"domain") + if domain is None: + my_log.debug( + "Modifier %r (%r) has no domain", modifier[b"modifier", b"name"], block_name + ) + return + + # See fluid_bake_startjob() in physics_fluid.c + path = domain[b"cache_directory"] + path, field = domain.get(b"cache_directory", return_field=True) + + log.info(" fluid cache at %s", path) + bpath = bpathlib.BlendPath(path) + yield result.BlockUsage( + domain, + bpath, + path_full_field=field, + is_sequence=True, + block_name=block_name, + ) + + @mod_handler(cdefs.eModifierType_Cloth) def modifier_cloth( ctx: ModifierContext, modifier: blendfile.BlendFileBlock, block_name: bytes