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