Support datablocks used as default values in nodes

Follow pointers of input sockets of nodes that can reference ID datablocks.
This commit is contained in:
Sybren A. Stüvel 2021-07-27 16:41:09 +02:00
parent 0bd18594f6
commit 24c0206e89
7 changed files with 67 additions and 1 deletions

View File

@ -6,6 +6,7 @@ changed functionality, fixed bugs).
## Version 1.6 (in development) ## Version 1.6 (in development)
- Support linked collections used as input in a Geometry Nodes modifier. - Support linked collections used as input in a Geometry Nodes modifier.
- Support collections, objects, images, and textures used as default values in nodes.
## Version 1.5.1 (2021-07-22) ## Version 1.5.1 (2021-07-22)

View File

@ -72,6 +72,23 @@ IDP_DOUBLE = 8
IDP_IDPARRAY = 9 IDP_IDPARRAY = 9
IDP_NUMTYPES = 10 IDP_NUMTYPES = 10
# DNA_node_types.h
SOCK_CUSTOM = -1 # socket has no integer type
SOCK_FLOAT = 0
SOCK_VECTOR = 1
SOCK_RGBA = 2
SOCK_SHADER = 3
SOCK_BOOLEAN = 4
SOCK_MESH = 5 # deprecated
SOCK_INT = 6
SOCK_STRING = 7
SOCK_OBJECT = 8
SOCK_IMAGE = 9
SOCK_GEOMETRY = 10
SOCK_COLLECTION = 11
SOCK_TEXTURE = 12
SOCK_MATERIAL = 13
# BKE_pointcache.h # BKE_pointcache.h
PTCACHE_FILE_PTCACHE = 0 PTCACHE_FILE_PTCACHE = 0
PTCACHE_FILE_OPENVDB = 1 PTCACHE_FILE_OPENVDB = 1

View File

@ -93,15 +93,35 @@ def _expand_generic_nodetree(block: blendfile.BlendFileBlock):
assert block.dna_type.dna_type_id == b"bNodeTree" assert block.dna_type.dna_type_id == b"bNodeTree"
nodes = block.get_pointer((b"nodes", b"first")) nodes = block.get_pointer((b"nodes", b"first"))
# See DNA_node_types.h
socket_types_with_value_pointer = {
cdefs.SOCK_OBJECT, # bNodeSocketValueObject
cdefs.SOCK_IMAGE, # bNodeSocketValueImage
cdefs.SOCK_COLLECTION, # bNodeSocketValueCollection
cdefs.SOCK_TEXTURE, # bNodeSocketValueTexture
cdefs.SOCK_MATERIAL, # bNodeSocketValueMaterial
}
for node in iterators.listbase(nodes): for node in iterators.listbase(nodes):
if node[b"type"] == cdefs.CMP_NODE_R_LAYERS: if node[b"type"] == cdefs.CMP_NODE_R_LAYERS:
continue continue
yield node
# The 'id' property points to whatever is used by the node # The 'id' property points to whatever is used by the node
# (like the image in an image texture node). # (like the image in an image texture node).
yield node.get_pointer(b"id") yield node.get_pointer(b"id")
# Default values of inputs can also point to ID datablocks.
inputs = node.get_pointer((b"inputs", b"first"))
for input in iterators.listbase(inputs):
if input[b"type"] not in socket_types_with_value_pointer:
continue
value_container = input.get_pointer(b"default_value")
if not value_container:
continue
value = value_container.get_pointer(b"value")
yield value
def _expand_generic_idprops(block: blendfile.BlendFileBlock): def _expand_generic_idprops(block: blendfile.BlendFileBlock):
"""Yield ID datablocks and their libraries referenced from ID properties.""" """Yield ID datablocks and their libraries referenced from ID properties."""

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -464,6 +464,34 @@ class DepsTest(AbstractTracerTest):
}, },
) )
def test_geometry_nodes_node_input(self):
"""Test linked collection as input to a geom node.
Here a Geometry Nodes node references a collection that is not instanced
into the scene, which caused it to be missed.
"""
self.assert_deps(
"geometry-nodes-3/shot_file.blend",
{
b"LIset_file.blend": Expect(
type="Library",
full_field="name[1024]",
dirname_field=None,
basename_field=None,
asset_path=b"//set_file.blend",
is_sequence=False,
),
b"LIlib_trash.blend": Expect(
type="Library",
full_field="name[1024]",
dirname_field=None,
basename_field=None,
asset_path=b"//lib_trash.blend",
is_sequence=False,
),
},
)
def test_usage_abspath(self): def test_usage_abspath(self):
deps = [ deps = [
dep dep