diff --git a/src/graphics/core/device.h b/src/graphics/core/device.h index 87330654..b2cfcd65 100644 --- a/src/graphics/core/device.h +++ b/src/graphics/core/device.h @@ -465,12 +465,6 @@ public: //! Enables/disables the given texture stage virtual void SetTextureEnabled(int index, bool enabled) = 0; - //! Sets the params for texture stage with given index - virtual void SetTextureStageParams(int index, const TextureStageParams ¶ms) = 0; - - //! Sets only the texture wrap modes (for faster than thru stage params) - virtual void SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wrapT) = 0; - //! Renders primitive composed of vertices with single texture virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount, Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) = 0; @@ -508,12 +502,6 @@ public: //! Sets the clear color virtual void SetClearColor(const Color &color) = 0; - //! Sets the current cull mode - virtual void SetCullMode(CullMode mode) = 0; - - //! Sets the current fill mode - virtual void SetFillMode(FillMode mode) = 0; - //! Copies content of framebuffer to texture virtual void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) = 0; diff --git a/src/graphics/core/renderers.h b/src/graphics/core/renderers.h index da06cab7..87951580 100644 --- a/src/graphics/core/renderers.h +++ b/src/graphics/core/renderers.h @@ -36,7 +36,7 @@ class CVertexBuffer; enum class PrimitiveType : unsigned char; struct Texture; -enum class TransparencyMode +enum class TransparencyMode : unsigned char { NONE, ALPHA, @@ -59,9 +59,6 @@ class CRenderer { public: virtual ~CRenderer() { } - - //! Flush buffered content - virtual void Flush() {} }; /** @@ -79,9 +76,14 @@ public: virtual void SetTexture(const Texture& texture) = 0; //! Sets color virtual void SetColor(const glm::vec4& color) = 0; + //! Sets transparency mode + virtual void SetTransparency(TransparencyMode mode) = 0; //! Draws primitive virtual void DrawPrimitive(PrimitiveType type, int count, const Vertex2D* vertices) = 0; + + virtual Vertex2D* BeginPrimitive(PrimitiveType type, int count) = 0; + virtual bool EndPrimitive() = 0; }; /** diff --git a/src/graphics/engine/camera.cpp b/src/graphics/engine/camera.cpp index de730431..11c66a9d 100644 --- a/src/graphics/engine/camera.cpp +++ b/src/graphics/engine/camera.cpp @@ -135,7 +135,7 @@ CCamera::CCamera() m_overType = CAM_OVER_EFFECT_NULL; m_overForce = 0.0f; m_overTime = 0.0f; - m_overMode = 0; + m_overMode = TransparencyMode::NONE; m_overFadeIn = 0.0f; m_overFadeOut = 0.0f; @@ -611,7 +611,7 @@ void CCamera::StartOver(CameraOverEffect effect, glm::vec3 pos, float force) if (m_overType == CAM_OVER_EFFECT_BLOOD) { m_overColor = Color(0.8f, 0.1f, 0.1f); // red - m_overMode = ENG_RSTATE_TCOLOR_BLACK; + m_overMode = TransparencyMode::BLACK; m_overFadeIn = 0.4f; m_overFadeOut = 0.8f; @@ -621,7 +621,7 @@ void CCamera::StartOver(CameraOverEffect effect, glm::vec3 pos, float force) if ( m_overType == CAM_OVER_EFFECT_FADEIN_WHITE ) { m_overColor = Color(1.0f, 1.0f, 1.0f); // white - m_overMode = ENG_RSTATE_TCOLOR_BLACK; + m_overMode = TransparencyMode::BLACK; m_overFadeIn = 0.0f; m_overFadeOut = 20.0f; @@ -631,7 +631,7 @@ void CCamera::StartOver(CameraOverEffect effect, glm::vec3 pos, float force) if ( m_overType == CAM_OVER_EFFECT_FADEOUT_WHITE ) { m_overColor = Color(1.0f, 1.0f, 1.0f); // white - m_overMode = ENG_RSTATE_TCOLOR_BLACK; + m_overMode = TransparencyMode::BLACK; m_overFadeIn = 6.0f; m_overFadeOut = 100000.0f; @@ -641,7 +641,7 @@ void CCamera::StartOver(CameraOverEffect effect, glm::vec3 pos, float force) if ( m_overType == CAM_OVER_EFFECT_FADEOUT_BLACK ) { m_overColor = m_engine->GetFogColor(1); // fog color underwater - m_overMode = ENG_RSTATE_TTEXTURE_WHITE; + m_overMode = TransparencyMode::WHITE; m_overFadeIn = 4.0f; m_overFadeOut = 100000.0f; @@ -651,7 +651,7 @@ void CCamera::StartOver(CameraOverEffect effect, glm::vec3 pos, float force) if ( m_overType == CAM_OVER_EFFECT_LIGHTNING ) { m_overColor = Color(0.9f, 1.0f, 1.0f); // white-cyan - m_overMode = ENG_RSTATE_TCOLOR_BLACK; + m_overMode = TransparencyMode::BLACK; m_overFadeIn = 0.0f; m_overFadeOut = 1.0f; @@ -692,7 +692,7 @@ void CCamera::OverFrame(const Event &event) intensity *= m_overForce; Color color; - if (m_overMode == ENG_RSTATE_TCOLOR_WHITE) + if (m_overMode == TransparencyMode::WHITE) { color.r = 1.0f - (1.0f - m_overColor.r) * intensity; color.g = 1.0f - (1.0f - m_overColor.g) * intensity; @@ -717,7 +717,7 @@ void CCamera::OverFrame(const Event &event) intensity *= m_overForce; Color color; - if (m_overMode == ENG_RSTATE_TCOLOR_WHITE) + if (m_overMode == TransparencyMode::WHITE) { color.r = 1.0f-(1.0f-m_overColor.r) * intensity; color.g = 1.0f-(1.0f-m_overColor.g) * intensity; diff --git a/src/graphics/engine/camera.h b/src/graphics/engine/camera.h index 00e4a46e..cf655563 100644 --- a/src/graphics/engine/camera.h +++ b/src/graphics/engine/camera.h @@ -389,7 +389,7 @@ protected: float m_overTime; Color m_overColorBase; Color m_overColor; - int m_overMode; + TransparencyMode m_overMode; float m_overFadeIn; float m_overFadeOut; diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 9d7a0314..6c0b8fa7 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -83,17 +83,17 @@ struct EngineMouse //! Shadow texture part int iconShadow; //! Mode to render 1st image in - EngineRenderState mode1; + TransparencyMode mode1; //! Mode to render 2nd image in - EngineRenderState mode2; + TransparencyMode mode2; //! Hot point glm::ivec2 hotPoint; EngineMouse(int icon1 = -1, int icon2 = -1, int iconShadow = -1, - EngineRenderState mode1 = ENG_RSTATE_NORMAL, - EngineRenderState mode2 = ENG_RSTATE_NORMAL, + TransparencyMode mode1 = TransparencyMode::NONE, + TransparencyMode mode2 = TransparencyMode::NONE, glm::ivec2 hotPoint = { 0, 0 }) : icon1(icon1) , icon2(icon2) @@ -106,22 +106,22 @@ struct EngineMouse constexpr glm::ivec2 MOUSE_SIZE(32, 32); const std::map MOUSE_TYPES = { - {{ENG_MOUSE_NORM}, {EngineMouse( 0, 1, 32, ENG_RSTATE_TTEXTURE_WHITE, ENG_RSTATE_TTEXTURE_BLACK, glm::ivec2( 1, 1))}}, - {{ENG_MOUSE_WAIT}, {EngineMouse( 2, 3, 33, ENG_RSTATE_TTEXTURE_WHITE, ENG_RSTATE_TTEXTURE_BLACK, glm::ivec2( 8, 12))}}, - {{ENG_MOUSE_HAND}, {EngineMouse( 4, 5, 34, ENG_RSTATE_TTEXTURE_WHITE, ENG_RSTATE_TTEXTURE_BLACK, glm::ivec2( 7, 2))}}, - {{ENG_MOUSE_NO}, {EngineMouse( 6, 7, 35, ENG_RSTATE_TTEXTURE_WHITE, ENG_RSTATE_TTEXTURE_BLACK, glm::ivec2(10, 10))}}, - {{ENG_MOUSE_EDIT}, {EngineMouse( 8, 9, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 6, 10))}}, - {{ENG_MOUSE_CROSS}, {EngineMouse(10, 11, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2(10, 10))}}, - {{ENG_MOUSE_MOVEV}, {EngineMouse(12, 13, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 5, 11))}}, - {{ENG_MOUSE_MOVEH}, {EngineMouse(14, 15, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2(11, 5))}}, - {{ENG_MOUSE_MOVED}, {EngineMouse(16, 17, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 9, 9))}}, - {{ENG_MOUSE_MOVEI}, {EngineMouse(18, 19, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 9, 9))}}, - {{ENG_MOUSE_MOVE}, {EngineMouse(20, 21, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2(11, 11))}}, - {{ENG_MOUSE_TARGET}, {EngineMouse(22, 23, -1, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2(15, 15))}}, - {{ENG_MOUSE_SCROLLL}, {EngineMouse(24, 25, 43, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 2, 9))}}, - {{ENG_MOUSE_SCROLLR}, {EngineMouse(26, 27, 44, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2(17, 9))}}, - {{ENG_MOUSE_SCROLLU}, {EngineMouse(28, 29, 45, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 9, 2))}}, - {{ENG_MOUSE_SCROLLD}, {EngineMouse(30, 31, 46, ENG_RSTATE_TTEXTURE_BLACK, ENG_RSTATE_TTEXTURE_WHITE, glm::ivec2( 9, 17))}}, + {{ENG_MOUSE_NORM}, {EngineMouse( 0, 1, 32, TransparencyMode::WHITE, TransparencyMode::BLACK, glm::ivec2( 1, 1))}}, + {{ENG_MOUSE_WAIT}, {EngineMouse( 2, 3, 33, TransparencyMode::WHITE, TransparencyMode::BLACK, glm::ivec2( 8, 12))}}, + {{ENG_MOUSE_HAND}, {EngineMouse( 4, 5, 34, TransparencyMode::WHITE, TransparencyMode::BLACK, glm::ivec2( 7, 2))}}, + {{ENG_MOUSE_NO}, {EngineMouse( 6, 7, 35, TransparencyMode::WHITE, TransparencyMode::BLACK, glm::ivec2(10, 10))}}, + {{ENG_MOUSE_EDIT}, {EngineMouse( 8, 9, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 6, 10))}}, + {{ENG_MOUSE_CROSS}, {EngineMouse(10, 11, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2(10, 10))}}, + {{ENG_MOUSE_MOVEV}, {EngineMouse(12, 13, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 5, 11))}}, + {{ENG_MOUSE_MOVEH}, {EngineMouse(14, 15, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2(11, 5))}}, + {{ENG_MOUSE_MOVED}, {EngineMouse(16, 17, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 9, 9))}}, + {{ENG_MOUSE_MOVEI}, {EngineMouse(18, 19, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 9, 9))}}, + {{ENG_MOUSE_MOVE}, {EngineMouse(20, 21, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2(11, 11))}}, + {{ENG_MOUSE_TARGET}, {EngineMouse(22, 23, -1, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2(15, 15))}}, + {{ENG_MOUSE_SCROLLL}, {EngineMouse(24, 25, 43, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 2, 9))}}, + {{ENG_MOUSE_SCROLLR}, {EngineMouse(26, 27, 44, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2(17, 9))}}, + {{ENG_MOUSE_SCROLLU}, {EngineMouse(28, 29, 45, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 9, 2))}}, + {{ENG_MOUSE_SCROLLD}, {EngineMouse(30, 31, 46, TransparencyMode::BLACK, TransparencyMode::WHITE, glm::ivec2( 9, 17))}}, }; CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils) @@ -181,7 +181,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils) m_backgroundScale = false; m_overFront = true; m_overColor = Color(); - m_overMode = ENG_RSTATE_TCOLOR_BLACK; + m_overMode = TransparencyMode::BLACK; m_highlight = false; std::fill_n(m_highlightRank, 100, -1); m_highlightTime = 0.0f; @@ -346,7 +346,6 @@ bool CEngine::Create() } m_device->SetClearColor(Color(0.0f, 0.0f, 0.0f, 0.0f)); - m_device->SetFillMode(FillMode::POLY); SetFocus(m_focus); @@ -1918,238 +1917,6 @@ bool CEngine::TransformPoint(glm::vec3& p2D, int objRank, glm::vec3 p3D) -void CEngine::SetState(int state, const Color& color) -{ - if (state == m_lastState && color == m_lastColor) - return; - - m_device->GetUIRenderer()->Flush(); - m_device->GetUIRenderer()->SetColor({ color.r, color.g, color.b, color.a }); - - m_lastState = state; - m_lastColor = color; - - if (state & ENG_RSTATE_TTEXTURE_BLACK) // transparent black texture? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_ONE, BLEND_INV_SRC_COLOR); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_MODULATE; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_FACTOR; - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - params.factor = color; - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - else if (state & ENG_RSTATE_TTEXTURE_WHITE) // transparent white texture? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_DST_COLOR, BLEND_ZERO); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_ADD; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_FACTOR; - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - params.factor = color.Inverse(); - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - else if (state & ENG_RSTATE_TCOLOR_BLACK) // transparent black color? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_ONE, BLEND_INV_SRC_COLOR); - - m_device->SetTextureEnabled(0, false); - } - else if (state & ENG_RSTATE_TCOLOR_WHITE) // transparent white color? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_DST_COLOR, BLEND_ZERO); - - m_device->SetTextureEnabled(0, false); - } - else if (state & ENG_RSTATE_TDIFFUSE) // diffuse color as transparent? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_SRC_ALPHA, BLEND_DST_ALPHA); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_REPLACE; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - else if (state & ENG_RSTATE_OPAQUE_TEXTURE) // opaque texture ? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - m_device->SetRenderState(RENDER_STATE_BLENDING, false); - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, TextureStageParams()); // default operation - } - else if (state & ENG_RSTATE_OPAQUE_COLOR) // opaque color ? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - m_device->SetRenderState(RENDER_STATE_BLENDING, false); - - m_device->SetTextureEnabled(0, false); - } - else if (state & ENG_RSTATE_TEXT) // font rendering? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_SRC_ALPHA, BLEND_INV_SRC_ALPHA); - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, TextureStageParams()); // default operation - } - else if (state & ENG_RSTATE_ALPHA) // image with alpha channel? - { - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_SRC_ALPHA, BLEND_INV_SRC_ALPHA); - - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, true); - - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true); - - m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.5f); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_MODULATE; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_SRC_COLOR; - params.alphaOperation = TEX_MIX_OPER_REPLACE; - params.alphaArg1 = TEX_MIX_ARG_TEXTURE; - params.factor = color; - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - else if (state & ENG_RSTATE_TTEXTURE_ALPHA) // texture with alpha channel? - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true); - m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.0f); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_DST_COLOR, BLEND_INV_SRC_ALPHA); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_MODULATE; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_SRC_COLOR; - params.alphaOperation = TEX_MIX_OPER_MODULATE; - params.alphaArg1 = TEX_MIX_ARG_TEXTURE; - params.alphaArg2 = TEX_MIX_ARG_FACTOR; - params.factor = color; - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - else if (state & ENG_RSTATE_TCOLOR_ALPHA) - { - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - - m_device->SetRenderState(RENDER_STATE_BLENDING, true); - m_device->SetBlendFunc(BLEND_DST_COLOR, BLEND_INV_SRC_ALPHA); - - m_device->SetTextureEnabled(0, false); - } - else // normal ? - { - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - m_device->SetRenderState(RENDER_STATE_BLENDING, false); - - m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, true); - - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_DEFAULT; // default modulate - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - - m_device->SetTextureEnabled(0, true); - m_device->SetTextureStageParams(0, params); - } - - bool second = m_dirty; - - // TODO: I'm pretty sure this is reversed and should be m_dirty instead of !m_dirty ~krzys_h - if ( !m_dirty && (state & ENG_RSTATE_SECOND) == 0 ) second = false; - - if ((state & ENG_RSTATE_DUAL_BLACK) && second) - { - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_MODULATE; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_COMPUTED_COLOR; - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - m_device->SetTextureEnabled(1, true); - m_device->SetTextureStageParams(1, params); - } - else if ((state & ENG_RSTATE_DUAL_WHITE) && second) - { - TextureStageParams params; - params.colorOperation = TEX_MIX_OPER_ADD; - params.colorArg1 = TEX_MIX_ARG_TEXTURE; - params.colorArg2 = TEX_MIX_ARG_COMPUTED_COLOR; - params.alphaOperation = TEX_MIX_OPER_DEFAULT; - m_device->SetTextureEnabled(1, true); - m_device->SetTextureStageParams(1, params); - } - else - { - m_device->SetTextureEnabled(1, false); - } - - if (state & ENG_RSTATE_WRAP) - { - m_device->SetTextureStageWrap(0, TEX_WRAP_REPEAT, TEX_WRAP_REPEAT); - m_device->SetTextureStageWrap(1, TEX_WRAP_REPEAT, TEX_WRAP_REPEAT); - } - else if (state & ENG_RSTATE_CLAMP) - { - m_device->SetTextureStageWrap(0, TEX_WRAP_CLAMP, TEX_WRAP_CLAMP); - m_device->SetTextureStageWrap(1, TEX_WRAP_CLAMP, TEX_WRAP_CLAMP); - } - - if (state & ENG_RSTATE_2FACE) - { - m_device->SetRenderState(RENDER_STATE_CULLING, false); - } - else - { - m_device->SetRenderState(RENDER_STATE_CULLING, true); - m_device->SetCullMode(CULL_CCW); - } -} - void CEngine::SetMaterial(const Material& mat) { m_lastMaterial = mat; @@ -2807,7 +2574,7 @@ void CEngine::SetOverFront(bool front) m_overFront = front; } -void CEngine::SetOverColor(const Color& color, int mode) +void CEngine::SetOverColor(const Color& color, TransparencyMode mode) { m_overColor = color; m_overMode = mode; @@ -3233,8 +3000,6 @@ void CEngine::Draw3DScene() //m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN); - SetState(0); - Gfx::ShadowParam shadowParams[4]; for (int i = 0; i < m_shadowRegions; i++) { @@ -3522,7 +3287,7 @@ void CEngine::Draw3DScene() glm::mat4 worldMatrix = glm::mat4(1.0f); m_device->SetTransform(TRANSFORM_WORLD, worldMatrix); - SetState(ENG_RSTATE_OPAQUE_COLOR); + //SetState(ENG_RSTATE_OPAQUE_COLOR); for (const auto& line : m_displayGoto) { @@ -3661,14 +3426,7 @@ void CEngine::Capture3DScene() void CEngine::DrawCaptured3DScene() { - glm::mat4 identity = glm::mat4(1.0f); - - m_device->SetTransform(TRANSFORM_PROJECTION, identity); - m_device->SetTransform(TRANSFORM_VIEW, identity); - m_device->SetTransform(TRANSFORM_WORLD, identity); - - m_device->SetRenderState(RENDER_STATE_BLENDING, false); - m_device->SetRenderState(RENDER_STATE_CULLING, false); + m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false); Vertex2D vertices[4]; @@ -3677,11 +3435,10 @@ void CEngine::DrawCaptured3DScene() vertices[2] = { { 0.0f, 1.0f }, { 0.0f, 1.0f } }; vertices[3] = { { 1.0f, 1.0f }, { 1.0f, 1.0f } }; - m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, false); - auto renderer = m_device->GetUIRenderer(); renderer->SetTexture(m_capturedWorldTexture); + renderer->SetTransparency(TransparencyMode::NONE); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertices); } @@ -3805,7 +3562,7 @@ void CEngine::RenderPendingDebugDraws() m_device->SetTransform(TRANSFORM_WORLD, glm::mat4(1.0f)); - SetState(ENG_RSTATE_OPAQUE_COLOR); + //SetState(ENG_RSTATE_OPAQUE_COLOR); m_device->DrawPrimitives(PrimitiveType::LINE_STRIP, m_pendingDebugDraws.vertices.data(), @@ -3975,10 +3732,6 @@ void CEngine::RenderShadowMap() renderer->End(); - m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); - m_device->SetRenderState(RENDER_STATE_CULLING, false); - m_device->SetCullMode(CULL_CW); - // restore default state m_device->SetViewport(0, 0, m_size.x, m_size.y); @@ -4060,7 +3813,6 @@ void CEngine::DrawInterface() // Force new state to disable lighting m_interfaceMode = true; m_lastState = -1; - SetState(Gfx::ENG_RSTATE_NORMAL); // Draw the entire interface Ui::CInterface* interface = CRobotMain::GetInstancePointer()->GetInterface(); @@ -4071,7 +3823,6 @@ void CEngine::DrawInterface() m_interfaceMode = false; m_lastState = -1; - SetState(Gfx::ENG_RSTATE_NORMAL); if (!m_screenshotMode && m_renderInterface) { @@ -4688,7 +4439,7 @@ void CEngine::DrawShadowSpots() if (lastIntensity != intensity) // intensity changed? { lastIntensity = intensity; - SetState(ENG_RSTATE_TTEXTURE_WHITE, Color(intensity, intensity, intensity, intensity)); + //SetState(ENG_RSTATE_TTEXTURE_WHITE, Color(intensity, intensity, intensity, intensity)); } m_device->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, vertex, 4); @@ -4733,8 +4484,6 @@ void CEngine::DrawBackgroundGradient(const Color& up, const Color& down) { 0, 0, 0, 0 } }; - SetState(ENG_RSTATE_OPAQUE_COLOR); - auto renderer = m_device->GetObjectRenderer(); renderer->Begin(); renderer->SetProjectionMatrix(m_matProjInterface); @@ -4826,8 +4575,6 @@ void CEngine::DrawBackgroundImage() v2 -= margin_v; } - SetUITexture(m_backgroundTex); - Vertex2D vertices[4] = { { { p1.x, p1.y }, { u1, v2 } }, @@ -4837,6 +4584,7 @@ void CEngine::DrawBackgroundImage() }; auto renderer = m_device->GetUIRenderer(); + renderer->SetTexture(m_backgroundTex); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertices); AddStatisticTriangle(2); } @@ -4887,7 +4635,7 @@ void CEngine::DrawForegroundImage() }; SetTexture(m_foregroundTex); - SetState(ENG_RSTATE_CLAMP | ENG_RSTATE_TTEXTURE_BLACK); + //SetState(ENG_RSTATE_TTEXTURE_BLACK); m_device->Restore(); @@ -4901,8 +4649,8 @@ void CEngine::DrawForegroundImage() void CEngine::DrawOverColor() { - if ((m_overColor == Color(0.0f, 0.0f, 0.0f, 0.0f) && m_overMode == ENG_RSTATE_TCOLOR_BLACK) || - (m_overColor == Color(1.0f, 1.0f, 1.0f, 1.0f) && m_overMode == ENG_RSTATE_TCOLOR_WHITE)) + if ((m_overColor == Color(0.0f, 0.0f, 0.0f, 0.0f) && m_overMode == TransparencyMode::BLACK) || + (m_overColor == Color(1.0f, 1.0f, 1.0f, 1.0f) && m_overMode == TransparencyMode::WHITE)) return; glm::vec2 p1(0.0f, 0.0f); @@ -4917,33 +4665,19 @@ void CEngine::DrawOverColor() { 0, 0, 0, 0 } }; - m_device->Restore(); + auto renderer = m_device->GetUIRenderer(); + renderer->SetTexture(Texture{}); + renderer->SetTransparency(m_overMode); - SetState(m_overMode); - - auto renderer = m_device->GetObjectRenderer(); - renderer->Begin(); - - renderer->SetProjectionMatrix(m_matProjInterface); - renderer->SetViewMatrix(m_matViewInterface); - renderer->SetModelMatrix(m_matWorldInterface); - renderer->SetLighting(false); - - if (m_overMode == ENG_RSTATE_TCOLOR_BLACK) - renderer->SetTransparency(TransparencyMode::BLACK); - else if (m_overMode == ENG_RSTATE_TCOLOR_WHITE) - renderer->SetTransparency(TransparencyMode::WHITE); - - Vertex3D vertex[4] = + Vertex2D vertex[4] = { - { glm::vec3(p1.x, p1.y, 0.0f), colors[1] }, - { glm::vec3(p1.x, p2.y, 0.0f), colors[0] }, - { glm::vec3(p2.x, p1.y, 0.0f), colors[1] }, - { glm::vec3(p2.x, p2.y, 0.0f), colors[0] } + { { p1.x, p1.y }, {}, colors[1] }, + { { p1.x, p2.y }, {}, colors[0] }, + { { p2.x, p1.y }, {}, colors[1] }, + { { p2.x, p2.y }, {}, colors[0] } }; renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex); - renderer->End(); AddStatisticTriangle(2); @@ -4999,7 +4733,7 @@ void CEngine::DrawHighlight() if (nbOut > 2) return; - SetState(ENG_RSTATE_OPAQUE_COLOR); + //SetState(ENG_RSTATE_OPAQUE_COLOR); float d = 0.5f + sinf(m_highlightTime * 6.0f) * 0.5f; d *= (p2.x - p1.x) * 0.1f; @@ -5049,10 +4783,6 @@ void CEngine::DrawMouse() SetWindowCoordinates(); - m_device->SetTexture(0, m_miceTexture); - - SetUITexture(m_miceTexture); - glm::vec2 mousePos = CInput::GetInstancePointer()->GetMousePos(); glm::ivec2 pos(mousePos.x * m_size.x, m_size.y - mousePos.y * m_size.y); pos.x -= MOUSE_TYPES.at(m_mouseType).hotPoint.x; @@ -5060,19 +4790,17 @@ void CEngine::DrawMouse() glm::ivec2 shadowPos = { pos.x + 4, pos.y - 3 }; - SetState(ENG_RSTATE_TCOLOR_WHITE); - DrawMouseSprite(shadowPos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).iconShadow); + auto renderer = m_device->GetUIRenderer(); + renderer->SetTexture(m_miceTexture); - SetState(MOUSE_TYPES.at(m_mouseType).mode1); - DrawMouseSprite(pos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).icon1); - - SetState(MOUSE_TYPES.at(m_mouseType).mode2); - DrawMouseSprite(pos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).icon2); + DrawMouseSprite(shadowPos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).iconShadow, TransparencyMode::WHITE); + DrawMouseSprite(pos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).icon1, MOUSE_TYPES.at(m_mouseType).mode1); + DrawMouseSprite(pos, MOUSE_SIZE, MOUSE_TYPES.at(m_mouseType).icon2, MOUSE_TYPES.at(m_mouseType).mode2); SetInterfaceCoordinates(); } -void CEngine::DrawMouseSprite(const glm::ivec2& pos, const glm::ivec2& size, int icon) +void CEngine::DrawMouseSprite(const glm::ivec2& pos, const glm::ivec2& size, int icon, TransparencyMode mode) { if (icon == -1) return; @@ -5100,6 +4828,7 @@ void CEngine::DrawMouseSprite(const glm::ivec2& pos, const glm::ivec2& size, int }; auto renderer = m_device->GetUIRenderer(); + renderer->SetTransparency(mode); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex); AddStatisticTriangle(2); } @@ -5115,8 +4844,9 @@ void CEngine::DrawStats() glm::vec2 pos(0.05f * m_size.x/m_size.y, 0.05f + TOTAL_LINES * height); - SetState(ENG_RSTATE_TCOLOR_ALPHA); + //SetState(ENG_RSTATE_TCOLOR_ALPHA); auto renderer = m_device->GetUIRenderer(); + renderer->SetTransparency(TransparencyMode::ALPHA); renderer->SetTexture(Texture{}); glm::u8vec4 black = { 0, 0, 0, 192 }; @@ -5133,7 +4863,7 @@ void CEngine::DrawStats() renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertex); - SetState(ENG_RSTATE_TEXT); + renderer->SetTransparency(TransparencyMode::ALPHA); auto drawStatsLine = [&](const std::string& name, const std::string& value, const std::string& value2) { @@ -5210,7 +4940,7 @@ void CEngine::DrawStats() void CEngine::DrawTimer() { - SetState(ENG_RSTATE_TEXT); + //SetState(ENG_RSTATE_TEXT); glm::vec2 pos(0.98f, 0.98f-m_text->GetAscent(FONT_COMMON, 15.0f)); m_text->DrawText(m_timerText, FONT_COMMON, 15.0f, pos, 1.0f, TEXT_ALIGN_RIGHT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f)); @@ -5529,18 +5259,4 @@ void CEngine::SetWindowCoordinates() renderer->SetProjection(0.0f, m_size.x, m_size.y, 0.0f); } -void CEngine::SetUITexture(const std::string& name) -{ - auto texture = LoadTexture(name); - - SetUITexture(texture); -} - -void CEngine::SetUITexture(const Texture& texture) -{ - auto renderer = m_device->GetUIRenderer(); - - renderer->SetTexture(texture); -} - } // namespace Gfx diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index d71cbac8..eec21c60 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -30,6 +30,7 @@ #include "graphics/core/color.h" #include "graphics/core/material.h" #include "graphics/core/texture.h" +#include "graphics/core/renderers.h" #include "graphics/core/vertex.h" #include "math/sphere.h" @@ -55,7 +56,6 @@ struct Event; namespace Gfx { - class CDevice; class COldModelManager; class CLightManager; @@ -90,10 +90,6 @@ enum EngineRenderState ENG_RSTATE_TTEXTURE_WHITE = (1<<1), //! The transparent diffuse color ENG_RSTATE_TDIFFUSE = (1<<2), - //! Texture wrap - ENG_RSTATE_WRAP = (1<<3), - //! Texture borders with solid color - ENG_RSTATE_CLAMP = (1<<4), //! Light texture (ambient max) ENG_RSTATE_LIGHT = (1<<5), //! Double black texturing @@ -837,7 +833,7 @@ public: /* *************** Mode setting *************** */ //! Sets the current rendering state - void SetState(int state, const Color& color = Color(1.0f, 1.0f, 1.0f, 1.0f)); + //void SetState(int state, const Color& color = Color(1.0f, 1.0f, 1.0f, 1.0f)); //! Sets the current material void SetMaterial(const Material& mat); @@ -997,7 +993,7 @@ public: //! Specifies whether to draw the foreground void SetOverFront(bool front); //! Sets the foreground overlay color - void SetOverColor(const Color& color = Color(), int mode = ENG_RSTATE_TCOLOR_BLACK); + void SetOverColor(const Color& color = Color(), TransparencyMode mode = TransparencyMode::BLACK); //@{ //! Management of the particle density @@ -1171,9 +1167,6 @@ public: void EnablePauseBlur(); void DisablePauseBlur(); - void SetUITexture(const std::string& name); - void SetUITexture(const Texture& texture); - //! Reloads all textures /** This additionally sends EVENT_RELOAD_TEXTURES to reload all textures not maintained by CEngine **/ @@ -1218,7 +1211,7 @@ protected: //! Draws the mouse cursor void DrawMouse(); //! Draw part of mouse cursor sprite - void DrawMouseSprite(const glm::ivec2& pos, const glm::ivec2& size, int icon); + void DrawMouseSprite(const glm::ivec2& pos, const glm::ivec2& size, int icon, TransparencyMode mode); //! Draw statistic texts void DrawStats(); //! Draw mission timer @@ -1380,7 +1373,7 @@ protected: Color m_backgroundCloudDown; bool m_overFront; Color m_overColor; - int m_overMode; + TransparencyMode m_overMode; std::string m_foregroundName; Texture m_foregroundTex; bool m_drawWorld; diff --git a/src/graphics/engine/lightning.cpp b/src/graphics/engine/lightning.cpp index be4921aa..3c49eb14 100644 --- a/src/graphics/engine/lightning.cpp +++ b/src/graphics/engine/lightning.cpp @@ -226,7 +226,7 @@ void CLightning::Draw() device->SetTransform(TRANSFORM_WORLD, mat); m_engine->SetTexture("textures/effect00.png"); - m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK); + //m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK); glm::vec2 texInf; texInf.x = 64.5f/256.0f; diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp index 224faee9..357b5445 100644 --- a/src/graphics/engine/terrain.cpp +++ b/src/graphics/engine/terrain.cpp @@ -635,7 +635,7 @@ bool CTerrain::CreateMosaic(int ox, int oy, int step, int objRank) buffer.type = EngineTriangleType::SURFACE; - buffer.state = ENG_RSTATE_WRAP; + buffer.state = ENG_RSTATE_NORMAL; buffer.state |= ENG_RSTATE_SECOND; if (step == 1) diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp index 48b8cdbf..0f5d5338 100644 --- a/src/graphics/engine/text.cpp +++ b/src/graphics/engine/text.cpp @@ -115,13 +115,13 @@ public: /// Add a quad to be rendered. /// This may trigger a call to Flush() if necessary. - void Add(Vertex2D vertices[4], unsigned int texID, EngineRenderState renderState, Color color) + void Add(Vertex2D vertices[4], unsigned int texID, TransparencyMode transparency, Color color) { - if (texID != m_texID || renderState != m_renderState || color != m_color) + if (texID != m_texID || transparency != m_transparency || color != m_color) { Flush(); m_texID = texID; - m_renderState = renderState; + m_transparency = transparency; m_color = color; } m_quads.emplace_back(Quad{{vertices[0], vertices[1], vertices[2], vertices[3]}}); @@ -132,9 +132,9 @@ public: { if (m_quads.empty()) return; - m_engine.SetState(m_renderState); - m_engine.GetDevice()->SetTexture(0, m_texID); - m_engine.SetUITexture(Texture{ m_texID }); + auto renderer = m_engine.GetDevice()->GetUIRenderer(); + renderer->SetTexture(Texture{ m_texID }); + renderer->SetTransparency(m_transparency); assert(m_firsts.size() == m_counts.size()); if (m_firsts.size() < m_quads.size()) @@ -151,15 +151,11 @@ public: } } - auto renderer = m_engine.GetDevice()->GetUIRenderer(); - for (const auto& quad : m_quads) { renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, quad.vertices); } - m_engine.GetDevice()->GetUIRenderer()->Flush(); - //const Vertex* vertices = m_quads.front().vertices; //m_engine.GetDevice()->DrawPrimitives(PrimitiveType::TRIANGLE_STRIP, vertices, m_firsts.data(), // m_counts.data(), static_cast(m_quads.size()), m_color); @@ -176,7 +172,7 @@ private: Color m_color; unsigned int m_texID{}; - EngineRenderState m_renderState{}; + TransparencyMode m_transparency = TransparencyMode::NONE; }; @@ -1068,7 +1064,7 @@ void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, glm::iv { { p2.x, p1.y }, { uv2.x, uv1.y }, col } }; - m_quadBatch->Add(quad, texID, ENG_RSTATE_TTEXTURE_WHITE, color); + m_quadBatch->Add(quad, texID, TransparencyMode::WHITE, color); pos.x += width; } @@ -1107,7 +1103,7 @@ void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, glm::iv { { p2.x, p1.y }, { texCoord2.x, texCoord1.y }, col } }; - m_quadBatch->Add(quad, tex.id, ENG_RSTATE_TEXT, color); + m_quadBatch->Add(quad, tex.id, TransparencyMode::ALPHA, color); pos.x += tex.charSize.x * width; } diff --git a/src/graphics/opengl/gl33device.cpp b/src/graphics/opengl/gl33device.cpp index 83f2355b..5a43b687 100644 --- a/src/graphics/opengl/gl33device.cpp +++ b/src/graphics/opengl/gl33device.cpp @@ -373,8 +373,6 @@ void CGL33Device::BeginScene() void CGL33Device::EndScene() { - m_uiRenderer->Flush(); - #ifdef DEV_BUILD CheckGLErrors(); #endif @@ -413,13 +411,7 @@ CShadowRenderer* CGL33Device::GetShadowRenderer() void CGL33Device::Restore() { - m_uiRenderer->Flush(); glUseProgram(m_normalProgram); - - - //UpdateTextureState(0); - //UpdateTextureState(1); - //UpdateTextureState(2); } void CGL33Device::SetTransform(TransformType type, const glm::mat4 &matrix) @@ -678,8 +670,6 @@ void CGL33Device::SetTexture(int index, const Texture &texture) m_currentTextures[index] = texture; // remember the new value - // Params need to be updated for the new bound texture - UpdateTextureParams(index); UpdateTextureState(index); } @@ -694,8 +684,6 @@ void CGL33Device::SetTexture(int index, unsigned int textureId) m_currentTextures[index].id = textureId; - // Params need to be updated for the new bound texture - UpdateTextureParams(index); UpdateTextureState(index); } @@ -711,82 +699,10 @@ void CGL33Device::SetTextureEnabled(int index, bool enabled) UpdateTextureState(index); } -/** - Sets the texture parameters for the given texture stage. - If the given texture was not set (bound) yet, nothing happens. - The settings are remembered, even if texturing is disabled at the moment. */ -void CGL33Device::SetTextureStageParams(int index, const TextureStageParams ¶ms) -{ - assert(index >= 0 && index < static_cast( m_currentTextures.size() )); - - // Remember the settings - m_textureStageParams[index] = params; - - UpdateTextureParams(index); -} - -void CGL33Device::UpdateTextureParams(int index) -{ - assert(index >= 0 && index < static_cast( m_currentTextures.size() )); - - // Don't actually do anything if texture not set - if (! m_currentTextures[index].Valid()) - return; - - const TextureStageParams ¶ms = m_textureStageParams[index]; - - glActiveTexture(GL_TEXTURE0 + index); - - if (params.wrapS == TEX_WRAP_CLAMP) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - else if (params.wrapS == TEX_WRAP_CLAMP_TO_BORDER) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - else if (params.wrapS == TEX_WRAP_REPEAT) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - else assert(false); - - if (params.wrapT == TEX_WRAP_CLAMP) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - else if (params.wrapT == TEX_WRAP_CLAMP_TO_BORDER) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - else if (params.wrapT == TEX_WRAP_REPEAT) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - else assert(false); -} - -void CGL33Device::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wrapT) -{ - assert(index >= 0 && index < static_cast( m_currentTextures.size() )); - - // Remember the settings - m_textureStageParams[index].wrapS = wrapS; - m_textureStageParams[index].wrapT = wrapT; - - // Don't actually do anything if texture not set - if (! m_currentTextures[index].Valid()) - return; - - glActiveTexture(GL_TEXTURE0 + index); - - if (wrapS == TEX_WRAP_CLAMP) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - else if (wrapS == TEX_WRAP_CLAMP_TO_BORDER) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - else if (wrapS == TEX_WRAP_REPEAT) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - else assert(false); - - if (wrapT == TEX_WRAP_CLAMP) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - else if (wrapT == TEX_WRAP_CLAMP_TO_BORDER) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - else if (wrapT == TEX_WRAP_REPEAT) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - else assert(false); -} - void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int vertexCount, Color color) { + return; + unsigned int size = vertexCount * sizeof(Vertex); DynamicBuffer& buffer = m_dynamicBuffer; @@ -824,6 +740,8 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex *vertices, int void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, int vertexCount) { + return; + unsigned int size = vertexCount * sizeof(VertexCol); DynamicBuffer& buffer = m_dynamicBuffer; @@ -860,6 +778,8 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const VertexCol *vertices, i void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex3D* vertices, int vertexCount) { + return; + unsigned int size = vertexCount * sizeof(Vertex3D); DynamicBuffer& buffer = m_dynamicBuffer; @@ -900,6 +820,8 @@ void CGL33Device::DrawPrimitive(PrimitiveType type, const Vertex3D* vertices, in void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices, int first[], int count[], int drawCount, Color color) { + return; + int vertexCount = 0; for (int i = 0; i < drawCount; i++) @@ -948,6 +870,8 @@ void CGL33Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices, void CGL33Device::DrawPrimitives(PrimitiveType type, const VertexCol *vertices, int first[], int count[], int drawCount) { + return; + int vertexCount = 0; for (int i = 0; i < drawCount; i++) @@ -1068,23 +992,6 @@ void CGL33Device::SetClearColor(const Color &color) glClearColor(color.r, color.g, color.b, color.a); } -void CGL33Device::SetCullMode(CullMode mode) -{ - // Cull clockwise back faces, so front face is the opposite - // (assuming GL_CULL_FACE is GL_BACK) - if (mode == CULL_CW ) glFrontFace(GL_CCW); - else if (mode == CULL_CCW) glFrontFace(GL_CW); - else assert(false); -} - -void CGL33Device::SetFillMode(FillMode mode) -{ - if (mode == FillMode::POINT) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); - else if (mode == FillMode::LINES) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else if (mode == FillMode::POLY) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - else assert(false); -} - void CGL33Device::CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) { if (texture.id == 0) return; diff --git a/src/graphics/opengl/gl33device.h b/src/graphics/opengl/gl33device.h index 016057b4..a6b8da8c 100644 --- a/src/graphics/opengl/gl33device.h +++ b/src/graphics/opengl/gl33device.h @@ -135,10 +135,6 @@ public: void SetTexture(int index, unsigned int textureId) override; void SetTextureEnabled(int index, bool enabled) override; - void SetTextureStageParams(int index, const TextureStageParams ¶ms) override; - - void SetTextureStageWrap(int index, Gfx::TexWrapMode wrapS, Gfx::TexWrapMode wrapT) override; - virtual void DrawPrimitive(PrimitiveType type, const Vertex *vertices , int vertexCount, Color color = Color(1.0f, 1.0f, 1.0f, 1.0f)) override; virtual void DrawPrimitive(PrimitiveType type, const VertexCol *vertices , int vertexCount) override; @@ -166,10 +162,6 @@ public: void SetClearColor(const Color &color) override; - void SetCullMode(CullMode mode) override; - - void SetFillMode(FillMode mode) override; - void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) override; std::unique_ptr GetFrameBufferPixels() const override; @@ -192,8 +184,6 @@ public: bool IsFramebufferSupported() override; private: - //! Updates the texture params for given texture stage - void UpdateTextureParams(int index); //! Updates texture state inline void UpdateTextureState(int index); diff --git a/src/graphics/opengl/gl33objectrenderer.cpp b/src/graphics/opengl/gl33objectrenderer.cpp index 76d60625..a83ac36c 100644 --- a/src/graphics/opengl/gl33objectrenderer.cpp +++ b/src/graphics/opengl/gl33objectrenderer.cpp @@ -177,6 +177,10 @@ void CGL33ObjectRenderer::CGL33ObjectRenderer::Begin() glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CW); // Colobot issue: faces are reversed + SetUVTransform({ 0.0f, 0.0f }, { 1.0f, 1.0f }); } @@ -320,7 +324,6 @@ void CGL33ObjectRenderer::SetCullMode(bool enabled) if (enabled) { glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); } else { diff --git a/src/graphics/opengl/gl33renderers.cpp b/src/graphics/opengl/gl33renderers.cpp index 429130ba..790cb8f3 100644 --- a/src/graphics/opengl/gl33renderers.cpp +++ b/src/graphics/opengl/gl33renderers.cpp @@ -71,7 +71,7 @@ CGL33UIRenderer::CGL33UIRenderer(CGL33Device* device) // Generic buffer glGenBuffers(1, &m_bufferVBO); glBindBuffer(GL_COPY_WRITE_BUFFER, m_bufferVBO); - glBufferData(GL_COPY_WRITE_BUFFER, m_bufferCapacity, nullptr, GL_STREAM_DRAW); + glBufferData(GL_COPY_WRITE_BUFFER, m_bufferCapacity * sizeof(Vertex2D), nullptr, GL_STREAM_DRAW); glGenVertexArrays(1, &m_bufferVAO); glBindVertexArray(m_bufferVAO); @@ -106,8 +106,6 @@ CGL33UIRenderer::~CGL33UIRenderer() void CGL33UIRenderer::SetProjection(float left, float right, float bottom, float top) { - Flush(); - m_uniforms.projectionMatrix = glm::ortho(left, right, bottom, top); m_uniformsDirty = true; } @@ -116,8 +114,6 @@ void CGL33UIRenderer::SetTexture(const Texture& texture) { if (m_currentTexture == texture.id) return; - Flush(); - glActiveTexture(GL_TEXTURE8); m_currentTexture = texture.id; @@ -130,88 +126,129 @@ void CGL33UIRenderer::SetTexture(const Texture& texture) void CGL33UIRenderer::SetColor(const glm::vec4& color) { - Flush(); - m_uniforms.color = color; m_uniformsDirty = true; } -void CGL33UIRenderer::DrawPrimitive(PrimitiveType type, int count, const Vertex2D* vertices) +void CGL33UIRenderer::SetTransparency(TransparencyMode mode) { - // If too much data would be buffered, flush - size_t totalSize = (m_buffer.size() + count) * sizeof(Vertex2D); - - if (totalSize > m_bufferCapacity) - Flush(); - - // Buffer data - GLint first = m_buffer.size(); - - m_buffer.insert(m_buffer.end(), vertices, vertices + count); - m_types.push_back(TranslateGfxPrimitive(type)); - m_firsts.push_back(first); - m_counts.push_back(count); + switch (mode) + { + case TransparencyMode::NONE: + glDisable(GL_BLEND); + break; + case TransparencyMode::ALPHA: + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + break; + case TransparencyMode::BLACK: + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); + glBlendEquation(GL_FUNC_ADD); + break; + case TransparencyMode::WHITE: + glEnable(GL_BLEND); + glBlendFunc(GL_DST_COLOR, GL_ZERO); + glBlendEquation(GL_FUNC_ADD); + break; + } } -void CGL33UIRenderer::Flush() +void CGL33UIRenderer::DrawPrimitive(PrimitiveType type, int count, const Vertex2D* vertices) { - if (m_types.empty()) return; + auto ptr = BeginPrimitive(type, count); - UpdateUniforms(); + std::copy_n(vertices, count, ptr); + + EndPrimitive(); +} + +Vertex2D* CGL33UIRenderer::BeginPrimitive(PrimitiveType type, int count) +{ + ClearGLErrors(); + + glBindVertexArray(m_bufferVAO); + glBindBuffer(GL_ARRAY_BUFFER, m_bufferVBO); + + GLuint total = m_offset + count; + + // Buffer full, orphan + if (total >= m_bufferCapacity) + { + glBufferData(GL_ARRAY_BUFFER, m_bufferCapacity * sizeof(Vertex2D), nullptr, GL_STREAM_DRAW); + + m_offset = 0; + + // Respecify vertex attributes + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), + reinterpret_cast(offsetof(Vertex2D, position))); + + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), + reinterpret_cast(offsetof(Vertex2D, uv))); + + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex2D), + reinterpret_cast(offsetof(Vertex2D, color))); + } + + auto ptr = glMapBufferRange(GL_ARRAY_BUFFER, + m_offset * sizeof(Vertex2D), + count * sizeof(Vertex2D), + GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); + + m_mapped = true; + m_type = type; + m_count = count; + + ClearGLErrors(); + CheckGLErrors(); + + // Mapping failed, use backup buffer + if (ptr == nullptr) + { + m_backup = true; + m_buffer.resize(count); + + return m_buffer.data(); + } + else + { + return reinterpret_cast(ptr); + } +} + +bool CGL33UIRenderer::EndPrimitive() +{ + if (!m_mapped) return false; + + if (m_backup) + { + glBufferSubData(GL_ARRAY_BUFFER, m_offset * sizeof(Vertex2D), m_count * sizeof(Vertex2D), m_buffer.data()); + } + else + { + glUnmapBuffer(GL_ARRAY_BUFFER); + } glUseProgram(m_program); glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_uniformBuffer); - // Increase buffer size if necessary - size_t size = m_buffer.size() * sizeof(Vertex2D); + UpdateUniforms(); - if (m_bufferCapacity < size) - m_bufferCapacity = size; + glDrawArrays(TranslateGfxPrimitive(m_type), m_offset, m_count); - // Send new vertices to GPU - glBindBuffer(GL_ARRAY_BUFFER, m_bufferVBO); - glBufferData(GL_ARRAY_BUFFER, m_bufferCapacity, nullptr, GL_STREAM_DRAW); - glBufferSubData(GL_ARRAY_BUFFER, 0, size, m_buffer.data()); + m_offset += m_count; - // Respecify vertex attributes - glBindVertexArray(m_bufferVAO); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), - reinterpret_cast(offsetof(Vertex2D, position))); - - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), - reinterpret_cast(offsetof(Vertex2D, uv))); - - glEnableVertexAttribArray(2); - glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex2D), - reinterpret_cast(offsetof(Vertex2D, color))); - - // Draw primitives by grouping by type - for (size_t i = 0; i < m_types.size(); i++) - { - size_t count = 1; - - for (; i + count < m_types.size(); count++) - { - if (m_types[i] != m_types[i + count]) - break; - } - - glMultiDrawArrays(m_types[i], &m_firsts[i], &m_counts[i], count); - - i += count; - } - - // Clear buffers - m_buffer.clear(); - m_types.clear(); - m_firsts.clear(); - m_counts.clear(); + m_mapped = false; + m_backup = false; m_device->Restore(); + + return true; } void CGL33UIRenderer::UpdateUniforms() @@ -336,6 +373,7 @@ void CGL33TerrainRenderer::Begin() glEnable(GL_CULL_FACE); glCullFace(GL_BACK); + glFrontFace(GL_CW); // Colobot issue: faces are reversed glDisable(GL_BLEND); @@ -475,11 +513,6 @@ void CGL33TerrainRenderer::DrawObject(const glm::mat4& matrix, const CVertexBuff glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, b->Size()); } -void CGL33TerrainRenderer::Flush() -{ - -} - CGL33ShadowRenderer::CGL33ShadowRenderer(CGL33Device* device) : m_device(device) { @@ -636,9 +669,4 @@ void CGL33ShadowRenderer::DrawObject(const CVertexBuffer* buffer, bool transpare glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, b->Size()); } -void CGL33ShadowRenderer::Flush() -{ - -} - } // namespace Gfx diff --git a/src/graphics/opengl/gl33renderers.h b/src/graphics/opengl/gl33renderers.h index 672f2d31..bf204482 100644 --- a/src/graphics/opengl/gl33renderers.h +++ b/src/graphics/opengl/gl33renderers.h @@ -46,10 +46,12 @@ public: virtual void SetProjection(float left, float right, float bottom, float top) override; virtual void SetTexture(const Texture& texture) override; virtual void SetColor(const glm::vec4& color) override; + virtual void SetTransparency(TransparencyMode mode) override; virtual void DrawPrimitive(PrimitiveType type, int count, const Vertex2D* vertices) override; - virtual void Flush() override; + virtual Vertex2D* BeginPrimitive(PrimitiveType type, int count) override; + virtual bool EndPrimitive() override; private: void UpdateUniforms(); @@ -76,12 +78,16 @@ private: GLuint m_bufferVAO = 0; // VBO capacity GLsizei m_bufferCapacity = 4 * 1024; + + // Buffer mapping state + PrimitiveType m_type = {}; + GLuint m_offset = 0; + GLuint m_count = 0; + bool m_mapped = false; + bool m_backup = false; // Buffered vertex data std::vector m_buffer; - std::vector m_types; - std::vector m_firsts; - std::vector m_counts; // Shader program GLuint m_program = 0; @@ -127,8 +133,6 @@ public: //! Draws terrain object virtual void DrawObject(const glm::mat4& matrix, const CVertexBuffer* buffer) override; - virtual void Flush() override; - private: CGL33Device* const m_device; @@ -196,8 +200,6 @@ public: //! Draws terrain object virtual void DrawObject(const CVertexBuffer* buffer, bool transparent) override; - virtual void Flush() override; - private: CGL33Device* const m_device; diff --git a/src/graphics/opengl/shaders/gl33/ui_vs.glsl b/src/graphics/opengl/shaders/gl33/ui_vs.glsl index f610b2e5..e6b98ce8 100644 --- a/src/graphics/opengl/shaders/gl33/ui_vs.glsl +++ b/src/graphics/opengl/shaders/gl33/ui_vs.glsl @@ -40,6 +40,6 @@ void main() { gl_Position = uni_Matrix * in_VertexCoord; - data.Color = uni_Color * in_Color; + data.Color = in_Color; data.TexCoord = in_TexCoord; } diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp index 0c0c632e..e6e4c371 100644 --- a/src/ui/controls/button.cpp +++ b/src/ui/controls/button.cpp @@ -25,6 +25,7 @@ #include "graphics/engine/engine.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" namespace Ui @@ -170,8 +171,12 @@ void CButton::Draw() (m_state & STATE_CARD ) == 0 && (m_state & STATE_SIMPLY) == 0 ) { - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - m_engine->SetUITexture("textures/interface/button2.png"); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); dp = 0.5f / 256.0f; diff --git a/src/ui/controls/check.cpp b/src/ui/controls/check.cpp index 17cedff0..a971a7e4 100644 --- a/src/ui/controls/check.cpp +++ b/src/ui/controls/check.cpp @@ -24,6 +24,7 @@ #include "common/restext.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "graphics/engine/text.h" @@ -94,6 +95,7 @@ void CCheck::Draw() int icon; auto device = m_engine->GetDevice(); + auto renderer = device->GetUIRenderer(); if ( (m_state & STATE_VISIBLE) == 0 ) return; @@ -105,8 +107,9 @@ void CCheck::Draw() DrawShadow(m_pos, m_dim); } - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - m_engine->SetUITexture("textures/interface/button1.png"); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); zoomExt = 1.00f; zoomInt = 0.95f; @@ -140,7 +143,7 @@ void CCheck::Draw() if ( (m_state & STATE_DEAD) == 0 ) { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); if ( m_state & STATE_CHECK ) { diff --git a/src/ui/controls/color.cpp b/src/ui/controls/color.cpp index 6d67b986..2fa493dd 100644 --- a/src/ui/controls/color.cpp +++ b/src/ui/controls/color.cpp @@ -136,8 +136,11 @@ void CColor::Draw() DrawShadow(m_pos, m_dim); } - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); CControl::Draw(); p1.x = m_pos.x + (3.0f / 640.0f); @@ -149,16 +152,14 @@ void CColor::Draw() glm::u8vec4 col = { color.r * 255, color.g * 255, color.b * 255, color.a * 255 }; - m_engine->SetUITexture(Gfx::Texture{0}); // no texture - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + renderer->SetTexture(Gfx::Texture{0}); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); vertex[0] = { { p1.x, p1.y }, {}, col }; vertex[1] = { { p1.x, p2.y }, {}, col }; vertex[2] = { { p2.x, p1.y }, {}, col }; vertex[3] = { { p2.x, p2.y }, {}, col }; - auto renderer = m_engine->GetDevice()->GetUIRenderer(); - renderer->DrawPrimitive(Gfx::PrimitiveType::TRIANGLE_STRIP, 4, vertex); m_engine->AddStatisticTriangle(2); } diff --git a/src/ui/controls/control.cpp b/src/ui/controls/control.cpp index 6b3c9cd2..e325382b 100644 --- a/src/ui/controls/control.cpp +++ b/src/ui/controls/control.cpp @@ -451,9 +451,11 @@ void CControl::Draw() if ( (m_state & STATE_VISIBLE) == 0 ) return; - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - m_engine->SetUITexture("textures/interface/button1.png"); - auto device = m_engine->GetDevice(); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); zoomExt = 1.00f; zoomInt = 0.95f; @@ -506,7 +508,8 @@ void CControl::Draw() if ( m_state & STATE_OKAY ) { - m_engine->SetUITexture("textures/interface/button3.png"); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); icon = 3; // yellow with green point pressed } @@ -518,7 +521,8 @@ void CControl::Draw() if ( m_state & STATE_DEAD ) return; icon = SetButtonTextureForIcon(m_icon); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); + //m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); if ( icon != -1 ) { DrawPart(icon, zoomInt, 0.0f); @@ -740,14 +744,17 @@ void CControl::DrawWarning(const glm::vec2& position, const glm::vec2& dimension glm::vec2 uv1, uv2; float dp; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + glm::vec2 pos = position; glm::vec2 dim = dimension; dp = 0.5f / 256.0f; - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - m_engine->SetUITexture("textures/interface/button2.png"); - auto device = m_engine->GetDevice(); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); uv1.x = 64.0f / 256.0f; uv1.y = 208.0f / 256.0f; @@ -788,14 +795,17 @@ void CControl::DrawShadow(const glm::vec2& position, const glm::vec2& dimension, glm::vec2 uv1, uv2, corner; float dp; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + glm::vec2 pos = position; glm::vec2 dim = dimension; dp = 0.5f/256.0f; - m_engine->SetState( Gfx::ENG_RSTATE_TTEXTURE_WHITE); - m_engine->SetUITexture("textures/interface/button2.png"); - auto device = m_engine->GetDevice(); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); + renderer->SetTexture(texture); pos.x += deep * 0.010f * 0.75f; pos.y -= deep * 0.015f; @@ -846,7 +856,8 @@ int CControl::SetButtonTextureForIcon(int icon) int iconIdx = icon%64; int buttonFile = (icon/64) + 1; - m_engine->SetUITexture("textures/interface/button" + StrUtils::ToString(buttonFile) + ".png"); + auto texture = m_engine->LoadTexture("textures/interface/button" + StrUtils::ToString(buttonFile) + ".png"); + m_engine->GetDevice()->GetUIRenderer()->SetTexture(texture); return iconIdx; } diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index 158c92cf..2ca55c7a 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -1177,7 +1177,8 @@ void CEdit::DrawImage(const glm::vec2& pos, std::string name, float width, glm::vec2 uv1, uv2, dim; float dp; - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + m_engine->GetDevice()->GetUIRenderer()->SetTransparency(Gfx::TransparencyMode::NONE); + //m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); Gfx::TextureCreateParams params; params.format = Gfx::TEX_IMG_AUTO; @@ -1185,7 +1186,7 @@ void CEdit::DrawImage(const glm::vec2& pos, std::string name, float width, params.padToNearestPowerOfTwo = true; Gfx::Texture tex = m_engine->LoadTexture(PrepareImageFilename(name), params); - m_engine->SetUITexture(tex); + m_engine->GetDevice()->GetUIRenderer()->SetTexture(tex); uv1.x = 0.0f; uv2.x = 1.0f; @@ -1217,8 +1218,11 @@ void CEdit::DrawBack(const glm::vec2& pos, const glm::vec2& dim) if ( m_bGeneric ) return; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); if ( m_bMulti ) { @@ -1262,7 +1266,8 @@ void CEdit::DrawBack(const glm::vec2& pos, const glm::vec2& dim) void CEdit::DrawHorizontalGradient(const glm::vec2& pos, const glm::vec2& dim, Gfx::Color color1, Gfx::Color color2) { - m_engine->SetState(Gfx::ENG_RSTATE_OPAQUE_COLOR); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); glm::vec2 p1, p2; p1.x = pos.x; @@ -1281,8 +1286,6 @@ void CEdit::DrawHorizontalGradient(const glm::vec2& pos, const glm::vec2& dim, G { { p2.x, p2.y }, {}, col2 } }; - auto renderer = m_engine->GetDevice()->GetUIRenderer(); - renderer->DrawPrimitive(Gfx::PrimitiveType::TRIANGLE_STRIP, 4, quad); m_engine->AddStatisticTriangle(2); } diff --git a/src/ui/controls/gauge.cpp b/src/ui/controls/gauge.cpp index 3f5a168b..5ea066c9 100644 --- a/src/ui/controls/gauge.cpp +++ b/src/ui/controls/gauge.cpp @@ -21,6 +21,8 @@ #include "ui/controls/gauge.h" #include "graphics/engine/engine.h" +#include "graphics/core/device.h" +#include "graphics/core/renderers.h" namespace Ui @@ -78,8 +80,11 @@ void CGauge::Draw() if ( (m_state & STATE_VISIBLE) == 0 ) return; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); dp = 0.5f/256.0f; diff --git a/src/ui/controls/group.cpp b/src/ui/controls/group.cpp index 412d8533..ae47a371 100644 --- a/src/ui/controls/group.cpp +++ b/src/ui/controls/group.cpp @@ -24,6 +24,7 @@ #include "common/restext.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "math/func.h" @@ -93,10 +94,13 @@ void CGroup::Draw() dp = 0.5f / 256.0f; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + if ( m_icon == 0 ) // hollow frame? { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 160.0f / 256.0f; uv1.y = 192.0f / 256.0f; // u-v texture @@ -112,8 +116,9 @@ void CGroup::Draw() } if ( m_icon == 1 ) // orange solid opaque? { - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - m_engine->SetUITexture("textures/interface/button2.png"); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 104.0f / 256.0f; uv1.y = 48.0f / 256.0f; @@ -127,8 +132,9 @@ void CGroup::Draw() } if ( m_icon == 2 ) // orange degrade -> transparent? { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); - m_engine->SetUITexture("textures/interface/button2.png"); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 112.0f / 256.0f; uv1.y = 48.0f / 256.0f; @@ -142,8 +148,9 @@ void CGroup::Draw() } if ( m_icon == 3 ) // transparent gradient -> gray? { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); - m_engine->SetUITexture("textures/interface/button2.png"); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 120.0f / 256.0f; uv1.y = 48.0f / 256.0f; @@ -157,8 +164,9 @@ void CGroup::Draw() } if ( m_icon == 4 ) // degrade blue corner? { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); - m_engine->SetUITexture("textures/interface/button2.png"); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 192.0f / 256.0f; uv1.y = 128.0f / 256.0f; @@ -172,8 +180,9 @@ void CGroup::Draw() } if ( m_icon == 5 ) // degrade orange corner? { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); - m_engine->SetUITexture("textures/interface/button2.png"); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 224.0f / 256.0f; uv1.y = 128.0f / 256.0f; @@ -187,8 +196,9 @@ void CGroup::Draw() } if ( m_icon == 6 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 0.0f / 256.0f; // brown transparent uv1.y = 75.0f / 256.0f; @@ -204,8 +214,9 @@ void CGroup::Draw() } if ( m_icon == 7 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f / 256.0f; uv1.y = 0.0f / 256.0f; @@ -219,8 +230,9 @@ void CGroup::Draw() } if ( m_icon == 8 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f / 256.0f; // green transparent uv1.y = 160.0f / 256.0f; @@ -234,8 +246,9 @@ void CGroup::Draw() } if ( m_icon == 9 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f / 256.0f; // red transparent uv1.y = 176.0f/256.0f; @@ -249,8 +262,9 @@ void CGroup::Draw() } if ( m_icon == 10 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f / 256.0f; // blue transparent uv1.y = 192.0f / 256.0f; @@ -264,8 +278,9 @@ void CGroup::Draw() } if ( m_icon == 11 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f / 256.0f; // yellow transparent uv1.y = 224.0f / 256.0f; uv2.x = 160.0f / 256.0f; @@ -281,8 +296,9 @@ void CGroup::Draw() dim.x = m_dim.x / 2.0f; dim.y = m_dim.y / 2.0f; - m_engine->SetUITexture("textures/interface/mouse.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/mouse.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x = m_pos.x-m_dim.x/300.0f; pos.y = m_pos.y+m_dim.y/300.0f+dim.y; uv1.x = 0.5f / 256.0f; @@ -300,7 +316,7 @@ void CGroup::Draw() Math::Swap(uv1.x, uv2.x); DrawIcon(pos, dim, uv1, uv2); // dl - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); pos.x = m_pos.x+m_dim.x/300.0f; pos.y = m_pos.y-m_dim.y/300.0f+dim.y; uv1.x = 64.5f / 256.0f; @@ -320,8 +336,9 @@ void CGroup::Draw() } if ( m_icon == 13 ) // corner upper / left? { - m_engine->SetUITexture("textures/interface/mouse.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/mouse.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x = m_pos.x-m_dim.x/150.0f; pos.y = m_pos.y+m_dim.y/150.0f; uv1.x = 128.5f / 256.0f; @@ -330,7 +347,7 @@ void CGroup::Draw() uv2.y = 255.5f / 256.0f; DrawIcon(pos, m_dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); pos.x = m_pos.x+m_dim.x/150.0f; pos.y = m_pos.y-m_dim.y/150.0f; uv1.x = 192.5f / 256.0f; @@ -341,8 +358,9 @@ void CGroup::Draw() } if ( m_icon == 14 ) // corner upper / right? { - m_engine->SetUITexture("textures/interface/mouse.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/mouse.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x = m_pos.x-m_dim.x/150.0f; pos.y = m_pos.y+m_dim.y/150.0f; uv2.x = 128.5f / 256.0f; @@ -351,7 +369,7 @@ void CGroup::Draw() uv2.y = 255.5f / 256.0f; DrawIcon(pos, m_dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); pos.x = m_pos.x+m_dim.x/150.0f; pos.y = m_pos.y-m_dim.y/150.0f; uv2.x = 192.5f / 256.0f; @@ -362,8 +380,9 @@ void CGroup::Draw() } if ( m_icon == 15 ) // corner lower / left? { - m_engine->SetUITexture("textures/interface/mouse.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/mouse.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x = m_pos.x-m_dim.x/150.0f; pos.y = m_pos.y+m_dim.y/150.0f; uv1.x = 128.5f / 256.0f; @@ -372,7 +391,7 @@ void CGroup::Draw() uv1.y = 255.5f / 256.0f; DrawIcon(pos, m_dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); pos.x = m_pos.x+m_dim.x/150.0f; pos.y = m_pos.y-m_dim.y/150.0f; uv1.x = 192.5f / 256.0f; @@ -383,8 +402,9 @@ void CGroup::Draw() } if ( m_icon == 16 ) // corner lower / left? { - m_engine->SetUITexture("textures/interface/mouse.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/mouse.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x = m_pos.x-m_dim.x/150.0f; pos.y = m_pos.y+m_dim.y/150.0f; uv2.x = 128.5f / 256.0f; @@ -393,7 +413,7 @@ void CGroup::Draw() uv1.y = 255.5f / 256.0f; DrawIcon(pos, m_dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); pos.x = m_pos.x+m_dim.x/150.0f; pos.y = m_pos.y-m_dim.y/150.0f; uv2.x = 192.5f / 256.0f; @@ -404,8 +424,9 @@ void CGroup::Draw() } if ( m_icon == 17 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 0.0f / 256.0f; // blue frame uv1.y = 75.0f / 256.0f; uv2.x = 64.0f / 256.0f; @@ -420,8 +441,9 @@ void CGroup::Draw() } if ( m_icon == 18 ) // arrow> for SatCom? { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 0.0f / 256.0f; // > uv1.y = 192.0f / 256.0f; uv2.x = 32.0f / 256.0f; @@ -434,8 +456,9 @@ void CGroup::Draw() } if ( m_icon == 19 ) // SatCom symbol? { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 224.0f / 256.0f; // SatCom symbol uv1.y = 224.0f / 256.0f; uv2.x = 256.0f / 256.0f; @@ -448,8 +471,9 @@ void CGroup::Draw() } if ( m_icon == 20 ) // solid blue background? { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 224.0f / 256.0f; uv1.y = 32.0f / 256.0f; uv2.x = 256.0f / 256.0f; @@ -462,8 +486,9 @@ void CGroup::Draw() } if ( m_icon == 21 ) // stand-by symbol? { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 160.0f / 256.0f; uv1.y = 32.0f / 256.0f; uv2.x = 192.0f / 256.0f; @@ -476,8 +501,9 @@ void CGroup::Draw() } if ( m_icon == 22 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f / 256.0f; // opaque yellow uv1.y = 224.0f / 256.0f; uv2.x = 160.0f / 256.0f; @@ -493,8 +519,9 @@ void CGroup::Draw() if ( m_icon == 23 ) { - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f / 256.0f; // yellow uv1.y = 192.0f / 256.0f; uv2.x = 80.0f / 256.0f; @@ -509,8 +536,9 @@ void CGroup::Draw() } if ( m_icon == 24 ) { - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 80.0f / 256.0f; // orange uv1.y = 192.0f / 256.0f; uv2.x = 96.0f / 256.0f; @@ -525,8 +553,9 @@ void CGroup::Draw() } if ( m_icon == 25 ) { - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f / 256.0f; // orange uv1.y = 208.0f / 256.0f; uv2.x = 80.0f / 256.0f; @@ -541,8 +570,9 @@ void CGroup::Draw() } if ( m_icon == 26 ) { - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 80.0f / 256.0f; // red uv1.y = 208.0f / 256.0f; uv2.x = 96.0f / 256.0f; @@ -557,8 +587,9 @@ void CGroup::Draw() } if ( m_icon == 27 ) { - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 32.0f / 256.0f; uv1.y = 0.0f / 256.0f; uv2.x = 64.0f / 256.0f; @@ -572,10 +603,11 @@ void CGroup::Draw() if ( m_icon >= 100 && m_icon <= 120 ) // building? { + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); pos = m_pos; dim = m_dim; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); uv1.x = 32.0f / 256.0f; uv1.y = 32.0f / 256.0f; uv2.x = uv1.x+32.0f/256.0f; @@ -586,8 +618,9 @@ void CGroup::Draw() uv2.y -= dp; DrawIcon(pos, dim, uv1, uv2); - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); pos.x += 8.0f / 640.0f; pos.y += 8.0f / 480.0f; dim.x -= 16.0f / 640.0f; @@ -602,7 +635,7 @@ void CGroup::Draw() uv2.y -= dp; DrawIcon(pos, dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); pos.x += 2.0f / 640.0f; pos.y += 2.0f / 480.0f; dim.x -= 4.0f / 640.0f; @@ -617,7 +650,7 @@ void CGroup::Draw() uv2.y -= dp; DrawIcon(pos, dim, uv1, uv2); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); pos.x += 8.0f / 640.0f; pos.y += 8.0f / 480.0f; dim.x -= 16.0f / 640.0f; diff --git a/src/ui/controls/image.cpp b/src/ui/controls/image.cpp index 1767faa5..e7c2a4ae 100644 --- a/src/ui/controls/image.cpp +++ b/src/ui/controls/image.cpp @@ -23,6 +23,8 @@ #include "common/event.h" #include "common/restext.h" +#include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" @@ -91,6 +93,8 @@ void CImage::Draw() glm::vec2 uv1,uv2, corner, pos, dim; float dp; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + if ( (m_state & STATE_VISIBLE) == 0 ) return; if ( m_state & STATE_SHADOW ) @@ -102,8 +106,9 @@ void CImage::Draw() if ( m_icon == 0 ) // hollow frame? { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 160.0f / 256.0f; uv1.y = 192.0f / 256.0f; // u-v texture uv2.x = 192.0f / 256.0f; @@ -124,8 +129,8 @@ void CImage::Draw() params.filter = Gfx::TEX_FILTER_BILINEAR; params.padToNearestPowerOfTwo = true; Gfx::Texture tex = m_engine->LoadTexture(m_filename, params); - m_engine->SetUITexture(tex); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + renderer->SetTexture(tex); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); pos = m_pos; dim = m_dim; pos.x += 5.0f / 640.0f; diff --git a/src/ui/controls/key.cpp b/src/ui/controls/key.cpp index fd4068e0..24305d95 100644 --- a/src/ui/controls/key.cpp +++ b/src/ui/controls/key.cpp @@ -23,6 +23,8 @@ #include "common/global.h" #include "common/stringutils.h" +#include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "sound/sound.h" @@ -134,9 +136,11 @@ void CKey::Draw() if (m_state & STATE_SHADOW) DrawShadow(m_pos, m_dim); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); float zoomExt = 1.00f; float zoomInt = 0.95f; diff --git a/src/ui/controls/list.cpp b/src/ui/controls/list.cpp index 09d64da6..2554923f 100644 --- a/src/ui/controls/list.cpp +++ b/src/ui/controls/list.cpp @@ -22,6 +22,8 @@ #include "common/make_unique.h" +#include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "math/func.h" @@ -366,14 +368,17 @@ void CList::Draw() dp = 0.5f / 256.0f; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + if (m_icon != -1) { dim = m_dim; if (m_icon == 0) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f / 256.0f; uv1.y = 64.0f / 256.0f; // u-v texture @@ -382,8 +387,9 @@ void CList::Draw() } else { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 132.0f / 256.0f; uv1.y = 68.0f / 256.0f; // u-v texture @@ -418,8 +424,9 @@ void CList::Draw() dim.y *= 0.4f; pos.y -= dim.y; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); // was D3DSTATETTw + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 120.0f / 256.0f; uv1.y = 64.0f / 256.0f; uv2.x = 128.0f / 256.0f; @@ -493,8 +500,9 @@ void CList::Draw() if (m_items[i + m_firstLine].check) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f / 256.0f; uv1.y = 0.0f / 256.0f; uv2.x = 96.0f / 256.0f; @@ -505,7 +513,7 @@ void CList::Draw() uv2.y -= dp; DrawIcon(pos, dim, uv1, uv2); // square shape - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); // was D3DSTATETTw + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 0.0f / 256.0f; // v uv1.y = 64.0f / 256.0f; uv2.x = 32.0f / 256.0f; @@ -518,8 +526,9 @@ void CList::Draw() } else { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); // was D3DSTATETTw + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); if ( i + m_firstLine == m_selectLine ) { uv1.x =224.0f / 256.0f; // < diff --git a/src/ui/controls/map.cpp b/src/ui/controls/map.cpp index 7bf06d29..9f37e315 100644 --- a/src/ui/controls/map.cpp +++ b/src/ui/controls/map.cpp @@ -335,6 +335,8 @@ void CMap::Draw() glm::vec2 uv1, uv2; int i; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + if ( (m_state & STATE_VISIBLE) == 0 ) return; @@ -348,23 +350,28 @@ void CMap::Draw() if (m_fixImage.empty()) // drawing of the relief? { - m_engine->SetUITexture("textures/interface/map.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/map.png"); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); + uv1.x = 0.5f + (m_offset.x - (m_half / m_zoom)) / (m_half * 2.0f); uv1.y = 0.5f - (m_offset.y + (m_half / m_zoom)) / (m_half * 2.0f); uv2.x = 0.5f + (m_offset.x + (m_half / m_zoom)) / (m_half * 2.0f); uv2.y = 0.5f - (m_offset.y - (m_half / m_zoom)) / (m_half * 2.0f); + DrawVertex(uv1, uv2, 0.97f); // drawing the map } else // still image? { - m_engine->LoadTexture(m_fixImage); - m_engine->SetUITexture(m_fixImage); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture(m_fixImage); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); + uv1.x = 0.0f; uv1.y = 0.0f; uv2.x = 1.0f; uv2.y = 1.0f; + DrawVertex(uv1, uv2, 0.97f); // drawing the map } @@ -499,8 +506,11 @@ void CMap::DrawFocus(const glm::vec2& position, float dir, ObjectType type, MapC uv2.x = 126.0f/256.0f; uv2.y = 255.0f/256.0f; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); + renderer->SetTexture(texture); bEnding = false; do @@ -551,6 +561,8 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map dim.x = 2.0f/128.0f*0.75f; dim.y = 2.0f/128.0f; + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + if ( bOut ) // outside the map? { if ( color == MAPCOLOR_BBOX && !m_bRadar ) return; @@ -561,8 +573,10 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map return; // flashes } - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); + if ( bUp ) { uv1.x = 160.5f/256.0f; // yellow triangle ^ @@ -704,8 +718,10 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map { if ( bSelect ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); + if ( m_bToy ) { uv1.x = 164.5f/256.0f; // black pentagon @@ -730,8 +746,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map { if ( m_bRadar ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); + renderer->SetTexture(texture); uv1.x = 64.5f/256.0f; // blue triangle uv1.y = 240.5f/256.0f; uv2.x = 79.0f/256.0f; @@ -750,8 +767,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map if ( color == MAPCOLOR_WAYPOINTb ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); uv1.x = 192.5f/256.0f; // blue cross uv1.y = 240.5f/256.0f; uv2.x = 207.0f/256.0f; @@ -760,8 +778,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map } if ( color == MAPCOLOR_WAYPOINTr ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); uv1.x = 208.5f/256.0f; // red cross uv1.y = 240.5f/256.0f; uv2.x = 223.0f/256.0f; @@ -770,8 +789,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map } if ( color == MAPCOLOR_WAYPOINTg ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); uv1.x = 224.5f/256.0f; // green cross uv1.y = 240.5f/256.0f; uv2.x = 239.0f/256.0f; @@ -780,8 +800,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map } if ( color == MAPCOLOR_WAYPOINTy ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); uv1.x = 240.5f/256.0f; // yellow cross uv1.y = 240.5f/256.0f; uv2.x = 255.0f/256.0f; @@ -790,8 +811,9 @@ void CMap::DrawObject(const glm::vec2& position, float dir, ObjectType type, Map } if ( color == MAPCOLOR_WAYPOINTv ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); uv1.x = 192.5f/256.0f; // violet cross uv1.y = 224.5f/256.0f; uv2.x = 207.0f/256.0f; @@ -811,8 +833,12 @@ void CMap::DrawObjectIcon(const glm::vec2& pos, const glm::vec2& dim, MapColor c dp = 0.5f/256.0f; - m_engine->SetUITexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); + renderer->SetTexture(texture); + if ( color == MAPCOLOR_MOVE ) { uv1.x = 160.0f/256.0f; // blue @@ -915,11 +941,15 @@ void CMap::DrawObjectIcon(const glm::vec2& pos, const glm::vec2& dim, MapColor c case OBJECT_MOBILEit: case OBJECT_MOBILErp: case OBJECT_MOBILEst: - m_engine->SetUITexture("textures/interface/button4.png"); break; + { + auto texture = m_engine->LoadTexture("textures/interface/button4.png"); + renderer->SetTexture(texture); + break; + } default: ; // button3.png } - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = (32.0f/256.0f)*(icon%8); uv1.y = (32.0f/256.0f)*(icon/8); uv2.x = uv1.x+32.0f/256.0f; @@ -952,8 +982,12 @@ void CMap::DrawHighlight(const glm::vec2& position) dim.x *= 2.0f+cosf(m_time*8.0f)*0.5f; dim.y *= 2.0f+cosf(m_time*8.0f)*0.5f; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); + renderer->SetTexture(texture); + uv1.x = 160.5f/256.0f; // hilite uv1.y = 224.5f/256.0f; uv2.x = 175.0f/256.0f; @@ -1090,9 +1124,13 @@ void CMap::UpdateTerrain() } } + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + m_engine->DeleteTexture("interface/map.png"); m_engine->LoadTexture("textures/interface/map.png", &img); - m_engine->SetUITexture("textures/interface/map.png"); + + auto texture = m_engine->LoadTexture("textures/interface/map.png"); + renderer->SetTexture(texture); } // Updates the field in the map. diff --git a/src/ui/controls/scroll.cpp b/src/ui/controls/scroll.cpp index 07c816b6..407c4115 100644 --- a/src/ui/controls/scroll.cpp +++ b/src/ui/controls/scroll.cpp @@ -24,6 +24,7 @@ #include "common/make_unique.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "ui/controls/button.h" @@ -364,11 +365,13 @@ void CScroll::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) float ex, dp; auto device = m_engine->GetDevice(); + auto renderer = device->GetUIRenderer(); if ( icon == 0 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 0.0f/256.0f; // yellow rectangle uv1.y = 32.0f/256.0f; uv2.x = 32.0f/256.0f; @@ -377,8 +380,9 @@ void CScroll::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) } else if ( icon == 1 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f/256.0f; // gray rectangle uv1.y = 32.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -387,8 +391,9 @@ void CScroll::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) } else if ( icon == 2 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f/256.0f; // blue rectangle uv1.y = 0.0f/256.0f; uv2.x = 96.0f/256.0f; @@ -397,8 +402,9 @@ void CScroll::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) } else { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 104.0f/256.0f; // blue line - uv1.y = 32.0f/256.0f; uv2.x = 128.0f/256.0f; diff --git a/src/ui/controls/shortcut.cpp b/src/ui/controls/shortcut.cpp index d8d9685b..83ab9ffc 100644 --- a/src/ui/controls/shortcut.cpp +++ b/src/ui/controls/shortcut.cpp @@ -89,28 +89,28 @@ bool CShortcut::EventProcess(const Event &event) void CShortcut::Draw() { float zoom; - int icon, mode; + int icon; icon = 0; zoom = 0.8f; - mode = Gfx::ENG_RSTATE_TTEXTURE_WHITE; + Gfx::TransparencyMode mode = Gfx::TransparencyMode::WHITE; if ( m_state & STATE_HILIGHT ) { icon = 4; zoom = 0.9f; - mode = Gfx::ENG_RSTATE_NORMAL; + mode = Gfx::TransparencyMode::NONE; } if ( m_state & STATE_CHECK ) { icon = 1; zoom = 0.8f; - mode = Gfx::ENG_RSTATE_NORMAL; + mode = Gfx::TransparencyMode::NONE; } if ( m_state & STATE_PRESS ) { icon = 1; zoom = 1.0f; - mode = Gfx::ENG_RSTATE_NORMAL; + mode = Gfx::TransparencyMode::NONE; } if ( m_icon == 128+6 || m_icon == 128+7 || m_icon == 58 ) // pause or film? { @@ -118,22 +118,25 @@ void CShortcut::Draw() zoom = 1.0f; } - m_engine->SetUITexture("textures/interface/button3.png"); + auto renderer = m_engine->GetDevice()->GetUIRenderer(); + + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); if ( icon != -1 ) { - m_engine->SetState(mode); + renderer->SetTransparency(mode); DrawVertex(icon, 0.95f); } icon = SetButtonTextureForIcon(m_icon); if (m_icon == 58) { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); } else { - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); } DrawVertex(icon, zoom); @@ -142,8 +145,9 @@ void CShortcut::Draw() glm::vec2 p1, p2, c, uv1, uv2; float dp; - m_engine->SetTexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); zoom = 0.9f+sinf(m_time*8.0f)*0.1f; @@ -182,8 +186,9 @@ void CShortcut::Draw() glm::vec2 uv1, uv2; float dp; - m_engine->SetTexture("textures/interface/button3.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 160.0f/256.0f; uv1.y = 0.0f/256.0f; @@ -203,8 +208,9 @@ void CShortcut::Draw() glm::vec2 uv1, uv2; float dp; - m_engine->SetTexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 159.0f / 256.0f; uv1.y = 240.0f / 256.0f; diff --git a/src/ui/controls/slider.cpp b/src/ui/controls/slider.cpp index 3af121b8..6a79866a 100644 --- a/src/ui/controls/slider.cpp +++ b/src/ui/controls/slider.cpp @@ -24,6 +24,7 @@ #include "common/stringutils.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include "graphics/engine/engine.h" #include "graphics/engine/text.h" @@ -494,8 +495,9 @@ void CSlider::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) if ( icon == 0 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 0.0f/256.0f; // yellow rectangle uv1.y = 32.0f/256.0f; uv2.x = 32.0f/256.0f; @@ -506,8 +508,9 @@ void CSlider::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) } else if ( icon == 1 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f/256.0f; // gray rectangle uv1.y = 32.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -518,8 +521,9 @@ void CSlider::DrawVertex(const glm::vec2& pos, const glm::vec2& dim, int icon) } else { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 224.0f/256.0f; // cursor uv1.y = 32.0f/256.0f; uv2.x = 256.0f/256.0f; diff --git a/src/ui/controls/window.cpp b/src/ui/controls/window.cpp index d709bb80..21a852fa 100644 --- a/src/ui/controls/window.cpp +++ b/src/ui/controls/window.cpp @@ -39,6 +39,7 @@ #include "ui/controls/target.h" #include "graphics/core/device.h" +#include "graphics/core/renderers.h" #include @@ -906,13 +907,15 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, glm::vec2 dim = dimension; auto device = m_engine->GetDevice(); + auto renderer = device->GetUIRenderer(); dp = 0.5f/256.0f; if ( icon == 0 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 64.0f/256.0f; // dark blue transparent uv1.y = 64.0f/256.0f; uv2.x = 128.0f/256.0f; @@ -927,8 +930,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 1 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f/256.0f; // white tooltip uv1.y = 0.0f/256.0f; uv2.x = 224.0f/256.0f; @@ -941,8 +945,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 2 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f/256.0f; // yellow uv1.y = 16.0f/256.0f; uv2.x = 224.0f/256.0f; @@ -955,8 +960,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 3 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 0.0f/256.0f; // transparent blue bar with yellow upper uv1.y = 64.0f/256.0f; uv2.x = 64.0f/256.0f; @@ -974,8 +980,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, dim.x += 100.0f/640.0f; dim.y += 60.0f/480.0f; - m_engine->SetUITexture("textures/object/human.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/human.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 140.0f/256.0f; uv1.y = 32.0f/256.0f; uv2.x = 182.0f/256.0f; @@ -991,8 +998,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, dim.x -= 20.0f/640.0f; dim.y += 0.0f/480.0f; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); + texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::WHITE); uv1.x = 192.0f/256.0f; uv1.y = 32.0f/256.0f; uv2.x = 224.0f/256.0f; @@ -1010,8 +1018,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, dim.x -= 20.0f/640.0f; dim.y -= 20.0f/480.0f; - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f/256.0f; uv1.y = 0.0f/256.0f; uv2.x = 96.0f/256.0f; @@ -1046,7 +1055,8 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, dim.x -= 20.0f/640.0f; dim.y -= 20.0f/480.0f; - m_engine->SetUITexture("textures/interface/button3.png"); + texture = m_engine->LoadTexture("textures/interface/button3.png"); + renderer->SetTexture(texture); uv1.x = 0.0f/256.0f; uv1.y = 224.0f/256.0f; uv2.x = 32.0f/256.0f; @@ -1057,7 +1067,8 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, uv2.y -= dp; DrawIcon(pos, dim, uv1, uv2); // dark blue background - m_engine->SetUITexture("textures/interface/button2.png"); + texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); uv1.x = 224.0f/256.0f; uv1.y = 224.0f/256.0f; uv2.x = 249.0f/256.0f; @@ -1129,8 +1140,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 5 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f/256.0f; // transparent green uv1.y = 160.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -1143,8 +1155,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 6 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f/256.0f; // transparent red uv1.y = 176.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -1157,8 +1170,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 7 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f/256.0f; // transparent blue uv1.y = 192.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -1171,8 +1185,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 8 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 0.0f/256.0f; // opaque orange uv1.y = 0.0f/256.0f; uv2.x = 32.0f/256.0f; @@ -1187,8 +1202,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 9 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 32.0f/256.0f; // opaque gray uv1.y = 32.0f/256.0f; uv2.x = 64.0f/256.0f; @@ -1207,8 +1223,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 11 ) { - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_BLACK); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::BLACK); uv1.x = 64.0f/256.0f; // transparent yellow uv1.y = 224.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -1221,8 +1238,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 12 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 128.0f/256.0f; // dirty opaque gray uv1.y = 128.0f/256.0f; uv2.x = 160.0f/256.0f; @@ -1237,8 +1255,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 13 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 192.0f/256.0f; // dirty opaque blue uv1.y = 128.0f/256.0f; uv2.x = 224.0f/256.0f; @@ -1253,8 +1272,9 @@ void CWindow::DrawVertex(const glm::vec2& position, const glm::vec2& dimension, } else if ( icon == 14 ) { - m_engine->SetUITexture("textures/interface/button1.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button1.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 160.0f/256.0f; // dirty opaque red uv1.y = 128.0f/256.0f; uv2.x = 192.0f/256.0f; @@ -1278,10 +1298,12 @@ void CWindow::DrawHach(const glm::vec2& pos, const glm::vec2& dim) bool bStop; auto device = m_engine->GetDevice(); + auto renderer = device->GetUIRenderer(); dp = 0.5f/256.0f; - m_engine->SetUITexture("textures/interface/button2.png"); - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); + auto texture = m_engine->LoadTexture("textures/interface/button2.png"); + renderer->SetTexture(texture); + renderer->SetTransparency(Gfx::TransparencyMode::NONE); uv1.x = 64.0f/256.0f; // hatching uv1.y = 208.0f/256.0f; uv2.x = 145.0f/256.0f; diff --git a/src/ui/mainui.cpp b/src/ui/mainui.cpp index 45a14436..15d827c9 100644 --- a/src/ui/mainui.cpp +++ b/src/ui/mainui.cpp @@ -156,7 +156,7 @@ void CMainUserInterface::ChangePhase(Phase phase) { m_main->GetCamera()->SetType(Gfx::CAM_TYPE_NULL); m_engine->SetOverFront(false); - m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_BLACK); // TODO: color ok? + m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::TransparencyMode::BLACK); // TODO: color ok? m_phase = phase; // copy the info from CRobotMain diff --git a/src/ui/screen/screen_welcome.cpp b/src/ui/screen/screen_welcome.cpp index b3a7eadd..01308173 100644 --- a/src/ui/screen/screen_welcome.cpp +++ b/src/ui/screen/screen_welcome.cpp @@ -58,9 +58,9 @@ void CScreenWelcome::CreateInterface() m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); if ( m_imageIndex == 0 ) - m_engine->SetOverColor(Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f), Gfx::ENG_RSTATE_TCOLOR_BLACK); + m_engine->SetOverColor(Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f), Gfx::TransparencyMode::BLACK); else - m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_WHITE); + m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::TransparencyMode::WHITE); m_engine->SetOverFront(true); SetBackground("textures/interface/intro"+StrUtils::ToString(m_imageIndex+1)+".png", true); @@ -96,11 +96,11 @@ bool CScreenWelcome::EventProcess(const Event &event) if ( intensity > 1.0f ) intensity = 1.0f; // white first, others -> black fading - int mode = Gfx::ENG_RSTATE_TCOLOR_WHITE; + Gfx::TransparencyMode mode = Gfx::TransparencyMode::WHITE; if ((m_imageIndex == 0) && (m_time < WELCOME_LENGTH/2.0f)) { intensity = 1.0f - intensity; - mode = Gfx::ENG_RSTATE_TCOLOR_BLACK; + mode = Gfx::TransparencyMode::BLACK; } m_engine->SetOverColor(Gfx::Color(intensity, intensity, intensity, intensity), mode);