Subversion Repositories AndroidProjects

Rev

Rev 179 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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;
        }
}