- Introduced a new `Boundary Padding` preference in the Cutout Tool with a default of 2 px and a configurable range of 1-4 px. - Updated the Cutout client to establish inward mapping from the final Mask, sampling in a fixed direction and processing independent material RGBA and Depth. - Enhanced the handling of RGBA and Depth during cutout operations, ensuring proper mapping and preservation of source data. - Added tests to validate the new boundary padding functionality and its integration with existing cutout processes. feat(geometry): remove overall mesh smoothing from geometry nodes - Removed the `Smooth` input from several geometry node groups to eliminate unnecessary overall mesh smoothing. - Retained `Smooth Weight` for depth nodes while removing it from Cutout and Relief Plane nodes. - Ensured that boundary, normal, and fill smoothing behaviors remain intact and consistent. - Updated tests and documentation to reflect the changes in node interfaces and behaviors. feat(normals): scale tangent normals with depth - Reused the existing `o_normal_reduction` attribute to adjust Tangent Normal strength based on the geometry's `Depth Scale`. - Ensured that Tangent Normal strength is consistent with the geometry depth, preserving full strength for materials that do not provide the attribute. - Updated tests to verify the correct behavior of normal strength adjustments in both Tangent and Object Space.
41 lines
1.6 KiB
Python
41 lines
1.6 KiB
Python
import numpy as np
|
|
import pytest
|
|
|
|
|
|
from tests.support.materials import image_layer
|
|
from tools.nodes.groups.image_depth_layer import build_image_depth_layer_group
|
|
|
|
|
|
@pytest.mark.parametrize("image_layer", ["definition", "asset"], indirect=True)
|
|
def test_alpha_curve_preserves_endpoints_and_suppresses_soft_edges(image_layer):
|
|
inputs = {
|
|
item.name: item for item in image_layer.interface.items_tree
|
|
if item.item_type == "SOCKET" and item.in_out == "INPUT"
|
|
}
|
|
assert list(inputs) == [
|
|
"Color", "Alpha", "Normal", "Bump Scale", "Alpha Fix",
|
|
"Normal Scale", "Object Space",
|
|
]
|
|
strength = inputs["Alpha Fix"]
|
|
output = next(node for node in image_layer.nodes if node.type == "GROUP_OUTPUT")
|
|
curve = output.inputs["Alpha"].links[0].from_node
|
|
assert curve.type == "CURVE_FLOAT"
|
|
assert curve.inputs["Value"].links[0].from_socket.name == "Alpha"
|
|
assert curve.inputs["Factor"].links[0].from_socket.name == "Alpha Fix"
|
|
mapping = curve.mapping
|
|
samples = np.array([
|
|
mapping.evaluate(mapping.curves[0], float(alpha))
|
|
for alpha in np.linspace(0, 1, 1001)
|
|
])
|
|
np.testing.assert_allclose(samples[:801], 0, atol=3e-4)
|
|
assert samples[-1] == pytest.approx(1)
|
|
|
|
|
|
def test_depth_layer_keeps_foreground_alpha_threshold(image_layer):
|
|
depth = build_image_depth_layer_group()
|
|
output = next(node for node in depth.nodes if node.type == "GROUP_OUTPUT")
|
|
threshold = output.inputs["Alpha"].links[0].from_node
|
|
assert threshold.operation == "GREATER_THAN"
|
|
assert threshold.inputs[1].default_value == 0.5
|
|
assert threshold.inputs[0].links[0].from_socket.name == "Alpha"
|