feat(cutout): implement boundary padding for cutout textures
- 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.
This commit is contained in:
@@ -62,7 +62,7 @@ def test_surface_caps_and_segmented_walls_are_connected(thickness, split):
|
||||
assert cKDTree(coords).query(front)[0].max() < 1e-5
|
||||
|
||||
|
||||
@pytest.mark.parametrize("size", [0.01, 1.0, 100.0])
|
||||
@pytest.mark.parametrize("size", [0.01, 100.0])
|
||||
def test_split_mapping_and_uniform_scale(size):
|
||||
obj, set_value = surface(step=2.0, size=size)
|
||||
# The normalized ray jump crosses the threshold only at full strength.
|
||||
@@ -99,7 +99,7 @@ def test_cleanup_keeps_split_parts_of_a_large_source_island():
|
||||
assert len(evaluated(obj)[1]) == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize("depth_scale", [0.0, 0.25, 1.0, 2.0, 4.0])
|
||||
@pytest.mark.parametrize("depth_scale", [0.0, 2.0])
|
||||
def test_split_topology_uses_depth_before_display_scaling(depth_scale):
|
||||
obj, set_value = surface(step=4.0)
|
||||
set_value("Depth Split", 0.5)
|
||||
@@ -111,11 +111,10 @@ def test_split_topology_uses_depth_before_display_scaling(depth_scale):
|
||||
np.testing.assert_allclose(coords[:, 2], original[:, 2] * depth_scale, atol=1e-6)
|
||||
|
||||
|
||||
def test_full_wrapper_smooth_keeps_closed_shell():
|
||||
def test_full_wrapper_keeps_closed_shell():
|
||||
obj, set_value = surface(wrapper=True)
|
||||
set_value("Depth Split", 0.5)
|
||||
set_value("Thickness", 0.2)
|
||||
set_value("Smooth", 2)
|
||||
coords, faces = evaluated(obj)
|
||||
assert np.isfinite(coords).all()
|
||||
assert_closed(faces)
|
||||
@@ -169,7 +168,7 @@ def test_shell_source_indices_cross_identity_grid_rows():
|
||||
assert_closed(faces)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("resolution", [1, 2, 4])
|
||||
@pytest.mark.parametrize("resolution", [1, 4])
|
||||
def test_planar_depth_preserves_blocks_and_cleans_single_face_width(resolution):
|
||||
obj, set_value = surface(step=0.0, resolution=resolution)
|
||||
original, original_faces = evaluated(obj)
|
||||
@@ -232,7 +231,6 @@ def test_temporary_fields_are_removed_and_user_attributes_survive(thickness, spl
|
||||
value.value = 0.75
|
||||
set_value("Depth Split", split)
|
||||
set_value("Thickness", thickness)
|
||||
set_value("Smooth", 2)
|
||||
result = obj.evaluated_get(bpy.context.evaluated_depsgraph_get())
|
||||
mesh = result.to_mesh()
|
||||
try:
|
||||
@@ -294,7 +292,7 @@ def test_triangle_corner_weights_do_not_open_sloped_side_walls():
|
||||
assert component_count(faces) == 2
|
||||
|
||||
|
||||
@pytest.mark.parametrize("resolution", [1, 2, 4])
|
||||
@pytest.mark.parametrize("resolution", [1, 4])
|
||||
def test_relative_distance_slope_has_density_independent_selection(resolution):
|
||||
obj, set_value = surface(step=0.0, resolution=resolution)
|
||||
output_split_mesh(obj)
|
||||
|
||||
Reference in New Issue
Block a user