Corrected OpenGL 2.1 engine's error spam and added experimental terrain shadowing
parent
a5988af59f
commit
8deeddffe0
|
@ -110,6 +110,9 @@ void CSettings::SaveSettings()
|
|||
GetConfigFile().SetIntProperty("Setup", "ShadowMappingResolution",
|
||||
engine->GetShadowMappingOffscreen() ? engine->GetShadowMappingOffscreenResolution() : 0);
|
||||
|
||||
// Experimental settings
|
||||
GetConfigFile().SetBoolProperty("Experimental", "TerrainShadows", engine->GetTerrainShadows());
|
||||
|
||||
CInput::GetInstancePointer()->SaveKeyBindings();
|
||||
|
||||
|
||||
|
@ -264,6 +267,9 @@ void CSettings::LoadSettings()
|
|||
}
|
||||
}
|
||||
|
||||
if (GetConfigFile().GetBoolProperty("Experimental", "TerrainShadows", bValue))
|
||||
engine->SetTerrainShadows(bValue);
|
||||
|
||||
CInput::GetInstancePointer()->LoadKeyBindings();
|
||||
|
||||
|
||||
|
|
|
@ -139,6 +139,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils)
|
|||
m_offscreenShadowRendering = true;
|
||||
m_offscreenShadowRenderingResolution = 1024;
|
||||
m_qualityShadows = true;
|
||||
m_terrainShadows = false;
|
||||
m_shadowRange = 0.0f;
|
||||
m_multisample = 2;
|
||||
|
||||
|
@ -2940,7 +2941,7 @@ int CEngine::GetShadowMappingOffscreenResolution()
|
|||
|
||||
bool CEngine::IsShadowMappingQualitySupported()
|
||||
{
|
||||
return IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 6;
|
||||
return IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 3;
|
||||
}
|
||||
|
||||
void CEngine::SetShadowMappingQuality(bool value)
|
||||
|
@ -2954,6 +2955,16 @@ bool CEngine::GetShadowMappingQuality()
|
|||
return m_qualityShadows;
|
||||
}
|
||||
|
||||
void CEngine::SetTerrainShadows(bool value)
|
||||
{
|
||||
m_terrainShadows = value;
|
||||
}
|
||||
|
||||
bool CEngine::GetTerrainShadows()
|
||||
{
|
||||
return m_terrainShadows;
|
||||
}
|
||||
|
||||
void CEngine::SetBackForce(bool present)
|
||||
{
|
||||
m_backForce = present;
|
||||
|
@ -3096,7 +3107,6 @@ void CEngine::Render()
|
|||
color = m_backgroundColorDown;
|
||||
|
||||
m_device->SetClearColor(color);
|
||||
|
||||
// Render shadow map
|
||||
if (m_drawWorld && m_shadowMapping)
|
||||
RenderShadowMap();
|
||||
|
@ -3133,7 +3143,6 @@ void CEngine::Draw3DScene()
|
|||
DrawPlanet(); // draws the planets
|
||||
m_cloud->Draw(); // draws the clouds
|
||||
|
||||
|
||||
// Display the objects
|
||||
|
||||
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, true);
|
||||
|
@ -3365,7 +3374,6 @@ void CEngine::Draw3DScene()
|
|||
|
||||
void CEngine::RenderShadowMap()
|
||||
{
|
||||
|
||||
m_shadowMapping = m_shadowMapping && m_device->IsShadowMappingSupported();
|
||||
m_offscreenShadowRendering = m_offscreenShadowRendering && m_device->IsFramebufferSupported();
|
||||
m_offscreenShadowRenderingResolution = Math::Min(m_offscreenShadowRenderingResolution, m_device->GetMaxTextureSize());
|
||||
|
@ -3438,11 +3446,9 @@ void CEngine::RenderShadowMap()
|
|||
m_device->SetRenderState(RENDER_STATE_FOG, false);
|
||||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
||||
m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true);
|
||||
m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, false);
|
||||
m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.5f);
|
||||
m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, true);
|
||||
m_device->SetDepthBias(2.0f, 8.0f);
|
||||
|
||||
m_device->SetViewport(0, 0, m_shadowMap.size.x, m_shadowMap.size.y);
|
||||
|
||||
// recompute matrices
|
||||
|
@ -3494,11 +3500,30 @@ void CEngine::RenderShadowMap()
|
|||
if (!m_objects[objRank].used)
|
||||
continue;
|
||||
|
||||
if (m_objects[objRank].type == ENG_OBJTYPE_TERRAIN)
|
||||
continue;
|
||||
bool terrain = (m_objects[objRank].type == ENG_OBJTYPE_TERRAIN);
|
||||
|
||||
if (terrain)
|
||||
{
|
||||
if (m_terrainShadows)
|
||||
{
|
||||
m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false);
|
||||
m_device->SetRenderState(RENDER_STATE_CULLING, true);
|
||||
m_device->SetCullMode(CULL_CCW);
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true);
|
||||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
||||
}
|
||||
|
||||
m_device->SetTransform(TRANSFORM_WORLD, m_objects[objRank].transform);
|
||||
|
||||
if (!IsVisible(objRank))
|
||||
continue;
|
||||
|
||||
int baseObjRank = m_objects[objRank].baseObjRank;
|
||||
if (baseObjRank == -1)
|
||||
continue;
|
||||
|
@ -3518,6 +3543,7 @@ void CEngine::RenderShadowMap()
|
|||
for (int l3 = 0; l3 < static_cast<int>(p2.next.size()); l3++)
|
||||
{
|
||||
EngineBaseObjDataTier& p3 = p2.next[l3];
|
||||
|
||||
DrawObject(p3);
|
||||
}
|
||||
}
|
||||
|
@ -3526,6 +3552,8 @@ void CEngine::RenderShadowMap()
|
|||
m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, false);
|
||||
m_device->SetDepthBias(0.0f, 0.0f);
|
||||
m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false);
|
||||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
||||
m_device->SetCullMode(CULL_CW);
|
||||
|
||||
if (m_offscreenShadowRendering) // shadow map texture already have depth information, just unbind it
|
||||
{
|
||||
|
@ -3557,7 +3585,8 @@ void CEngine::UseShadowMapping(bool enable)
|
|||
{
|
||||
m_device->SetShadowColor(m_shadowColor);
|
||||
m_device->SetTransform(TRANSFORM_SHADOW, m_shadowTextureMat);
|
||||
m_device->SetTexture(TEXTURE_SHADOW, m_shadowMap.id);
|
||||
m_device->SetTexture(TEXTURE_SHADOW, m_shadowMap);
|
||||
m_device->SetTextureStageWrap(TEXTURE_SHADOW, TEX_WRAP_CLAMP_TO_BORDER, TEX_WRAP_CLAMP_TO_BORDER);
|
||||
m_device->SetRenderState(RENDER_STATE_SHADOW_MAPPING, true);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1095,6 +1095,8 @@ public:
|
|||
bool IsShadowMappingQualitySupported();
|
||||
void SetShadowMappingQuality(bool value);
|
||||
bool GetShadowMappingQuality();
|
||||
void SetTerrainShadows(bool value);
|
||||
bool GetTerrainShadows();
|
||||
//@}
|
||||
|
||||
//@{
|
||||
|
@ -1420,6 +1422,8 @@ protected:
|
|||
int m_offscreenShadowRenderingResolution;
|
||||
//! true enables higher quality shadows
|
||||
bool m_qualityShadows;
|
||||
//! true enables casting shadows by terrain
|
||||
bool m_terrainShadows;
|
||||
//! Shadow color
|
||||
float m_shadowColor;
|
||||
//! Shadow range
|
||||
|
|
|
@ -1194,142 +1194,6 @@ void CGL21Device::UpdateTextureParams(int index)
|
|||
else if (params.wrapT == TEX_WRAP_REPEAT)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
else assert(false);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, params.factor.Array());
|
||||
|
||||
// To save some trouble
|
||||
if ( (params.colorOperation == TEX_MIX_OPER_DEFAULT) &&
|
||||
(params.alphaOperation == TEX_MIX_OPER_DEFAULT) )
|
||||
{
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
goto after_tex_operations;
|
||||
}
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
|
||||
// Only these modes of getting color & alpha are used
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
|
||||
|
||||
// Color operation
|
||||
|
||||
if (params.colorOperation == TEX_MIX_OPER_DEFAULT)
|
||||
{
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
|
||||
goto after_tex_color;
|
||||
}
|
||||
else if (params.colorOperation == TEX_MIX_OPER_REPLACE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
|
||||
else if (params.colorOperation == TEX_MIX_OPER_MODULATE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
||||
else if (params.colorOperation == TEX_MIX_OPER_ADD)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
|
||||
else if (params.colorOperation == TEX_MIX_OPER_SUBTRACT)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT);
|
||||
else assert(false);
|
||||
|
||||
// Color arg1
|
||||
if (params.colorArg1 == TEX_MIX_ARG_TEXTURE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_0)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_1)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE1);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_2)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE2);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_3)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE3);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_COMPUTED_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_SRC_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
|
||||
else if (params.colorArg1 == TEX_MIX_ARG_FACTOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT);
|
||||
else assert(false);
|
||||
|
||||
// Color arg2
|
||||
if (params.colorArg2 == TEX_MIX_ARG_TEXTURE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_0)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE0);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_1)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE1);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_2)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE2);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_3)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE3);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_COMPUTED_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_SRC_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR);
|
||||
else if (params.colorArg2 == TEX_MIX_ARG_FACTOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT);
|
||||
else assert(false);
|
||||
|
||||
|
||||
after_tex_color:
|
||||
|
||||
// Alpha operation
|
||||
if (params.alphaOperation == TEX_MIX_OPER_DEFAULT)
|
||||
{
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE);
|
||||
goto after_tex_operations;
|
||||
}
|
||||
else if (params.alphaOperation == TEX_MIX_OPER_REPLACE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
|
||||
else if (params.alphaOperation == TEX_MIX_OPER_MODULATE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
|
||||
else if (params.alphaOperation == TEX_MIX_OPER_ADD)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);
|
||||
else if (params.alphaOperation == TEX_MIX_OPER_SUBTRACT)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_SUBTRACT);
|
||||
else assert(false);
|
||||
|
||||
// Alpha arg1
|
||||
if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_0)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE0);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_1)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE1);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_2)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE2);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_3)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE3);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_COMPUTED_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_SRC_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR);
|
||||
else if (params.alphaArg1 == TEX_MIX_ARG_FACTOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_CONSTANT);
|
||||
else assert(false);
|
||||
|
||||
// Alpha arg2
|
||||
if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_0)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_1)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE1);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_2)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE2);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_3)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE3);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_COMPUTED_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_SRC_COLOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR);
|
||||
else if (params.alphaArg2 == TEX_MIX_ARG_FACTOR)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT);
|
||||
else assert(false);
|
||||
|
||||
after_tex_operations: ;
|
||||
}
|
||||
|
||||
void CGL21Device::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wrapT)
|
||||
|
@ -1404,7 +1268,6 @@ void CGL21Device::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices,
|
|||
glNormalPointer(GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].normal));
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].texCoord));
|
||||
|
||||
|
@ -1456,7 +1319,6 @@ void CGL21Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
|
|||
glNormalPointer(GL_FLOAT, sizeof(Vertex), reinterpret_cast<GLfloat*>(&vs[0].normal));
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<GLfloat*>(&vs[0].texCoord));
|
||||
|
||||
|
@ -1483,7 +1345,6 @@ void CGL21Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices,
|
|||
glNormalPointer(GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].normal));
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast<GLfloat*>(&vs[0].texCoord));
|
||||
|
||||
|
@ -1666,7 +1527,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId)
|
|||
if (it == m_vboObjects.end())
|
||||
return;
|
||||
|
||||
glEnable(GL_VERTEX_ARRAY);
|
||||
BindVBO((*it).second.bufferId);
|
||||
|
||||
if ((*it).second.vertexType == VERTEX_TYPE_NORMAL)
|
||||
|
@ -1678,7 +1538,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId)
|
|||
glNormalPointer(GL_FLOAT, sizeof(Vertex), static_cast<char*>(nullptr) + offsetof(Vertex, normal));
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), static_cast<char*>(nullptr) + offsetof(Vertex, texCoord));
|
||||
}
|
||||
|
@ -1691,7 +1550,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId)
|
|||
glNormalPointer(GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, normal));
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), static_cast<char*>(nullptr) + offsetof(VertexTex2, texCoord));
|
||||
|
||||
|
@ -1722,6 +1580,7 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId)
|
|||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_NORMAL_ARRAY);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); // GL_TEXTURE1
|
||||
|
||||
glClientActiveTexture(GL_TEXTURE0);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
}
|
||||
|
@ -1730,8 +1589,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId)
|
|||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_COLOR_ARRAY);
|
||||
}
|
||||
|
||||
glDisable(GL_VERTEX_ARRAY);
|
||||
}
|
||||
|
||||
void CGL21Device::DestroyStaticBuffer(unsigned int bufferId)
|
||||
|
@ -1868,7 +1725,6 @@ void CGL21Device::SetRenderState(RenderState state, bool enabled)
|
|||
{
|
||||
case RENDER_STATE_BLENDING: flag = GL_BLEND; break;
|
||||
case RENDER_STATE_DEPTH_TEST: flag = GL_DEPTH_TEST; break;
|
||||
case RENDER_STATE_ALPHA_TEST: flag = GL_ALPHA_TEST; break;
|
||||
case RENDER_STATE_CULLING: flag = GL_CULL_FACE; break;
|
||||
case RENDER_STATE_DEPTH_BIAS: flag = GL_POLYGON_OFFSET_FILL; break;
|
||||
default: assert(false); break;
|
||||
|
@ -1897,7 +1753,7 @@ void CGL21Device::SetDepthBias(float factor, float units)
|
|||
|
||||
void CGL21Device::SetAlphaTestFunc(CompFunc func, float refValue)
|
||||
{
|
||||
glUniform1i(m_uniforms[m_mode].alphaReference, refValue);
|
||||
glUniform1f(m_uniforms[m_mode].alphaReference, refValue);
|
||||
}
|
||||
|
||||
void CGL21Device::SetBlendFunc(BlendFunc srcBlend, BlendFunc dstBlend)
|
||||
|
|
|
@ -63,7 +63,8 @@ bool CGLFramebuffer::Create()
|
|||
glGenTextures(1, &m_colorTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_colorTexture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height,
|
||||
0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
@ -81,13 +82,15 @@ bool CGLFramebuffer::Create()
|
|||
glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);
|
||||
|
||||
if (m_params.samples > 1)
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, GL_RGBA8, m_params.width, m_params.height);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples,
|
||||
GL_RGBA8, m_params.width, m_params.height);
|
||||
else
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, m_params.width, m_params.height);
|
||||
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||
GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer);
|
||||
}
|
||||
|
||||
GLuint depthFormat = 0;
|
||||
|
@ -109,7 +112,8 @@ bool CGLFramebuffer::Create()
|
|||
glGenTextures(1, &m_depthTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0,
|
||||
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||
|
@ -124,7 +128,8 @@ bool CGLFramebuffer::Create()
|
|||
|
||||
glBindTexture(GL_TEXTURE_2D, previous);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER,
|
||||
GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||
}
|
||||
// create depth renderbuffer
|
||||
else
|
||||
|
@ -133,13 +138,16 @@ bool CGLFramebuffer::Create()
|
|||
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||
|
||||
if (m_params.samples > 1)
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, depthFormat, m_params.width, m_params.height);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples,
|
||||
depthFormat, m_params.width, m_params.height);
|
||||
else
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, depthFormat, m_params.width, m_params.height);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER,
|
||||
depthFormat, m_params.width, m_params.height);
|
||||
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||
GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||
}
|
||||
|
||||
GLuint result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
|
@ -273,12 +281,14 @@ void CGLFramebuffer::Unbind()
|
|||
m_currentFBO = 0;
|
||||
}
|
||||
|
||||
void CGLFramebuffer::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, int toX, int toY, int toWidth, int toHeight)
|
||||
void CGLFramebuffer::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight,
|
||||
int toX, int toY, int toWidth, int toHeight)
|
||||
{
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
|
||||
glBlitFramebuffer(fromX, fromY, fromX + fromWidth, fromY + fromHeight, toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
glBlitFramebuffer(fromX, fromY, fromX + fromWidth, fromY + fromHeight,
|
||||
toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_currentFBO);
|
||||
}
|
||||
|
@ -321,7 +331,9 @@ bool CGLFramebufferEXT::Create()
|
|||
glGenTextures(1, &m_colorTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_colorTexture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
|
||||
m_params.width, m_params.height, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
@ -330,7 +342,8 @@ bool CGLFramebufferEXT::Create()
|
|||
|
||||
glBindTexture(GL_TEXTURE_2D, previous);
|
||||
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0);
|
||||
}
|
||||
// create color renderbuffer
|
||||
else
|
||||
|
@ -339,13 +352,16 @@ bool CGLFramebufferEXT::Create()
|
|||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
||||
|
||||
if (m_params.samples > 1)
|
||||
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, m_params.samples, GL_RGBA8, m_params.width, m_params.height);
|
||||
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT,
|
||||
m_params.samples, GL_RGBA8, m_params.width, m_params.height);
|
||||
else
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, m_params.width, m_params.height);
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8,
|
||||
m_params.width, m_params.height);
|
||||
|
||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
|
||||
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
||||
}
|
||||
|
||||
GLuint depthFormat = 0;
|
||||
|
@ -367,7 +383,8 @@ bool CGLFramebufferEXT::Create()
|
|||
glGenTextures(1, &m_depthTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0,
|
||||
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||
|
@ -382,7 +399,8 @@ bool CGLFramebufferEXT::Create()
|
|||
|
||||
glBindTexture(GL_TEXTURE_2D, previous);
|
||||
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||
}
|
||||
// create depth renderbuffer
|
||||
else
|
||||
|
@ -391,13 +409,15 @@ bool CGLFramebufferEXT::Create()
|
|||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthRenderbuffer);
|
||||
|
||||
if (m_params.samples > 1)
|
||||
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, m_params.samples, depthFormat, m_params.width, m_params.height);
|
||||
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT,
|
||||
m_params.samples, depthFormat, m_params.width, m_params.height);
|
||||
else
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depthFormat, m_params.width, m_params.height);
|
||||
|
||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
|
||||
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthRenderbuffer);
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthRenderbuffer);
|
||||
}
|
||||
|
||||
GLuint result = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||
|
@ -429,7 +449,7 @@ bool CGLFramebufferEXT::Create()
|
|||
|
||||
Destroy();
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_currentFBO);
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_currentFBO);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -532,12 +552,14 @@ void CGLFramebufferEXT::Unbind()
|
|||
m_currentFBO = 0;
|
||||
}
|
||||
|
||||
void CGLFramebufferEXT::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, int toX, int toY, int toWidth, int toHeight)
|
||||
void CGLFramebufferEXT::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight,
|
||||
int toX, int toY, int toWidth, int toHeight)
|
||||
{
|
||||
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_fbo);
|
||||
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
|
||||
|
||||
glBlitFramebufferEXT(fromX, fromY, fromX + fromWidth, fromY + fromHeight, toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
glBlitFramebufferEXT(fromX, fromY, fromX + fromWidth, fromY + fromHeight,
|
||||
toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_currentFBO);
|
||||
}
|
||||
|
|
|
@ -292,6 +292,22 @@ std::string GetHardwareInfo(bool full)
|
|||
return result.str();
|
||||
}
|
||||
|
||||
int ClearGLErrors()
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
GLint error = glGetError();
|
||||
if (error == GL_NO_ERROR)
|
||||
break;
|
||||
|
||||
result++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CheckGLErrors()
|
||||
{
|
||||
GLint error = glGetError();
|
||||
|
|
|
@ -68,6 +68,9 @@ bool AreExtensionsSupported(std::string list);
|
|||
//! Returns information about graphics card
|
||||
std::string GetHardwareInfo(bool full = false);
|
||||
|
||||
//! Clears OpenGL errors
|
||||
int ClearGLErrors();
|
||||
|
||||
//! Checks for OpenGL errors
|
||||
bool CheckGLErrors();
|
||||
|
||||
|
|
Loading…
Reference in New Issue