verus/Verus/src/CGI/BaseRenderer.cpp
2019-11-01 01:00:26 +03:00

124 lines
3.2 KiB
C++

#include "verus.h"
using namespace verus;
using namespace verus::CGI;
BaseRenderer::BaseRenderer()
{
}
BaseRenderer::~BaseRenderer()
{
}
PBaseRenderer BaseRenderer::Load(CSZ dll, RBaseRendererDesc desc)
{
#ifdef _WIN32
PFNVERUSCREATERENDERER VerusCreateRenderer = reinterpret_cast<PFNVERUSCREATERENDERER>(
GetProcAddress(LoadLibraryA(dll), "VerusCreateRenderer"));
return VerusCreateRenderer(VERUS_SDK_VERSION, &desc);
#else
PFNVERUSCREATERENDERER VerusCreateRenderer = reinterpret_cast<PFNVERUSCREATERENDERER>(
dlsym(dlopen("./libRenderOpenGL.so", RTLD_LAZY), "VerusCreateRenderer"));
return VerusCreateRenderer(VERUS_SDK_VERSION, &desc);
#endif
}
void BaseRenderer::SetAlphaBlendHelper(
CSZ sz,
int& colorBlendOp,
int& alphaBlendOp,
int& srcColorBlendFactor,
int& dstColorBlendFactor,
int& srcAlphaBlendFactor,
int& dstAlphaBlendFactor)
{
enum BLENDOP
{
BLENDOP_ADD,
BLENDOP_SUBTRACT,
BLENDOP_REVSUBTRACT,
BLENDOP_MIN,
BLENDOP_MAX
};
colorBlendOp = -1;
alphaBlendOp = -1;
srcColorBlendFactor = 0;
dstColorBlendFactor = 0;
srcAlphaBlendFactor = 0;
dstAlphaBlendFactor = 0;
CSZ p = sz;
static CSZ ppMinMax[] = { "min(", "max(", nullptr };
if ('m' == *p)
{
switch (RendererParser::Expect(p, ppMinMax))
{
case 0: colorBlendOp = BLENDOP_MIN; break;
case 1: colorBlendOp = BLENDOP_MAX; break;
}
alphaBlendOp = colorBlendOp;
return;
}
static CSZ ppInvert[] = { "s*(", "d*(", nullptr };
switch (RendererParser::Expect(p, ppInvert))
{
case 0: break;
case 1: colorBlendOp = BLENDOP_REVSUBTRACT; break;
default: VERUS_RT_FAIL("FAIL: color s/d not found.");
}
srcColorBlendFactor = RendererParser::ExpectBlendOp(p);
p += VERUS_LITERAL_LENGTH(")");
static CSZ ppSign[] = { "+", "-", ",", nullptr };
switch (RendererParser::Expect(p, ppSign))
{
case 0: if (-1 == colorBlendOp) colorBlendOp = BLENDOP_ADD; break;
case 1: if (-1 == colorBlendOp) colorBlendOp = BLENDOP_SUBTRACT; break;
case 2: break;
default: VERUS_RT_FAIL("FAIL: invalid color op.");
}
p += VERUS_LITERAL_LENGTH("d*(");
dstColorBlendFactor = RendererParser::ExpectBlendOp(p);
p += VERUS_LITERAL_LENGTH(")");
if (BLENDOP_MIN == colorBlendOp || BLENDOP_MAX == colorBlendOp)
p += VERUS_LITERAL_LENGTH(")");
if ('|' == *p)
{
if ('m' == *p)
{
switch (RendererParser::Expect(p, ppMinMax))
{
case 0: alphaBlendOp = BLENDOP_MIN; break;
case 1: alphaBlendOp = BLENDOP_MAX; break;
}
}
switch (RendererParser::Expect(p, ppInvert))
{
case 0: break;
case 1: alphaBlendOp = BLENDOP_REVSUBTRACT; break;
default: VERUS_RT_FAIL("FAIL: alpha s/d not found.");
}
srcAlphaBlendFactor = RendererParser::ExpectBlendOp(p);
p += VERUS_LITERAL_LENGTH(")");
switch (RendererParser::Expect(p, ppSign))
{
case 0: if (-1 == alphaBlendOp) alphaBlendOp = BLENDOP_ADD; break;
case 1: if (-1 == alphaBlendOp) alphaBlendOp = BLENDOP_SUBTRACT; break;
case 2: break;
default: VERUS_RT_FAIL("FAIL: invalid alpha op.");
}
p += VERUS_LITERAL_LENGTH("d*(");
dstAlphaBlendFactor = RendererParser::ExpectBlendOp(p);
p += VERUS_LITERAL_LENGTH(")");
}
else
{
alphaBlendOp = colorBlendOp;
srcAlphaBlendFactor = srcColorBlendFactor;
dstAlphaBlendFactor = dstColorBlendFactor;
}
}