Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.bauzoid.graphics.model;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.util.ArrayList;
import java.util.List;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.utils.BufferUtils;
import com.gebauz.bauzoid.app.Consts;
import com.gebauz.bauzoid.graphics.Graphics;
import com.gebauz.bauzoid.graphics.GraphicsObject;


/** Index stream. */
public class IndexStream extends GraphicsObject
{
        private static List<IndexStream> mManagedStreams = new ArrayList<IndexStream>();
       
        private int mIndexCount = 0;
        private ShortBuffer mData;
       
        private int mBufferID = 0;
        //private static int[] BUFFERID = new int[1];
        private static final IntBuffer BUFFERID = BufferUtils.newIntBuffer(1);
       
        /** Constructor. */
        public IndexStream(Graphics graphics)
        {
                super(graphics);
               
                mManagedStreams.add(this);
        }      
       
        /** Destroy internal data. */
        public void dispose()
        {
                mManagedStreams.remove(this);
               
                unload();
                mIndexCount = 0;
                mData = null;
        }
       
        /** Set the data. */
        public void setData(byte data[])
        {
                if (data == null)
                {
                        dispose();
                        return;
                }
               
                ByteBuffer byteBuffer = ByteBuffer.allocateDirect(data.length);
                byteBuffer.order(ByteOrder.nativeOrder());
                byteBuffer.put(data);
                byteBuffer.position(0);
                mData = byteBuffer.asShortBuffer();
               
                mIndexCount = data.length;
        }
       
        /** Set the data. */
        public void setData(short data[])
        {
                if (data == null)
                {
                        dispose();
                        return;
                }
               
                mData = BufferUtils.newShortBuffer(data.length);
                mData.put(data);
                mData.position(0);

                mIndexCount = data.length;
        }
               
        /** Reload all managed index streams. */
        public static void reloadManagedStreams()
        {
                for (int i = 0; i < mManagedStreams.size(); i++)
                {
                        IndexStream stream = mManagedStreams.get(i);
                        stream.upload();
                        Gdx.app.log(Consts.LOG_TAG, "IndexStream reloaded!");
                }
        }      
       
        /** Create handle and upload indices to hardware. */
        public final void upload()
        {
                if (mData == null)
                        return;
               
                Gdx.gl20.glGenBuffers(1, BUFFERID);
                mBufferID = BUFFERID.get(0);
               
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
                Gdx.gl20.glBufferData(GL20.GL_ELEMENT_ARRAY_BUFFER, mData.capacity() * Consts.SIZEOF_SHORT, mData, GL20.GL_STATIC_DRAW);
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0);
        }
       
        /** Reload indices to hardware. */
        public final void reupload()
        {
                if (mBufferID == 0)
                {
                        // perform initial upload
                        upload();
                        return;
                }
               
                if (mData == null)
                        return;
               
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
                Gdx.gl20.glBufferSubData(GL20.GL_ELEMENT_ARRAY_BUFFER, 0, mData.capacity() * Consts.SIZEOF_SHORT, mData);
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0);        
        }
       
        /** Unload indices from hardware. */
        public final void unload()
        {
                BUFFERID.put(0, mBufferID);
                Gdx.gl20.glDeleteBuffers(1, BUFFERID);
                mBufferID = 0;
        }
       
        /** Activate index stream. */
        public final void activate()
        {
                // TODO: state tracking
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
        }
       
        /** Deactivate index stream. */
        public final void deactivate()
        {
                // TODO: state tracking
                Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0);
        }
       
        /** Get number of indices. */
        public final int getIndexCount()
        {
                return mIndexCount;
        }
       
}