Renderer/RenderStates: Update RenderStates structure (preparing for renderer update)
Former-commit-id: 8839ceda70dfa0384e8da43205a208c89f1eb7bf [formerly f5434c9c44a52e02fdc6970e443cd7d3e9e99e6b] Former-commit-id: 6a4846a2e2c8b60160598812ebd02da17a2f6947
This commit is contained in:
@@ -652,7 +652,7 @@ namespace Nz
|
||||
|
||||
void DebugDrawer::EnableDepthBuffer(bool depthBuffer)
|
||||
{
|
||||
s_renderStates.parameters[RendererParameter_DepthBuffer] = depthBuffer;
|
||||
s_renderStates.depthBuffer = depthBuffer;
|
||||
}
|
||||
|
||||
float DebugDrawer::GetLineWidth()
|
||||
@@ -698,7 +698,7 @@ namespace Nz
|
||||
}
|
||||
|
||||
s_primaryColor = Color::Red;
|
||||
s_renderStates.parameters[RendererParameter_DepthBuffer] = true;
|
||||
s_renderStates.depthBuffer = true;
|
||||
s_secondaryColor = Color::Green;
|
||||
|
||||
s_initialized = true;
|
||||
@@ -709,7 +709,7 @@ namespace Nz
|
||||
|
||||
bool DebugDrawer::IsDepthBufferEnabled()
|
||||
{
|
||||
return s_renderStates.parameters[RendererParameter_DepthBuffer];
|
||||
return s_renderStates.depthBuffer;
|
||||
}
|
||||
|
||||
void DebugDrawer::SetLineWidth(float width)
|
||||
|
||||
@@ -158,7 +158,7 @@ namespace Nz
|
||||
RenderStates& currentRenderStates = s_contextStates->renderStates;
|
||||
|
||||
// Les fonctions de blend n'a aucun intérêt sans blending
|
||||
if (states.parameters[RendererParameter_Blend])
|
||||
if (states.blending)
|
||||
{
|
||||
if (currentRenderStates.dstBlend != states.dstBlend ||
|
||||
currentRenderStates.srcBlend != states.srcBlend)
|
||||
@@ -169,7 +169,7 @@ namespace Nz
|
||||
}
|
||||
}
|
||||
|
||||
if (states.parameters[RendererParameter_DepthBuffer])
|
||||
if (states.depthBuffer)
|
||||
{
|
||||
// La comparaison de profondeur n'a aucun intérêt sans depth buffer
|
||||
if (currentRenderStates.depthFunc != states.depthFunc)
|
||||
@@ -179,20 +179,20 @@ namespace Nz
|
||||
}
|
||||
|
||||
// Le DepthWrite n'a aucune importance si le DepthBuffer est désactivé
|
||||
if (currentRenderStates.parameters[RendererParameter_DepthWrite] != states.parameters[RendererParameter_DepthWrite])
|
||||
if (currentRenderStates.depthWrite != states.depthWrite)
|
||||
{
|
||||
glDepthMask((states.parameters[RendererParameter_DepthWrite]) ? GL_TRUE : GL_FALSE);
|
||||
currentRenderStates.parameters[RendererParameter_DepthWrite] = states.parameters[RendererParameter_DepthWrite];
|
||||
glDepthMask((states.depthWrite) ? GL_TRUE : GL_FALSE);
|
||||
currentRenderStates.depthWrite = states.depthWrite;
|
||||
}
|
||||
}
|
||||
|
||||
// Inutile de changer le mode de face culling s'il n'est pas actif
|
||||
if (states.parameters[RendererParameter_FaceCulling])
|
||||
if (states.faceCulling)
|
||||
{
|
||||
if (currentRenderStates.faceCulling != states.faceCulling)
|
||||
if (currentRenderStates.cullingSide != states.cullingSide)
|
||||
{
|
||||
glCullFace(FaceSide[states.faceCulling]);
|
||||
currentRenderStates.faceCulling = states.faceCulling;
|
||||
glCullFace(FaceSide[states.cullingSide]);
|
||||
currentRenderStates.cullingSide = states.cullingSide;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,33 +203,46 @@ namespace Nz
|
||||
}
|
||||
|
||||
// Ici encore, ça ne sert à rien de se soucier des fonctions de stencil sans qu'il soit activé
|
||||
if (states.parameters[RendererParameter_StencilTest])
|
||||
if (states.stencilTest)
|
||||
{
|
||||
for (unsigned int i = 0; i < 2; ++i)
|
||||
if (currentRenderStates.stencilCompare.back != states.stencilCompare.back ||
|
||||
currentRenderStates.stencilReference.back != states.stencilReference.back ||
|
||||
currentRenderStates.stencilWriteMask.back != states.stencilWriteMask.back)
|
||||
{
|
||||
GLenum face = (i == 0) ? GL_BACK : GL_FRONT;
|
||||
const RenderStates::Face& srcStates = (i == 0) ? states.backFace : states.frontFace;
|
||||
RenderStates::Face& dstStates = (i == 0) ? currentRenderStates.backFace : currentRenderStates.frontFace;
|
||||
glStencilFuncSeparate(GL_BACK, RendererComparison[states.stencilCompare.back], states.stencilReference.back, states.stencilWriteMask.back);
|
||||
currentRenderStates.stencilCompare.back = states.stencilCompare.back;
|
||||
currentRenderStates.stencilReference.back = states.stencilReference.back;
|
||||
currentRenderStates.stencilWriteMask.back = states.stencilWriteMask.back;
|
||||
}
|
||||
|
||||
if (dstStates.stencilCompare != srcStates.stencilCompare ||
|
||||
dstStates.stencilMask != srcStates.stencilMask ||
|
||||
dstStates.stencilReference != srcStates.stencilReference)
|
||||
{
|
||||
glStencilFuncSeparate(face, RendererComparison[srcStates.stencilCompare], srcStates.stencilReference, srcStates.stencilMask);
|
||||
dstStates.stencilCompare = srcStates.stencilCompare;
|
||||
dstStates.stencilMask = srcStates.stencilMask;
|
||||
dstStates.stencilReference = srcStates.stencilReference;
|
||||
}
|
||||
if (currentRenderStates.stencilDepthFail.back != states.stencilDepthFail.back ||
|
||||
currentRenderStates.stencilFail.back != states.stencilFail.back ||
|
||||
currentRenderStates.stencilPass.back != states.stencilPass.back)
|
||||
{
|
||||
glStencilOpSeparate(GL_BACK, StencilOperation[states.stencilFail.back], StencilOperation[states.stencilDepthFail.back], StencilOperation[states.stencilPass.back]);
|
||||
currentRenderStates.stencilDepthFail.back = states.stencilDepthFail.back;
|
||||
currentRenderStates.stencilFail.back = states.stencilFail.back;
|
||||
currentRenderStates.stencilPass.back = states.stencilPass.back;
|
||||
}
|
||||
|
||||
if (dstStates.stencilFail != srcStates.stencilFail ||
|
||||
dstStates.stencilPass != srcStates.stencilPass ||
|
||||
dstStates.stencilZFail != srcStates.stencilZFail)
|
||||
{
|
||||
glStencilOpSeparate(face, StencilOperation[srcStates.stencilFail], StencilOperation[srcStates.stencilZFail], StencilOperation[srcStates.stencilPass]);
|
||||
dstStates.stencilFail = srcStates.stencilFail;
|
||||
dstStates.stencilPass = srcStates.stencilPass;
|
||||
dstStates.stencilZFail = srcStates.stencilZFail;
|
||||
}
|
||||
if (currentRenderStates.stencilCompare.front != states.stencilCompare.front ||
|
||||
currentRenderStates.stencilReference.front != states.stencilReference.front ||
|
||||
currentRenderStates.stencilWriteMask.front != states.stencilWriteMask.front)
|
||||
{
|
||||
glStencilFuncSeparate(GL_FRONT, RendererComparison[states.stencilCompare.front], states.stencilReference.front, states.stencilWriteMask.front);
|
||||
currentRenderStates.stencilCompare.front = states.stencilCompare.front;
|
||||
currentRenderStates.stencilReference.front = states.stencilReference.front;
|
||||
currentRenderStates.stencilWriteMask.front = states.stencilWriteMask.front;
|
||||
}
|
||||
|
||||
if (currentRenderStates.stencilDepthFail.front != states.stencilDepthFail.front ||
|
||||
currentRenderStates.stencilFail.front != states.stencilFail.front ||
|
||||
currentRenderStates.stencilPass.front != states.stencilPass.front)
|
||||
{
|
||||
glStencilOpSeparate(GL_FRONT, StencilOperation[states.stencilFail.front], StencilOperation[states.stencilDepthFail.front], StencilOperation[states.stencilPass.front]);
|
||||
currentRenderStates.stencilDepthFail.front = states.stencilDepthFail.front;
|
||||
currentRenderStates.stencilFail.front = states.stencilFail.front;
|
||||
currentRenderStates.stencilPass.front = states.stencilPass.front;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,62 +259,62 @@ namespace Nz
|
||||
}
|
||||
|
||||
// Paramètres de rendu
|
||||
if (currentRenderStates.parameters[RendererParameter_Blend] != states.parameters[RendererParameter_Blend])
|
||||
if (currentRenderStates.blending != states.blending)
|
||||
{
|
||||
if (states.parameters[RendererParameter_Blend])
|
||||
if (states.blending)
|
||||
glEnable(GL_BLEND);
|
||||
else
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_Blend] = states.parameters[RendererParameter_Blend];
|
||||
currentRenderStates.blending = states.blending;
|
||||
}
|
||||
|
||||
if (currentRenderStates.parameters[RendererParameter_ColorWrite] != states.parameters[RendererParameter_ColorWrite])
|
||||
if (currentRenderStates.colorWrite != states.colorWrite)
|
||||
{
|
||||
GLboolean param = (states.parameters[RendererParameter_ColorWrite]) ? GL_TRUE : GL_FALSE;
|
||||
GLboolean param = (states.colorWrite) ? GL_TRUE : GL_FALSE;
|
||||
glColorMask(param, param, param, param);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_ColorWrite] = states.parameters[RendererParameter_ColorWrite];
|
||||
currentRenderStates.colorWrite = states.colorWrite;
|
||||
}
|
||||
|
||||
if (currentRenderStates.parameters[RendererParameter_DepthBuffer] != states.parameters[RendererParameter_DepthBuffer])
|
||||
if (currentRenderStates.depthBuffer != states.depthBuffer)
|
||||
{
|
||||
if (states.parameters[RendererParameter_DepthBuffer])
|
||||
if (states.depthBuffer)
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
else
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_DepthBuffer] = states.parameters[RendererParameter_DepthBuffer];
|
||||
currentRenderStates.depthBuffer = states.depthBuffer;
|
||||
}
|
||||
|
||||
if (currentRenderStates.parameters[RendererParameter_FaceCulling] != states.parameters[RendererParameter_FaceCulling])
|
||||
if (currentRenderStates.faceCulling != states.faceCulling)
|
||||
{
|
||||
if (states.parameters[RendererParameter_FaceCulling])
|
||||
if (states.faceCulling)
|
||||
glEnable(GL_CULL_FACE);
|
||||
else
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_FaceCulling] = states.parameters[RendererParameter_FaceCulling];
|
||||
currentRenderStates.faceCulling = states.faceCulling;
|
||||
}
|
||||
|
||||
if (currentRenderStates.parameters[RendererParameter_ScissorTest] != states.parameters[RendererParameter_ScissorTest])
|
||||
if (currentRenderStates.scissorTest != states.scissorTest)
|
||||
{
|
||||
if (states.parameters[RendererParameter_ScissorTest])
|
||||
if (states.scissorTest)
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
else
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_ScissorTest] = states.parameters[RendererParameter_ScissorTest];
|
||||
currentRenderStates.scissorTest = states.scissorTest;
|
||||
}
|
||||
|
||||
if (currentRenderStates.parameters[RendererParameter_StencilTest] != states.parameters[RendererParameter_StencilTest])
|
||||
if (currentRenderStates.stencilTest != states.stencilTest)
|
||||
{
|
||||
if (states.parameters[RendererParameter_StencilTest])
|
||||
if (states.stencilTest)
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
else
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
|
||||
currentRenderStates.parameters[RendererParameter_StencilTest] = states.parameters[RendererParameter_StencilTest];
|
||||
currentRenderStates.stencilTest = states.stencilTest;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -396,7 +396,38 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
s_states.parameters[parameter] = enable;
|
||||
switch (parameter)
|
||||
{
|
||||
case RendererParameter_Blend:
|
||||
s_states.blending = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_ColorWrite:
|
||||
s_states.colorWrite = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_DepthBuffer:
|
||||
s_states.depthBuffer = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_DepthWrite:
|
||||
s_states.depthWrite = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_FaceCulling:
|
||||
s_states.faceCulling = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_ScissorTest:
|
||||
s_states.scissorTest = enable;
|
||||
return;
|
||||
|
||||
case RendererParameter_StencilTest:
|
||||
s_states.stencilTest = enable;
|
||||
return;
|
||||
}
|
||||
|
||||
NazaraInternalError("Unhandled renderer parameter: 0x" + String::Number(parameter, 16));
|
||||
}
|
||||
|
||||
void Renderer::EndCondition()
|
||||
@@ -762,7 +793,32 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
return s_states.parameters[parameter];
|
||||
switch (parameter)
|
||||
{
|
||||
case RendererParameter_Blend:
|
||||
return s_states.blending;
|
||||
|
||||
case RendererParameter_ColorWrite:
|
||||
return s_states.colorWrite;
|
||||
|
||||
case RendererParameter_DepthBuffer:
|
||||
return s_states.depthBuffer;
|
||||
|
||||
case RendererParameter_DepthWrite:
|
||||
return s_states.depthWrite;
|
||||
|
||||
case RendererParameter_FaceCulling:
|
||||
return s_states.faceCulling;
|
||||
|
||||
case RendererParameter_ScissorTest:
|
||||
return s_states.scissorTest;
|
||||
|
||||
case RendererParameter_StencilTest:
|
||||
return s_states.stencilTest;
|
||||
}
|
||||
|
||||
NazaraInternalError("Unhandled renderer parameter: 0x" + String::Number(parameter, 16));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Renderer::IsInitialized()
|
||||
@@ -865,7 +921,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
s_states.faceCulling = faceSide;
|
||||
s_states.cullingSide = faceSide;
|
||||
}
|
||||
|
||||
void Renderer::SetFaceFilling(FaceFilling fillingMode)
|
||||
@@ -1042,16 +1098,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilCompare = compareFunc;
|
||||
s_states.stencilCompare.back = compareFunc;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilCompare = compareFunc;
|
||||
s_states.stencilCompare.front = compareFunc;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilCompare = compareFunc;
|
||||
s_states.frontFace.stencilCompare = compareFunc;
|
||||
s_states.stencilCompare.back = compareFunc;
|
||||
s_states.stencilCompare.front = compareFunc;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1075,16 +1131,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilFail = failOperation;
|
||||
s_states.stencilFail.back = failOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilFail = failOperation;
|
||||
s_states.stencilFail.front = failOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilFail = failOperation;
|
||||
s_states.frontFace.stencilFail = failOperation;
|
||||
s_states.stencilFail.back = failOperation;
|
||||
s_states.stencilFail.front = failOperation;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1102,16 +1158,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilMask = mask;
|
||||
s_states.stencilWriteMask.back = mask;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilMask = mask;
|
||||
s_states.stencilWriteMask.front = mask;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilMask = mask;
|
||||
s_states.frontFace.stencilMask = mask;
|
||||
s_states.stencilWriteMask.back = mask;
|
||||
s_states.stencilWriteMask.front = mask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1135,16 +1191,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilPass = passOperation;
|
||||
s_states.stencilPass.back = passOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilPass = passOperation;
|
||||
s_states.stencilPass.front = passOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilPass = passOperation;
|
||||
s_states.frontFace.stencilPass = passOperation;
|
||||
s_states.stencilPass.back = passOperation;
|
||||
s_states.stencilPass.front = passOperation;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1162,16 +1218,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilReference = refValue;
|
||||
s_states.stencilReference.back = refValue;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilReference = refValue;
|
||||
s_states.stencilReference.front = refValue;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilReference = refValue;
|
||||
s_states.frontFace.stencilReference = refValue;
|
||||
s_states.stencilReference.back = refValue;
|
||||
s_states.stencilReference.front = refValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1195,16 +1251,16 @@ namespace Nz
|
||||
switch (faceSide)
|
||||
{
|
||||
case FaceSide_Back:
|
||||
s_states.backFace.stencilZFail = zfailOperation;
|
||||
s_states.stencilDepthFail.back = zfailOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_Front:
|
||||
s_states.frontFace.stencilZFail = zfailOperation;
|
||||
s_states.stencilDepthFail.front = zfailOperation;
|
||||
break;
|
||||
|
||||
case FaceSide_FrontAndBack:
|
||||
s_states.backFace.stencilZFail = zfailOperation;
|
||||
s_states.frontFace.stencilZFail = zfailOperation;
|
||||
s_states.stencilDepthFail.back = zfailOperation;
|
||||
s_states.stencilDepthFail.front = zfailOperation;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user