package com.android.droidgraph.lighting;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import android.util.Log;
import com.android.droidgraph.util.GLH;
public class Light {
/* The initial light values */
private float[] ambient = { 0.5f, 0.5f, 0.5f, 1.0f };
private float[] diffuse = { 0.8f, 0.8f, 0.8f, 1.0f };
private float[] specular = { 0.5f, 0.5f, 0.5f, 1.0f};
private float[] position = { 0.0f, 0.0f, 0.0f, 1.0f };
public float translateX = 0;
public float translateY = 0;
public float translateZ = 0;
private float red = 1;
private float green = 1;
private float blue = 1;
private float alpha = 1;
/* The buffers for our light values */
private FloatBuffer ambientBuffer;
private FloatBuffer diffuseBuffer;
private FloatBuffer specularBuffer;
private FloatBuffer positionBuffer;
private int id;
private GL10 gl;
public Light(float[] ambient, float[] diffuse, float[] specular, float[] position, int id) {
gl = GLH.gl;
this.ambient = ambient;
this.diffuse = diffuse;
this.specular = specular;
this.position = position;
this.id = id;
// Max id val is 7
if (this.id > 7) {
this.id = 7;
} else if (this.id < 0) {
this.id = 0;
}
this.id += GL10.GL_LIGHT0;
initBuffers();
}
public Light(float[] position, int id) {
this.position = position;
this.id = id;
// Max id val is 7
if (this.id > 7) {
this.id = 7;
} else if (this.id < 0) {
this.id = 0;
}
this.id += GL10.GL_LIGHT0;
initBuffers();
}
public Light() {
this(new float[] {0,0,0}, GL10.GL_LIGHT0);
}
public Light(int id) {
this.id = id;
initBuffers();
}
private void initBuffers() {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(ambient.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
ambientBuffer = byteBuf.asFloatBuffer();
ambientBuffer.put(ambient);
ambientBuffer.position(0);
byteBuf = ByteBuffer.allocateDirect(diffuse.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
diffuseBuffer = byteBuf.asFloatBuffer();
diffuseBuffer.put(diffuse);
diffuseBuffer.position(0);
byteBuf = ByteBuffer.allocateDirect(specular.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
specularBuffer = byteBuf.asFloatBuffer();
specularBuffer.put(specular);
specularBuffer.position(0);
byteBuf = ByteBuffer.allocateDirect(position.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
positionBuffer = byteBuf.asFloatBuffer();
positionBuffer.put(position);
positionBuffer.position(0);
}
public void onSurfaceCreated(GL10 gl) {
gl.glLightfv(id, GL10.GL_AMBIENT, ambientBuffer);
gl.glLightfv(id, GL10.GL_POSITION, positionBuffer);
gl.glLightfv(id, GL10.GL_SPECULAR, specularBuffer);
gl.glEnable(id); // Enable Light 0 + id value (up to 7)
}
public void disable() {
// Kill this light
gl.glDisable(id);
}
public void enable() {
gl.glEnable(id);
}
public int getID() {
return id;
}
public void setTranslation(float x, float y, float z) {
position[0] = x;
translateX = x;
position[1] = y;
translateY = y;
position[2] = z;
translateZ = z;
updatePositionBuffer();
}
public void setTranslateX(float x) {
position[0] = x;
translateX = x;
updatePositionBuffer();
Log.d("TranslateX", Float.toString(x));
}
public void setTranslateY(float y) {
position[1] = y;
translateY = y;
updatePositionBuffer();
}
public void setTranslateZ(float z) {
position[2] = z;
translateX = z;
updatePositionBuffer();
}
public void setRed(float r) {
setAmbient(r, green, blue, alpha);
setDiffuse(r, green, blue, alpha);
red = r;
}
public float getRed() {
return red;
}
public void setGreen(float g) {
setAmbient(red, g, blue, alpha);
setDiffuse(red, g, blue, alpha);
green = g;
}
public float getGreen() {
return green;
}
public void setBlue(float b) {
setAmbient(red, green, b, alpha);
setDiffuse(red, green, b, alpha);
blue = b;
}
public float getBlue() {
return blue;
}
public void setAlpha(float a) {
setAmbient(red, green, blue, a);
setDiffuse(red, green, blue, a);
alpha = a;
}
public float getAlpha() {
return alpha;
}
public void setAmbient(float x, float y, float z, float a) {
ambient[0] = x;
ambient[1] = y;
ambient[2] = z;
ambient[3] = a;
updateAmbientBuffer();
}
public void setDiffuse(float r, float g, float b, float a) {
diffuse[0] = r;
diffuse[1] = g;
diffuse[2] = b;
diffuse[3] = a;
updateDiffuseBuffer();
}
public void setSpecular(float r, float g, float b, float a) {
specular[0] = r;
specular[1] = g;
specular[2] = b;
specular[3] = a;
updateSpecularBuffer();
}
private void updateAmbientBuffer() {
ambientBuffer.clear();
ambientBuffer.put(ambient);
ambientBuffer.position(0);
}
private void updatePositionBuffer() {
positionBuffer.clear();
positionBuffer.put(position);
positionBuffer.position(0);
}
private void updateDiffuseBuffer() {
diffuseBuffer.clear();
diffuseBuffer.put(diffuse);
diffuseBuffer.position(0);
}
private void updateSpecularBuffer() {
specularBuffer.clear();
specularBuffer.put(specular);
specularBuffer.position(0);
}
}