1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00
Beef/BeefySysLib/gfx/RenderDevice.cpp
Brian Fiete b63a243fd7 Working on installer, fixing more Win32 issues
Throwing error on member references with ".." cascade token outside invocations (ie: "ts..mA = 123")
Fixed 'Thread.ModuleTLSIndex' error - which caused us TLS lookup failures in Beef DLLs
Fixed some hotswap errors
Made BeefPerf shut down properly
Fixed an 'int literal' FixIntUnknown issue where rhs was System.Object which caused an illegal boxing
Fixed COFF::LocateSymbol issues with Win32 and also with linking to static libraries - showed up with hot-linking in fmod when hot-adding a floating point mod
Fixed a couple memory leaks
Fixed alignment issue in COFF::ParseCompileUnit
2019-09-02 17:39:47 -07:00

151 lines
3.2 KiB
C++

#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/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;
mShader = NULL;
mClipped = false;
}
RenderTarget::RenderTarget()
{
mWidth = 0;
mHeight = 0;
mHasBeenDrawnTo = false;
mHasBeenTargeted = false;
mResizeNum = 0;
}
RenderWindow::RenderWindow()
{
mCurDrawLayer = NULL;
mRenderDevice = NULL;
mWindow = NULL;
}
RenderWindow::~RenderWindow()
{
for (auto drawLayer : mDrawLayerList)
delete drawLayer;
}
///
RenderDevice::RenderDevice() :
mPooledIndexBuffers(DRAWBUFFER_IDXBUFFER_SIZE),
mPooledVertexBuffers(DRAWBUFFER_VTXBUFFER_SIZE),
mPooledRenderCmdBuffers(DRAWBUFFER_CMDBUFFER_SIZE)
{
mCurRenderState = NULL;
mDefaultRenderState = NULL;
mPhysRenderState = mDefaultRenderState;
mResizeCount = 0;
mCurRenderTarget = NULL;
mCurDrawLayer = NULL;
mPhysRenderWindow = NULL;
}
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)
ext = fileName.Substring(dotPos);
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;
}
else if (ext == ".tga")
imageData = new TGAData();
else if (ext == ".png")
imageData = new PNGData();
else if (ext == ".jpg")
imageData = new JPEGData();
else if (ext == ".pvr")
imageData = new PVRData();
else
{
BF_FATAL("Unknown texture format");
return NULL; // Unknown format
}
if (!handled)
{
imageData->mWantsAlphaPremultiplied = (flags & TextureFlag_NoPremult) == 0;
if (!imageData->LoadFromFile(fileName))
{
failed = true;
BF_FATAL("Failed to load image");
}
}
Texture* aTexture = NULL;
if (!failed)
aTexture = LoadTexture(imageData, flags);
delete imageData;
return aTexture;
}