Add new functionality for image rectification and depth metadata handling

- Implemented a preview tool for rectifying images with interactive aspect controls in `preview.py`.
- Added tests for depth metadata loading to ensure consistent schema usage in `test_depth_metadata.py`.
- Developed comprehensive tests for cutout calibration processes in `test_cutout_calibration.py`, including stability checks and depth calibration.
- Created tests for frame compositing operations in `test_frame_compositing.py`, ensuring correct handling of depth and transparency.
- Introduced material slot inheritance functionality in `material_slots.py` to manage geometry material assignments.
- Built shared shader nodes for material processing in `shader.py`, including roughness and bump mapping setups.
This commit is contained in:
2026-09-12 19:20:06 +08:00
parent e8268504c2
commit 938d95db0f
175 changed files with 3812 additions and 6864 deletions

View File

@@ -7,7 +7,8 @@ from mathutils import Matrix
from anyimage.common import image as image_data
from anyimage.common.selection import SelectionMask
from anyimage.operators import mask_tool as edit_mask
from anyimage.operators import frame_tool as edit_frame
from anyimage.operators.frame_tool import operators as edit_frame
from anyimage.operators.frame_tool.compositing import composite_frame_pixels
def test_image_edit_result_uses_complete_shared_source_name():
@@ -58,7 +59,7 @@ def test_image_edit_result_recovers_unshared_source_name():
assert bpy.data.images.get("Poster.png") == result_image
def test_mask_frame_mask_add_preserves_packed_hidden_rgb():
def test_mask_frame_mask_extend_preserves_packed_hidden_rgb():
from io import BytesIO
from PIL import Image
@@ -87,7 +88,7 @@ def test_mask_frame_mask_add_preserves_packed_hidden_rgb():
)
np.testing.assert_allclose(descriptor["rgba"][..., :3], expected[..., :3])
np.testing.assert_array_equal(descriptor["pixels"], 0)
framed = edit_frame.composite_frame_pixels(
framed = composite_frame_pixels(
(descriptor,), ((0, 4), (4, 4), (4, 0), (0, 0)), (4, 4)
)
result = image_data.create_image_edit_result(source.data, framed, (4, 4))
@@ -100,7 +101,7 @@ def test_mask_frame_mask_add_preserves_packed_hidden_rgb():
np.testing.assert_array_equal(packed[..., 3], 0)
result.reload()
assert result.alpha_mode == "STRAIGHT"
operator.mode = "ADD"
operator.mode = "EXTEND"
assert edit_mask.EditImageAlpha._apply_mask(
operator, SimpleNamespace(), source, selection
) == {"FINISHED"}
@@ -140,7 +141,7 @@ def test_frame_restored_alpha_keeps_foreground_blended_into_white():
source_alpha = front["rgba"][..., 3:4]
expected = front["rgba"][..., :3] * source_alpha + 1 - source_alpha
# The image aspect makes its orthographic screen projection two thirds of a pixel high.
pixels = edit_frame.composite_frame_pixels(
pixels = composite_frame_pixels(
sources, ((0, 4 / 3), (6, 4 / 3), (6, 2 / 3), (0, 2 / 3)), (6, 2)
)
result = image_data.create_image_edit_result(front["object"].data, pixels, (6, 2))
@@ -149,7 +150,7 @@ def test_frame_restored_alpha_keeps_foreground_blended_into_white():
np.testing.assert_allclose(encoded[..., :3], expected, atol=1 / 255)
np.testing.assert_allclose(encoded[..., 3:4], source_alpha, atol=1 / 255)
selection = SelectionMask(np.ones((2, 6), dtype=np.float32), (0, 0, 6, 2))
operator = SimpleNamespace(mode="ADD", report=lambda *_args: None)
operator = SimpleNamespace(mode="EXTEND", report=lambda *_args: None)
assert edit_mask.EditImageAlpha._apply_mask(
operator, SimpleNamespace(), front["object"], selection
) == {"FINISHED"}