aboutsummaryrefslogtreecommitdiffstats
path: root/generat3d
diff options
context:
space:
mode:
Diffstat (limited to 'generat3d')
-rw-r--r--generat3d/evaluate.py11
-rw-r--r--generat3d/scene.py11
2 files changed, 17 insertions, 5 deletions
diff --git a/generat3d/evaluate.py b/generat3d/evaluate.py
index c1a9f1b..173a78f 100644
--- a/generat3d/evaluate.py
+++ b/generat3d/evaluate.py
@@ -15,6 +15,11 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import math
+
+import numpy as np
+
+from . import Error
from .scene import AXES, REST_CHANNELS, key
@@ -26,8 +31,12 @@ def evaluate(scene):
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
+ with np.errstate(all="ignore"):
+ 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}
+ if (not np.isfinite(verts).all()
+ or not all(math.isfinite(v) for r in rest.values() for c in r.values() for v in c)):
+ raise Error("evaluation produced non-finite values")
return verts, rest
diff --git a/generat3d/scene.py b/generat3d/scene.py
index cccfcff..722057f 100644
--- a/generat3d/scene.py
+++ b/generat3d/scene.py
@@ -63,8 +63,11 @@ class Scene:
def _finite(v):
- return (not isinstance(v, bool) and isinstance(v, (int, float))
- and math.isfinite(v))
+ try:
+ return (not isinstance(v, bool) and isinstance(v, (int, float))
+ and math.isfinite(v))
+ except OverflowError: # huge int
+ return False
def _channel(node, name):
@@ -86,8 +89,8 @@ def _lookup(library, doc, url, section):
def _number(url, v):
- if isinstance(v, bool) or not isinstance(v, (int, float)):
- raise Error(f"{url}: dial value is not a number")
+ if not _finite(v):
+ raise Error(f"{url}: dial value is not a finite number")
return v