package jo.util.lwjgl.win;
import jo.util.jgl.obj.JGLLight;
import jo.util.jgl.obj.JGLNode;
import jo.vecmath.logic.Color4fLogic;
import jo.vecmath.logic.MathUtils;
import jo.vecmath.logic.Point3fLogic;
import org.lwjgl.opengl.GL11;
public class LightDrawHandler extends NodeDrawHandler {
private static final int[] LIGHT_NUM = {
GL11.GL_LIGHT0,
GL11.GL_LIGHT1,
GL11.GL_LIGHT2,
GL11.GL_LIGHT3,
GL11.GL_LIGHT4,
GL11.GL_LIGHT5,
GL11.GL_LIGHT6,
GL11.GL_LIGHT7,};
private long mTick = -1;
private int mLightCount = 0;
@Override
public void draw(long tick, JGLNode node) {
if (mTick != tick) {
mTick = tick;
mLightCount = 0;
} else {
mLightCount++;
}
if (mLightCount >= LIGHT_NUM.length) {
return;
}
preDraw(tick, node);
JGLLight light = (JGLLight) node;
int l = LIGHT_NUM[mLightCount];
GL11.glEnable(l);
if (light.getAmbient() != null) {
GL11.glLight(l, GL11.GL_AMBIENT, Color4fLogic.toFloatBuffer(light.getAmbient()));
}
if (light.getDiffuse() != null) {
GL11.glLight(l, GL11.GL_DIFFUSE, Color4fLogic.toFloatBuffer(light.getDiffuse()));
}
if (light.getSpecular() != null) {
GL11.glLight(l, GL11.GL_SPECULAR, Color4fLogic.toFloatBuffer(light.getSpecular()));
}
if (light.getPosition() != null) {
GL11.glLight(l, GL11.GL_POSITION, Color4fLogic.toFloatBuffer(light.getPosition()));
}
if (light.getSpotDirection() != null) {
GL11.glLight(l, GL11.GL_SPOT_DIRECTION, Point3fLogic.toFloatBuffer(light.getSpotDirection()));
}
if (light.getSpotDirection() != null) {
GL11.glLight(l, GL11.GL_SPOT_DIRECTION, Point3fLogic.toFloatBuffer(light.getSpotDirection()));
}
if (light.getSpotExponent() != 0) {
GL11.glLightf(l, GL11.GL_SPOT_EXPONENT, light.getSpotExponent());
}
if (!MathUtils.epsilonEquals(light.getSpotCutoff(), 180.0f)) {
GL11.glLightf(l, GL11.GL_SPOT_CUTOFF, light.getSpotExponent());
}
if (light.getConstantAttenuation() != 1) {
GL11.glLightf(l, GL11.GL_CONSTANT_ATTENUATION, light.getConstantAttenuation());
}
if (light.getLinearAttenuation() != 0) {
GL11.glLightf(l, GL11.GL_LINEAR_ATTENUATION, light.getLinearAttenuation());
}
if (light.getQuadraticAttenuation() != 0) {
GL11.glLightf(l, GL11.GL_QUADRATIC_ATTENUATION, light.getQuadraticAttenuation());
}
postDraw(tick, node);
}
}