Use ram pointers instead of vbo in gl1immed

This commit is contained in:
Shinovon 2026-05-07 07:54:38 +05:00
parent 2390c67fa1
commit 301498e09e
2 changed files with 32 additions and 47 deletions

View file

@ -334,6 +334,7 @@ static int MapScanCode(TInt aScanCode, TInt aModifiers) {
case 'z': case 'z':
case 'Z': case 'Z':
case '1': case '1':
case EStdKeyDevice3:
return JOY_B; return JOY_B;
case 'x': case 'x':
case 'X': case 'X':

View file

@ -17,8 +17,6 @@
namespace rw { namespace rw {
namespace gles1 { namespace gles1 {
uint32 im2DVbo, im2DIbo;
static int primTypeMap[] = { static int primTypeMap[] = {
GL_POINTS, // invalid GL_POINTS, // invalid
GL_LINES, GL_LINES,
@ -32,15 +30,11 @@ static int primTypeMap[] = {
void void
openIm2D(void) openIm2D(void)
{ {
glGenBuffers(1, &im2DIbo);
glGenBuffers(1, &im2DVbo);
} }
void void
closeIm2D(void) closeIm2D(void)
{ {
glDeleteBuffers(1, &im2DIbo);
glDeleteBuffers(1, &im2DVbo);
} }
static Im2DVertex tmpprimbuf[3]; static Im2DVertex tmpprimbuf[3];
@ -70,15 +64,16 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
Camera *cam; Camera *cam;
cam = (Camera*)engine->currentCamera; cam = (Camera*)engine->currentCamera;
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im2DVertex), vertices, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), (void*)0); glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), vertices);
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, r)); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, r)));
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, u)); glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, u)));
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
@ -110,18 +105,17 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
Camera *cam; Camera *cam;
cam = (Camera*)engine->currentCamera; cam = (Camera*)engine->currentCamera;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2, indices, GL_DYNAMIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im2DVertex), vertices, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), (void*)0); glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), vertices);
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, r)); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, r)));
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, u)); glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, u)));
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
@ -133,7 +127,7 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
glLoadIdentity(); glLoadIdentity();
flushCache(); flushCache();
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, nil); glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPopMatrix(); glPopMatrix();
@ -147,30 +141,17 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
// Im3D // Im3D
static AttribDesc im3dattribDesc[3] = { static int32 num3DVertices;
{ ATTRIB_POS, GL_FLOAT, GL_FALSE, 3,
sizeof(Im3DVertex), 0 },
{ ATTRIB_COLOR, GL_UNSIGNED_BYTE, GL_TRUE, 4,
sizeof(Im3DVertex), OFFSET_OF(Im3DVertex, r) },
{ ATTRIB_TEXCOORDS0, GL_FLOAT, GL_FALSE, 2,
sizeof(Im3DVertex), OFFSET_OF(Im3DVertex, u) },
};
static uint32 im3DVbo, im3DIbo;
static int32 num3DVertices; // not actually needed here
static void* currentIm3dVertices; static void* currentIm3dVertices;
void void
openIm3D(void) openIm3D(void)
{ {
glGenBuffers(1, &im3DIbo);
glGenBuffers(1, &im3DVbo);
} }
void void
closeIm3D(void) closeIm3D(void)
{ {
glDeleteBuffers(1, &im3DIbo);
glDeleteBuffers(1, &im3DVbo);
} }
void void
@ -186,21 +167,23 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags)
if((flags & im3d::VERTEXUV) == 0) if((flags & im3d::VERTEXUV) == 0)
SetRenderStatePtr(TEXTURERASTER, nil); SetRenderStatePtr(TEXTURERASTER, nil);
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo); currentIm3dVertices = vertices;
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im3DVertex), vertices, GL_DYNAMIC_DRAW);
num3DVertices = numVertices; num3DVertices = numVertices;
} }
void void
im3DRenderPrimitive(PrimitiveType primType) im3DRenderPrimitive(PrimitiveType primType)
{ {
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo); glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), (void*)0); glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), currentIm3dVertices);
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, r)); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r)));
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, u)); glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)));
flushCache(); flushCache();
glDrawArrays(primTypeMap[primType], 0, num3DVertices); glDrawArrays(primTypeMap[primType], 0, num3DVertices);
@ -213,19 +196,20 @@ im3DRenderPrimitive(PrimitiveType primType)
void void
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
{ {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2, indices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), (void*)0); glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), currentIm3dVertices);
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, r)); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r)));
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, u)); glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)));
flushCache(); flushCache();
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, nil); glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_COLOR_ARRAY);