Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions jme3-core/src/main/java/com/jme3/light/PointLight.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
44 changes: 44 additions & 0 deletions jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -1247,6 +1247,37 @@ 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();

Expand Down Expand Up @@ -1282,26 +1313,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;
gl.glUniform1f(loc, f.floatValue());
break;
case Vector2:
Vector2f v2 = (Vector2f) uniform.getValue();
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;
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;
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;
gl.glUniform4f(loc, c.x, c.y, c.z, c.w);
} else {
Quaternion c = (Quaternion) uniform.getValue();
assert isValidNumber(c) : "Invalid Quaternion value " + c;
gl.glUniform4f(loc, c.getX(), c.getY(), c.getZ(), c.getW());
}
break;
Expand All @@ -1311,11 +1348,13 @@ protected void updateUniform(Shader shader, Uniform uniform) {
break;
case Matrix3:
fb = uniform.getMultiData();
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 fb.remaining() == 16;
gl.glUniformMatrix4(loc, false, fb);
break;
Expand All @@ -1325,22 +1364,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());
gl.glUniform1(loc, fb);
break;
case Vector2Array:
fb = uniform.getMultiData();
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());
gl.glUniform3(loc, fb);
break;
case Vector4Array:
fb = uniform.getMultiData();
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());
gl.glUniformMatrix4(loc, false, fb);
break;
case Int:
Expand Down