Julien Gouesse 9 years ago
commit 8ace69d0c3
  1. 2
      .travis.yml
  2. 10
      jme3-core/src/main/java/com/jme3/light/AmbientLight.java
  3. 29
      jme3-core/src/main/java/com/jme3/light/DirectionalLight.java
  4. 11
      jme3-core/src/main/java/com/jme3/light/Light.java
  5. 55
      jme3-core/src/main/java/com/jme3/light/PointLight.java
  6. 108
      jme3-core/src/main/java/com/jme3/light/SpotLight.java

@ -25,7 +25,7 @@ install:
script: script:
- ./gradlew check - ./gradlew check
- ./gradlew createZipDistribution - ./gradlew createZipDistribution
- "[ $TRAVIS_BRANCH == 'master' ] && [ $TRAVIS_PULL_REQUEST == 'false' ] && ./gradlew uploadArchives;" - [ $TRAVIS_BRANCH == 'master' ] && [ $TRAVIS_PULL_REQUEST == 'false' ] && ./gradlew uploadArchives || :
before_deploy: before_deploy:
- export RELEASE_DIST=$(ls build/distributions/*.zip) - export RELEASE_DIST=$(ls build/distributions/*.zip)

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2012, 2015 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -32,6 +32,7 @@
package com.jme3.light; package com.jme3.light;
import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingBox;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
@ -49,6 +50,13 @@ import com.jme3.util.TempVars;
*/ */
public class AmbientLight extends Light { public class AmbientLight extends Light {
public AmbientLight() {
}
public AmbientLight(ColorRGBA color) {
super(color);
}
@Override @Override
public boolean intersectsBox(BoundingBox box, TempVars vars) { public boolean intersectsBox(BoundingBox box, TempVars vars) {
return true; return true;

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2012, 2015 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -36,6 +36,7 @@ import com.jme3.export.InputCapsule;
import com.jme3.export.JmeExporter; import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter; import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule; import com.jme3.export.OutputCapsule;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
@ -53,6 +54,30 @@ public class DirectionalLight extends Light {
protected Vector3f direction = new Vector3f(0f, -1f, 0f); protected Vector3f direction = new Vector3f(0f, -1f, 0f);
/**
* Creates a DirectionalLight
*/
public DirectionalLight() {
}
/**
* Creates a DirectionalLight with the given direction
* @param direction the light's direction
*/
public DirectionalLight(Vector3f direction) {
setDirection(direction);
}
/**
* Creates a DirectionalLight with the given direction and the given color
* @param direction the light's direction
* @param color the light's color
*/
public DirectionalLight(Vector3f direction, ColorRGBA color) {
super(color);
setDirection(direction);
}
@Override @Override
public void computeLastDistance(Spatial owner) { public void computeLastDistance(Spatial owner) {
lastDistance = 0; // directional lights are always closest to their owner lastDistance = 0; // directional lights are always closest to their owner
@ -77,7 +102,7 @@ public class DirectionalLight extends Light {
* *
* @param dir the direction of the light. * @param dir the direction of the light.
*/ */
public void setDirection(Vector3f dir){ public final void setDirection(Vector3f dir){
direction.set(dir); direction.set(dir);
if (!direction.isUnitVector()) { if (!direction.isUnitVector()) {
direction.normalizeLocal(); direction.normalizeLocal();

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2012, 2015 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -94,7 +94,7 @@ public abstract class Light implements Savable, Cloneable {
} }
} }
protected ColorRGBA color = new ColorRGBA(1f,1f,1f,1f); protected ColorRGBA color = new ColorRGBA(ColorRGBA.White);
/** /**
* Used in LightList for caching the distance * Used in LightList for caching the distance
@ -115,6 +115,13 @@ public abstract class Light implements Savable, Cloneable {
boolean frustumCheckNeeded = true; boolean frustumCheckNeeded = true;
boolean intersectsFrustum = false; boolean intersectsFrustum = false;
protected Light() {
}
protected Light(ColorRGBA color) {
setColor(color);
}
/** /**
* Returns the color of the light. * Returns the color of the light.
* *

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2012, 2015 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -32,14 +32,13 @@
package com.jme3.light; package com.jme3.light;
import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingBox;
import com.jme3.bounding.BoundingSphere;
import com.jme3.bounding.BoundingVolume; import com.jme3.bounding.BoundingVolume;
import com.jme3.export.InputCapsule; import com.jme3.export.InputCapsule;
import com.jme3.export.JmeExporter; import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter; import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule; import com.jme3.export.OutputCapsule;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.math.Plane;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
@ -62,6 +61,52 @@ public class PointLight extends Light {
protected float radius = 0; protected float radius = 0;
protected float invRadius = 0; protected float invRadius = 0;
/**
* Creates a PointLight
*/
public PointLight() {
}
/**
* Creates a PointLight at the given position
* @param position the position in world space
*/
public PointLight(Vector3f position) {
setPosition(position);
}
/**
* Creates a PointLight at the given position and with the given color
* @param position the position in world space
* @param color the light color
*/
public PointLight(Vector3f position, ColorRGBA color) {
super(color);
setPosition(position);
}
/**
* Creates a PointLight at the given position, with the given color and the
* given radius
* @param position the position in world space
* @param color the light color
* @param radius the light radius
*/
public PointLight(Vector3f position, ColorRGBA color, float radius) {
this(position, color);
setRadius(radius);
}
/**
* Creates a PointLight at the given position, with the given radius
* @param position the position in world space
* @param radius the light radius
*/
public PointLight(Vector3f position, float radius) {
this(position);
setRadius(radius);
}
@Override @Override
public void computeLastDistance(Spatial owner) { public void computeLastDistance(Spatial owner) {
if (owner.getWorldBound() != null) { if (owner.getWorldBound() != null) {
@ -88,7 +133,7 @@ public class PointLight extends Light {
* *
* @param position the world space position of the light. * @param position the world space position of the light.
*/ */
public void setPosition(Vector3f position) { public final void setPosition(Vector3f position) {
this.position.set(position); this.position.set(position);
} }
@ -115,7 +160,7 @@ public class PointLight extends Light {
* *
* @throws IllegalArgumentException If radius is negative * @throws IllegalArgumentException If radius is negative
*/ */
public void setRadius(float radius) { public final void setRadius(float radius) {
if (radius < 0) { if (radius < 0) {
throw new IllegalArgumentException("Light radius cannot be negative"); throw new IllegalArgumentException("Light radius cannot be negative");
} }

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2012, 2015 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -34,6 +34,7 @@ package com.jme3.light;
import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingBox;
import com.jme3.bounding.BoundingVolume; import com.jme3.bounding.BoundingVolume;
import com.jme3.export.*; import com.jme3.export.*;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.math.Plane; import com.jme3.math.Plane;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
@ -44,36 +45,121 @@ import java.io.IOException;
/** /**
* Represents a spot light. * Represents a spot light.
* A spot light emmit a cone of light from a position and in a direction. * A spot light emits a cone of light from a position and in a direction.
* It can be used to fake torch lights or car's lights. * It can be used to fake torch lights or cars' lights.
* <p> * <p>
* In addition to a position and a direction, spot lights also have a range which * In addition to a position and a direction, spot lights also have a range which
* can be used to attenuate the influence of the light depending on the * can be used to attenuate the influence of the light depending on the
* distance between the light and the effected object. * distance between the light and the affected object.
* Also the angle of the cone can be tweaked by changing the spot inner angle and the spot outer angle. * Also the angle of the cone can be tweaked by changing the spot inner angle and the spot outer angle.
* the spot inner angle determin the cone of light where light has full influence. * the spot inner angle determines the cone of light where light has full influence.
* the spot outer angle determin the cone global cone of light of the spot light. * the spot outer angle determines the cone global cone of light of the spot light.
* the light intensity slowly decrease between the inner cone and the outer cone. * the light intensity slowly decreases between the inner cone and the outer cone.
* @author Nehon * @author Nehon
*/ */
public class SpotLight extends Light { public class SpotLight extends Light {
protected Vector3f position = new Vector3f(); protected Vector3f position = new Vector3f();
protected Vector3f direction = new Vector3f(0,-1,0); protected Vector3f direction = new Vector3f(0, -1, 0);
protected float spotInnerAngle = FastMath.QUARTER_PI / 8; protected float spotInnerAngle = FastMath.QUARTER_PI / 8;
protected float spotOuterAngle = FastMath.QUARTER_PI / 6; protected float spotOuterAngle = FastMath.QUARTER_PI / 6;
protected float spotRange = 100; protected float spotRange = 100;
protected float invSpotRange = 1f / 100; protected float invSpotRange = 1f / 100;
protected float packedAngleCos=0; protected float packedAngleCos = 0;
protected float outerAngleCosSqr, outerAngleSinSqr; protected float outerAngleCosSqr, outerAngleSinSqr;
protected float outerAngleSinRcp, outerAngleSin, outerAngleCos; protected float outerAngleSinRcp, outerAngleSin, outerAngleCos;
/**
* Creates a SpotLight.
*/
public SpotLight() { public SpotLight() {
super(); super();
computeAngleParameters(); computeAngleParameters();
} }
/**
* Creates a SpotLight at the given position and with the given direction.
* @param position the position in world space.
* @param direction the direction of the light.
*/
public SpotLight(Vector3f position, Vector3f direction) {
this();
setPosition(position);
setDirection(direction);
}
/**
* Creates a SpotLight at the given position, with the given direction, and the
* given range.
* @param position the position in world space.
* @param direction the direction of the light.
* @param range the spot light range
*/
public SpotLight(Vector3f position, Vector3f direction, float range) {
this();
setPosition(position);
setDirection(direction);
this.spotRange = range;
}
/**
* Creates a SpotLight at the given position, with the given direction and
* the given color.
* @param position the position in world space.
* @param direction the direction of the light.
* @param color the light's color.
*/
public SpotLight(Vector3f position, Vector3f direction, ColorRGBA color) {
super(color);
computeAngleParameters();
setPosition(position);
setDirection(direction);
}
/**
* Creates a SpotLight at the given position, with the given direction,
* the given range and the given color.
* @param position the position in world space.
* @param direction the direction of the light.
* @param range the spot light range
* @param color the light's color.
*/
public SpotLight(Vector3f position, Vector3f direction, float range, ColorRGBA color) {
super(color);
computeAngleParameters();
setPosition(position);
setDirection(direction);
this.spotRange = range;
}
/**
* Creates a SpotLight at the given position, with the given direction,
* the given color and the given inner and outer angles
* (controls the falloff of the light)
*
* @param position the position in world space.
* @param direction the direction of the light.
* @param range the spot light range
* @param color the light's color.
* @param innerAngle the inner angle of the spot light.
* @param outerAngle the outer angle of the spot light.
*
* @see SpotLight#setSpotInnerAngle(float)
* @see SpotLight#setSpotOuterAngle(float)
*/
public SpotLight(Vector3f position, Vector3f direction, float range, ColorRGBA color, float innerAngle, float outerAngle) {
super(color);
this.spotInnerAngle = innerAngle;
this.spotOuterAngle = outerAngle;
computeAngleParameters();
setPosition(position);
setDirection(direction);
this.spotRange = range;
}
private void computeAngleParameters() { private void computeAngleParameters() {
float innerCos = FastMath.cos(spotInnerAngle); float innerCos = FastMath.cos(spotInnerAngle);
outerAngleCos = FastMath.cos(spotOuterAngle); outerAngleCos = FastMath.cos(spotOuterAngle);
@ -189,7 +275,7 @@ public class SpotLight extends Light {
return direction; return direction;
} }
public void setDirection(Vector3f direction) { public final void setDirection(Vector3f direction) {
this.direction.set(direction); this.direction.set(direction);
} }
@ -197,7 +283,7 @@ public class SpotLight extends Light {
return position; return position;
} }
public void setPosition(Vector3f position) { public final void setPosition(Vector3f position) {
this.position.set(position); this.position.set(position);
} }

Loading…
Cancel
Save