package rajawali.extras;
import java.util.ArrayList;
import rajawali.materials.TextureInfo;
import rajawali.math.Number3D;
/**
* LensFlare effects class for adding lens flare to the renderer.
*
* @author Andrew Jo
*/
public class LensFlare {
protected ArrayList<FlareInfo> mLensFlares;
protected Number3D mPositionScreen;
protected Number3D mPosition;
protected boolean mOccluded;
public LensFlare(TextureInfo texture, int size, float distance, Number3D color) {
mLensFlares = new ArrayList<FlareInfo>();
mPositionScreen = new Number3D();
mPosition = new Number3D();
addLensFlare(texture, size, distance, color);
}
public void addLensFlare(TextureInfo texture) {
addLensFlare(texture, -1, 0, new Number3D(1, 1, 1));
}
public void addLensFlare(TextureInfo texture, int size, float distance, Number3D color) {
addLensFlare(texture, size, distance, color, 1);
}
public void addLensFlare(TextureInfo texture, int size, float distance, Number3D color, float opacity) {
distance = Math.min(distance, Math.max(0, distance));
mLensFlares.add(new FlareInfo(texture, size, distance, new Number3D(), color, opacity));
}
public ArrayList<FlareInfo> getLensFlares() {
return mLensFlares;
}
public Number3D getPosition() {
return mPosition;
}
public Number3D getPositionScreen() {
return mPositionScreen;
}
public void setPosition(float x, float y, float z) {
mPosition.setAll(x, y, z);
}
/**
* Sets the world space coordinates of the lens flare.
* Make sure this is the same position as the light position for which to apply the lens flare effect.
* @param position
*/
public void setPosition(Number3D position) {
mPosition.setAllFrom(position);
}
public void setPositionScreen(float x, float y, float z) {
mPositionScreen.setAll(x, y, z);
}
public void setPositionScreen(Number3D position) {
mPositionScreen.setAllFrom(position);
}
/**
* Updates individual flare element information.
* Override this method to achieve custom lens flare behavior.
*/
public void updateLensFlares() {
float vecX = -mPositionScreen.x * 2;
float vecY = -mPositionScreen.y * 2;
for (int f = 0; f < mLensFlares.size(); f++) {
FlareInfo flare = mLensFlares.get(f);
flare.setScreenPosition(mPositionScreen.x + vecX * flare.getDistance(), mPositionScreen.y + vecY * flare.getDistance());
flare.setWantedRotation(flare.getScreenPosition().x * (float)Math.PI * 0.25f);
flare.setRotation(flare.getRotation() + (flare.getWantedRotation() - flare.getRotation()) * 0.25f);
}
}
public class FlareInfo {
protected TextureInfo mTexture;
protected int mSize;
protected float mDistance;
protected Number3D mColor;
protected Number3D mScreenPosition;
protected float mOpacity;
protected float mScale;
protected float mRotation;
protected float mWantedRotation;
public FlareInfo(TextureInfo texture, int size, float distance,
Number3D screenPosition, Number3D color, float opacity) {
mTexture = texture;
mSize = size;
mDistance = distance;
mScreenPosition = screenPosition;
mColor = color;
mRotation = 1;
mScale = 1;
mOpacity = opacity;
mWantedRotation = 0;
}
public Number3D getColor() {
return mColor;
}
public float getDistance() {
return mDistance;
}
public float getOpacity() {
return mOpacity;
}
public float getRotation() {
return mRotation;
}
public float getScale() {
return mScale;
}
public Number3D getScreenPosition() {
return mScreenPosition;
}
public int getSize() {
return mSize;
}
public TextureInfo getTexture() {
return mTexture;
}
public float getWantedRotation() {
return mWantedRotation;
}
public void setColor(float[] color) {
mColor.x = color[0];
mColor.y = color[1];
mColor.z = color[2];
}
public void setColor(Number3D color) {
setColor(new float[] {color.x, color.y, color.z});
}
public void setDistance(float distance) {
mDistance = distance;
}
public void setOpacity(float opacity) {
mOpacity = opacity;
}
public void setRotation(float rotation) {
mRotation = rotation;
}
public void setScale(float scale) {
mScale = scale;
}
public void setScreenPosition(float x, float y) {
mScreenPosition.x = x;
mScreenPosition.y = y;
mScreenPosition.z = 0;
}
public void setScreenPosition(float[] screenPosition) {
mScreenPosition.x = screenPosition[0];
mScreenPosition.y = screenPosition[1];
mScreenPosition.z = screenPosition[2];
}
public void setScreenPosition(Number3D screenPosition) {
mScreenPosition.setAllFrom(screenPosition);
}
public void setSize(int size) {
mSize = size;
}
public void setTexture(TextureInfo texture) {
mTexture = texture;
}
public void setWantedRotation(float wantedRotation) {
mWantedRotation = wantedRotation;
}
}
}