diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-28 10:35:56 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-28 10:35:56 +0100 |
| commit | 6304f9b074452af3648266fe23c773f8fb478270 (patch) | |
| tree | 58435e1bb68f2708aa1421fc41c2cccb692100fe | |
| parent | 1b811693373c20e48160cf2eca5e723727ec6ca5 (diff) | |
| download | generat3D-6304f9b074452af3648266fe23c773f8fb478270.tar.gz generat3D-6304f9b074452af3648266fe23c773f8fb478270.zip | |
Evaluate scenes into morphed vertices and rest data
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
| -rw-r--r-- | generat3d/evaluate.py | 33 | ||||
| -rw-r--r-- | tests/test_evaluate.py | 39 |
2 files changed, 72 insertions, 0 deletions
diff --git a/generat3d/evaluate.py b/generat3d/evaluate.py new file mode 100644 index 0000000..c1a9f1b --- /dev/null +++ b/generat3d/evaluate.py @@ -0,0 +1,33 @@ +# generat3D - evaluate Daz DSON scenes and write .dbz files +# Copyright (C) 2026 Danilo M. <danix@danix.xyz> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .scene import AXES, REST_CHANNELS, key + + +def evaluate(scene): + """Morphed rest vertices and per-node rest channels {node id: {channel: [x, y, z]}}.""" + values = scene.graph.evaluate() + fig = scene.figure + verts = fig.verts.copy() + for k, (idx, deltas) in fig.morphs.items(): + w = values.get(k, 0.0) + if w: + verts[idx] += w * deltas # indices are unique within one morph + rest = {n.id: {ch: [values[key(n.id, n.id, f"{ch}/{a}")] for a in AXES] + for ch in REST_CHANNELS} + for n in fig.nodes} + return verts, rest diff --git a/tests/test_evaluate.py b/tests/test_evaluate.py new file mode 100644 index 0000000..6668b0e --- /dev/null +++ b/tests/test_evaluate.py @@ -0,0 +1,39 @@ +# generat3D - evaluate Daz DSON scenes and write .dbz files +# Copyright (C) 2026 Danilo M. <danix@danix.xyz> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import contextlib +import io +import unittest +from pathlib import Path + +from generat3d.evaluate import evaluate +from generat3d.library import Library +from generat3d.scene import load + +DATA = Path(__file__).parent / "data" + + +class EvaluateTest(unittest.TestCase): + def test_synthetic_scene(self): + with contextlib.redirect_stderr(io.StringIO()): + scene = load(DATA / "scene.duf", Library([DATA / "lib"])) + verts, rest = evaluate(scene) + self.assertEqual(verts.tolist(), [[-0.5, 0, 0], [1.5, 2, 0], [0, 1, 0]]) + self.assertEqual(rest["hip"]["center_point"], [0, 7, 0]) + self.assertEqual(rest["hip"]["end_point"], [0, 8, 0]) + self.assertEqual(rest["Fig"]["end_point"], [0, 10, 0]) + self.assertEqual(scene.figure.verts.tolist()[0], [0, 0, 0]) # base untouched |
