Partially fixed rendering of models in front of the interface (e.g. profile screen)

dev
Tomasz Kapuściński 2022-01-19 23:13:50 +01:00
parent 367dab9c5a
commit 710f448477
3 changed files with 32 additions and 24 deletions

View File

@ -4301,23 +4301,26 @@ void CEngine::DrawInterface()
// 3D objects drawn in front of interface
if (m_drawFront)
{
m_device->Restore();
// Display the objects
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, true);
m_device->SetTransform(TRANSFORM_PROJECTION, m_matProj);
m_device->SetGlobalAmbient(m_ambientColor[m_rankView]);
m_device->SetRenderState(RENDER_STATE_LIGHTING, true);
m_device->SetRenderState(RENDER_STATE_FOG, true);
float fogStart = m_deepView[m_rankView] * m_fogStart[m_rankView] * m_clippingDistance;
float fogEnd = m_deepView[m_rankView] * m_clippingDistance;
m_device->SetFogParams(FOG_LINEAR, m_fogColor[m_rankView], fogStart, fogEnd, 1.0f);
Color fogColor = m_fogColor[m_rankView];
m_device->SetTransform(TRANSFORM_VIEW, m_matView);
auto renderer = m_device->GetObjectRenderer();
renderer->Begin();
renderer->SetProjectionMatrix(m_matProj);
renderer->SetViewMatrix(m_matView);
renderer->SetFog(fogStart, fogEnd, { fogColor.r, fogColor.g, fogColor.b });
renderer->SetLighting(false);
renderer->SetLight(glm::vec4(1.0, 1.0, -1.0, 0.0), 1.0f, glm::vec3(1.0));
renderer->SetTransparency(TransparencyMode::NONE);
renderer->SetAlphaScissor(0.0f);
renderer->SetShadowParams(0, nullptr);
renderer->SetColor({ 1.0f, 1.0f, 1.0f, 1.0f });
renderer->SetCullMode(true);
renderer->SetPrimaryTextureEnabled(true);
renderer->SetTriplanarMode(m_triplanarMode);
renderer->SetTriplanarScale(m_triplanarScale);
auto projectionViewMatrix = m_matProj * m_matView;
@ -4332,11 +4335,10 @@ void CEngine::DrawInterface()
if (! m_objects[objRank].drawFront)
continue;
m_device->SetTransform(TRANSFORM_WORLD, m_objects[objRank].transform);
auto combinedMatrix = projectionViewMatrix * m_objects[objRank].transform;
if (! IsVisible(combinedMatrix, objRank))
continue;
//if (! IsVisible(combinedMatrix, objRank))
// continue;
int baseObjRank = m_objects[objRank].baseObjRank;
if (baseObjRank == -1)
@ -4348,27 +4350,32 @@ void CEngine::DrawInterface()
if (! p1.used)
continue;
m_lightMan->UpdateDeviceLights(m_objects[objRank].type);
renderer->SetModelMatrix(m_objects[objRank].transform);
//m_lightMan->UpdateDeviceLights(m_objects[objRank].type);
for (int l2 = 0; l2 < static_cast<int>( p1.next.size() ); l2++)
{
EngineBaseObjTexTier& p2 = p1.next[l2];
SetTexture(p2.tex1, 0);
SetTexture(p2.tex2, 1);
renderer->SetPrimaryTexture(p2.tex1);
renderer->SetSecondaryTexture(p2.tex2);
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
{
EngineBaseObjDataTier& p3 = p2.next[l3];
//SetMaterial(p3.material);
SetState(p3.state);
//SetState(p3.state);
DrawObject(p3);
renderer->DrawObject(p3.buffer);
//DrawObject(p3);
}
}
}
renderer->End();
m_particle->DrawParticle(SH_FRONT); // draws the particles of the 3D world
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false);

View File

@ -1195,6 +1195,8 @@ public:
/** This additionally sends EVENT_RELOAD_TEXTURES to reload all textures not maintained by CEngine **/
void ReloadAllTextures();
int ComputeSphereVisibility(const glm::mat4& m, const glm::vec3& center, float radius);
protected:
//! Resets some states and flushes textures after device was changed (e.g. resoulution changed)
/** Instead of calling this directly, send EVENT_RESOLUTION_CHANGED event **/
@ -1254,8 +1256,6 @@ protected:
//! Tests whether the given object is visible
bool IsVisible(const glm::mat4& matrix, int objRank);
int ComputeSphereVisibility(const glm::mat4& m, const glm::vec3& center, float radius);
bool InPlane(glm::vec3 normal, float originPlane, glm::vec3 center, float radius);
//! Detects whether an object is affected by the mouse

View File

@ -156,6 +156,7 @@ void CGL33ObjectRenderer::CGL33ObjectRenderer::Begin()
m_secondaryTexture = 0;
m_shadowMap = 0;
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
}