#ifndef _HW__VERTEXBUFFER_H #define _HW__VERTEXBUFFER_H #include "tarray.h" #include "hwrenderer/data/buffers.h" #include #include class FRenderState; struct secplane_t; struct subsector_t; struct FFlatVertex { float x, z, y; // world position float u, v; // texture coordinates void Set(float xx, float zz, float yy, float uu, float vv) { x = xx; z = zz; y = yy; u = uu; v = vv; } void SetVertex(float _x, float _y, float _z = 0) { x = _x; z = _y; y = _z; } void SetTexCoord(float _u = 0, float _v = 0) { u = _u; v = _v; } }; class FFlatVertexBuffer { TArray vbo_shadowdata; TArray ibo_data; IVertexBuffer *mVertexBuffer; IIndexBuffer *mIndexBuffer; unsigned int mIndex; std::atomic mCurIndex; unsigned int mNumReserved; static const unsigned int BUFFER_SIZE = 4000000; // Was upped from 2000000 to account for voxels not being implemented with a separate vertex buffer. static const unsigned int BUFFER_SIZE_TO_USE = BUFFER_SIZE-500; public: enum { QUAD_INDEX = 0, FULLSCREEN_INDEX = 4, PRESENT_INDEX = 8, STENCILTOP_INDEX = 12, STENCILBOTTOM_INDEX = 16, NUM_RESERVED = 20 }; FFlatVertexBuffer(int width, int height); ~FFlatVertexBuffer(); void OutputResized(int width, int height); std::pair GetBufferObjects() const { return std::make_pair(mVertexBuffer, mIndexBuffer); } void Copy(int start, int count); FFlatVertex *GetBuffer(int index) const { FFlatVertex *ff = (FFlatVertex*)mVertexBuffer->Memory(); return &ff[index]; } FFlatVertex *GetBuffer() const { return GetBuffer(mCurIndex); } std::pair AllocVertices(unsigned int count); void Reset() { mCurIndex = mIndex; } void Map() { mVertexBuffer->Map(); } void Unmap() { mVertexBuffer->Unmap(); } }; #endif