Add cutout shell and volume node assets for depth volume processing
- Implemented `cutout_shell.py` to build front normals and shell positions for balloon geometry. - Created `cutout_volume.py` to establish smooth center fields and manage balloon surface attributes. - Introduced `pisa_sr_export.py` for exporting PiSA-SR components with dependencies and asset finalization.
This commit is contained in:
@@ -1238,6 +1238,35 @@ class BaseShape:
|
||||
balloon: object
|
||||
|
||||
|
||||
def refine_balloon_triangles(points, faces, boundary):
|
||||
"""Add interior samples to boundary ears and interior boundary chords."""
|
||||
from collections import Counter
|
||||
import numpy as np
|
||||
|
||||
edges = Counter(tuple(sorted((face[i], face[(i + 1) % 3]))) for face in faces for i in range(3))
|
||||
values, midpoints = list(points), {}
|
||||
for edge, count in edges.items():
|
||||
if count == 2 and all(boundary[index] for index in edge):
|
||||
midpoints[edge] = len(values)
|
||||
values.append(points[list(edge)].mean(axis=0))
|
||||
refined = []
|
||||
for face in faces:
|
||||
ring = []
|
||||
for index, vertex in enumerate(face):
|
||||
ring.append(vertex)
|
||||
midpoint = midpoints.get(tuple(sorted((vertex, face[(index + 1) % 3]))))
|
||||
if midpoint is not None:
|
||||
ring.append(midpoint)
|
||||
if len(ring) == 3 and not all(boundary[vertex] for vertex in face):
|
||||
refined.append(tuple(face))
|
||||
continue
|
||||
center = len(values)
|
||||
values.append(points[list(face)].mean(axis=0))
|
||||
refined.extend((center, ring[i], ring[(i + 1) % len(ring)]) for i in range(len(ring)))
|
||||
points = np.asarray(values)
|
||||
return points, refined, boundary_vertices_from_faces(len(points), refined)
|
||||
|
||||
|
||||
def cutout_domain(
|
||||
selection_contours,
|
||||
bounds,
|
||||
@@ -1276,6 +1305,17 @@ def cutout_domain(
|
||||
(start, end, faces.tolist(), pixel_to_planar(contour))
|
||||
for start, end, faces, contour in pixel_components
|
||||
]
|
||||
refined_points, refined_faces, refined_components = [], [], []
|
||||
offset = 0
|
||||
for start, end, component_faces, contour in components:
|
||||
points, faces, _ = refine_balloon_triangles(planar[start:end], component_faces, boundary[start:end])
|
||||
refined_points.append(points)
|
||||
refined_faces.extend(tuple(offset + index for index in face) for face in faces)
|
||||
refined_components.append((offset, offset + len(points), faces, contour))
|
||||
offset += len(points)
|
||||
planar = np.concatenate(refined_points)
|
||||
planar_faces, components = refined_faces, refined_components
|
||||
boundary = boundary_vertices_from_faces(len(planar), planar_faces)
|
||||
profile = balloon_profile(
|
||||
balloon_algorithm, planar, planar_faces, boundary, components
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user