/*******************************************************************************
* Copyright (c) 2013 Philip Collin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Philip Collin - initial API and implementation
******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Lights;
import java.io.Serializable;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;
import com.lyeeedar.Roguelike3D.Graphics.Models.Shapes;
public class PointLight implements Comparable, Serializable {
/**
*
*/
private static final long serialVersionUID = 5237715137220677938L;
final public String UID;
final public Vector3 position;
private final Color colour = new Color();
public float attenuation;
public float power;
protected int priority;
public static final int PRIORITY_DISCRETE_STEPS = 256;
private final Vector3 tmpVec = new Vector3();
public transient Mesh area;
public transient float radius;
public PointLight(Vector3 position, Color colour, float attentuation, float power)
{
UID = this.toString()+this.hashCode()+System.currentTimeMillis()+System.nanoTime();
this.position = position;
this.colour.set(colour);
this.attenuation = attentuation;
this.power = power;
computeMesh();
}
public void computeMesh()
{
Vector3 intensity = new Vector3(getColour().r, getColour().g, getColour().b);
float dist = 1;
while (intensity.len2() > 0.5f)
{
intensity.set(getColour().r, getColour().g, getColour().b).div((attenuation + (attenuation/5)*dist)*dist);
dist++;
}
dist *= 4;
if (area != null) area.dispose();
area = Shapes.genIcosahedronMesh(dist, dist);
area.setVertices(Shapes.genIcosahedronVertices(dist, dist));
radius = dist;
}
public void positionAbsolutely(float x, float y, float z)
{
position.set(x, y, z);
}
@Override
public int compareTo (Object other) {
return this.priority - ((PointLight)other).priority;
}
public void fixReferences()
{
computeMesh();
}
public void bind(ShaderProgram shader)
{
shader.setUniformf("u_model", position);
shader.setUniformf("u_colour", getColour().r, getColour().g, getColour().b);
shader.setUniformf("u_attenuation", attenuation);
shader.setUniformf("u_power", power);
}
public Color getColour() {
return colour;
}
}