diff options
Diffstat (limited to 'generat3d')
| -rw-r--r-- | generat3d/evaluate.py | 11 | ||||
| -rw-r--r-- | generat3d/scene.py | 11 |
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 |
