package com.android.droidgraph.material; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.opengles.GL10; import com.android.droidgraph.scene.SGAbstractShape; import com.android.droidgraph.shape.GLShape; public class AMaterial implements IMaterial { // Material Properties private float[] diffuse = { 0.8f, 0.8f, 0.8f, 1.0f }; private float[] ambient = { 0.8f, 0.8f, 0.8f, 1.0f }; private float[] specular = { 0.2f, 0.2f, 0.2f, 0.5f }; private float shininess = 12f; private float[] position = { 0.0f, 0.0f, 0.0f }; // Material Buffers private FloatBuffer ambientBuffer; private FloatBuffer diffuseBuffer; private FloatBuffer specularBuffer; private FloatBuffer positionBuffer; protected GLShape glshape; protected SGAbstractShape parent; protected Material defaultMaterial = new Material(null); protected boolean enabled = true; public AMaterial(SGAbstractShape node) { this.parent = node; } public void setShape(GLShape glshape) { this.glshape = glshape; } public void setParent(SGAbstractShape node) { parent = node; glshape = node.getShape(); } /* * Ambient */ @Override public void setAmbient(float red, float green, float blue, float alpha) { ambient[0] = red; ambient[1] = green; ambient[2] = blue; ambient[3] = alpha; updateAmbientBuffer(); } public void setAmbient(float[] ambient) { this.ambient = ambient; } @Override public float[] getAmbient() { return ambient; } public void initAmbientBuffer() { ByteBuffer byteBuff = ByteBuffer.allocateDirect(ambient.length * 4); byteBuff.order(ByteOrder.nativeOrder()); ambientBuffer = byteBuff.asFloatBuffer(); ambientBuffer.put(ambient); ambientBuffer.position(0); } public void updateAmbientBuffer() { ambientBuffer.position(0); ambientBuffer.put(ambient); ambientBuffer.position(0); } public FloatBuffer getAmbientBuffer() { return ambientBuffer; } /* * Diffusse */ @Override public void setDiffuse(float red, float green, float blue, float alpha) { diffuse[0] = red; diffuse[1] = green; diffuse[2] = blue; diffuse[3] = alpha; updateDiffuseBuffer(); } public void setDiffuse(float[] diffuse) { this.diffuse = diffuse; updateDiffuseBuffer(); } @Override public float[] getDiffuse() { return diffuse; } public FloatBuffer getDiffuseBuffer() { return diffuseBuffer; } public void initDiffuseBuffer() { ByteBuffer byteBuff = ByteBuffer.allocateDirect(diffuse.length * 4); byteBuff.order(ByteOrder.nativeOrder()); diffuseBuffer = byteBuff.asFloatBuffer(); diffuseBuffer.put(diffuse); diffuseBuffer.position(0); } public void updateDiffuseBuffer() { diffuseBuffer.position(0); diffuseBuffer.put(diffuse); diffuseBuffer.position(0); } /* * Ambient and Diffuse */ public void setAmbientAndDiffuse(float red, float green, float blue, float alpha) { setAmbient(red, green, blue, alpha); setDiffuse(red, green, blue, alpha); } /* * Specular */ @Override public void setSpecular(float red, float green, float blue, float alpha) { specular[0] = red; specular[1] = green; specular[2] = blue; specular[3] = alpha; updateSpecularBuffer(); } public void setSpecular(float[] specular) { this.specular = specular; updateSpecularBuffer(); } @Override public float[] getSpecular() { return specular; } public FloatBuffer getSpecularBuffer() { return specularBuffer; } public void initSpecularBuffer() { ByteBuffer byteBuff = ByteBuffer.allocateDirect(specular.length * 4); byteBuff.order(ByteOrder.nativeOrder()); specularBuffer = byteBuff.asFloatBuffer(); specularBuffer.put(specular); specularBuffer.position(0); } public void updateSpecularBuffer() { specularBuffer.position(0); specularBuffer.put(specular); specularBuffer.position(0); } /* * Shininess */ @Override public void setShininess(float shininess) { this.shininess = shininess; } @Override public float getShininess() { return shininess; } /* * Position */ @Override public void setPosition(float x, float y, float z) { position[0] = x; position[1] = y; position[2] = z; updatePositionBuffer(); } public void setPosition(float[] position) { this.position = position; updatePositionBuffer(); } @Override public float[] getPosition() { return position; } public void initPositionBuffer() { ByteBuffer byteBuff = ByteBuffer.allocateDirect(position.length * 4); byteBuff.order(ByteOrder.nativeOrder()); positionBuffer = byteBuff.asFloatBuffer(); positionBuffer.put(position); positionBuffer.position(0); } public void updatePositionBuffer() { positionBuffer.position(0); positionBuffer.put(position); positionBuffer.position(0); } protected void initBuffers() { initAmbientBuffer(); initDiffuseBuffer(); initSpecularBuffer(); initPositionBuffer(); } protected void updateBuffers() { updateAmbientBuffer(); updateDiffuseBuffer(); updateSpecularBuffer(); updatePositionBuffer(); } @Override public void loadMaterial(GL10 gl) { } @Override public void draw(GL10 gl) { if (glshape != null) { if(enabled) { gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambientBuffer); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuseBuffer); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specularBuffer); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, Math.min(shininess, 128)); } } } @Override public void drawSelected(GL10 gl) { int[] color = parent.getColorID().color; if (glshape != null) { if(enabled) { gl.glColor4f(color[0], color[1], color[2], color[3]); } } } @Override public void killDraw(GL10 gl) { if (glshape != null) { if(enabled) { gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, defaultMaterial.getAmbientBuffer()); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, defaultMaterial.getDiffuseBuffer()); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, defaultMaterial.getSpecularBuffer()); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, Math.min(defaultMaterial.getShininess(), 128)); } } } @Override public void enable() { enabled = true; } @Override public void disable() { enabled = false; } }