Removed remaining rendering code from CGL33Device and fixed some issues

dev
Tomasz Kapuściński 2022-02-03 20:53:53 +01:00
parent cbf661f69f
commit 37bdc8665f
13 changed files with 74 additions and 849 deletions

View File

@ -157,7 +157,6 @@ enum RenderState
RENDER_STATE_BLENDING, RENDER_STATE_BLENDING,
RENDER_STATE_DEPTH_TEST, RENDER_STATE_DEPTH_TEST,
RENDER_STATE_DEPTH_WRITE, RENDER_STATE_DEPTH_WRITE,
RENDER_STATE_ALPHA_TEST,
RENDER_STATE_CULLING, RENDER_STATE_CULLING,
}; };
@ -437,12 +436,6 @@ public:
//! Returns shadow renderer //! Returns shadow renderer
virtual CShadowRenderer* GetShadowRenderer() = 0; virtual CShadowRenderer* GetShadowRenderer() = 0;
//! Restores device rendering mode
virtual void Restore() = 0;
//! Sets the transform matrix of given type
virtual void SetTransform(TransformType type, const glm::mat4 &matrix) = 0;
//! Creates a texture from image; the image can be safely removed after that //! Creates a texture from image; the image can be safely removed after that
virtual Texture CreateTexture(CImage *image, const TextureCreateParams &params) = 0; virtual Texture CreateTexture(CImage *image, const TextureCreateParams &params) = 0;
//! Creates a texture from raw image data; image data can be freed after that //! Creates a texture from raw image data; image data can be freed after that
@ -456,15 +449,6 @@ public:
//! Deletes all textures created so far //! Deletes all textures created so far
virtual void DestroyAllTextures() = 0; virtual void DestroyAllTextures() = 0;
//! Returns the maximum number of multitexture stages
virtual int GetMaxTextureStageCount() = 0;
//! Sets the texture at given texture stage
virtual void SetTexture(int index, const Texture &texture) = 0;
//! Sets the texture image by ID at given texture stage
virtual void SetTexture(int index, unsigned int textureId) = 0;
//! Enables/disables the given texture stage
virtual void SetTextureEnabled(int index, bool enabled) = 0;
//! Renders primitive composed of vertices with single texture //! Renders primitive composed of vertices with single texture
virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount, virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount,
Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) = 0; Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) = 0;
@ -493,12 +477,6 @@ public:
//! Sets the color mask //! Sets the color mask
virtual void SetColorMask(bool red, bool green, bool blue, bool alpha) = 0; virtual void SetColorMask(bool red, bool green, bool blue, bool alpha) = 0;
//! Sets the alpha test function and reference value
virtual void SetAlphaTestFunc(CompFunc func, float refValue) = 0;
//! Sets the blending functions for source and destination operations
virtual void SetBlendFunc(BlendFunc srcBlend, BlendFunc dstBlend) = 0;
//! Sets the clear color //! Sets the clear color
virtual void SetClearColor(const Color &color) = 0; virtual void SetClearColor(const Color &color) = 0;

View File

@ -105,7 +105,6 @@ void CCloud::Draw()
float deep = (m_brickCount*m_brickSize)/2.0f; float deep = (m_brickCount*m_brickSize)/2.0f;
m_engine->SetDeepView(deep); m_engine->SetDeepView(deep);
m_engine->SetFocus(m_engine->GetFocus()); m_engine->SetFocus(m_engine->GetFocus());
m_engine->UpdateMatProj(); // increases the depth of view
float fogStart = deep*0.15f; float fogStart = deep*0.15f;
float fogEnd = deep*0.24f; float fogEnd = deep*0.24f;
@ -188,7 +187,6 @@ void CCloud::Draw()
m_engine->SetDeepView(iDeep); m_engine->SetDeepView(iDeep);
m_engine->SetFocus(m_engine->GetFocus()); m_engine->SetFocus(m_engine->GetFocus());
m_engine->UpdateMatProj(); // gives depth to initial
} }
void CCloud::CreateLine(int x, int y, int len) void CCloud::CreateLine(int x, int y, int len)

View File

@ -2285,37 +2285,6 @@ void CEngine::FlushTextureCache()
m_firstGroundSpot = true; m_firstGroundSpot = true;
} }
bool CEngine::SetTexture(const std::string& name, int stage)
{
auto it = m_texNameMap.find(name);
if (it != m_texNameMap.end())
{
m_device->SetTexture(stage, (*it).second);
return true;
}
if (! LoadTexture(name).Valid())
{
m_device->SetTexture(stage, 0); // invalid texture
return false;
}
it = m_texNameMap.find(name);
if (it != m_texNameMap.end())
{
m_device->SetTexture(stage, (*it).second);
return true;
}
m_device->SetTexture(stage, 0); // invalid texture
return false; // should not happen normally
}
void CEngine::SetTexture(const Texture& tex, int stage)
{
m_device->SetTexture(stage, tex);
}
void CEngine::SetTerrainVision(float vision) void CEngine::SetTerrainVision(float vision)
{ {
m_terrainVision = vision; m_terrainVision = vision;
@ -2659,7 +2628,7 @@ int CEngine::GetTextureAnisotropyLevel()
bool CEngine::IsShadowMappingSupported() bool CEngine::IsShadowMappingSupported()
{ {
return m_device->IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 3; return true;
} }
void CEngine::SetShadowMapping(bool value) void CEngine::SetShadowMapping(bool value)
@ -2718,7 +2687,7 @@ int CEngine::GetShadowMappingOffscreenResolution()
bool CEngine::IsShadowMappingQualitySupported() bool CEngine::IsShadowMappingQualitySupported()
{ {
return IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 3; return true;
} }
void CEngine::SetShadowMappingQuality(bool value) void CEngine::SetShadowMappingQuality(bool value)
@ -2860,11 +2829,6 @@ bool CEngine::IsVisiblePoint(const glm::vec3 &pos)
return glm::distance(m_eyePt, pos) <= (m_deepView[0] * m_clippingDistance); return glm::distance(m_eyePt, pos) <= (m_deepView[0] * m_clippingDistance);
} }
void CEngine::UpdateMatProj()
{
m_device->SetTransform(TRANSFORM_PROJECTION, m_matProj);
}
void CEngine::ApplyChange() void CEngine::ApplyChange()
{ {
SetFocus(m_focus); SetFocus(m_focus);
@ -2987,9 +2951,6 @@ void CEngine::Draw3DScene()
float fogStart = m_deepView[m_rankView] * m_fogStart[m_rankView] * m_clippingDistance; float fogStart = m_deepView[m_rankView] * m_fogStart[m_rankView] * m_clippingDistance;
float fogEnd = m_deepView[m_rankView] * m_clippingDistance; float fogEnd = m_deepView[m_rankView] * m_clippingDistance;
m_device->SetTransform(TRANSFORM_PROJECTION, m_matProj);
m_device->SetTransform(TRANSFORM_VIEW, m_matView);
// TODO: This causes a rendering artifact and I can't see anything that breaks if you just comment it out // TODO: This causes a rendering artifact and I can't see anything that breaks if you just comment it out
// So I'll just leave it like that for now ~krzys_h // So I'll just leave it like that for now ~krzys_h
//m_water->DrawBack(); // draws water background //m_water->DrawBack(); // draws water background
@ -3285,7 +3246,7 @@ void CEngine::Draw3DScene()
if (m_debugGoto) if (m_debugGoto)
{ {
glm::mat4 worldMatrix = glm::mat4(1.0f); glm::mat4 worldMatrix = glm::mat4(1.0f);
m_device->SetTransform(TRANSFORM_WORLD, worldMatrix); //m_device->SetTransform(TRANSFORM_WORLD, worldMatrix);
//SetState(ENG_RSTATE_OPAQUE_COLOR); //SetState(ENG_RSTATE_OPAQUE_COLOR);
@ -3560,7 +3521,7 @@ void CEngine::RenderPendingDebugDraws()
{ {
if (m_pendingDebugDraws.firsts.empty()) return; if (m_pendingDebugDraws.firsts.empty()) return;
m_device->SetTransform(TRANSFORM_WORLD, glm::mat4(1.0f)); //m_device->SetTransform(TRANSFORM_WORLD, glm::mat4(1.0f));
//SetState(ENG_RSTATE_OPAQUE_COLOR); //SetState(ENG_RSTATE_OPAQUE_COLOR);
@ -3740,7 +3701,6 @@ void CEngine::RenderShadowMap()
CProfiler::StopPerformanceCounter(PCNT_RENDER_SHADOW_MAP); CProfiler::StopPerformanceCounter(PCNT_RENDER_SHADOW_MAP);
m_device->Restore();
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false); m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false);
} }
@ -3804,8 +3764,6 @@ void CEngine::UseMSAA(bool enable)
void CEngine::DrawInterface() void CEngine::DrawInterface()
{ {
m_device->Restore();
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false); m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false);
SetInterfaceCoordinates(); SetInterfaceCoordinates();
@ -3928,8 +3886,6 @@ void CEngine::DrawInterface()
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false); m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false);
m_device->Restore();
SetInterfaceCoordinates(); SetInterfaceCoordinates();
} }
@ -3946,8 +3902,6 @@ void CEngine::DrawInterface()
if (m_renderInterface) if (m_renderInterface)
DrawMouse(); DrawMouse();
m_device->Restore();
} }
void CEngine::UpdateGroundSpotTextures() void CEngine::UpdateGroundSpotTextures()
@ -4262,10 +4216,10 @@ void CEngine::DrawShadowSpots()
m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false);
glm::mat4 matrix = glm::mat4(1.0f); glm::mat4 matrix = glm::mat4(1.0f);
m_device->SetTransform(TRANSFORM_WORLD, matrix); //m_device->SetTransform(TRANSFORM_WORLD, matrix);
// TODO: create a separate texture // TODO: create a separate texture
SetTexture("textures/effect03.png"); //SetTexture("textures/effect03.png");
glm::vec2 ts, ti; glm::vec2 ts, ti;
@ -4451,8 +4405,6 @@ void CEngine::DrawShadowSpots()
void CEngine::DrawBackground() void CEngine::DrawBackground()
{ {
m_device->Restore();
if (m_cloud->GetLevel() != 0.0f) // clouds ? if (m_cloud->GetLevel() != 0.0f) // clouds ?
{ {
if (m_backgroundCloudUp != m_backgroundCloudDown) // degraded? if (m_backgroundCloudUp != m_backgroundCloudDown) // degraded?
@ -4468,8 +4420,6 @@ void CEngine::DrawBackground()
{ {
DrawBackgroundImage(); // image DrawBackgroundImage(); // image
} }
m_device->Restore();
} }
void CEngine::DrawBackgroundGradient(const Color& up, const Color& down) void CEngine::DrawBackgroundGradient(const Color& up, const Color& down)
@ -4626,24 +4576,18 @@ void CEngine::DrawForegroundImage()
float v2 = 1.0f; float v2 = 1.0f;
Vertex vertex[4] = Vertex2D vertex[4] =
{ {
{ glm::vec3(p1.x, p1.y, 0.0f), n, { u1, v2 } }, { { p1.x, p1.y }, { u1, v2 } },
{ glm::vec3(p1.x, p2.y, 0.0f), n, { u1, v1 } }, { { p1.x, p2.y }, { u1, v1 } },
{ glm::vec3(p2.x, p1.y, 0.0f), n, { u2, v2 } }, { { p2.x, p1.y }, { u2, v2 } },
{ glm::vec3(p2.x, p2.y, 0.0f), n, { u2, v1 } } { { p2.x, p2.y }, { u2, v1 } }
}; };
SetTexture(m_foregroundTex); auto renderer = m_device->GetUIRenderer();
//SetState(ENG_RSTATE_TTEXTURE_BLACK); renderer->SetTexture(m_foregroundTex);
renderer->SetTransparency(TransparencyMode::BLACK);
m_device->Restore(); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex);
m_device->SetTransform(TRANSFORM_VIEW, m_matViewInterface);
m_device->SetTransform(TRANSFORM_PROJECTION, m_matProjInterface);
m_device->SetTransform(TRANSFORM_WORLD, m_matWorldInterface);
m_device->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, vertex, 4);
AddStatisticTriangle(2); AddStatisticTriangle(2);
} }
@ -4680,8 +4624,6 @@ void CEngine::DrawOverColor()
renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex);
AddStatisticTriangle(2); AddStatisticTriangle(2);
m_device->Restore();
} }
void CEngine::DrawHighlight() void CEngine::DrawHighlight()
@ -4733,8 +4675,6 @@ void CEngine::DrawHighlight()
if (nbOut > 2) if (nbOut > 2)
return; return;
//SetState(ENG_RSTATE_OPAQUE_COLOR);
float d = 0.5f + sinf(m_highlightTime * 6.0f) * 0.5f; float d = 0.5f + sinf(m_highlightTime * 6.0f) * 0.5f;
d *= (p2.x - p1.x) * 0.1f; d *= (p2.x - p1.x) * 0.1f;
p1.x += d; p1.x += d;
@ -4742,37 +4682,41 @@ void CEngine::DrawHighlight()
p2.x -= d; p2.x -= d;
p2.y -= d; p2.y -= d;
Color color(1.0f, 1.0f, 0.0f); // yellow glm::u8vec4 color(255, 255, 0, 255); // yellow
VertexCol line[3] = Vertex2D line[3] =
{ {
{ { 0, 0, 0 }, color }, { { 0, 0 }, {}, color },
{ { 0, 0, 0 }, color}, { { 0, 0 }, {}, color },
{ { 0, 0, 0 }, color} { { 0, 0 }, {}, color }
}; };
auto renderer = m_device->GetUIRenderer();
renderer->SetTransparency(TransparencyMode::NONE);
renderer->SetTexture(Texture{});
float dx = (p2.x - p1.x) / 5.0f; float dx = (p2.x - p1.x) / 5.0f;
float dy = (p2.y - p1.y) / 5.0f; float dy = (p2.y - p1.y) / 5.0f;
line[0].coord = glm::vec3(p1.x, p1.y + dy, 0.0f); line[0].position = glm::vec3(p1.x, p1.y + dy, 0.0f);
line[1].coord = glm::vec3(p1.x, p1.y, 0.0f); line[1].position = glm::vec3(p1.x, p1.y, 0.0f);
line[2].coord = glm::vec3(p1.x + dx, p1.y, 0.0f); line[2].position = glm::vec3(p1.x + dx, p1.y, 0.0f);
m_device->DrawPrimitive(PrimitiveType::LINE_STRIP, line, 3); renderer->DrawPrimitive(PrimitiveType::LINE_STRIP, 3, line);
line[0].coord = glm::vec3(p2.x - dx, p1.y, 0.0f); line[0].position = glm::vec3(p2.x - dx, p1.y, 0.0f);
line[1].coord = glm::vec3(p2.x, p1.y, 0.0f); line[1].position = glm::vec3(p2.x, p1.y, 0.0f);
line[2].coord = glm::vec3(p2.x, p1.y + dy, 0.0f); line[2].position = glm::vec3(p2.x, p1.y + dy, 0.0f);
m_device->DrawPrimitive(PrimitiveType::LINE_STRIP, line, 3); renderer->DrawPrimitive(PrimitiveType::LINE_STRIP, 3, line);
line[0].coord = glm::vec3(p2.x, p2.y - dy, 0.0f); line[0].position = glm::vec3(p2.x, p2.y - dy, 0.0f);
line[1].coord = glm::vec3(p2.x, p2.y, 0.0f); line[1].position = glm::vec3(p2.x, p2.y, 0.0f);
line[2].coord = glm::vec3(p2.x - dx, p2.y, 0.0f); line[2].position = glm::vec3(p2.x - dx, p2.y, 0.0f);
m_device->DrawPrimitive(PrimitiveType::LINE_STRIP, line, 3); renderer->DrawPrimitive(PrimitiveType::LINE_STRIP, 3, line);
line[0].coord = glm::vec3(p1.x + dx, p2.y, 0.0f); line[0].position = glm::vec3(p1.x + dx, p2.y, 0.0f);
line[1].coord = glm::vec3(p1.x, p2.y, 0.0f); line[1].position = glm::vec3(p1.x, p2.y, 0.0f);
line[2].coord = glm::vec3(p1.x, p2.y - dy, 0.0f); line[2].position = glm::vec3(p1.x, p2.y - dy, 0.0f);
m_device->DrawPrimitive(PrimitiveType::LINE_STRIP, line, 3); renderer->DrawPrimitive(PrimitiveType::LINE_STRIP, 3, line);
} }
void CEngine::DrawMouse() void CEngine::DrawMouse()
@ -4844,7 +4788,6 @@ void CEngine::DrawStats()
glm::vec2 pos(0.05f * m_size.x/m_size.y, 0.05f + TOTAL_LINES * height); glm::vec2 pos(0.05f * m_size.x/m_size.y, 0.05f + TOTAL_LINES * height);
//SetState(ENG_RSTATE_TCOLOR_ALPHA);
auto renderer = m_device->GetUIRenderer(); auto renderer = m_device->GetUIRenderer();
renderer->SetTransparency(TransparencyMode::ALPHA); renderer->SetTransparency(TransparencyMode::ALPHA);
renderer->SetTexture(Texture{}); renderer->SetTexture(Texture{});
@ -5220,10 +5163,6 @@ void CEngine::SetDebugGotoBitmap(std::unique_ptr<CImage> debugImage)
void CEngine::SetInterfaceCoordinates() void CEngine::SetInterfaceCoordinates()
{ {
m_device->SetTransform(TRANSFORM_VIEW, m_matViewInterface);
m_device->SetTransform(TRANSFORM_PROJECTION, m_matProjInterface);
m_device->SetTransform(TRANSFORM_WORLD, m_matWorldInterface);
auto renderer = m_device->GetUIRenderer(); auto renderer = m_device->GetUIRenderer();
renderer->SetProjection(0.0f, 1.0f, 0.0f, 1.0f); renderer->SetProjection(0.0f, 1.0f, 0.0f, 1.0f);
} }
@ -5244,17 +5183,6 @@ void CEngine::DisablePauseBlur()
void CEngine::SetWindowCoordinates() void CEngine::SetWindowCoordinates()
{ {
glm::mat4 matWorldWindow = glm::mat4(1.0f);
glm::mat4 matViewWindow = glm::mat4(1.0f);
glm::mat4 matProjWindow;
Math::LoadOrthoProjectionMatrix(matProjWindow, 0.0f, m_size.x, m_size.y, 0.0f, -1.0f, 1.0f);
m_device->SetTransform(TRANSFORM_VIEW, matViewWindow);
m_device->SetTransform(TRANSFORM_PROJECTION, matProjWindow);
m_device->SetTransform(TRANSFORM_WORLD, matWorldWindow);
auto renderer = m_device->GetUIRenderer(); auto renderer = m_device->GetUIRenderer();
renderer->SetProjection(0.0f, m_size.x, m_size.y, 0.0f); renderer->SetProjection(0.0f, m_size.x, m_size.y, 0.0f);
} }

View File

@ -872,12 +872,6 @@ public:
float shift = 0.0f, bool hsv = false); float shift = 0.0f, bool hsv = false);
//@} //@}
//! Sets texture for given stage; if not present in cache, the texture is loaded
/** If loading fails, returns false. */
bool SetTexture(const std::string& name, int stage = 0);
//! Sets texture for given stage
void SetTexture(const Texture& tex, int stage = 0);
//! Deletes the given texture, unloading it and removing from cache //! Deletes the given texture, unloading it and removing from cache
void DeleteTexture(const std::string& texName); void DeleteTexture(const std::string& texName);
//! Deletes the given texture, unloading it and removing from cache //! Deletes the given texture, unloading it and removing from cache
@ -1140,9 +1134,6 @@ public:
//! Indicates whether a point is visible //! Indicates whether a point is visible
bool IsVisiblePoint(const glm::vec3& pos); bool IsVisiblePoint(const glm::vec3& pos);
//! Resets the projection matrix after changes
void UpdateMatProj();
//! Updates the scene after a change of parameters //! Updates the scene after a change of parameters
void ApplyChange(); void ApplyChange();

View File

@ -223,9 +223,9 @@ void CLightning::Draw()
CDevice* device = m_engine->GetDevice(); CDevice* device = m_engine->GetDevice();
glm::mat4 mat = glm::mat4(1.0f); glm::mat4 mat = glm::mat4(1.0f);
device->SetTransform(TRANSFORM_WORLD, mat); //device->SetTransform(TRANSFORM_WORLD, mat);
m_engine->SetTexture("textures/effect00.png"); //m_engine->SetTexture("textures/effect00.png");
//m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK); //m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK);
glm::vec2 texInf; glm::vec2 texInf;

View File

@ -156,9 +156,6 @@ public:
renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, quad.vertices); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, quad.vertices);
} }
//const Vertex* vertices = m_quads.front().vertices;
//m_engine.GetDevice()->DrawPrimitives(PrimitiveType::TRIANGLE_STRIP, vertices, m_firsts.data(),
// m_counts.data(), static_cast<int>(m_quads.size()), m_color);
m_engine.AddStatisticTriangle(static_cast<int>(m_quads.size() * 2)); m_engine.AddStatisticTriangle(static_cast<int>(m_quads.size() * 2));
m_quads.clear(); m_quads.clear();
} }
@ -970,18 +967,17 @@ void CText::DrawString(const std::string &text, FontType font,
void CText::DrawHighlight(FontMetaChar hl, const glm::ivec2& pos, const glm::ivec2& size) void CText::DrawHighlight(FontMetaChar hl, const glm::ivec2& pos, const glm::ivec2& size)
{ {
// Gradient colors // Gradient colors
Color grad[4]; glm::u8vec4 grad[4];
// TODO: switch to alpha factors // TODO: switch to alpha factors
if ((hl & FONT_MASK_LINK) != 0) if ((hl & FONT_MASK_LINK) != 0)
{ {
grad[0] = grad[1] = grad[2] = grad[3] = Color(0.0f, 0.0f, 1.0f, 0.5f); grad[0] = grad[1] = grad[2] = grad[3] = { 0, 0, 255, 128 };
} }
else if ((hl & FONT_MASK_HIGHLIGHT) == FONT_HIGHLIGHT_KEY) else if ((hl & FONT_MASK_HIGHLIGHT) == FONT_HIGHLIGHT_KEY)
{ {
grad[0] = grad[1] = grad[2] = grad[3] = grad[0] = grad[1] = grad[2] = grad[3] = { 192, 192, 192, 128 };
Color(192.0f / 256.0f, 192.0f / 256.0f, 192.0f / 256.0f, 0.5f);
} }
else else
{ {
@ -1008,20 +1004,19 @@ void CText::DrawHighlight(FontMetaChar hl, const glm::ivec2& pos, const glm::ive
p1.y = pos.y - h; // just emphasized p1.y = pos.y - h; // just emphasized
} }
m_device->SetTextureEnabled(0, false); auto renderer = m_device->GetUIRenderer();
renderer->SetTexture(Texture{});
VertexCol quad[] = Vertex2D quad[] =
{ {
{ glm::vec3(p1.x, p2.y, 0.0f), grad[3] }, { { p1.x, p2.y }, {}, grad[3] },
{ glm::vec3(p1.x, p1.y, 0.0f), grad[0] }, { { p1.x, p1.y }, {}, grad[0] },
{ glm::vec3(p2.x, p2.y, 0.0f), grad[2] }, { { p2.x, p2.y }, {}, grad[2] },
{ glm::vec3(p2.x, p1.y, 0.0f), grad[1] } { { p2.x, p1.y }, {}, grad[1] }
}; };
m_device->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, quad, 4); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, quad);
m_engine->AddStatisticTriangle(2); m_engine->AddStatisticTriangle(2);
m_device->SetTextureEnabled(0, true);
} }
void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, glm::ivec2&pos, Color color) void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, glm::ivec2&pos, Color color)

View File

@ -185,101 +185,18 @@ bool CGL33Device::Create()
m_capabilities.multitexturingSupported = true; m_capabilities.multitexturingSupported = true;
m_capabilities.maxTextures = maxTextures; m_capabilities.maxTextures = maxTextures;
m_currentTextures = std::vector<Texture> (maxTextures, Texture());
m_texturesEnabled = std::vector<bool> (maxTextures, false);
m_textureStageParams = std::vector<TextureStageParams>(maxTextures, TextureStageParams());
m_capabilities.shadowMappingSupported = true; m_capabilities.shadowMappingSupported = true;
m_capabilities.framebufferSupported = true; m_capabilities.framebufferSupported = true;
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &m_capabilities.maxRenderbufferSize); glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &m_capabilities.maxRenderbufferSize);
GetLogger()->Info("Maximum renderbuffer size: %d\n", m_capabilities.maxRenderbufferSize); GetLogger()->Info("Maximum renderbuffer size: %d\n", m_capabilities.maxRenderbufferSize);
// Create shader program for normal rendering
GLint shaders[2];
char filename[64];
strcpy(filename, "shaders/gl33/vs_normal.glsl");
shaders[0] = LoadShader(GL_VERTEX_SHADER, filename);
if (shaders[0] == 0)
{
m_errorMessage = GetLastShaderError();
GetLogger()->Error("Cound not create vertex shader from file '%s'\n", filename);
return false;
}
strcpy(filename, "shaders/gl33/fs_normal.glsl");
shaders[1] = LoadShader(GL_FRAGMENT_SHADER, filename);
if (shaders[1] == 0)
{
m_errorMessage = GetLastShaderError();
GetLogger()->Error("Cound not create fragment shader from file '%s'\n", filename);
return false;
}
m_normalProgram = LinkProgram(2, shaders);
if (m_normalProgram == 0)
{
m_errorMessage = GetLastShaderError();
GetLogger()->Error("Cound not link shader program for normal rendering\n");
return false;
}
glDeleteShader(shaders[0]);
glDeleteShader(shaders[1]);
// Obtain uniform locations
glUseProgram(m_normalProgram);
{
UniformLocations &uni = m_uniforms;
uni.projectionMatrix = glGetUniformLocation(m_normalProgram, "uni_ProjectionMatrix");
uni.viewMatrix = glGetUniformLocation(m_normalProgram, "uni_ViewMatrix");
uni.modelMatrix = glGetUniformLocation(m_normalProgram, "uni_ModelMatrix");
uni.normalMatrix = glGetUniformLocation(m_normalProgram, "uni_NormalMatrix");
uni.shadowMatrix = glGetUniformLocation(m_normalProgram, "uni_ShadowMatrix");
uni.cameraPosition = glGetUniformLocation(m_normalProgram, "uni_CameraPosition");
uni.primaryTexture = glGetUniformLocation(m_normalProgram, "uni_PrimaryTexture");
uni.secondaryTexture = glGetUniformLocation(m_normalProgram, "uni_SecondaryTexture");
uni.textureEnabled[0] = glGetUniformLocation(m_normalProgram, "uni_PrimaryTextureEnabled");
uni.textureEnabled[1] = glGetUniformLocation(m_normalProgram, "uni_SecondaryTextureEnabled");
uni.textureEnabled[2] = glGetUniformLocation(m_normalProgram, "uni_ShadowTextureEnabled");
uni.alphaTestEnabled = glGetUniformLocation(m_normalProgram, "uni_AlphaTestEnabled");
uni.alphaReference = glGetUniformLocation(m_normalProgram, "uni_AlphaReference");
// Set default uniform values
glm::mat4 matrix = glm::mat4(1.0f);
glUniformMatrix4fv(uni.projectionMatrix, 1, GL_FALSE, glm::value_ptr(matrix));
glUniformMatrix4fv(uni.viewMatrix, 1, GL_FALSE, glm::value_ptr(matrix));
glUniformMatrix4fv(uni.modelMatrix, 1, GL_FALSE, glm::value_ptr(matrix));
glUniformMatrix4fv(uni.normalMatrix, 1, GL_FALSE, glm::value_ptr(matrix));
glUniformMatrix4fv(uni.shadowMatrix, 1, GL_FALSE, glm::value_ptr(matrix));
glUniform3f(uni.cameraPosition, 0.0f, 0.0f, 0.0f);
glUniform1i(uni.primaryTexture, 0);
glUniform1i(uni.secondaryTexture, 1);
glUniform1i(uni.textureEnabled[0], 0);
glUniform1i(uni.textureEnabled[1], 0);
glUniform1i(uni.textureEnabled[2], 0);
glUniform1i(uni.alphaTestEnabled, 0);
glUniform1f(uni.alphaReference, 0.5f);
}
m_uiRenderer = std::make_unique<CGL33UIRenderer>(this); m_uiRenderer = std::make_unique<CGL33UIRenderer>(this);
m_terrainRenderer = std::make_unique<CGL33TerrainRenderer>(this); m_terrainRenderer = std::make_unique<CGL33TerrainRenderer>(this);
m_objectRenderer = std::make_unique<CGL33ObjectRenderer>(this); m_objectRenderer = std::make_unique<CGL33ObjectRenderer>(this);
m_particleRenderer = std::make_unique<CGL33ParticleRenderer>(this); m_particleRenderer = std::make_unique<CGL33ParticleRenderer>(this);
m_shadowRenderer = std::make_unique<CGL33ShadowRenderer>(this); m_shadowRenderer = std::make_unique<CGL33ShadowRenderer>(this);
glUseProgram(m_normalProgram);
// create default framebuffer object // create default framebuffer object
FramebufferParams framebufferParams; FramebufferParams framebufferParams;
@ -289,19 +206,6 @@ bool CGL33Device::Create()
m_framebuffers["default"] = MakeUnique<CDefaultFramebuffer>(framebufferParams); m_framebuffers["default"] = MakeUnique<CDefaultFramebuffer>(framebufferParams);
// create dynamic buffer
glGenVertexArrays(1, &m_dynamicBuffer.vao);
m_dynamicBuffer.size = 4 * 1024 * 1024;
m_dynamicBuffer.offset = 0;
glGenBuffers(1, &m_dynamicBuffer.vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_dynamicBuffer.vbo);
glBufferData(GL_ARRAY_BUFFER, m_dynamicBuffer.size, nullptr, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
m_vboMemory += m_dynamicBuffer.size;
GetLogger()->Info("CDevice created successfully\n"); GetLogger()->Info("CDevice created successfully\n");
return true; return true;
@ -311,7 +215,6 @@ void CGL33Device::Destroy()
{ {
// delete shader program // delete shader program
glUseProgram(0); glUseProgram(0);
glDeleteProgram(m_normalProgram);
// delete framebuffers // delete framebuffers
for (auto& framebuffer : m_framebuffers) for (auto& framebuffer : m_framebuffers)
@ -323,16 +226,6 @@ void CGL33Device::Destroy()
// Should not be strictly necessary, but just in case // Should not be strictly necessary, but just in case
DestroyAllTextures(); DestroyAllTextures();
// delete dynamic buffer
glDeleteVertexArrays(1, &m_dynamicBuffer.vao);
glDeleteBuffers(1, &m_dynamicBuffer.vbo);
m_vboMemory -= m_dynamicBuffer.size;
m_currentTextures.clear();
m_texturesEnabled.clear();
m_textureStageParams.clear();
for (auto buffer : m_buffers) for (auto buffer : m_buffers)
delete buffer; delete buffer;
@ -365,10 +258,6 @@ void CGL33Device::ConfigChanged(const DeviceConfig& newConfig)
void CGL33Device::BeginScene() void CGL33Device::BeginScene()
{ {
Clear(); Clear();
glUniformMatrix4fv(m_uniforms.projectionMatrix, 1, GL_FALSE, glm::value_ptr(m_projectionMat));
glUniformMatrix4fv(m_uniforms.viewMatrix, 1, GL_FALSE, glm::value_ptr(m_viewMat));
glUniformMatrix4fv(m_uniforms.modelMatrix, 1, GL_FALSE, glm::value_ptr(m_worldMat));
} }
void CGL33Device::EndScene() void CGL33Device::EndScene()
@ -409,57 +298,6 @@ CShadowRenderer* CGL33Device::GetShadowRenderer()
return m_shadowRenderer.get(); return m_shadowRenderer.get();
} }
void CGL33Device::Restore()
{
glUseProgram(m_normalProgram);
}
void CGL33Device::SetTransform(TransformType type, const glm::mat4 &matrix)
{
if (type == TRANSFORM_WORLD)
{
m_worldMat = matrix;
glUniformMatrix4fv(m_uniforms.modelMatrix, 1, GL_FALSE, glm::value_ptr(m_worldMat));
m_modelviewMat = m_viewMat * m_worldMat;
m_combinedMatrixOutdated = true;
// normal transform
glm::mat4 normalMat = glm::inverse(normalMat);
glUniformMatrix4fv(m_uniforms.normalMatrix, 1, GL_TRUE, glm::value_ptr(normalMat));
}
else if (type == TRANSFORM_VIEW)
{
glm::mat4 scale = glm::mat4(1.0f);
scale[2][2] = -1.0f;
m_viewMat = scale * matrix;
m_modelviewMat = m_viewMat * m_worldMat;
m_combinedMatrixOutdated = true;
glUniformMatrix4fv(m_uniforms.viewMatrix, 1, GL_FALSE, glm::value_ptr(m_viewMat));
if (m_uniforms.cameraPosition >= 0)
{
glm::vec3 cameraPosition = { 0, 0, 0 };
cameraPosition = glm::vec3(glm::inverse(m_viewMat) * glm::vec4(cameraPosition, 1.0f));
glUniform3fv(m_uniforms.cameraPosition, 1, glm::value_ptr(cameraPosition));
}
}
else if (type == TRANSFORM_PROJECTION)
{
m_projectionMat = matrix;
m_combinedMatrixOutdated = true;
glUniformMatrix4fv(m_uniforms.projectionMatrix, 1, GL_FALSE, glm::value_ptr(m_projectionMat));
}
else
{
assert(false);
}
}
/** If image is invalid, returns invalid texture. /** If image is invalid, returns invalid texture.
Otherwise, returns pointer to new Texture struct. Otherwise, returns pointer to new Texture struct.
This struct must not be deleted in other way than through DeleteTexture() */ This struct must not be deleted in other way than through DeleteTexture() */
@ -494,7 +332,8 @@ Texture CGL33Device::CreateTexture(ImageData *data, const TextureCreateParams &p
glGenTextures(1, &result.id); glGenTextures(1, &result.id);
BindTexture(m_freeTexture, result.id); glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, result.id);
// Set texture parameters // Set texture parameters
GLint minF = GL_NEAREST, magF = GL_NEAREST; GLint minF = GL_NEAREST, magF = GL_NEAREST;
@ -570,7 +409,8 @@ Texture CGL33Device::CreateDepthTexture(int width, int height, int depth)
glGenTextures(1, &result.id); glGenTextures(1, &result.id);
BindTexture(m_freeTexture, result.id); glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, result.id);
GLuint format = GL_DEPTH_COMPONENT; GLuint format = GL_DEPTH_COMPONENT;
@ -606,7 +446,8 @@ void CGL33Device::UpdateTexture(const Texture& texture, const glm::ivec2& offset
{ {
if (texture.id == 0) return; if (texture.id == 0) return;
BindTexture(m_freeTexture, texture.id); glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, texture.id);
PreparedTextureData texData = PrepareTextureData(data, format); PreparedTextureData texData = PrepareTextureData(data, format);
@ -623,13 +464,6 @@ void CGL33Device::UpdateTexture(const Texture& texture, const glm::ivec2& offset
void CGL33Device::DestroyTexture(const Texture &texture) void CGL33Device::DestroyTexture(const Texture &texture)
{ {
// Unbind the texture if in use anywhere
for (int index = 0; index < static_cast<int>( m_currentTextures.size() ); ++index)
{
if (m_currentTextures[index] == texture)
SetTexture(index, Texture()); // set to invalid texture
}
auto it = m_allTextures.find(texture); auto it = m_allTextures.find(texture);
if (it != m_allTextures.end()) if (it != m_allTextures.end())
{ {
@ -641,8 +475,11 @@ void CGL33Device::DestroyTexture(const Texture &texture)
void CGL33Device::DestroyAllTextures() void CGL33Device::DestroyAllTextures()
{ {
// Unbind all texture stages // Unbind all texture stages
for (int index = 0; index < static_cast<int>( m_currentTextures.size() ); ++index) for (int index = 0; index < 32; ++index)
SetTexture(index, Texture()); {
glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D, 0);
}
for (auto it = m_allTextures.begin(); it != m_allTextures.end(); ++it) for (auto it = m_allTextures.begin(); it != m_allTextures.end(); ++it)
glDeleteTextures(1, &(*it).id); glDeleteTextures(1, &(*it).id);
@ -650,270 +487,31 @@ void CGL33Device::DestroyAllTextures()
m_allTextures.clear(); m_allTextures.clear();
} }
int CGL33Device::GetMaxTextureStageCount()
{
return m_currentTextures.size();
}
/**
If \a texture is invalid, unbinds the given texture.
If valid, binds the texture and enables the given texture stage.
The setting is remembered, even if texturing is disabled at the moment. */
void CGL33Device::SetTexture(int index, const Texture &texture)
{
assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
if (m_currentTextures[index].id == texture.id)
return;
BindTexture(index, texture.id);
m_currentTextures[index] = texture; // remember the new value
UpdateTextureState(index);
}
void CGL33Device::SetTexture(int index, unsigned int textureId)
{
assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
if (m_currentTextures[index].id == textureId)
return; // nothing to do
BindTexture(index, textureId);
m_currentTextures[index].id = textureId;
UpdateTextureState(index);
}
void CGL33Device::SetTextureEnabled(int index, bool enabled)
{
assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
if (m_texturesEnabled[index] == enabled)
return;
m_texturesEnabled[index] = enabled;
UpdateTextureState(index);
}
void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int vertexCount, Color color) void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int vertexCount, Color color)
{ {
return;
unsigned int size = vertexCount * sizeof(Vertex);
DynamicBuffer& buffer = m_dynamicBuffer;
BindVAO(buffer.vao);
BindVBO(buffer.vbo);
unsigned int offset = UploadVertexData(buffer, vertices, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, normal)));
// Color
glDisableVertexAttribArray(2);
glVertexAttrib4fv(2, color.Array());
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, texCoord)));
// Texture coordinate 1
glDisableVertexAttribArray(4);
glVertexAttrib2f(4, 0.0f, 0.0f);
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
} }
void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int vertexCount) void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int vertexCount)
{ {
return;
unsigned int size = vertexCount * sizeof(VertexCol);
DynamicBuffer& buffer = m_dynamicBuffer;
BindVAO(buffer.vao);
BindVBO(buffer.vbo);
unsigned int offset = UploadVertexData(buffer, vertices, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
reinterpret_cast<void*>(offset + offsetof(VertexCol, coord)));
// Normal
glDisableVertexAttribArray(1);
glVertexAttrib3f(1, 0.0f, 0.0f, 1.0f);
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
reinterpret_cast<void*>(offset + offsetof(VertexCol, color)));
// Texture coordinate 0
glDisableVertexAttribArray(3);
glVertexAttrib2f(3, 0.0f, 0.0f);
// Texture coordinate 1
glDisableVertexAttribArray(4);
glVertexAttrib2f(4, 0.0f, 0.0f);
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
} }
void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex3D* vertices, int vertexCount) void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex3D* vertices, int vertexCount)
{ {
return;
unsigned int size = vertexCount * sizeof(Vertex3D);
DynamicBuffer& buffer = m_dynamicBuffer;
BindVAO(buffer.vao);
BindVBO(buffer.vbo);
unsigned int offset = UploadVertexData(buffer, vertices, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
reinterpret_cast<void*>(offset + offsetof(Vertex3D, position)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
reinterpret_cast<void*>(offset + offsetof(Vertex3D, normal)));
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex3D),
reinterpret_cast<void*>(offset + offsetof(Vertex3D, color)));
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
reinterpret_cast<void*>(offset + offsetof(Vertex3D, uv)));
// Texture coordinate 1
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
reinterpret_cast<void*>(offset + offsetof(Vertex3D, uv2)));
glDrawArrays(TranslateGfxPrimitive(type), 0, vertexCount);
} }
void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices, void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices,
int first[], int count[], int drawCount, Color color) int first[], int count[], int drawCount, Color color)
{ {
return;
int vertexCount = 0;
for (int i = 0; i < drawCount; i++)
{
int currentCount = first[i] + count[i];
if (currentCount > vertexCount)
vertexCount = currentCount;
}
unsigned int size = vertexCount * sizeof(Vertex);
DynamicBuffer& buffer = m_dynamicBuffer;
BindVAO(buffer.vao);
BindVBO(buffer.vbo);
unsigned int offset = UploadVertexData(buffer, vertices, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, coord)));
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, normal)));
// Color
glDisableVertexAttribArray(2);
glVertexAttrib4fv(2, color.Array());
// Texture coordinate 0
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<void*>(offset + offsetof(Vertex, texCoord)));
// Texture coordinate 1
glDisableVertexAttribArray(4);
glVertexAttrib2f(4, 0.0f, 0.0f);
glMultiDrawArrays(TranslateGfxPrimitive(type), first, count, drawCount);
} }
void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices, void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices,
int first[], int count[], int drawCount) int first[], int count[], int drawCount)
{ {
return;
int vertexCount = 0;
for (int i = 0; i < drawCount; i++)
{
int currentCount = first[i] + count[i];
if (currentCount > vertexCount)
vertexCount = currentCount;
}
unsigned int size = vertexCount * sizeof(VertexCol);
DynamicBuffer& buffer = m_dynamicBuffer;
BindVAO(buffer.vao);
BindVBO(buffer.vbo);
unsigned int offset = UploadVertexData(buffer, vertices, size);
// Vertex coordinate
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
reinterpret_cast<void*>(offset + offsetof(VertexCol, coord)));
// Normal
glDisableVertexAttribArray(1);
glVertexAttrib3f(1, 0.0f, 0.0f, 1.0f);
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(VertexCol),
reinterpret_cast<void*>(offset + offsetof(VertexCol, color)));
// Texture coordinate 0
glDisableVertexAttribArray(3);
glVertexAttrib2f(3, 0.0f, 0.0f);
// Texture coordinate 1
glDisableVertexAttribArray(4);
glVertexAttrib2f(4, 0.0f, 0.0f);
glMultiDrawArrays(TranslateGfxPrimitive(type), first, count, drawCount);
} }
CVertexBuffer* CGL33Device::CreateVertexBuffer(PrimitiveType primitiveType, const Vertex3D* vertices, int vertexCount) CVertexBuffer* CGL33Device::CreateVertexBuffer(PrimitiveType primitiveType, const Vertex3D* vertices, int vertexCount)
@ -944,17 +542,13 @@ void CGL33Device::SetViewport(int x, int y, int width, int height)
void CGL33Device::SetRenderState(RenderState state, bool enabled) void CGL33Device::SetRenderState(RenderState state, bool enabled)
{ {
return;
if (state == RENDER_STATE_DEPTH_WRITE) if (state == RENDER_STATE_DEPTH_WRITE)
{ {
glDepthMask(enabled ? GL_TRUE : GL_FALSE); glDepthMask(enabled ? GL_TRUE : GL_FALSE);
return; return;
} }
else if (state == RENDER_STATE_ALPHA_TEST)
{
glUniform1i(m_uniforms.alphaTestEnabled, enabled ? 1 : 0);
return;
}
GLenum flag = 0; GLenum flag = 0;
@ -977,16 +571,6 @@ void CGL33Device::SetColorMask(bool red, bool green, bool blue, bool alpha)
glColorMask(red, green, blue, alpha); glColorMask(red, green, blue, alpha);
} }
void CGL33Device::SetAlphaTestFunc(CompFunc func, float refValue)
{
glUniform1f(m_uniforms.alphaReference, refValue);
}
void CGL33Device::SetBlendFunc(BlendFunc srcBlend, BlendFunc dstBlend)
{
glBlendFunc(TranslateGfxBlendFunc(srcBlend), TranslateGfxBlendFunc(dstBlend));
}
void CGL33Device::SetClearColor(const Color &color) void CGL33Device::SetClearColor(const Color &color)
{ {
glClearColor(color.r, color.g, color.b, color.a); glClearColor(color.r, color.g, color.b, color.a);
@ -996,7 +580,8 @@ void CGL33Device::CopyFramebufferToTexture(Texture& texture, int xOffset, int yO
{ {
if (texture.id == 0) return; if (texture.id == 0) return;
BindTexture(m_freeTexture, texture.id); glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, texture.id);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, x, y, width, height); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, x, y, width, height);
} }
@ -1044,68 +629,6 @@ void CGL33Device::DeleteFramebuffer(std::string name)
} }
} }
inline void CGL33Device::UpdateTextureState(int index)
{
bool enabled = m_texturesEnabled[index] && (m_currentTextures[index].id != 0);
glUniform1i(m_uniforms.textureEnabled[index], enabled ? 1 : 0);
}
inline void CGL33Device::BindVBO(GLuint vbo)
{
glBindBuffer(GL_ARRAY_BUFFER, vbo);
m_currentVBO = vbo;
}
inline void CGL33Device::BindVAO(GLuint vao)
{
glBindVertexArray(vao);
m_currentVAO = vao;
}
inline void CGL33Device::BindTexture(int index, GLuint texture)
{
glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D, texture);
}
unsigned int CGL33Device::UploadVertexData(DynamicBuffer& buffer, const void* data, unsigned int size)
{
unsigned int nextOffset = buffer.offset + size;
// buffer limit exceeded
// invalidate buffer for the next round of buffer streaming
if (nextOffset > buffer.size)
{
glBufferData(GL_ARRAY_BUFFER, buffer.size, nullptr, GL_STREAM_DRAW);
buffer.offset = 0;
nextOffset = size;
}
unsigned int currentOffset = buffer.offset;
// map buffer for unsynchronized copying
void* ptr = glMapBufferRange(GL_ARRAY_BUFFER, currentOffset, size,
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
if (ptr != nullptr)
{
memcpy(ptr, data, size);
glUnmapBuffer(GL_ARRAY_BUFFER);
}
// mapping failed, we must upload data with glBufferSubData
else
{
GetLogger()->Debug("Buffer mapping failed (offset %d, size %d)\n", currentOffset, size);
glBufferSubData(GL_ARRAY_BUFFER, currentOffset, size, data);
}
buffer.offset = nextOffset;
return currentOffset;
}
bool CGL33Device::IsAnisotropySupported() bool CGL33Device::IsAnisotropySupported()
{ {
return m_capabilities.anisotropySupported; return m_capabilities.anisotropySupported;

View File

@ -119,10 +119,6 @@ public:
CParticleRenderer* GetParticleRenderer() override; CParticleRenderer* GetParticleRenderer() override;
CShadowRenderer* GetShadowRenderer() override; CShadowRenderer* GetShadowRenderer() override;
void Restore() override;
void SetTransform(TransformType type, const glm::mat4 &matrix) override;
Texture CreateTexture(CImage *image, const TextureCreateParams &params) override; Texture CreateTexture(CImage *image, const TextureCreateParams &params) override;
Texture CreateTexture(ImageData *data, const TextureCreateParams &params) override; Texture CreateTexture(ImageData *data, const TextureCreateParams &params) override;
Texture CreateDepthTexture(int width, int height, int depth) override; Texture CreateDepthTexture(int width, int height, int depth) override;
@ -130,11 +126,6 @@ public:
void DestroyTexture(const Texture &texture) override; void DestroyTexture(const Texture &texture) override;
void DestroyAllTextures() override; void DestroyAllTextures() override;
int GetMaxTextureStageCount() override;
void SetTexture(int index, const Texture &texture) override;
void SetTexture(int index, unsigned int textureId) override;
void SetTextureEnabled(int index, bool enabled) override;
virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount, virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount,
Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) override; Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) override;
virtual void DrawPrimitive(PrimitiveType type, const VertexCol *vertices , int vertexCount) override; virtual void DrawPrimitive(PrimitiveType type, const VertexCol *vertices , int vertexCount) override;
@ -156,10 +147,6 @@ public:
void SetColorMask(bool red, bool green, bool blue, bool alpha) override; void SetColorMask(bool red, bool green, bool blue, bool alpha) override;
void SetAlphaTestFunc(CompFunc func, float refValue) override;
void SetBlendFunc(BlendFunc srcBlend, BlendFunc dstBlend) override;
void SetClearColor(const Color &color) override; void SetClearColor(const Color &color) override;
void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) override; void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) override;
@ -183,58 +170,16 @@ public:
bool IsFramebufferSupported() override; bool IsFramebufferSupported() override;
private:
//! Updates texture state
inline void UpdateTextureState(int index);
//! Binds VBO
inline void BindVBO(GLuint vbo);
//! Binds VAO
inline void BindVAO(GLuint vao);
//! Binds texture
inline void BindTexture(int index, GLuint texture);
//! Uploads data to dynamic buffer and returns offset to it
unsigned int UploadVertexData(DynamicBuffer& buffer, const void* data, unsigned int size);
private: private:
//! Current config //! Current config
DeviceConfig m_config; DeviceConfig m_config;
//! Current world matrix
glm::mat4 m_worldMat = glm::mat4(1.0f);
//! Current view matrix
glm::mat4 m_viewMat = glm::mat4(1.0f);
//! OpenGL modelview matrix = world matrix * view matrix
glm::mat4 m_modelviewMat = glm::mat4(1.0f);
//! Current projection matrix
glm::mat4 m_projectionMat = glm::mat4(1.0f);
//! Combined world-view-projection matrix
glm::mat4 m_combinedMatrix = glm::mat4(1.0f);
//! true means combined matrix is outdated
bool m_combinedMatrixOutdated = false;
//! Current textures; \c nullptr value means unassigned
std::vector<Texture> m_currentTextures;
//! Current texture stages enable status
std::vector<bool> m_texturesEnabled;
//! Current texture params
std::vector<TextureStageParams> m_textureStageParams;
//! Set of all created textures //! Set of all created textures
std::set<Texture> m_allTextures; std::set<Texture> m_allTextures;
//! Free texture unit
const int m_freeTexture = 3;
//! Detected capabilities //! Detected capabilities
//! Set of vertex buffers //! Set of vertex buffers
std::unordered_set<CVertexBuffer*> m_buffers; std::unordered_set<CVertexBuffer*> m_buffers;
//! Last ID of VBO object
unsigned int m_lastVboId = 0;
//! Currently bound VBO
GLuint m_currentVBO = 0;
//! Currently bound VAO
GLuint m_currentVAO = 0;
//! Total memory allocated in VBOs //! Total memory allocated in VBOs
unsigned long m_vboMemory = 0; unsigned long m_vboMemory = 0;
@ -242,14 +187,6 @@ private:
//! Map of framebuffers //! Map of framebuffers
std::map<std::string, std::unique_ptr<CFramebuffer>> m_framebuffers; std::map<std::string, std::unique_ptr<CFramebuffer>> m_framebuffers;
//! Shader program for normal rendering
GLuint m_normalProgram = 0;
DynamicBuffer m_dynamicBuffer;
//! Uniform locations for all modes
UniformLocations m_uniforms;
//! Interface renderer //! Interface renderer
std::unique_ptr<CGL33UIRenderer> m_uiRenderer; std::unique_ptr<CGL33UIRenderer> m_uiRenderer;
//! Terrain renderer //! Terrain renderer

View File

@ -199,8 +199,6 @@ void CGL33ObjectRenderer::CGL33ObjectRenderer::End()
m_secondaryTexture = 0; m_secondaryTexture = 0;
m_shadowMap = 0; m_shadowMap = 0;
m_device->Restore();
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
} }

View File

@ -129,8 +129,6 @@ void CGL33ParticleRenderer::End()
glBindVertexArray(0); glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
m_device->Restore();
} }
void CGL33ParticleRenderer::SetProjectionMatrix(const glm::mat4& matrix) void CGL33ParticleRenderer::SetProjectionMatrix(const glm::mat4& matrix)

View File

@ -233,6 +233,7 @@ bool CGL33UIRenderer::EndPrimitive()
glUseProgram(m_program); glUseProgram(m_program);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_uniformBuffer); glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_uniformBuffer);
glDisable(GL_DEPTH_TEST);
UpdateUniforms(); UpdateUniforms();
@ -243,8 +244,6 @@ bool CGL33UIRenderer::EndPrimitive()
m_mapped = false; m_mapped = false;
m_backup = false; m_backup = false;
m_device->Restore();
return true; return true;
} }
@ -402,8 +401,6 @@ void CGL33TerrainRenderer::End()
m_primaryTexture = 0; m_primaryTexture = 0;
m_secondaryTexture = 0; m_secondaryTexture = 0;
m_shadowMap = 0; m_shadowMap = 0;
m_device->Restore();
} }
void CGL33TerrainRenderer::SetProjectionMatrix(const glm::mat4& matrix) void CGL33TerrainRenderer::SetProjectionMatrix(const glm::mat4& matrix)
@ -598,8 +595,6 @@ void CGL33ShadowRenderer::End()
glPolygonOffset(0.0f, 0.0f); glPolygonOffset(0.0f, 0.0f);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
m_device->Restore();
} }
void CGL33ShadowRenderer::SetProjectionMatrix(const glm::mat4& matrix) void CGL33ShadowRenderer::SetProjectionMatrix(const glm::mat4& matrix)

View File

@ -1,63 +0,0 @@
/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
// FRAGMENT SHADER - NORMAL MODE
#version 330 core
uniform sampler2D uni_PrimaryTexture;
uniform sampler2D uni_SecondaryTexture;
uniform bool uni_PrimaryTextureEnabled;
uniform bool uni_SecondaryTextureEnabled;
uniform bool uni_AlphaTestEnabled;
uniform float uni_AlphaReference;
in VertexData
{
vec4 Color;
vec2 TexCoord0;
vec2 TexCoord1;
vec3 Normal;
} data;
out vec4 out_FragColor;
void main()
{
vec4 color = data.Color;
if (uni_PrimaryTextureEnabled)
{
color = color * texture(uni_PrimaryTexture, data.TexCoord0);
}
if (uni_SecondaryTextureEnabled)
{
color = color * texture(uni_SecondaryTexture, data.TexCoord1);
}
if (uni_AlphaTestEnabled)
{
if(color.a < uni_AlphaReference)
discard;
}
out_FragColor = color;
}

View File

@ -1,53 +0,0 @@
/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
// VERTEX SHADER - NORMAL MODE
#version 330 core
uniform mat4 uni_ProjectionMatrix;
uniform mat4 uni_ViewMatrix;
uniform mat4 uni_ModelMatrix;
uniform mat4 uni_NormalMatrix;
uniform vec3 uni_CameraPosition;
layout(location = 0) in vec4 in_VertexCoord;
layout(location = 1) in vec3 in_Normal;
layout(location = 2) in vec4 in_Color;
layout(location = 3) in vec2 in_TexCoord0;
layout(location = 4) in vec2 in_TexCoord1;
out VertexData
{
vec4 Color;
vec2 TexCoord0;
vec2 TexCoord1;
vec3 Normal;
} data;
void main()
{
vec4 position = uni_ModelMatrix * in_VertexCoord;
vec4 eyeSpace = uni_ViewMatrix * position;
gl_Position = uni_ProjectionMatrix * eyeSpace;
data.Color = in_Color;
data.TexCoord0 = in_TexCoord0;
data.TexCoord1 = in_TexCoord1;
data.Normal = normalize((uni_NormalMatrix * vec4(in_Normal, 0.0f)).xyz);
}