Skip to content

Commit 7dfffb5

Browse files
authored
Fix issue #2056 . Check for NaN uniforms (#2058)
1 parent f33d4a8 commit 7dfffb5

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

jme3-core/src/main/java/com/jme3/light/PointLight.java

+5
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ public final void setRadius(float radius) {
165165
if (radius < 0) {
166166
throw new IllegalArgumentException("Light radius cannot be negative");
167167
}
168+
169+
if (radius == Float.POSITIVE_INFINITY) {
170+
radius = Float.MAX_VALUE;
171+
}
172+
168173
this.radius = radius;
169174
if (radius != 0f) {
170175
this.invRadius = 1f / radius;

jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java

+44
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,37 @@ protected void updateUniformLocation(Shader shader, Uniform uniform) {
12471247
}
12481248
}
12491249

1250+
private boolean isValidNumber(float v) {
1251+
return !Float.isNaN(v);
1252+
}
1253+
1254+
private boolean isValidNumber(FloatBuffer fb) {
1255+
for(int i = 0; i < fb.limit(); i++) {
1256+
if (!isValidNumber(fb.get(i))) return false;
1257+
}
1258+
return true;
1259+
}
1260+
1261+
private boolean isValidNumber(Vector2f v) {
1262+
return isValidNumber(v.x) && isValidNumber(v.y);
1263+
}
1264+
1265+
private boolean isValidNumber(Vector3f v) {
1266+
return isValidNumber(v.x) && isValidNumber(v.y) && isValidNumber(v.z);
1267+
}
1268+
1269+
private boolean isValidNumber(Quaternion q) {
1270+
return isValidNumber(q.getX()) && isValidNumber(q.getY()) && isValidNumber(q.getZ()) && isValidNumber(q.getW());
1271+
}
1272+
1273+
private boolean isValidNumber(ColorRGBA c) {
1274+
return isValidNumber(c.r) && isValidNumber(c.g) && isValidNumber(c.b) && isValidNumber(c.a);
1275+
}
1276+
1277+
private boolean isValidNumber(Vector4f c) {
1278+
return isValidNumber(c.x) && isValidNumber(c.y) && isValidNumber(c.z) && isValidNumber(c.w);
1279+
}
1280+
12501281
protected void updateUniform(Shader shader, Uniform uniform) {
12511282
int shaderId = shader.getId();
12521283

@@ -1282,26 +1313,32 @@ protected void updateUniform(Shader shader, Uniform uniform) {
12821313
switch (uniform.getVarType()) {
12831314
case Float:
12841315
Float f = (Float) uniform.getValue();
1316+
assert isValidNumber(f) : "Invalid float value " + f;
12851317
gl.glUniform1f(loc, f.floatValue());
12861318
break;
12871319
case Vector2:
12881320
Vector2f v2 = (Vector2f) uniform.getValue();
1321+
assert isValidNumber(v2) : "Invalid Vector2f value " + v2;
12891322
gl.glUniform2f(loc, v2.getX(), v2.getY());
12901323
break;
12911324
case Vector3:
12921325
Vector3f v3 = (Vector3f) uniform.getValue();
1326+
assert isValidNumber(v3) : "Invalid Vector3f value " + v3;
12931327
gl.glUniform3f(loc, v3.getX(), v3.getY(), v3.getZ());
12941328
break;
12951329
case Vector4:
12961330
Object val = uniform.getValue();
12971331
if (val instanceof ColorRGBA) {
12981332
ColorRGBA c = (ColorRGBA) val;
1333+
assert isValidNumber(c) : "Invalid ColorRGBA value " + c;
12991334
gl.glUniform4f(loc, c.r, c.g, c.b, c.a);
13001335
} else if (val instanceof Vector4f) {
13011336
Vector4f c = (Vector4f) val;
1337+
assert isValidNumber(c) : "Invalid Vector4f value " + c;
13021338
gl.glUniform4f(loc, c.x, c.y, c.z, c.w);
13031339
} else {
13041340
Quaternion c = (Quaternion) uniform.getValue();
1341+
assert isValidNumber(c) : "Invalid Quaternion value " + c;
13051342
gl.glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW());
13061343
}
13071344
break;
@@ -1311,11 +1348,13 @@ protected void updateUniform(Shader shader, Uniform uniform) {
13111348
break;
13121349
case Matrix3:
13131350
fb = uniform.getMultiData();
1351+
assert isValidNumber(fb) : "Invalid Matrix3f value " + uniform.getValue();
13141352
assert fb.remaining() == 9;
13151353
gl.glUniformMatrix3(loc, false, fb);
13161354
break;
13171355
case Matrix4:
13181356
fb = uniform.getMultiData();
1357+
assert isValidNumber(fb) : "Invalid Matrix4f value " + uniform.getValue();
13191358
assert fb.remaining() == 16;
13201359
gl.glUniformMatrix4(loc, false, fb);
13211360
break;
@@ -1325,22 +1364,27 @@ protected void updateUniform(Shader shader, Uniform uniform) {
13251364
break;
13261365
case FloatArray:
13271366
fb = uniform.getMultiData();
1367+
assert isValidNumber(fb) : "Invalid float array value " + Arrays.asList((float[]) uniform.getValue());
13281368
gl.glUniform1(loc, fb);
13291369
break;
13301370
case Vector2Array:
13311371
fb = uniform.getMultiData();
1372+
assert isValidNumber(fb) : "Invalid Vector2f array value " + Arrays.deepToString((Vector2f[]) uniform.getValue());
13321373
gl.glUniform2(loc, fb);
13331374
break;
13341375
case Vector3Array:
13351376
fb = uniform.getMultiData();
1377+
assert isValidNumber(fb) : "Invalid Vector3f array value " + Arrays.deepToString((Vector3f[]) uniform.getValue());
13361378
gl.glUniform3(loc, fb);
13371379
break;
13381380
case Vector4Array:
13391381
fb = uniform.getMultiData();
1382+
assert isValidNumber(fb) : "Invalid Vector4f array value " + Arrays.deepToString((Vector4f[]) uniform.getValue());
13401383
gl.glUniform4(loc, fb);
13411384
break;
13421385
case Matrix4Array:
13431386
fb = uniform.getMultiData();
1387+
assert isValidNumber(fb) : "Invalid Matrix4f array value " + Arrays.deepToString((Matrix4f[]) uniform.getValue());
13441388
gl.glUniformMatrix4(loc, false, fb);
13451389
break;
13461390
case Int:

0 commit comments

Comments
 (0)