From cc112d53422709da61c6752ed43cda454f4ff39d Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 8 Aug 2023 18:53:17 +0200 Subject: [PATCH 1/4] Fix issue #2056 . Check for NaN uniforms --- .../main/java/com/jme3/light/PointLight.java | 5 ++ .../com/jme3/renderer/opengl/GLRenderer.java | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/light/PointLight.java b/jme3-core/src/main/java/com/jme3/light/PointLight.java index 959147c9a0..75b6e919b4 100644 --- a/jme3-core/src/main/java/com/jme3/light/PointLight.java +++ b/jme3-core/src/main/java/com/jme3/light/PointLight.java @@ -165,6 +165,11 @@ public final void setRadius(float radius) { if (radius < 0) { throw new IllegalArgumentException("Light radius cannot be negative"); } + + if (radius == Float.POSITIVE_INFINITY) { + radius = Float.MAX_VALUE; + } + this.radius = radius; if (radius != 0f) { this.invRadius = 1f / radius; diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 82bcca3a4f..eff2f0b422 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1247,6 +1247,41 @@ protected void updateUniformLocation(Shader shader, Uniform uniform) { } } + private boolean isValidNumber(float v) { + return !Float.isNaN(v); + } + + + + private boolean isValidNumber(FloatBuffer fb) { + for(int i = 0; i < fb.limit(); i++) { + if (!isValidNumber(fb.get(i))) return false; + } + return true; + } + + private boolean isValidNumber(Vector2f v) { + return isValidNumber(v.x) && isValidNumber(v.y); + } + + private boolean isValidNumber(Vector3f v) { + return isValidNumber(v.x) && isValidNumber(v.y) && isValidNumber(v.z); + } + + private boolean isValidNumber(Quaternion q) { + return isValidNumber(q.getX()) && isValidNumber(q.getY()) && isValidNumber(q.getZ()) && isValidNumber(q.getW()); + } + + private boolean isValidNumber(ColorRGBA c) { + return isValidNumber(c.r) && isValidNumber(c.g) && isValidNumber(c.b) && isValidNumber(c.a); + } + + private boolean isValidNumber(Vector4f c) { + return isValidNumber(c.x) && isValidNumber(c.y) && isValidNumber(c.z) && isValidNumber(c.w); + } + + + protected void updateUniform(Shader shader, Uniform uniform) { int shaderId = shader.getId(); @@ -1282,26 +1317,32 @@ protected void updateUniform(Shader shader, Uniform uniform) { switch (uniform.getVarType()) { case Float: Float f = (Float) uniform.getValue(); + assert isValidNumber(f) : "Invalid float value"; gl.glUniform1f(loc, f.floatValue()); break; case Vector2: Vector2f v2 = (Vector2f) uniform.getValue(); + assert isValidNumber(v2) : "Invalid Vector2f value"; gl.glUniform2f(loc, v2.getX(), v2.getY()); break; case Vector3: Vector3f v3 = (Vector3f) uniform.getValue(); + assert isValidNumber(v3) : "Invalid Vector3f value" ; gl.glUniform3f(loc, v3.getX(), v3.getY(), v3.getZ()); break; case Vector4: Object val = uniform.getValue(); if (val instanceof ColorRGBA) { ColorRGBA c = (ColorRGBA) val; + assert isValidNumber(c) : "Invalid ColorRGBA value"; gl.glUniform4f(loc, c.r, c.g, c.b, c.a); } else if (val instanceof Vector4f) { Vector4f c = (Vector4f) val; + assert isValidNumber(c) : "Invalid Vector4f value"; gl.glUniform4f(loc, c.x, c.y, c.z, c.w); } else { Quaternion c = (Quaternion) uniform.getValue(); + assert isValidNumber(c) : "Invalid Quaternion value"; gl.glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW()); } break; @@ -1311,11 +1352,13 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case Matrix3: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Matrix3f value"; assert fb.remaining() == 9; gl.glUniformMatrix3(loc, false, fb); break; case Matrix4: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Matrix4f value"; assert fb.remaining() == 16; gl.glUniformMatrix4(loc, false, fb); break; @@ -1325,22 +1368,27 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case FloatArray: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid float array value"; gl.glUniform1(loc, fb); break; case Vector2Array: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Vector2f array value"; gl.glUniform2(loc, fb); break; case Vector3Array: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Vector3f array value"; gl.glUniform3(loc, fb); break; case Vector4Array: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Vector4f array value" ; gl.glUniform4(loc, fb); break; case Matrix4Array: fb = uniform.getMultiData(); + assert isValidNumber(fb) : "Invalid Matrix4f array value"; gl.glUniformMatrix4(loc, false, fb); break; case Int: From 80e53b3c8fba5d52cfeb3266939442adc590ac9c Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 8 Aug 2023 20:50:06 +0200 Subject: [PATCH 2/4] Print invalid values --- .../com/jme3/renderer/opengl/GLRenderer.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index eff2f0b422..3aa57cad61 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1317,32 +1317,32 @@ protected void updateUniform(Shader shader, Uniform uniform) { switch (uniform.getVarType()) { case Float: Float f = (Float) uniform.getValue(); - assert isValidNumber(f) : "Invalid float value"; + assert isValidNumber(f) : "Invalid float value "+f; gl.glUniform1f(loc, f.floatValue()); break; case Vector2: Vector2f v2 = (Vector2f) uniform.getValue(); - assert isValidNumber(v2) : "Invalid Vector2f value"; + assert isValidNumber(v2) : "Invalid Vector2f value "+v2; gl.glUniform2f(loc, v2.getX(), v2.getY()); break; case Vector3: Vector3f v3 = (Vector3f) uniform.getValue(); - assert isValidNumber(v3) : "Invalid Vector3f value" ; + assert isValidNumber(v3) : "Invalid Vector3f value "+v3 ; gl.glUniform3f(loc, v3.getX(), v3.getY(), v3.getZ()); break; case Vector4: Object val = uniform.getValue(); if (val instanceof ColorRGBA) { ColorRGBA c = (ColorRGBA) val; - assert isValidNumber(c) : "Invalid ColorRGBA value"; + assert isValidNumber(c) : "Invalid ColorRGBA value "+c; gl.glUniform4f(loc, c.r, c.g, c.b, c.a); } else if (val instanceof Vector4f) { Vector4f c = (Vector4f) val; - assert isValidNumber(c) : "Invalid Vector4f value"; + assert isValidNumber(c) : "Invalid Vector4f value "+c; gl.glUniform4f(loc, c.x, c.y, c.z, c.w); } else { Quaternion c = (Quaternion) uniform.getValue(); - assert isValidNumber(c) : "Invalid Quaternion value"; + assert isValidNumber(c) : "Invalid Quaternion value "+c; gl.glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW()); } break; @@ -1352,13 +1352,13 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case Matrix3: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix3f value"; + assert isValidNumber(fb) : "Invalid Matrix3f value "+uniform.getValue(); assert fb.remaining() == 9; gl.glUniformMatrix3(loc, false, fb); break; case Matrix4: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix4f value"; + assert isValidNumber(fb) : "Invalid Matrix4f value "+uniform.getValue(); assert fb.remaining() == 16; gl.glUniformMatrix4(loc, false, fb); break; @@ -1368,27 +1368,27 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case FloatArray: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid float array value"; + assert isValidNumber(fb) : "Invalid float array value "+Arrays.asList((float[])uniform.getValue()); gl.glUniform1(loc, fb); break; case Vector2Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector2f array value"; + assert isValidNumber(fb) : "Invalid Vector2f array value "+Arrays.deepToString((Vector2f[])uniform.getValue()); gl.glUniform2(loc, fb); break; case Vector3Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector3f array value"; + assert isValidNumber(fb) : "Invalid Vector3f array value "+Arrays.deepToString((Vector3f[])uniform.getValue()); gl.glUniform3(loc, fb); break; case Vector4Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector4f array value" ; + assert isValidNumber(fb) : "Invalid Vector4f array value "+Arrays.deepToString((Vector4f[])uniform.getValue()); ; gl.glUniform4(loc, fb); break; case Matrix4Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix4f array value"; + assert isValidNumber(fb) : "Invalid Matrix4f array value "+Arrays.deepToString((Matrix4f[])uniform.getValue()); ; gl.glUniformMatrix4(loc, false, fb); break; case Int: From 278614b406d7b64a2dfc16d33e6b77bae7e2b8ba Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Fri, 18 Aug 2023 11:40:21 +0200 Subject: [PATCH 3/4] fix formatting --- .../com/jme3/renderer/opengl/GLRenderer.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 3aa57cad61..7ad6e22375 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1317,32 +1317,32 @@ protected void updateUniform(Shader shader, Uniform uniform) { switch (uniform.getVarType()) { case Float: Float f = (Float) uniform.getValue(); - assert isValidNumber(f) : "Invalid float value "+f; + assert isValidNumber(f) : "Invalid float value " + f; gl.glUniform1f(loc, f.floatValue()); break; case Vector2: Vector2f v2 = (Vector2f) uniform.getValue(); - assert isValidNumber(v2) : "Invalid Vector2f value "+v2; + assert isValidNumber(v2) : "Invalid Vector2f value " + v2; gl.glUniform2f(loc, v2.getX(), v2.getY()); break; case Vector3: Vector3f v3 = (Vector3f) uniform.getValue(); - assert isValidNumber(v3) : "Invalid Vector3f value "+v3 ; + assert isValidNumber(v3) : "Invalid Vector3f value " + v3; gl.glUniform3f(loc, v3.getX(), v3.getY(), v3.getZ()); break; case Vector4: Object val = uniform.getValue(); if (val instanceof ColorRGBA) { ColorRGBA c = (ColorRGBA) val; - assert isValidNumber(c) : "Invalid ColorRGBA value "+c; + assert isValidNumber(c) : "Invalid ColorRGBA value " + c; gl.glUniform4f(loc, c.r, c.g, c.b, c.a); } else if (val instanceof Vector4f) { Vector4f c = (Vector4f) val; - assert isValidNumber(c) : "Invalid Vector4f value "+c; + assert isValidNumber(c) : "Invalid Vector4f value " + c; gl.glUniform4f(loc, c.x, c.y, c.z, c.w); } else { Quaternion c = (Quaternion) uniform.getValue(); - assert isValidNumber(c) : "Invalid Quaternion value "+c; + assert isValidNumber(c) : "Invalid Quaternion value " + c; gl.glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW()); } break; @@ -1352,13 +1352,13 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case Matrix3: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix3f value "+uniform.getValue(); + assert isValidNumber(fb) : "Invalid Matrix3f value " + uniform.getValue(); assert fb.remaining() == 9; gl.glUniformMatrix3(loc, false, fb); break; case Matrix4: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix4f value "+uniform.getValue(); + assert isValidNumber(fb) : "Invalid Matrix4f value " + uniform.getValue(); assert fb.remaining() == 16; gl.glUniformMatrix4(loc, false, fb); break; @@ -1368,27 +1368,27 @@ protected void updateUniform(Shader shader, Uniform uniform) { break; case FloatArray: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid float array value "+Arrays.asList((float[])uniform.getValue()); + assert isValidNumber(fb) : "Invalid float array value " + Arrays.asList((float[]) uniform.getValue()); gl.glUniform1(loc, fb); break; case Vector2Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector2f array value "+Arrays.deepToString((Vector2f[])uniform.getValue()); + assert isValidNumber(fb) : "Invalid Vector2f array value " + Arrays.deepToString((Vector2f[]) uniform.getValue()); gl.glUniform2(loc, fb); break; case Vector3Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector3f array value "+Arrays.deepToString((Vector3f[])uniform.getValue()); + assert isValidNumber(fb) : "Invalid Vector3f array value " + Arrays.deepToString((Vector3f[]) uniform.getValue()); gl.glUniform3(loc, fb); break; case Vector4Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Vector4f array value "+Arrays.deepToString((Vector4f[])uniform.getValue()); ; + assert isValidNumber(fb) : "Invalid Vector4f array value " + Arrays.deepToString((Vector4f[]) uniform.getValue()); gl.glUniform4(loc, fb); break; case Matrix4Array: fb = uniform.getMultiData(); - assert isValidNumber(fb) : "Invalid Matrix4f array value "+Arrays.deepToString((Matrix4f[])uniform.getValue()); ; + assert isValidNumber(fb) : "Invalid Matrix4f array value " + Arrays.deepToString((Matrix4f[]) uniform.getValue()); gl.glUniformMatrix4(loc, false, fb); break; case Int: From 5242306525aa159eb83927a06326c9f44db7d052 Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Sat, 19 Aug 2023 11:01:34 +0200 Subject: [PATCH 4/4] fix formatting --- .../src/main/java/com/jme3/renderer/opengl/GLRenderer.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 7ad6e22375..dfe62113f8 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1251,8 +1251,6 @@ private boolean isValidNumber(float v) { return !Float.isNaN(v); } - - private boolean isValidNumber(FloatBuffer fb) { for(int i = 0; i < fb.limit(); i++) { if (!isValidNumber(fb.get(i))) return false; @@ -1280,8 +1278,6 @@ private boolean isValidNumber(Vector4f c) { return isValidNumber(c.x) && isValidNumber(c.y) && isValidNumber(c.z) && isValidNumber(c.w); } - - protected void updateUniform(Shader shader, Uniform uniform) { int shaderId = shader.getId();