feat: Add new Geometry Nodes groups for image relief and shadeless shader

- Implemented the "O Image Relief Plane" Geometry Nodes group to create a fixed-base image relief using depth images and various parameters.
- Created the "O Shadeless" shader node group to display color without scene lighting while preserving shadows and reflections.
- Introduced a preview feature for node groups, allowing for interactive visualization of node arrangements in an HTML format.
- Added a template HTML file for rendering node previews with customizable views and controls.
This commit is contained in:
2026-09-09 21:24:57 +08:00
parent f5aff50b13
commit 89087fc2e2
118 changed files with 5635 additions and 3130 deletions

View File

@@ -67,8 +67,12 @@ def create_depth_plane_object(
material,
depth_image,
depth_metadata,
plane_type,
):
node_group = load_node_group("O Image Depth Plane")
node_group = load_node_group({
"DEPTH": "O Image Depth Plane",
"RELIEF": "O Image Relief Plane",
}[plane_type])
source_name = source_object.name
bounds = image_empty_bounds(source_object)
mesh = create_image_plane_mesh(source_name, bounds)
@@ -80,7 +84,7 @@ def create_depth_plane_object(
plane = bpy.data.objects.new(source_name, mesh)
context.collection.objects.link(plane)
plane.matrix_world = build_image_plane_matrix(source_object.matrix_world, bounds)
plane["anyimage_mesh_shape"] = "DEPTH_PLANE"
plane["anyimage_mesh_shape"] = f"{plane_type}_PLANE"
modifier = plane.modifiers.new(name=node_group.name, type="NODES")
modifier.node_group = node_group
@@ -108,6 +112,7 @@ def create_depth_plane_object(
def create_depth_plane_from_result(context, result, operator):
normal_space = {"DEPTH": "OBJECT", "RELIEF": "TANGENT"}[operator.plane_type]
source_object = require_image_empty(operator.source_object_name)
color_image = load_color_result_image(source_object, result.directory)
color_image.name = color_data_name(source_object)
@@ -122,16 +127,14 @@ def create_depth_plane_from_result(context, result, operator):
depth_metadata,
)
normal_image = load_normal_result_image(
result.file("tangent_normal"),
result.file(f"{normal_space.lower()}_normal"),
source_object,
)
material = create_image_material(
source_object,
source_object.data,
color_image,
0.0,
normal_image=normal_image,
normal_space="TANGENT",
ior=1.2,
normal_space=normal_space,
scene=context.scene,
)
create_depth_plane_object(
@@ -141,6 +144,7 @@ def create_depth_plane_from_result(context, result, operator):
material,
depth_image,
depth_metadata,
operator.plane_type,
)
except Exception:
if material is not None and material.users == 0:
@@ -149,6 +153,6 @@ def create_depth_plane_from_result(context, result, operator):
if image is not None and image.users == 0:
bpy.data.images.remove(image, do_unlink=True)
raise
label = "Convert to Depth Plane"
label = f"Convert to {operator.plane_type.title()} Plane"
if "FINISHED" not in bpy.ops.ed.undo_push(message=label):
raise RuntimeError(f"Unable to create the {label} Undo step")