aboutsummaryrefslogtreecommitdiffstats
path: root/generat3d
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-28 10:35:56 +0100
committerDanilo M. <danix@danix.xyz>2026-10-28 10:35:56 +0100
commit6304f9b074452af3648266fe23c773f8fb478270 (patch)
tree58435e1bb68f2708aa1421fc41c2cccb692100fe /generat3d
parent1b811693373c20e48160cf2eca5e723727ec6ca5 (diff)
downloadgenerat3D-6304f9b074452af3648266fe23c773f8fb478270.tar.gz
generat3D-6304f9b074452af3648266fe23c773f8fb478270.zip
Evaluate scenes into morphed vertices and rest data
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Diffstat (limited to 'generat3d')
-rw-r--r--generat3d/evaluate.py33
1 files changed, 33 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