package com.gebauz.Bauzoid.graphics.model;
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;
import com.gebauz.Bauzoid.app.Consts;
import com.gebauz.Bauzoid.graphics.Graphics;
import com.gebauz.Bauzoid.graphics.GraphicsObject;
import com.gebauz.Bauzoid.math.Vector2;
import com.gebauz.Bauzoid.math.Vector3;
import com.gebauz.Bauzoid.math.Vector4;
/** Vertex Stream that supports individual or interleaved vertex attributes. */
public class VertexStream
extends GraphicsObject
{
/** Type of stream - single attribute or multi-attribute interleaved. */
public enum StreamType
{
INDIVIDUAL,
INTERLEAVED
};
private StreamType mStreamType
;
private String mName
;
private FloatBuffer mData
;
private int mVertexCount =
0;
private int mCoordsPerElement =
0;
private int mBytesPerElement =
0;
private int mBufferID =
0;
private static int[] BUFFERID =
new int[1];
private VertexAttribute
[] mAttribs
;
/** Constructor. */
public VertexStream
(Graphics graphics, StreamType streamType,
String name, VertexAttribute
[] attribs
)
{
super(graphics
);
mStreamType = streamType
;
mName = name
;
mAttribs = attribs
;
}
/** Set the buffer data. */
public void setData
(byte[] data,
int vertexCount,
int coordsPerElement,
int bytesPerElement
)
{
mVertexCount = vertexCount
;
mCoordsPerElement = coordsPerElement
;
mBytesPerElement = bytesPerElement
;
ByteBuffer byteBuffer =
ByteBuffer.
allocateDirect(data.
length);
byteBuffer.
order(ByteOrder.
nativeOrder());
byteBuffer.
put(data
);
byteBuffer.
position(0);
mData = byteBuffer.
asFloatBuffer();
}
/** Upload vertex data to hardware. */
public final void upload
()
{
GLES20.
glGenBuffers(1, BUFFERID,
0);
mBufferID = BUFFERID
[0];
GLES20.
glBindBuffer(GLES20.
GL_ARRAY_BUFFER, mBufferID
);
GLES20.
glBufferData(GLES20.
GL_ARRAY_BUFFER, mData.
capacity() * Consts.
SIZEOF_FLOAT, mData, GLES20.
GL_STATIC_DRAW);
GLES20.
glBindBuffer(GLES20.
GL_ARRAY_BUFFER,
0);
}
/** Unload vertex data from hardware. */
public final void unload
()
{
deactivate
();
BUFFERID
[0] = mBufferID
;
GLES20.
glDeleteBuffers(1, BUFFERID,
0);
mBufferID =
0;
}
/** Activate stream for rendering. */
public final void activate
()
{
// TODO: buffer state tracking
GLES20.
glBindBuffer(GLES20.
GL_ARRAY_BUFFER, mBufferID
);
for (int i =
0; i
< mAttribs.
length; i++
)
{
VertexAttribute attrib = mAttribs
[i
];
// TODO: attrib to handle adapter
GLES20.
glVertexAttribPointer(attrib.
getAttribType(), attrib.
getCoordsPerElement(), GLES20.
GL_FLOAT,
false, getBytesPerElement
(), attrib.
getByteOffset());
GLES20.
glEnableVertexAttribArray(attrib.
getAttribType());
}
}
public final void deactivate
()
{
for (int i =
0; i
< mAttribs.
length; i++
)
{
VertexAttribute attrib = mAttribs
[i
];
// TODO: attrib to handle adapter
GLES20.
glDisableVertexAttribArray(attrib.
getAttribType());
}
// TODO: buffer state tracking
GLES20.
glBindBuffer(GLES20.
GL_ARRAY_BUFFER,
0);
}
/** Get number of bytes per complete element (equals vertex stride). */
public final int getBytesPerElement
()
{
return mBytesPerElement
;
}
/** Get number of elements. */
public final int getVertexCount
()
{
return mVertexCount
;
}
/** Set a two dimensional element. */
public final void setElement2
(float x,
float y
)
{
}
/** Set a three dimensional element. */
public final void setElement3
(float x,
float y,
float z
)
{
}
/** Set a four dimensional element. */
public final void setElement4
(float x,
float y,
float z,
float w
)
{
}
/** Get a two dimensional element. */
public final Vector2 getElement2
()
{
return new Vector2
();
}
/** Get a two dimensional element. */
public final Vector3 getElement3
()
{
return new Vector3
();
}
/** Get a two dimensional element. */
public final Vector4 getElement4
()
{
return new Vector4
();
}
/** Get name of vertex stream. */
public String getName
()
{
return mName
;
}
}