1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00
Beef/BeefySysLib/gfx/DrawLayer.h
2021-05-12 07:24:29 -04:00

118 lines
2.8 KiB
C++

#pragma once
#include "Common.h"
#include "util/SLIList.h"
#include "fbx/FBXReader.h"
#include "gfx/RenderCmd.h"
#include "gfx/RenderDevice.h"
NS_BF_BEGIN;
class RenderWindow;
class Texture;
class Shader;
class ShaderPass;
class BFApp;
class Vertex3D;
class DrawLayer;
class RenderState;
#define MAX_TEXTURES 4
class DrawBatch : public RenderCmd
{
public:
DrawLayer* mDrawLayer;
int mId;
bool mIsVertexBufferHead;
bool mIsIndexBufferHead;
void* mVertices;
int mVtxSize;
int mVtxIdx;
int mAllocatedVertices;
uint16* mIndices;
int mIdxIdx;
int mAllocatedIndices;
Texture* mCurTextures[MAX_TEXTURES];
public:
DrawBatch();
virtual ~DrawBatch();
virtual void Free() override;
void Clear();
DrawBatch* AllocateChainedBatch(int minVtxCount, int minIdxCount);
virtual void* AllocTris(int vtxCount);
virtual void* AllocStrip(int vtxCount);
virtual void AllocIndexed(int vtxCount, int idxCount, void** verticesOut, uint16** indicesOut, uint16* idxOfsOut);
};
#define DRAWBUFFER_CMDBUFFER_SIZE 64*1024
class DrawLayer
{
public:
SLIList<RenderCmd*> mRenderCmdList;
DrawBatch* mCurDrawBatch;
RenderWindow* mRenderWindow;
RenderDevice* mRenderDevice;
void* mIdxBuffer;
void* mVtxBuffer;
void* mRenderCmdBuffer;
int mIdxByteIdx;
int mVtxByteIdx;
int mRenderCmdByteIdx;
Texture* mCurTextures[MAX_TEXTURES];
public:
template <typename T>
T* AllocRenderCmd(int extraBytes = 0)
{
if (mRenderCmdByteIdx + sizeof(T) + extraBytes >= DRAWBUFFER_CMDBUFFER_SIZE)
{
mRenderCmdBuffer = mRenderDevice->mPooledRenderCmdBuffers.AllocMemoryBlock();
T* cmd = new(mRenderCmdBuffer) T();
cmd->mIsPoolHead = true;
mRenderCmdByteIdx = sizeof(T) + extraBytes;
return cmd;
}
T* cmd = new((uint8*)mRenderCmdBuffer + mRenderCmdByteIdx) T();
cmd->mIsPoolHead = false;
mRenderCmdByteIdx += sizeof(T) + extraBytes;
return cmd;
}
public:
void CloseDrawBatch();
virtual DrawBatch* CreateDrawBatch() = 0;
virtual DrawBatch* AllocateBatch(int minVtxCount, int minIdxCount);
void QueueRenderCmd(RenderCmd* renderCmd);
virtual RenderCmd* CreateSetTextureCmd(int textureIdx, Texture* texture) = 0;
virtual void SetShaderConstantData(int usageIdx, int slotIdx, void* constData, int size) = 0;
virtual void SetShaderConstantDataTyped(int usageIdx, int slotIdx, void* constData, int size, int* typeData, int typeCount);
public:
DrawLayer();
virtual ~DrawLayer();
virtual void Draw();
virtual void Flush();
virtual void Clear();
virtual void* AllocTris(int vtxCount);
virtual void* AllocStrip(int vtxCount);
virtual void AllocIndexed(int vtxCount, int idxCount, void** verticesOut, uint16** indicesOut, uint16* idxOfsOut);
virtual void SetTexture(int texIdx, Texture* texture);
};
NS_BF_END;