mirror of
https://github.com/blender/blender
synced 2026-09-29 04:37:17 +03:00
Fix: Node Tools: Image data-block inputs broken
- Because these data-blocks don't use the copy-on-eval system, they need special handling in the system that creates evaluated data-blocks for use inside the node tool execution. - The UI didn't account for the missing support of string name referenced data-blocks in `template_id`. It already did for font sockets a few lines up though. Fix the same problem for sound inputs. Pull Request: https://projects.blender.org/blender/blender/pulls/158301
This commit is contained in:
parent
b68a2f3921
commit
7ca5713d99
3 changed files with 90 additions and 11 deletions
|
|
@ -165,6 +165,65 @@ class TestNodeTool(unittest.TestCase):
|
|||
self.assertAlmostEqual(center_y, 10.0, places=4)
|
||||
self.assertAlmostEqual(center_z, 0.0, places=4)
|
||||
|
||||
def test_image_input_sample_texture(self):
|
||||
from bpy.types import WindowManager
|
||||
|
||||
# Build a 32x32 image: left half white, right half black.
|
||||
size = 32
|
||||
image = bpy.data.images.new("TestImage", width=size, height=size)
|
||||
white = [1.0, 1.0, 1.0, 1.0]
|
||||
black = [0.0, 0.0, 0.0, 1.0]
|
||||
row = (white * (size // 2)) + (black * (size // 2))
|
||||
pixels = row * size
|
||||
image.pixels.foreach_set(pixels)
|
||||
image.update()
|
||||
|
||||
bpy.ops.mesh.primitive_plane_add()
|
||||
plane = bpy.context.active_object
|
||||
|
||||
tree = create_object_mode_mesh_tool_tree(
|
||||
"TestNodeToolImage", "geometry.test_node_tool_image"
|
||||
)
|
||||
tree.interface.new_socket("Geometry", in_out='INPUT', socket_type='NodeSocketGeometry')
|
||||
image_socket = tree.interface.new_socket(
|
||||
"Image", in_out='INPUT', socket_type='NodeSocketImage')
|
||||
tree.interface.new_socket("Geometry", in_out='OUTPUT', socket_type='NodeSocketGeometry')
|
||||
|
||||
group_input = tree.nodes.new("NodeGroupInput")
|
||||
group_output = tree.nodes.new("NodeGroupOutput")
|
||||
|
||||
uv_attr = tree.nodes.new("GeometryNodeInputNamedAttribute")
|
||||
uv_attr.data_type = 'FLOAT_VECTOR'
|
||||
uv_attr.inputs["Name"].default_value = "UVMap"
|
||||
|
||||
image_texture = tree.nodes.new("GeometryNodeImageTexture")
|
||||
# Avoid edge interpolation/wrap effects so the leftmost vertices sample pure white.
|
||||
image_texture.interpolation = 'Closest'
|
||||
image_texture.extension = 'EXTEND'
|
||||
|
||||
store_attr = tree.nodes.new("GeometryNodeStoreNamedAttribute")
|
||||
store_attr.data_type = 'FLOAT'
|
||||
store_attr.inputs["Name"].default_value = "sampled_value"
|
||||
|
||||
tree.links.new(group_input.outputs["Geometry"], store_attr.inputs["Geometry"])
|
||||
tree.links.new(group_input.outputs["Image"], image_texture.inputs["Image"])
|
||||
tree.links.new(uv_attr.outputs["Attribute"], image_texture.inputs["Vector"])
|
||||
tree.links.new(image_texture.outputs["Color"], store_attr.inputs["Value"])
|
||||
tree.links.new(store_attr.outputs["Geometry"], group_output.inputs["Geometry"])
|
||||
|
||||
WindowManager.register_node_group_operators()
|
||||
|
||||
bpy.ops.geometry.test_node_tool_image(
|
||||
'EXEC_DEFAULT',
|
||||
inputs={image_socket.identifier: {"value": image.name}},
|
||||
)
|
||||
|
||||
value_attr = plane.data.attributes["sampled_value"]
|
||||
left_vertex_indices = [i for i, v in enumerate(plane.data.vertices) if v.co.x < 0.0]
|
||||
self.assertGreater(len(left_vertex_indices), 0)
|
||||
for i in left_vertex_indices:
|
||||
self.assertAlmostEqual(value_attr.data[i].value, 1.0, places=2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue