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