diff --git a/src/gl/gl3immed.cpp b/src/gl/gl3immed.cpp index f37213a..b0cb76a 100644 --- a/src/gl/gl3immed.cpp +++ b/src/gl/gl3immed.cpp @@ -15,12 +15,10 @@ #include "rwgl3impl.h" #include "rwgl3shader.h" -extern float *gVertexBuffer; extern float *gVertexBufferIm2D; extern uint16_t *gIndicesIm2D; extern float *gVertexBufferIm3D; extern uint16_t *gIndicesIm3D; -extern uint16_t *gIndices; extern uint16_t *gConstIndices; namespace rw { @@ -218,8 +216,6 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags) SetRenderStatePtr(TEXTURERASTER, nil); memcpy_neon(gVertexBufferIm3D, vertices, numVertices*sizeof(Im3DVertex)); - vglVertexAttribPointerMapped(0, gVertexBufferIm3D); - gVertexBufferIm3D += numVertices*(sizeof(Im3DVertex)/sizeof(float)); #ifndef RW_GL_USE_VAOS //setAttribPointers(im3dattribDesc, 3); @@ -232,6 +228,8 @@ im3DRenderPrimitive(PrimitiveType primType) { flushCache(); vglIndexPointerMapped(gConstIndices); + vglVertexAttribPointerMapped(0, gVertexBufferIm3D); + gVertexBufferIm3D += num3DVertices*(sizeof(Im3DVertex)/sizeof(float)); vglDrawObjects(primTypeMap[primType], num3DVertices, GL_FALSE); } @@ -240,6 +238,8 @@ im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndic { memcpy_neon(gIndicesIm3D, indices, numIndices * 2); vglIndexPointerMapped(gIndicesIm3D); + vglVertexAttribPointerMapped(0, gVertexBufferIm3D); + gVertexBufferIm3D += num3DVertices*(sizeof(Im3DVertex)/sizeof(float)); gIndicesIm3D += numIndices; flushCache(); diff --git a/src/gl/gl3pipe.cpp b/src/gl/gl3pipe.cpp index e9ab046..80b75b2 100644 --- a/src/gl/gl3pipe.cpp +++ b/src/gl/gl3pipe.cpp @@ -32,7 +32,7 @@ freeInstanceData(Geometry *geometry) geometry->instData = nil; rwFree(header->indexBuffer); - //rwFree(header->vertexBuffer); + rwFree(header->vertexBuffer); rwFree(header->attribDesc); rwFree(header); } @@ -226,7 +226,7 @@ defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) // // Allocate vertex buffer // - //header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); + header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); //assert(header->vbo == 0); //glGenBuffers(1, &header->vbo); } @@ -237,7 +237,7 @@ defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) // Fill vertex buffer // - uint8 *verts = (uint8*)gVertexBuffer; + uint8 *verts = (uint8*)header->vertexBuffer; // Positions if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ @@ -283,9 +283,6 @@ defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) header->totalNumVertex, a->stride); } } - - vglVertexAttribPointerMapped(0, gVertexBuffer); - gVertexBuffer += (header->totalNumVertex*attribs[0].stride) / sizeof(float); } void diff --git a/src/gl/gl3render.cpp b/src/gl/gl3render.cpp index 6ea68bb..e8716bb 100644 --- a/src/gl/gl3render.cpp +++ b/src/gl/gl3render.cpp @@ -30,8 +30,11 @@ drawInst_simple(InstanceDataHeader *header, InstanceData *inst) { flushCache(); memcpy_neon(gIndices, (uint8_t*)header->indexBuffer + inst->offset, inst->numIndex * 2); - vglIndexPointerMapped(gIndices + inst->offset); + vglIndexPointerMapped(gIndices); gIndices += inst->numIndex; + memcpy_neon(gVertexBuffer, (uint8_t*)header->vertexBuffer, inst->numVertices * header->attribDesc[0].stride); + vglVertexAttribPointerMapped(0, gVertexBuffer); + gVertexBuffer += (inst->numVertices * header->attribDesc[0].stride) / sizeof(float); vglDrawObjects(header->primType, inst->numIndex, GL_FALSE); } @@ -81,7 +84,7 @@ drawInst(InstanceDataHeader *header, InstanceData *inst) void setAttribPointers(AttribDesc *attribDescs, int32 numAttribs) { - vglVertexAttribPointerMapped(0, gVertexBuffer); + //vglVertexAttribPointerMapped(0, gVertexBuffer); } void diff --git a/src/gl/gl3skin.cpp b/src/gl/gl3skin.cpp index 3783c58..fda79ef 100644 --- a/src/gl/gl3skin.cpp +++ b/src/gl/gl3skin.cpp @@ -119,7 +119,7 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) // // Allocate vertex buffer // - //header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); + header->vertexBuffer = rwNewT(uint8, header->totalNumVertex*stride, MEMDUR_EVENT | ID_GEOMETRY); //assert(header->vbo == 0); //glGenBuffers(1, &header->vbo); } @@ -131,7 +131,7 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) // Fill vertex buffer // - uint8 *verts = (uint8*)gVertexBuffer; + uint8 *verts = (uint8*)header->vertexBuffer; // Positions if(!reinstance || geo->lockedSinceInst&Geometry::LOCKVERTICES){ @@ -190,9 +190,6 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance) (RGBA*)skin->indices, header->totalNumVertex, a->stride); } - - vglVertexAttribPointerMapped(0, gVertexBuffer); - gVertexBuffer += (header->totalNumVertex*attribs[0].stride) / sizeof(float); } void diff --git a/src/gl/wdgl.cpp b/src/gl/wdgl.cpp index 3c89071..1f56815 100644 --- a/src/gl/wdgl.cpp +++ b/src/gl/wdgl.cpp @@ -91,22 +91,6 @@ printAttribInfo(AttribDesc *attribs, int n) } */ -#ifdef RW_OPENGL -void -setAttribPointers(InstanceDataHeader *inst) -{ - static GLenum attribType[] = { - GL_FLOAT, - GL_BYTE, GL_UNSIGNED_BYTE, - GL_SHORT, GL_UNSIGNED_SHORT - }; - for(int32 i = 0; i < inst->numAttribs; i++){ - AttribDesc *a = &inst->attribs[i]; - vglVertexAttribPointerMapped(a->index, (void*)(uint64)a->offset); - } -} -#endif - void packattrib(uint8 *dst, float32 *src, AttribDesc *a, float32 scale=1.0f) {