package com.android.droidgraph.loader;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.Vector;
import javax.microedition.khronos.opengles.GL10;
import com.android.droidgraph.geom.BoundingBox;
import com.android.droidgraph.shape.GLShape;
public class TDModel extends GLShape{
Vector<Float> v;
Vector<Float> vn;
Vector<Float> vt;
Vector<TDModelPart> parts;
FloatBuffer vertexBuffer;
public TDModel(Vector<Float> v, Vector<Float> vn, Vector<Float> vt,
Vector<TDModelPart> parts) {
super();
this.v = v;
this.vn = vn;
this.vt = vt;
this.parts = parts;
}
public String toString(){
String str=new String();
str+="Number of parts: "+parts.size();
str+="\nNumber of vertexes: "+v.size();
str+="\nNumber of vns: "+vn.size();
str+="\nNumber of vts: "+vt.size();
str+="\n/////////////////////////\n";
for(int i=0; i<parts.size(); i++){
str+="Part "+i+'\n';
str+=parts.get(i).toString();
str+="\n/////////////////////////";
}
return str;
}
@Override
public void draw(GL10 gl) {
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
for(int i=0; i<parts.size(); i++){
TDModelPart t=parts.get(i);
Material m=t.getMaterial();
if(m!=null){
FloatBuffer a=m.getAmbientColorBuffer();
FloatBuffer d=m.getDiffuseColorBuffer();
FloatBuffer s=m.getSpecularColorBuffer();
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,a);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_SPECULAR,s);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,d);
}
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
//gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
//gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
}
}
public void buildVertexBuffer(){
ByteBuffer vBuf = ByteBuffer.allocateDirect(v.size() * 4);
vBuf.order(ByteOrder.nativeOrder());
vertexBuffer = vBuf.asFloatBuffer();
vertexBuffer.put(toPrimitiveArrayF(v));
vertexBuffer.position(0);
}
private static float[] toPrimitiveArrayF(Vector<Float> vector){
float[] f;
f=new float[vector.size()];
for (int i=0; i<vector.size(); i++){
f[i]=vector.get(i);
}
return f;
}
@Override
public BoundingBox getBounds() {
// TODO Auto-generated method stub
return null;
}
@Override
public void loadGLTexture() {
// TODO Auto-generated method stub
}
@Override
public FloatBuffer getTextureBuffer() {
// TODO Auto-generated method stub
return null;
}
}