1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/BeefySysLib/gfx/RenderDevice.cpp

194 lines
4.1 KiB
C++
Raw Normal View History

2019-08-23 11:56:54 -07:00
#include "RenderDevice.h"
#include "BFApp.h"
#include "Shader.h"
#include "Texture.h"
#include "gfx/DrawLayer.h"
#include "img/TGAData.h"
#include "img/PNGData.h"
#include "img/PVRData.h"
#include "img/BMPData.h"
2019-08-23 11:56:54 -07:00
#include "img/BFIData.h"
#include "img/JPEGData.h"
#include "util/PerfTimer.h"
#include "util/AllocDebug.h"
USING_NS_BF;
RenderState::RenderState()
{
mWriteDepthBuffer = false;
mCullMode = CullMode_None;
mDepthFunc = DepthFunc_Always;
2021-05-25 10:57:22 -04:00
mTopology = Topology3D_TriangleList;
2022-11-03 10:58:24 -07:00
mShader = NULL;
2019-08-23 11:56:54 -07:00
mClipped = false;
2021-05-12 07:24:29 -04:00
mTexWrap = false;
2021-05-25 10:57:22 -04:00
mWireframe = false;
2019-08-23 11:56:54 -07:00
}
RenderTarget::RenderTarget()
{
mWidth = 0;
mHeight = 0;
mHasBeenDrawnTo = false;
mHasBeenTargeted = false;
2022-11-03 10:58:24 -07:00
mResizeNum = 0;
mWantsClear = true;
mResetClear = false;
2019-08-23 11:56:54 -07:00
}
RenderWindow::RenderWindow()
{
2022-11-03 10:58:24 -07:00
mCurDrawLayer = NULL;
2019-08-23 11:56:54 -07:00
mRenderDevice = NULL;
mWindow = NULL;
}
RenderWindow::~RenderWindow()
2022-11-03 10:58:24 -07:00
{
2019-08-23 11:56:54 -07:00
for (auto drawLayer : mDrawLayerList)
delete drawLayer;
}
///
RenderDevice::RenderDevice() :
mPooledIndexBuffers(DRAWBUFFER_IDXBUFFER_SIZE),
mPooledVertexBuffers(DRAWBUFFER_VTXBUFFER_SIZE),
mPooledRenderCmdBuffers(DRAWBUFFER_CMDBUFFER_SIZE)
2022-11-03 10:58:24 -07:00
{
mCurRenderState = NULL;
2019-08-23 11:56:54 -07:00
mDefaultRenderState = NULL;
mPhysRenderState = mDefaultRenderState;
mResizeCount = 0;
2022-11-03 10:58:24 -07:00
mCurRenderTarget = NULL;
2019-08-23 11:56:54 -07:00
mCurDrawLayer = NULL;
2022-11-03 10:58:24 -07:00
mPhysRenderWindow = NULL;
2022-05-15 08:00:55 -07:00
mApp = NULL;
2019-08-23 11:56:54 -07:00
}
RenderDevice::~RenderDevice()
{
for (auto batch : mDrawBatchPool)
delete batch;
}
void RenderDevice::AddRenderWindow(RenderWindow* renderWindow)
{
mRenderWindowList.push_back(renderWindow);
}
void RenderDevice::RemoveRenderWindow(RenderWindow* renderWindow)
{
mRenderWindowList.erase(std::find(mRenderWindowList.begin(), mRenderWindowList.end(), renderWindow));
}
void RenderDevice::FrameEnd()
{
}
RenderState* RenderDevice::CreateRenderState(RenderState* srcRenderState)
{
RenderState* renderState = new RenderState();
if (srcRenderState != NULL)
*renderState = *srcRenderState;
return renderState;
}
VertexDefinition* Beefy::RenderDevice::CreateVertexDefinition(VertexDefData* elementData, int numElements)
{
VertexDefinition* vertexDefinition = new VertexDefinition();
vertexDefinition->mElementData = new VertexDefData[numElements];
vertexDefinition->mNumElements = numElements;
memcpy(vertexDefinition->mElementData, elementData, numElements * sizeof(VertexDefData));
return vertexDefinition;
}
Texture* RenderDevice::LoadTexture(const StringImpl& fileName, int flags)
{
int dotPos = (int)fileName.LastIndexOf('.');
String ext;
if (dotPos != -1)
2022-11-03 10:58:24 -07:00
ext = fileName.Substring(dotPos);
2021-05-12 07:24:29 -04:00
2019-08-23 11:56:54 -07:00
ImageData* imageData = NULL;
bool handled = false;
bool failed = false;
if (fileName == "!white")
{
imageData = new ImageData();
imageData->CreateNew(1, 1, true);
imageData->mBits[0] = 0xFFFFFFFF;
handled = true;
}
2023-07-26 09:39:14 -07:00
else if (fileName.StartsWith("!square"))
{
int squareSize = atoi(fileName.c_str() + 7);
imageData = new ImageData();
imageData->CreateNew(squareSize + 2, squareSize + 2, true);
for (int y = 0; y < squareSize; y++)
{
for (int x = 0; x < squareSize; x++)
{
imageData->mBits[(y + 1) * (squareSize + 2) + x + 1] = 0xFFFFFFFF;
}
}
handled = true;
}
else if (ext == ".tga")
2022-11-03 10:58:24 -07:00
imageData = new TGAData();
2019-08-23 11:56:54 -07:00
else if (ext == ".png")
imageData = new PNGData();
else if (ext == ".jpg")
imageData = new JPEGData();
else if (ext == ".pvr")
imageData = new PVRData();
else if (ext == ".bmp")
{
BMPData* bmpData = new BMPData();
bmpData->mHasTransFollowing = (flags & TextureFlag_HasTransFollowing) == 0;;
imageData = bmpData;
}
2019-08-23 11:56:54 -07:00
else
{
return NULL; // Unknown format
}
2022-11-03 10:58:24 -07:00
if (!handled)
2019-08-23 11:56:54 -07:00
{
2022-11-03 10:58:24 -07:00
imageData->mWantsAlphaPremultiplied = (flags & TextureFlag_NoPremult) == 0;
2025-01-17 10:18:50 -08:00
void* memPtr = NULL;
int memLen = 0;
if (ParseMemorySpan(fileName, memPtr, memLen))
{
if (!imageData->LoadFromMemory(memPtr, memLen))
2021-04-12 17:22:47 -04:00
{
failed = true;
2023-12-09 09:10:44 -05:00
delete imageData;
return NULL;
2021-04-12 17:22:47 -04:00
}
}
else
{
if (!imageData->LoadFromFile(fileName))
{
failed = true;
2023-12-09 09:10:44 -05:00
delete imageData;
return NULL;
2021-04-12 17:22:47 -04:00
}
}
}
2019-08-23 11:56:54 -07:00
Texture* aTexture = NULL;
if (!failed)
2019-08-23 11:56:54 -07:00
aTexture = LoadTexture(imageData, flags);
2022-11-03 10:58:24 -07:00
imageData->Deref();
2019-08-23 11:56:54 -07:00
return aTexture;
}