aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generat3d/scene.py3
-rw-r--r--tests/test_scene.py7
2 files changed, 9 insertions, 1 deletions
diff --git a/generat3d/scene.py b/generat3d/scene.py
index 5c35022..1917f28 100644
--- a/generat3d/scene.py
+++ b/generat3d/scene.py
@@ -162,6 +162,7 @@ class _Loader:
self.graph.add_prop(key(n["id"], n["id"], f"{ch}/{a}"), v)
for f in n.get("formulas", []):
self.pending.append((f, fpath))
+ self.owners = {asset["id"], geom.get("id")} - {None}
verts = np.array(geom["vertices"]["values"], dtype=float)
if verts.ndim != 2 or verts.shape[1] != 3 or not np.isfinite(verts).all():
raise Error(f"{fpath}: bad vertices")
@@ -195,7 +196,7 @@ class _Loader:
nverts = len(self.figure.verts)
for mod in doc.get("modifier_library", []):
parent = parse_url(mod.get("parent", ""))[2]
- if parent and parent != self.figure.id:
+ if parent and parent not in self.owners: # figure node or its geometry
continue
ch = mod.get("channel", {})
if ch.get("type", "float") not in ("float", "int"):
diff --git a/tests/test_scene.py b/tests/test_scene.py
index 812ea60..c9fbcf4 100644
--- a/tests/test_scene.py
+++ b/tests/test_scene.py
@@ -189,6 +189,13 @@ class SceneTest(unittest.TestCase):
scene, _ = load_quiet(DATA / "scene.duf", [root])
self.assertNotIn("Fig:Tools?value", scene.graph.props)
+ def test_morph_parented_to_geometry(self):
+ m = self.mod("Geo", {"vertex_count": 3, "deltas": {"values": [[2, 0, 0, 1]]}})
+ m["parent"] = "/data/Test/Fig/Fig.dsf#Fig-geom"
+ root = self.root(self.MORPHS + "Geo.dsf", self.morph_doc(m))
+ scene, _ = load_quiet(DATA / "scene.duf", [root])
+ self.assertIn("Fig:Geo?value", scene.figure.morphs)
+
def test_other_geometry_warning_once(self):
other = {"vertex_count": 99, "deltas": {"values": [[0, 1, 0, 0]]}}
root = self.root(self.MORPHS + "Other.dsf", self.morph_doc(