diff --git a/blender_asset_tracer/trace/expanders.py b/blender_asset_tracer/trace/expanders.py index 8b101d2..0437333 100644 --- a/blender_asset_tracer/trace/expanders.py +++ b/blender_asset_tracer/trace/expanders.py @@ -90,7 +90,14 @@ def _expand_generic_mtex(block: blendfile.BlendFileBlock): def _expand_generic_nodetree(block: blendfile.BlendFileBlock): - assert block.dna_type.dna_type_id == b"bNodeTree" + if block.dna_type.dna_type_id == b"ID": + # This is a placeholder for a linked node tree. + yield block + return + + assert ( + block.dna_type.dna_type_id == b"bNodeTree" + ), f"Expected bNodeTree, got {block.dna_type.dna_type_id.decode()})" nodes = block.get_pointer((b"nodes", b"first")) @@ -145,7 +152,11 @@ def _expand_generic_idprops(block: blendfile.BlendFileBlock): def _expand_generic_nodetree_id(block: blendfile.BlendFileBlock): - block_ntree = block.get_pointer(b"nodetree", None) + if block.bfile.header.version >= 500 and block.bfile.file_subversion >= 4: + # Introduced in Blender 5.0, commit bd61e69be5a7c96f1e5da1c86aafc17b839e049f + block_ntree = block.get_pointer(b"compositing_node_group", None) + else: + block_ntree = block.get_pointer(b"nodetree", None) if block_ntree is not None: yield from _expand_generic_nodetree(block_ntree) diff --git a/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_library.blend b/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_library.blend new file mode 100644 index 0000000..dccedf3 Binary files /dev/null and b/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_library.blend differ diff --git a/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_workfile.blend b/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_workfile.blend new file mode 100644 index 0000000..8232c38 Binary files /dev/null and b/tests/blendfiles/compositor_nodes/compositor_nodes_blender500_workfile.blend differ diff --git a/tests/test_tracer.py b/tests/test_tracer.py index 20967aa..68699e8 100644 --- a/tests/test_tracer.py +++ b/tests/test_tracer.py @@ -506,6 +506,26 @@ class DepsTest(AbstractTracerTest): }, ) + def test_compositor_nodes(self) -> None: + """Test compositor node trees. + + Since Blender 5.0 these use a different DNA field, and can also be + linked from other files. + """ + self.assert_deps( + "compositor_nodes/compositor_nodes_blender500_workfile.blend", + { + b"LIcompositor_nodes_blender500_library.blend": Expect( + type="Library", + full_field="name[1024]", + dirname_field=None, + basename_field=None, + asset_path=b"//compositor_nodes_blender500_library.blend", + is_sequence=False, + ), + }, + ) + def test_usage_abspath(self): deps = [ dep