Enhance image editing tests and functionality
- Added parameterized tests for image edit replacement to ensure alpha mode preservation. - Refactored existing tests to utilize new image editing methods and improve clarity. - Introduced new tests for image target functionality, ensuring proper handling of shared textures and context. - Updated various tests to validate alpha mode handling across different scenarios. - Improved undo/redo functionality in image operators to maintain state consistency. - Added support for texture node actions, enhancing integration with Blender's node system. - Ensured that image properties are preserved during operations and that invalid contexts are handled gracefully.
This commit is contained in:
@@ -78,12 +78,17 @@ class BlenderTestCase(unittest.TestCase):
|
||||
prepend=lambda draw: cls.outliner_menu_draws.insert(0, draw),
|
||||
remove=lambda draw: cls.outliner_menu_draws.remove(draw),
|
||||
),
|
||||
NODE_MT_context_menu=SimpleNamespace(
|
||||
prepend=lambda draw: cls.node_menu_draws.insert(0, draw),
|
||||
remove=lambda draw: cls.node_menu_draws.remove(draw),
|
||||
),
|
||||
)
|
||||
cls.registered = []
|
||||
cls.registered_tools = []
|
||||
cls.status_bar_draws = []
|
||||
cls.context_menu_draws = []
|
||||
cls.outliner_menu_draws = []
|
||||
cls.node_menu_draws = []
|
||||
fake_bpy.utils = SimpleNamespace(
|
||||
register_class=cls.registered.append,
|
||||
unregister_class=cls.registered.remove,
|
||||
@@ -177,6 +182,7 @@ class BlenderTestCase(unittest.TestCase):
|
||||
self.status_bar_draws.clear()
|
||||
self.context_menu_draws.clear()
|
||||
self.outliner_menu_draws.clear()
|
||||
self.node_menu_draws.clear()
|
||||
self.fake_bpy.data = SimpleNamespace(
|
||||
objects=SimpleNamespace(get=lambda _name: None),
|
||||
)
|
||||
|
||||
45
tests/support/image_texture.py
Normal file
45
tests/support/image_texture.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from types import SimpleNamespace
|
||||
|
||||
import bpy
|
||||
import numpy as np
|
||||
import pytest
|
||||
from PIL import Image
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def texture():
|
||||
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||
material = bpy.data.materials.new("Texture material")
|
||||
material.use_nodes = True
|
||||
material.use_fake_user = True
|
||||
tree = material.node_tree
|
||||
node = tree.nodes.new("ShaderNodeTexImage")
|
||||
node.name = "Source texture"
|
||||
node.image = bpy.data.images.new("Texture.png", width=4, height=3, alpha=True)
|
||||
node.image.pixels.foreach_set(np.tile([0.2, 0.4, 0.6, 0.75], 12).astype(np.float32))
|
||||
node.image.pack()
|
||||
node.location = (-400, 100)
|
||||
node.interpolation = "Closest"
|
||||
node.extension = "CLIP"
|
||||
node.projection = "BOX"
|
||||
tree.nodes.active = node
|
||||
tree.links.new(node.outputs["Color"], tree.nodes.get("Principled BSDF").inputs["Base Color"])
|
||||
yield node
|
||||
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||
|
||||
|
||||
def texture_context(node, **space_options):
|
||||
return SimpleNamespace(
|
||||
space_data=SimpleNamespace(
|
||||
**dict(type="NODE_EDITOR", tree_type="ShaderNodeTree", shader_type="OBJECT",
|
||||
edit_tree=node.id_data, id=bpy.data.materials["Texture material"], **space_options),
|
||||
),
|
||||
object=None,
|
||||
scene=SimpleNamespace(anyimage_settings=SimpleNamespace(video_frames=16)),
|
||||
)
|
||||
|
||||
|
||||
def write_result(directory, prefix="image.", count=1):
|
||||
for index in range(1, count + 1):
|
||||
Image.new("RGBA", (8, 6), (128, 64, 32, 80)).save(directory / f"{prefix}{index:04d}.png")
|
||||
|
||||
Reference in New Issue
Block a user