Add comprehensive tests for cutout and mesh functionalities

- Introduced `test_cutout.py` to validate cutout pie menu behavior, image lasso options, and mesh detail calculations.
- Added `test_mesh.py` to ensure correct tangent normal rasterization, plane source topology, and depth surface evaluations.
- Created `test_mesh_blender.py` to verify material node groups, tangent baking, and local cutout building from Blender images.
- Implemented tests for handling alpha regions and ensuring geometry nodes maintain expected behavior.
This commit is contained in:
2026-08-26 10:42:29 +08:00
parent 0cf04a13c6
commit 2b79a342b0
46 changed files with 5554 additions and 645 deletions

View File

@@ -25,7 +25,7 @@ class ModelSessionCache:
key = (str(Path(model_dir).resolve()), requested_device, "onnx")
if self.ben2_model is not None and self.ben2_key == key:
return self.ben2_model, 0.0
self.close()
self.release_ben2()
return self._load_ben2(model_dir, requested_device, key)
def _load_ben2(self, model_dir, requested_device, key):
@@ -43,7 +43,7 @@ class ModelSessionCache:
key = (str(Path(model_dir).resolve()), requested_device, "onnx")
if self.da3_model is not None and self.da3_key == key:
return self.da3_model
self.close()
self.release_geometry()
return self._load_da3(model_dir, requested_device, key)
def _load_da3(self, model_dir, requested_device, key):
@@ -60,7 +60,7 @@ class ModelSessionCache:
key = (str(Path(model_dir).resolve()), requested_device, "onnx")
if self.moge_model is not None and self.moge_key == key:
return self.moge_model
self.close()
self.release_geometry()
model = create_session(model_dir, requested_device)
self.moge_model = model
self.moge_key = key
@@ -72,7 +72,7 @@ class ModelSessionCache:
key = (str(Path(model_dir).resolve()), requested_device, "onnx")
if self.upscale_model is not None and self.upscale_key == key:
return self.upscale_model
self.close()
self.release_upscale()
model = create_session(model_dir, requested_device)
self.upscale_model = model
self.upscale_key = key
@@ -83,12 +83,9 @@ class ModelSessionCache:
self.ben2_key = None
self._release_runtime_cache()
def release_da3(self):
def release_geometry(self):
self.da3_model = None
self.da3_key = None
self._release_runtime_cache()
def release_moge(self):
self.moge_model = None
self.moge_key = None
self._release_runtime_cache()
@@ -110,15 +107,11 @@ class ModelSessionCache:
self._release_runtime_cache()
def snapshot(self):
geometry_key = self.da3_key or self.moge_key
return {
"ben2": Path(self.ben2_key[0]).name if self.ben2_key else "",
"da3": Path(self.da3_key[0]).name if self.da3_key else "",
"moge2": Path(self.moge_key[0]).name if self.moge_key else "",
"upscale": (
Path(self.upscale_key[0]).name
if self.upscale_key
else ""
),
"geometry": Path(geometry_key[0]).name if geometry_key else "",
"upscale": (Path(self.upscale_key[0]).name if self.upscale_key else ""),
}
def _release_runtime_cache(self):
@@ -176,6 +169,7 @@ class ModelManager:
total = len(missing)
for index, model_key in enumerate(missing):
def report(value, message, *, offset=index):
context.progress((offset + value) / total, message)