Subversion Repositories AndroidProjects

Rev

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

Rev Author Line No. Line
786 chris 1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
 
7
using Tao.OpenGl;
8
 
790 chris 9
using BauzoidNET.graphics;
10
 
1451 chris 11
#pragma warning disable 0618
12
 
786 chris 13
namespace BauzoidNET.graphics.model
14
{
790 chris 15
    public class IndexStream : GraphicsObject
786 chris 16
    {
17
        private static List<IndexStream> mManagedStreams = new List<IndexStream>();
18
 
19
            private int mIndexCount = 0;
20
            //private ShortBuffer mData;
21
        private short[] mData = null;
22
 
23
            private int mBufferID = 0;
24
            //private static int[] BUFFERID = new int[1];
787 chris 25
            private int[] BUFFERID = new int[1];
786 chris 26
 
27
            /** Constructor. */
790 chris 28
            public IndexStream(Graphics graphics)
29
            : base(graphics)
786 chris 30
            {          
31
                    mManagedStreams.Add(this);
32
            }  
33
 
34
            /** Destroy internal data. */
35
            public void dispose()
36
            {
37
                    mManagedStreams.Remove(this);
38
 
39
                    unload();
40
                    mIndexCount = 0;
41
                    mData = null;
42
            }
43
 
44
            /** Set the data. */
45
            /*public void setData(byte[] data)
46
            {
47
                    if (data == null)
48
                    {
49
                            dispose();
50
                            return;
51
                    }
52
 
53
                    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(data.length);
54
                    byteBuffer.order(ByteOrder.nativeOrder());
55
                    byteBuffer.put(data);
56
                    byteBuffer.position(0);
57
                    mData = byteBuffer.asShortBuffer();
58
 
59
                    mIndexCount = data.length;
60
            }*/
61
 
62
            /** Set the data. */
63
            public void setData(short[] data)
64
            {
65
                    if (data == null)
66
                    {
67
                            dispose();
68
                            return;
69
                    }
70
 
71
/*                  mData = BufferUtils.newShortBuffer(data.length);
72
                    mData.put(data);
73
                    mData.position(0);
74
 
75
                    mIndexCount = data.length;*/
76
 
77
            mIndexCount = data.Length;
78
            mData = (short[])data.Clone();
79
            }
80
 
81
            /** Reload all managed index streams. */
82
            public static void reloadManagedStreams()
83
            {
84
                    for (int i = 0; i < mManagedStreams.Count; i++)
85
                    {
86
                            IndexStream stream = mManagedStreams[i];
87
                            stream.upload();
88
                            //Gdx.app.log(Consts.LOG_TAG, "IndexStream reloaded!");
89
                    }
90
            }  
91
 
92
            /** Create handle and upload indices to hardware. */
93
            public void upload()
94
            {
95
                    if (mData == null)
96
                            return;
97
 
98
                    Gl.glGenBuffers(1, BUFFERID);
99
                    mBufferID = BUFFERID[0];
100
 
101
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
102
                    Gl.glBufferData(Gl.GL_ELEMENT_ARRAY_BUFFER, (IntPtr)(mData.Length * sizeof(short)), mData, Gl.GL_STATIC_DRAW);
103
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, 0);
104
            }
105
 
106
            /** Reload indices to hardware. */
107
            public void reupload()
108
            {
109
                    if (mBufferID == 0)
110
                    {
111
                            // perform initial upload
112
                            upload();
113
                            return;
114
                    }
115
 
116
                    if (mData == null)
117
                            return;
118
 
119
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
120
                    Gl.glBufferSubData(Gl.GL_ELEMENT_ARRAY_BUFFER, (IntPtr)0, (IntPtr)(mData.Length * sizeof(short)), mData);
121
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, 0);            
122
            }
123
 
124
            /** Unload indices from hardware. */
125
            public void unload()
126
            {
127
                    BUFFERID[0] = mBufferID;
128
                    Gl.glDeleteBuffers(1, BUFFERID);
129
                    mBufferID = 0;
130
            }
131
 
132
            /** Activate index stream. */
133
            public void activate()
134
            {
135
                    // TODO: state tracking
136
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, mBufferID);
137
            }
138
 
139
            /** Deactivate index stream. */
140
            public void deactivate()
141
            {
142
                    // TODO: state tracking
787 chris 143
                    Gl.glBindBuffer(Gl.GL_ELEMENT_ARRAY_BUFFER, 0);
786 chris 144
            }
145
 
146
            /** Get number of indices. */
147
            public int getIndexCount()
148
            {
149
                    return mIndexCount;
150
            }
151
 
152
    }
153
}