Subversion Repositories AndroidProjects

Rev

Rev 790 | Blame | Compare with Previous | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Tao.OpenGl;

using BauzoidNET.graphics;

#pragma warning disable 0618

namespace BauzoidNET.graphics.model
{
    public class IndexStream : GraphicsObject
    {
        private static List<IndexStream> mManagedStreams = new List<IndexStream>();
       
            private int mIndexCount = 0;
            //private ShortBuffer mData;
        private short[] mData = null;
       
            private int mBufferID = 0;
            //private static int[] BUFFERID = new int[1];
            private int[] BUFFERID = new int[1];
       
            /** Constructor. */
            public IndexStream(Graphics graphics)
            : base(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;*/


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