From 9e4e97a58e3a35439b5330df0de5417c5c0085b4 Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Sat, 1 Dec 2018 18:57:06 +0100 Subject: [PATCH] Convert Renderer to unique_ptr --- rwengine/src/render/DebugDraw.cpp | 8 ++-- rwengine/src/render/DebugDraw.hpp | 2 +- rwengine/src/render/GameRenderer.cpp | 10 ++-- rwengine/src/render/GameRenderer.hpp | 10 ++-- rwengine/src/render/MapRenderer.cpp | 44 +++++++++--------- rwengine/src/render/MapRenderer.hpp | 4 +- rwengine/src/render/OpenGLRenderer.hpp | 4 +- rwengine/src/render/TextRenderer.cpp | 26 +++++------ rwengine/src/render/TextRenderer.hpp | 4 +- rwengine/src/render/WaterRenderer.cpp | 32 ++++++------- rwengine/src/render/WaterRenderer.hpp | 4 +- rwgame/HUDDrawer.cpp | 64 +++++++++++++------------- rwgame/HUDDrawer.hpp | 10 ++-- rwgame/MenuSystem.hpp | 6 +-- rwgame/RWGame.cpp | 20 ++++---- rwgame/State.cpp | 2 +- rwgame/State.hpp | 2 +- rwgame/StateManager.hpp | 2 +- rwgame/states/BenchmarkState.cpp | 2 +- rwgame/states/BenchmarkState.hpp | 2 +- rwgame/states/DebugState.cpp | 4 +- rwgame/states/DebugState.hpp | 2 +- rwgame/states/IngameState.cpp | 5 +- rwgame/states/IngameState.hpp | 2 +- rwgame/states/LoadingState.cpp | 9 ++-- rwgame/states/LoadingState.hpp | 2 +- rwgame/states/PauseState.cpp | 4 +- rwgame/states/PauseState.hpp | 2 +- rwviewer/ViewerWidget.cpp | 18 ++++---- 29 files changed, 154 insertions(+), 152 deletions(-) diff --git a/rwengine/src/render/DebugDraw.cpp b/rwengine/src/render/DebugDraw.cpp index 2cf2c37d..696cd3a3 100644 --- a/rwengine/src/render/DebugDraw.cpp +++ b/rwengine/src/render/DebugDraw.cpp @@ -57,12 +57,12 @@ void DebugDraw::drawContactPoint(const btVector3 &pointOnB, RW_UNUSED(color); } -void DebugDraw::flush(GameRenderer *renderer) { +void DebugDraw::flush(GameRenderer &renderer) { if (lines.empty()) { return; } - renderer->getRenderer()->useProgram(shaderProgram); + renderer.getRenderer().useProgram(shaderProgram); lineBuff->uploadVertices(lines); dbuff->addGeometry(lineBuff.get()); @@ -75,9 +75,9 @@ void DebugDraw::flush(GameRenderer *renderer) { dp.count = lines.size(); dp.diffuse = 1.f; - renderer->getRenderer()->drawArrays(glm::mat4(1.f), dbuff.get(), dp); + renderer.getRenderer().drawArrays(glm::mat4(1.f), dbuff.get(), dp); - renderer->getRenderer()->invalidate(); + renderer.getRenderer().invalidate(); glUseProgram(0); glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/rwengine/src/render/DebugDraw.hpp b/rwengine/src/render/DebugDraw.hpp index 66d24a18..5ad84b32 100644 --- a/rwengine/src/render/DebugDraw.hpp +++ b/rwengine/src/render/DebugDraw.hpp @@ -38,7 +38,7 @@ public: void setDebugMode(int debugMode) override; int getDebugMode() const override; - void flush(GameRenderer *renderer); + void flush(GameRenderer &renderer); void setShaderProgram(Renderer::ShaderProgram *shaderProgram) { this->shaderProgram = shaderProgram; diff --git a/rwengine/src/render/GameRenderer.cpp b/rwengine/src/render/GameRenderer.cpp index d40732e9..8c41ea1b 100644 --- a/rwengine/src/render/GameRenderer.cpp +++ b/rwengine/src/render/GameRenderer.cpp @@ -43,9 +43,9 @@ struct ParticleVert { GameRenderer::GameRenderer(Logger* log, GameData* _data) : data(_data) , logger(log) - , map(renderer, _data) - , water(this) - , text(this) { + , map(*renderer, _data) + , water(*this) + , text(*this) { logger->info("Renderer", renderer->getIDString()); worldProg = @@ -171,7 +171,7 @@ GameRenderer::~GameRenderer() { void GameRenderer::setupRender() { // Set the viewport - const glm::ivec2& vp = getRenderer()->getViewport(); + const glm::ivec2& vp = getRenderer().getViewport(); glViewport(0, 0, vp.x, vp.y); glBindFramebuffer(GL_FRAMEBUFFER, framebufferName); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); @@ -239,7 +239,7 @@ void GameRenderer::renderWorld(GameWorld* world, const ViewCamera& camera, renderer->pushDebugGroup("Water"); - water.render(this, world); + water.render(*this, world); profWater = renderer->popDebugGroup(); diff --git a/rwengine/src/render/GameRenderer.hpp b/rwengine/src/render/GameRenderer.hpp index 291e5a05..669ed1e3 100644 --- a/rwengine/src/render/GameRenderer.hpp +++ b/rwengine/src/render/GameRenderer.hpp @@ -37,7 +37,7 @@ class GameRenderer { Logger* logger; /** The low-level drawing interface to use */ - std::shared_ptr renderer = std::make_shared(); + std::unique_ptr renderer = std::make_unique(); // Temporary variables used during rendering float _renderAlpha{0.f}; @@ -80,8 +80,8 @@ public: DrawBuffer skyDbuff; GeometryBuffer skyGbuff; - GameData* getData() const { - return data; + const GameData& getData() const { + return *data; } size_t getCulledCount() { @@ -119,8 +119,8 @@ public: void setupRender(); void renderPostProcess(); - std::shared_ptr getRenderer() { - return renderer; + Renderer& getRenderer() { + return *renderer; } void setViewport(int w, int h); diff --git a/rwengine/src/render/MapRenderer.cpp b/rwengine/src/render/MapRenderer.cpp index a0d70dab..2f409e9e 100644 --- a/rwengine/src/render/MapRenderer.cpp +++ b/rwengine/src/render/MapRenderer.cpp @@ -46,7 +46,7 @@ void main() outColour = vec4(colour.rgb + c.rgb, colour.a * c.a); })"; -MapRenderer::MapRenderer(std::shared_ptr renderer, GameData* _data) +MapRenderer::MapRenderer(Renderer &renderer, GameData* _data) : data(_data), renderer(renderer) { rectGeom.uploadVertices( {{-.5f, -.5f}, {.5f, -.5f}, {.5f, .5f}, {-.5f, .5f}}); @@ -64,16 +64,16 @@ MapRenderer::MapRenderer(std::shared_ptr renderer, GameData* _data) circle.addGeometry(&circleGeom); circle.setFaceType(GL_TRIANGLE_FAN); - rectProg = renderer->createShader(MapVertexShader, MapFragmentShader); + rectProg = renderer.createShader(MapVertexShader, MapFragmentShader); - renderer->setUniform(rectProg.get(), "colour", glm::vec4(1.f)); + renderer.setUniform(rectProg.get(), "colour", glm::vec4(1.f)); } #define GAME_MAP_SIZE 4000 void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { - renderer->pushDebugGroup("Map"); - renderer->useProgram(rectProg.get()); + renderer.pushDebugGroup("Map"); + renderer.useProgram(rectProg.get()); Renderer::DrawParameters dp { }; dp.start = 0; @@ -87,24 +87,24 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { // Determine the scale to show the right number of world units on the screen float worldScale = mi.screenSize / mi.worldSize; - auto proj = renderer->get2DProjection(); + auto proj = renderer.get2DProjection(); glm::mat4 view{1.0f}, model{1.0f}; - renderer->setUniform(rectProg.get(), "proj", proj); - renderer->setUniform(rectProg.get(), "model", glm::mat4(1.0f)); - renderer->setUniform(rectProg.get(), "colour", glm::vec4(0.f, 0.f, 0.f, 1.f)); + renderer.setUniform(rectProg.get(), "proj", proj); + renderer.setUniform(rectProg.get(), "model", glm::mat4(1.0f)); + renderer.setUniform(rectProg.get(), "colour", glm::vec4(0.f, 0.f, 0.f, 1.f)); view = glm::translate(view, glm::vec3(mi.screenPosition, 0.f)); if (mi.clipToSize) { glm::mat4 circleView = glm::scale(view, glm::vec3(mi.screenSize)); - renderer->setUniform(rectProg.get(), "view", circleView); + renderer.setUniform(rectProg.get(), "view", circleView); dp.count = 182; glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 0xFF); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilMask(0xFF); glColorMask(0x00, 0x00, 0x00, 0x00); - renderer->drawArrays(glm::mat4(1.0f), &circle, dp); + renderer.drawArrays(glm::mat4(1.0f), &circle, dp); glColorMask(0xFF, 0xFF, 0xFF, 0xFF); glStencilFunc(GL_EQUAL, 1, 0xFF); } @@ -113,7 +113,7 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { view = glm::rotate(view, mi.rotation, glm::vec3(0.f, 0.f, 1.f)); view = glm::translate( view, glm::vec3(glm::vec2(-1.f, 1.f) * mi.worldCenter, 0.f)); - renderer->setUniform(rectProg.get(), "view", view); + renderer.setUniform(rectProg.get(), "view", view); // radar00 = -x, +y // incrementing in X, then Y @@ -138,13 +138,13 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { tilemodel = glm::translate(tilemodel, glm::vec3(tc, 0.f)); tilemodel = glm::scale(tilemodel, glm::vec3(tileSize, 1.f)); - renderer->setUniform(rectProg.get(), "model", tilemodel); + renderer.setUniform(rectProg.get(), "model", tilemodel); - renderer->drawArrays(glm::mat4(1.0f), &rect, dp); + renderer.drawArrays(glm::mat4(1.0f), &rect, dp); } // From here on out we will work in screenspace - renderer->setUniform(rectProg.get(), "view", glm::mat4(1.0f)); + renderer.setUniform(rectProg.get(), "view", glm::mat4(1.0f)); if (mi.clipToSize) { glDisable(GL_STENCIL_TEST); @@ -157,8 +157,8 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { glm::mat4 model{1.0f}; model = glm::translate(model, glm::vec3(mi.screenPosition, 0.0f)); model = glm::scale(model, glm::vec3(mi.screenSize * 1.07f)); - renderer->setUniform(rectProg.get(), "model", model); - renderer->drawArrays(glm::mat4(1.0f), &rect, dp); + renderer.setUniform(rectProg.get(), "model", model); + renderer.drawArrays(glm::mat4(1.0f), &rect, dp); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); } @@ -237,8 +237,8 @@ void MapRenderer::draw(GameWorld* world, const MapInfo& mi) { } /// @TODO migrate to using the renderer - renderer->invalidate(); - renderer->popDebugGroup(); + renderer.invalidate(); + renderer.popDebugGroup(); } void MapRenderer::prepareBlip(const glm::vec2& coord, const glm::mat4& view, @@ -260,14 +260,14 @@ void MapRenderer::prepareBlip(const glm::vec2& coord, const glm::mat4& view, model = glm::translate(model, viewPos); model = glm::scale(model, glm::vec3(size)); model = glm::rotate(model, heading, glm::vec3(0.f, 0.f, 1.f)); - renderer->setUniform(rectProg.get(), "model", model); + renderer.setUniform(rectProg.get(), "model", model); GLuint tex = 0; if (!texture.empty()) { auto sprite = data->findSlotTexture("hud", texture); tex = sprite->getName(); } - renderer->setUniform(rectProg.get(), "colour", colour); + renderer.setUniform(rectProg.get(), "colour", colour); glBindTexture(GL_TEXTURE_2D, tex); @@ -286,7 +286,7 @@ void MapRenderer::drawBlip(const glm::vec2& coord, const glm::mat4& view, const MapInfo& mi, glm::vec4 colour, float size) { drawBlip(coord, view, mi, "", colour, size); // Draw outline - renderer->setUniform(rectProg.get(), "colour", glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); + renderer.setUniform(rectProg.get(), "colour", glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); glDrawArrays(GL_LINE_LOOP, 0, 4); } diff --git a/rwengine/src/render/MapRenderer.hpp b/rwengine/src/render/MapRenderer.hpp index 15805907..102dbc80 100644 --- a/rwengine/src/render/MapRenderer.hpp +++ b/rwengine/src/render/MapRenderer.hpp @@ -36,14 +36,14 @@ public: bool clipToSize = true; }; - MapRenderer(std::shared_ptr renderer, GameData* data); + MapRenderer(Renderer& renderer, GameData* data); void draw(GameWorld* world, const MapInfo& mi); void scaleHUD(const float scale); private: GameData* data; - std::shared_ptr renderer; + Renderer& renderer; GeometryBuffer rectGeom; DrawBuffer rect; diff --git a/rwengine/src/render/OpenGLRenderer.hpp b/rwengine/src/render/OpenGLRenderer.hpp index 9f99eb0c..55576141 100644 --- a/rwengine/src/render/OpenGLRenderer.hpp +++ b/rwengine/src/render/OpenGLRenderer.hpp @@ -308,8 +308,8 @@ public: float f) override; void useProgram(ShaderProgram* p) override; - void clear(const glm::vec4& colour, bool clearColour, - bool clearDepth) override; + void clear(const glm::vec4& colour, bool clearColour = true, + bool clearDepth = true) override; void setSceneParameters(const SceneUniformData& data) override; diff --git a/rwengine/src/render/TextRenderer.cpp b/rwengine/src/render/TextRenderer.cpp index bcf7ec01..aba0625a 100644 --- a/rwengine/src/render/TextRenderer.cpp +++ b/rwengine/src/render/TextRenderer.cpp @@ -142,13 +142,13 @@ struct TextVertex { } }; -TextRenderer::TextRenderer(GameRenderer* renderer) : renderer(renderer) { - textShader = renderer->getRenderer()->createShader(TextVertexShader, +TextRenderer::TextRenderer(GameRenderer &renderer) : renderer(renderer) { + textShader = renderer.getRenderer().createShader(TextVertexShader, TextFragmentShader); } void TextRenderer::setFontTexture(font_t font, const std::string& textureName) { - auto ftexture = renderer->getData()->findSlotTexture("fonts", textureName); + auto ftexture = renderer.getData().findSlotTexture("fonts", textureName); const glm::u32vec2 textureSize = ftexture->getSize(); glm::u8vec2 glyphOffset{textureSize.x / 16, textureSize.x / 16}; if (font != FONT_PAGER) { @@ -187,8 +187,8 @@ void TextRenderer::renderText(const TextRenderer::TextInfo& ti, if (ti.text.empty() || ti.text[0] == '*') return; - renderer->getRenderer()->pushDebugGroup("Text"); - renderer->getRenderer()->useProgram(textShader.get()); + renderer.getRenderer().pushDebugGroup("Text"); + renderer.getRenderer().useProgram(textShader.get()); glm::vec2 coord(0.f, 0.f); glm::vec2 alignment = ti.screenPosition; @@ -331,15 +331,15 @@ void TextRenderer::renderText(const TextRenderer::TextInfo& ti, // If we need to, draw the background. if (colourBG.a > 0.f) { - renderer->drawColour( + renderer.drawColour( colourBG, glm::vec4(ti.screenPosition - (ss / 3.f), glm::vec2(maxWidth, maxHeight) + (ss / 2.f))); } - renderer->getRenderer()->setUniform( - textShader.get(), "proj", renderer->getRenderer()->get2DProjection()); - renderer->getRenderer()->setUniformTexture(textShader.get(), "fontTexture", 0); - renderer->getRenderer()->setUniform(textShader.get(), "alignment", alignment); + renderer.getRenderer().setUniform( + textShader.get(), "proj", renderer.getRenderer().get2DProjection()); + renderer.getRenderer().setUniformTexture(textShader.get(), "fontTexture", 0); + renderer.getRenderer().setUniform(textShader.get(), "alignment", alignment); gb.uploadVertices(geo); db.addGeometry(&gb); @@ -349,11 +349,11 @@ void TextRenderer::renderText(const TextRenderer::TextInfo& ti, dp.start = 0; dp.blendMode = BlendMode::BLEND_ALPHA; dp.count = gb.getCount(); - auto ftexture = renderer->getData()->findSlotTexture("fonts", fontMetaData.textureName); + auto ftexture = renderer.getData().findSlotTexture("fonts", fontMetaData.textureName); dp.textures = {{ftexture->getName()}}; dp.depthMode = DepthMode::OFF; - renderer->getRenderer()->drawArrays(glm::mat4(1.0f), &db, dp); + renderer.getRenderer().drawArrays(glm::mat4(1.0f), &db, dp); - renderer->getRenderer()->popDebugGroup(); + renderer.getRenderer().popDebugGroup(); } diff --git a/rwengine/src/render/TextRenderer.hpp b/rwengine/src/render/TextRenderer.hpp index 41f0aefe..3aea418f 100644 --- a/rwengine/src/render/TextRenderer.hpp +++ b/rwengine/src/render/TextRenderer.hpp @@ -56,7 +56,7 @@ public: float widthFrac; }; - TextRenderer(GameRenderer* renderer); + TextRenderer(GameRenderer& renderer); ~TextRenderer() = default; void setFontTexture(font_t font, const std::string& textureName); @@ -89,7 +89,7 @@ private: std::array fonts; - GameRenderer* renderer; + GameRenderer& renderer; std::unique_ptr textShader; GeometryBuffer gb; diff --git a/rwengine/src/render/WaterRenderer.cpp b/rwengine/src/render/WaterRenderer.cpp index b9b5162f..7ca6a399 100644 --- a/rwengine/src/render/WaterRenderer.cpp +++ b/rwengine/src/render/WaterRenderer.cpp @@ -13,20 +13,20 @@ #include "render/GameShaders.hpp" #include "render/OpenGLRenderer.hpp" -WaterRenderer::WaterRenderer(GameRenderer* renderer) { +WaterRenderer::WaterRenderer(GameRenderer &renderer) { maskDraw.setFaceType(GL_TRIANGLES); gridDraw.setFaceType(GL_TRIANGLES); - waterProg = renderer->getRenderer()->createShader( + waterProg = renderer.getRenderer().createShader( GameShaders::WaterHQ::VertexShader, GameShaders::WaterHQ::FragmentShader); - maskProg = renderer->getRenderer()->createShader( + maskProg = renderer.getRenderer().createShader( GameShaders::Mask3D::VertexShader, GameShaders::Mask3D::FragmentShader); - renderer->getRenderer()->setProgramBlockBinding(waterProg.get(), "SceneData", 1); - renderer->getRenderer()->setProgramBlockBinding(maskProg.get(), "SceneData", 1); + renderer.getRenderer().setProgramBlockBinding(waterProg.get(), "SceneData", 1); + renderer.getRenderer().setProgramBlockBinding(maskProg.get(), "SceneData", 1); - renderer->getRenderer()->setUniformTexture(waterProg.get(), "data", 1); + renderer.getRenderer().setUniformTexture(waterProg.get(), "data", 1); // Generate grid mesh int gridres = 60; @@ -99,8 +99,8 @@ void WaterRenderer::setDataTexture(GLuint fbBinding, GLuint dataTex) { dataTexture = dataTex; } -void WaterRenderer::render(GameRenderer* renderer, GameWorld* world) { - auto r = renderer->getRenderer(); +void WaterRenderer::render(GameRenderer &renderer, GameWorld* world) { + auto& r = renderer.getRenderer(); auto waterTex = world->data->findSlotTexture("particle", "water_old"); RW_CHECK(waterTex != nullptr, "Water texture is null"); @@ -126,30 +126,30 @@ void WaterRenderer::render(GameRenderer* renderer, GameWorld* world) { glDrawBuffers(1, buffers); glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - r->useProgram(maskProg.get()); + r.useProgram(maskProg.get()); - r->drawArrays(m, &maskDraw, wdp); + r.drawArrays(m, &maskDraw, wdp); glStencilFunc(GL_EQUAL, 1, 0xFF); glStencilMask(0x00); glEnable(GL_DEPTH_TEST); - r->useProgram(waterProg.get()); + r.useProgram(waterProg.get()); buffers[0] = GL_COLOR_ATTACHMENT0; glDrawBuffers(1, buffers); - r->setUniform(waterProg.get(), "time", world->getGameTime()); - r->setUniform(waterProg.get(), "waveParams", + r.setUniform(waterProg.get(), "time", world->getGameTime()); + r.setUniform(waterProg.get(), "waveParams", glm::vec2(WATER_SCALE, WATER_HEIGHT)); auto ivp = - glm::inverse(r->getSceneData().projection * r->getSceneData().view); - r->setUniform(waterProg.get(), "inverseVP", ivp); + glm::inverse(r.getSceneData().projection * r.getSceneData().view); + r.setUniform(waterProg.get(), "inverseVP", ivp); wdp.count = gridGeom.getCount(); wdp.textures = {{waterTex->getName(), dataTexture}}; - r->drawArrays(m, &gridDraw, wdp); + r.drawArrays(m, &gridDraw, wdp); glDisable(GL_STENCIL_TEST); } diff --git a/rwengine/src/render/WaterRenderer.hpp b/rwengine/src/render/WaterRenderer.hpp index d7a0138e..d916ac4a 100644 --- a/rwengine/src/render/WaterRenderer.hpp +++ b/rwengine/src/render/WaterRenderer.hpp @@ -19,7 +19,7 @@ class GameWorld; */ class WaterRenderer { public: - WaterRenderer(GameRenderer* renderer); + WaterRenderer(GameRenderer& renderer); ~WaterRenderer() = default; /** @@ -38,7 +38,7 @@ public: /** * Render the water using the currently active render state */ - void render(GameRenderer* renderer, GameWorld* world); + void render(GameRenderer& renderer, GameWorld* world); private: std::unique_ptr waterProg = nullptr; diff --git a/rwgame/HUDDrawer.cpp b/rwgame/HUDDrawer.cpp index 961a5fdb..f8ae684f 100644 --- a/rwgame/HUDDrawer.cpp +++ b/rwgame/HUDDrawer.cpp @@ -10,10 +10,10 @@ #include #include -void HUDDrawer::drawScriptTimer(GameWorld* world, GameRenderer* render) { +void HUDDrawer::drawScriptTimer(GameWorld* world, GameRenderer& render) { if (world->state->scriptTimerVariable) { float scriptTimerTextX = static_cast( - render->getRenderer()->getViewport().x - hudParameters.uiOuterMargin); + render.getRenderer().getViewport().x - hudParameters.uiOuterMargin); float scriptTimerTextY = hudParameters.uiScriptTimerHeight; TextRenderer::TextInfo ti; @@ -33,16 +33,16 @@ void HUDDrawer::drawScriptTimer(GameWorld* world, GameRenderer* render) { ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(scriptTimerTextX + 1.f, scriptTimerTextY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = hudParameters.uiScriptTimerColour; ti.screenPosition = glm::vec2(scriptTimerTextX, scriptTimerTextY); - render->text.renderText(ti); + render.text.renderText(ti); } } void HUDDrawer::drawMap(ViewCamera& currentView, PlayerController* player, - GameWorld* world, GameRenderer* render) { + GameWorld* world, GameRenderer& render) { MapRenderer::MapInfo map; if (world->state->hudFlash != HudFlash::FlashRadar || @@ -56,7 +56,7 @@ void HUDDrawer::drawMap(ViewCamera& currentView, PlayerController* player, map.worldCenter = glm::vec2(player->getCharacter()->getPosition()); } - const glm::ivec2& vp = render->getRenderer()->getViewport(); + const glm::ivec2& vp = render.getRenderer().getViewport(); glm::vec2 mapTop = glm::vec2(hudParameters.uiOuterMargin, vp.y - (hudParameters.uiOuterMargin + hudParameters.uiMapSize)); @@ -66,19 +66,19 @@ void HUDDrawer::drawMap(ViewCamera& currentView, PlayerController* player, map.screenPosition = (mapTop + mapBottom) / 2.f; map.screenSize = hudParameters.uiMapSize * 0.95f; - render->map.draw(world, map); + render.map.draw(world, map); } } void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, - GameRenderer* render) { - float infoTextX = static_cast(render->getRenderer()->getViewport().x - + GameRenderer& render) { + float infoTextX = static_cast(render.getRenderer().getViewport().x - (hudParameters.uiOuterMargin + hudParameters.uiWeaponSize + hudParameters.uiInfoMargin)); float infoTextY = 0.f + hudParameters.uiOuterMargin; - float iconX = static_cast(render->getRenderer()->getViewport().x - + float iconX = static_cast(render.getRenderer().getViewport().x - (hudParameters.uiOuterMargin + hudParameters.uiWeaponSize)); float iconY = hudParameters.uiOuterMargin; - float wantedX = static_cast(render->getRenderer()->getViewport().x - hudParameters.uiOuterMargin); + float wantedX = static_cast(render.getRenderer().getViewport().x - hudParameters.uiOuterMargin); float wantedY = hudParameters.uiWantedLevelHeight; TextRenderer::TextInfo ti; @@ -96,12 +96,12 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = hudParameters.uiTimeColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); - render->text.renderText(ti); + render.text.renderText(ti); infoTextY += hudParameters.uiTextHeight; @@ -115,12 +115,12 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = hudParameters.uiMoneyColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); - render->text.renderText(ti); + render.text.renderText(ti); infoTextY += hudParameters.uiTextHeight; @@ -137,11 +137,11 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f, infoTextY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = hudParameters.uiHealthColour; ti.screenPosition = glm::vec2(infoTextX, infoTextY); - render->text.renderText(ti); + render.text.renderText(ti); } if (player->getCharacter()->getCurrentState().armour > 0) { @@ -154,11 +154,11 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(infoTextX + 1.f - hudParameters.uiArmourOffset, infoTextY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = hudParameters.uiArmourColour; ti.screenPosition = glm::vec2(infoTextX - hudParameters.uiArmourOffset, infoTextY); - render->text.renderText(ti); + render.text.renderText(ti); } GameString s; @@ -168,7 +168,7 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.text = s; ti.baseColour = hudParameters.uiShadowColour; ti.screenPosition = glm::vec2(wantedX + 1.f, wantedY + 1.f); - render->text.renderText(ti); + render.text.renderText(ti); #if 0 // Useful for debugging ti.text = "ABCDEFGHIJKLMANOQRTSWXYZ\nM0123456789"; @@ -176,10 +176,10 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.align = TextRenderer::TextInfo::Left; ti.baseColour = glm::vec3(0.f, 0.f, 0.f); ti.screenPosition = glm::vec2(101.f, 202.f); - render->text.renderText(ti); + render.text.renderText(ti); ti.baseColour = glm::vec3(1.f, 1.f, 1.f); ti.screenPosition = glm::vec2(100.f, 200.f); - render->text.renderText(ti); + render.text.renderText(ti); #endif auto item = player->getCharacter()->getActiveItem(); @@ -200,13 +200,13 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, } TextureData::Handle itemTexture = - render->getData()->findSlotTexture("hud", itemTextureName); + render.getData().findSlotTexture("hud", itemTextureName); RW_CHECK(itemTexture != nullptr, "Item has 0 texture"); if (itemTexture != nullptr) { RW_CHECK(itemTexture->getName() != 0, "Item has 0 texture"); - render->drawTexture( - itemTexture.get(), - glm::vec4(iconX, iconY, hudParameters.uiWeaponSize, hudParameters.uiWeaponSize)); + render.drawTexture(itemTexture.get(), + glm::vec4(iconX, iconY, hudParameters.uiWeaponSize, + hudParameters.uiWeaponSize)); } if (weapon.fireType != WeaponData::MELEE) { @@ -242,12 +242,12 @@ void HUDDrawer::drawPlayerInfo(PlayerController* player, GameWorld* world, ti.align = TextRenderer::TextInfo::TextAlignment::Center; ti.screenPosition = glm::vec2(iconX + hudParameters.uiWeaponSize / 2.f, iconY + hudParameters.uiWeaponSize - hudParameters.uiAmmoHeight); - render->text.renderText(ti); + render.text.renderText(ti); } } void HUDDrawer::drawHUD(ViewCamera& currentView, PlayerController* player, - GameWorld* world, GameRenderer* render) { + GameWorld* world, GameRenderer& render) { if (player && player->getCharacter()) { drawMap(currentView, player, world, render); drawPlayerInfo(player, world, render); @@ -255,8 +255,8 @@ void HUDDrawer::drawHUD(ViewCamera& currentView, PlayerController* player, } } -void HUDDrawer::drawOnScreenText(GameWorld* world, GameRenderer* renderer) { - const auto vp = glm::vec2(renderer->getRenderer()->getViewport()); +void HUDDrawer::drawOnScreenText(GameWorld* world, GameRenderer& renderer) { + const auto vp = glm::vec2(renderer.getRenderer().getViewport()); TextRenderer::TextInfo ti; ti.font = FONT_ARIAL; @@ -293,7 +293,7 @@ void HUDDrawer::drawOnScreenText(GameWorld* world, GameRenderer* renderer) { ti.screenPosition += shadowPosition; ti.backgroundColour = {0, 0, 0, 0}; - renderer->text.renderText(ti, true); + renderer.text.renderText(ti, true); ti.screenPosition -= shadowPosition; } else if (t.colourBG.a > 0) { @@ -301,7 +301,7 @@ void HUDDrawer::drawOnScreenText(GameWorld* world, GameRenderer* renderer) { } ti.baseColour = t.colourFG; - renderer->text.renderText(ti); + renderer.text.renderText(ti); } } } diff --git a/rwgame/HUDDrawer.hpp b/rwgame/HUDDrawer.hpp index 82555eff..ec793ee3 100644 --- a/rwgame/HUDDrawer.hpp +++ b/rwgame/HUDDrawer.hpp @@ -41,17 +41,17 @@ public: void applyHUDScale(float scale); HUDParameters getHUDParameters(); void drawHUD(ViewCamera& currentView, PlayerController* player, - GameWorld* world, GameRenderer* render); - void drawOnScreenText(GameWorld* world, GameRenderer* renderer); + GameWorld* world, GameRenderer& render); + void drawOnScreenText(GameWorld* world, GameRenderer& renderer); private: HUDParameters hudParameters; - void drawScriptTimer(GameWorld* world, GameRenderer* render); + void drawScriptTimer(GameWorld* world, GameRenderer& render); void drawMap(ViewCamera& currentView, PlayerController* player, - GameWorld* world, GameRenderer* render); + GameWorld* world, GameRenderer& render); void drawPlayerInfo(PlayerController* player, GameWorld* world, - GameRenderer* render); + GameRenderer& render); }; #endif diff --git a/rwgame/MenuSystem.hpp b/rwgame/MenuSystem.hpp index dbcab907..ce33e2b0 100644 --- a/rwgame/MenuSystem.hpp +++ b/rwgame/MenuSystem.hpp @@ -49,7 +49,7 @@ public: : text(n), callback(cb) { } - void draw(font_t font, float size, bool active, GameRenderer* r, + void draw(font_t font, float size, bool active, GameRenderer& r, glm::vec2& basis) { TextRenderer::TextInfo ti; ti.font = font; @@ -61,7 +61,7 @@ public: } else { ti.baseColour = glm::u8vec3(255, 255, 0); } - r->text.renderText(ti); + r.text.renderText(ti); basis.y += size; } @@ -97,7 +97,7 @@ public: */ int activeEntry; - void draw(GameRenderer* r) { + void draw(GameRenderer& r) { glm::vec2 basis(offset); for (size_t i = 0; i < entries.size(); ++i) { bool active = false; diff --git a/rwgame/RWGame.cpp b/rwgame/RWGame.cpp index e9d2b7d9..d25cf4a0 100644 --- a/rwgame/RWGame.cpp +++ b/rwgame/RWGame.cpp @@ -585,9 +585,9 @@ void RWGame::tickObjects(float dt) const { void RWGame::render(float alpha, float time) { RW_PROFILE_SCOPEC(__func__, MP_CORNFLOWERBLUE); - lastDraws = getRenderer().getRenderer()->getDrawCount(); + lastDraws = getRenderer().getRenderer().getDrawCount(); - getRenderer().getRenderer()->swap(); + getRenderer().getRenderer().swap(); // Update the camera if (!StateManager::get().states.empty()) { @@ -611,19 +611,19 @@ void RWGame::render(float alpha, float time) { glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - renderer.getRenderer()->pushDebugGroup("World"); + renderer.getRenderer().pushDebugGroup("World"); renderer.renderWorld(world.get(), viewCam, alpha); - renderer.getRenderer()->popDebugGroup(); + renderer.getRenderer().popDebugGroup(); renderDebugView(time, viewCam); - if (!world->isPaused()) hudDrawer.drawOnScreenText(world.get(), &renderer); + if (!world->isPaused()) hudDrawer.drawOnScreenText(world.get(), renderer); if (StateManager::currentState()) { RW_PROFILE_SCOPE("state"); - StateManager::get().draw(&renderer); + StateManager::get().draw(renderer); } } @@ -635,7 +635,7 @@ void RWGame::renderDebugView(float time, ViewCamera &viewCam) { break; case DebugViewMode::Physics: world->dynamicsWorld->debugDrawWorld(); - debug.flush(&renderer); + debug.flush(renderer); break; case DebugViewMode::Navigation: renderDebugPaths(time); @@ -671,8 +671,8 @@ void RWGame::renderDebugStats(float time) { << "Frame: " << time_ms << "ms\n" << "Draws/Culls/Textures/Buffers: " << lastDraws << "/" << renderer.getCulledCount() << "/" - << renderer.getRenderer()->getTextureCount() << "/" - << renderer.getRenderer()->getBufferCount() << "\n" + << renderer.getRenderer().getTextureCount() << "/" + << renderer.getRenderer().getBufferCount() << "\n" << "Timescale: " << world->state->basic.timeScale; TextRenderer::TextInfo ti; @@ -785,7 +785,7 @@ void RWGame::renderDebugPaths(float time) { } } - debug.flush(&renderer); + debug.flush(renderer); } void RWGame::renderDebugObjects(float time, ViewCamera& camera) { diff --git a/rwgame/State.cpp b/rwgame/State.cpp index d7fc8604..507d85f8 100644 --- a/rwgame/State.cpp +++ b/rwgame/State.cpp @@ -9,7 +9,7 @@ const ViewCamera defaultView{{-250.f, -550.f, 75.f}, State::State(RWGame *game) : game(game) { } -void State::draw(GameRenderer *r) { +void State::draw(GameRenderer& r) { auto& menu = getCurrentMenu(); if (menu) { menu->draw(r); diff --git a/rwgame/State.hpp b/rwgame/State.hpp index 7c8d78d9..a0afb81d 100644 --- a/rwgame/State.hpp +++ b/rwgame/State.hpp @@ -25,7 +25,7 @@ public: virtual void tick(float dt) = 0; - virtual void draw(GameRenderer* r); + virtual void draw(GameRenderer& r); virtual ~State() = default; diff --git a/rwgame/StateManager.hpp b/rwgame/StateManager.hpp index c24d94aa..424bd147 100644 --- a/rwgame/StateManager.hpp +++ b/rwgame/StateManager.hpp @@ -59,7 +59,7 @@ public: states.back()->tick(dt); } - void draw(GameRenderer* r) { + void draw(GameRenderer& r) { states.back()->draw(r); } diff --git a/rwgame/states/BenchmarkState.cpp b/rwgame/states/BenchmarkState.cpp index 8e03418e..4b8bdbc7 100644 --- a/rwgame/states/BenchmarkState.cpp +++ b/rwgame/states/BenchmarkState.cpp @@ -90,7 +90,7 @@ void BenchmarkState::tick(float dt) { } } -void BenchmarkState::draw(GameRenderer* r) { +void BenchmarkState::draw(GameRenderer& r) { frameCounter++; State::draw(r); } diff --git a/rwgame/states/BenchmarkState.hpp b/rwgame/states/BenchmarkState.hpp index 43f6aa3b..1ce64a3d 100644 --- a/rwgame/states/BenchmarkState.hpp +++ b/rwgame/states/BenchmarkState.hpp @@ -28,7 +28,7 @@ public: void tick(float dt) override; - void draw(GameRenderer* r) override; + void draw(GameRenderer &r) override; void handleEvent(const SDL_Event& event) override; diff --git a/rwgame/states/DebugState.cpp b/rwgame/states/DebugState.cpp index 6d75641e..c66e2b83 100644 --- a/rwgame/states/DebugState.cpp +++ b/rwgame/states/DebugState.cpp @@ -390,7 +390,7 @@ void DebugState::tick(float dt) { } } -void DebugState::draw(GameRenderer* r) { +void DebugState::draw(GameRenderer& r) { // Draw useful information like camera position. std::stringstream ss; ss << "Camera Position: " << glm::to_string(_debugCam.position) << "\n"; @@ -403,7 +403,7 @@ void DebugState::draw(GameRenderer* r) { ti.screenPosition = glm::vec2(10.f, 10.f); ti.size = 15.f; ti.baseColour = glm::u8vec3(255); - r->text.renderText(ti); + r.text.renderText(ti); State::draw(r); } diff --git a/rwgame/states/DebugState.hpp b/rwgame/states/DebugState.hpp index 781f09f0..fbe254a2 100644 --- a/rwgame/states/DebugState.hpp +++ b/rwgame/states/DebugState.hpp @@ -29,7 +29,7 @@ public: void tick(float dt) override; - void draw(GameRenderer* r) override; + void draw(GameRenderer &r) override; void handleEvent(const SDL_Event& event) override; diff --git a/rwgame/states/IngameState.cpp b/rwgame/states/IngameState.cpp index 4b9b486d..525af233 100644 --- a/rwgame/states/IngameState.cpp +++ b/rwgame/states/IngameState.cpp @@ -281,9 +281,10 @@ void IngameState::tick(float dt) { } } -void IngameState::draw(GameRenderer* r) { +void IngameState::draw(GameRenderer& r) { if (!getWorld()->state->isCinematic && getWorld()->isCutsceneDone()) { - game->getHUDDrawer().drawHUD(_look, game->getWorld()->getPlayer(), getWorld(), r); + game->getHUDDrawer().drawHUD(_look, game->getWorld()->getPlayer(), + getWorld(), r); } State::draw(r); diff --git a/rwgame/states/IngameState.hpp b/rwgame/states/IngameState.hpp index bc66edd3..753dff98 100644 --- a/rwgame/states/IngameState.hpp +++ b/rwgame/states/IngameState.hpp @@ -53,7 +53,7 @@ public: void tick(float dt) override; - void draw(GameRenderer* r) override; + void draw(GameRenderer &r) override; void handleEvent(const SDL_Event& event) override; virtual void handlePlayerInput(const SDL_Event& event); diff --git a/rwgame/states/LoadingState.cpp b/rwgame/states/LoadingState.cpp index 0e04cf6e..ac87558f 100644 --- a/rwgame/states/LoadingState.cpp +++ b/rwgame/states/LoadingState.cpp @@ -27,15 +27,16 @@ void LoadingState::handleEvent(const SDL_Event& e) { State::handleEvent(e); } -void LoadingState::draw(GameRenderer* r) { - static auto kLoadingString = GameStringUtil::fromString("Loading...", FONT_ARIAL); +void LoadingState::draw(GameRenderer& r) { + static auto kLoadingString = + GameStringUtil::fromString("Loading...", FONT_ARIAL); // Display some manner of loading screen. TextRenderer::TextInfo ti; ti.text = kLoadingString; - auto size = r->getRenderer()->getViewport(); + auto size = r.getRenderer().getViewport(); ti.size = 25.f; ti.screenPosition = glm::vec2(50.f, size.y - ti.size - 50.f); ti.font = FONT_PRICEDOWN; ti.baseColour = glm::u8vec3(255); - r->text.renderText(ti); + r.text.renderText(ti); } diff --git a/rwgame/states/LoadingState.hpp b/rwgame/states/LoadingState.hpp index 7702d306..d5a867e9 100644 --- a/rwgame/states/LoadingState.hpp +++ b/rwgame/states/LoadingState.hpp @@ -16,7 +16,7 @@ public: void tick(float dt) override; - void draw(GameRenderer* r) override; + void draw(GameRenderer& r) override; bool shouldWorldUpdate() override; diff --git a/rwgame/states/PauseState.cpp b/rwgame/states/PauseState.cpp index 9a5bd7f4..fa1f9bd8 100644 --- a/rwgame/states/PauseState.cpp +++ b/rwgame/states/PauseState.cpp @@ -29,10 +29,10 @@ void PauseState::tick(float dt) { RW_UNUSED(dt); } -void PauseState::draw(GameRenderer* r) { +void PauseState::draw(GameRenderer& r) { MapRenderer::MapInfo map; - auto& vp = r->getRenderer()->getViewport(); + auto& vp = r.getRenderer().getViewport(); map.worldSize = 4000.f; map.clipToSize = false; diff --git a/rwgame/states/PauseState.hpp b/rwgame/states/PauseState.hpp index 0747d342..b8e170ed 100644 --- a/rwgame/states/PauseState.hpp +++ b/rwgame/states/PauseState.hpp @@ -13,7 +13,7 @@ public: void tick(float dt) override; - void draw(GameRenderer* r) override; + void draw(GameRenderer &r) override; void handleEvent(const SDL_Event& event) override; }; diff --git a/rwviewer/ViewerWidget.cpp b/rwviewer/ViewerWidget.cpp index b4337428..f2208a12 100644 --- a/rwviewer/ViewerWidget.cpp +++ b/rwviewer/ViewerWidget.cpp @@ -76,8 +76,8 @@ void ViewerWidget::drawModel(GameRenderer& r, ClumpPtr& model) { viewDistance, view, proj); - r.getRenderer()->useProgram(r.worldProg.get()); - r.getRenderer()->setSceneParameters( + r.getRenderer().useProgram(r.worldProg.get()); + r.getRenderer().setSceneParameters( {proj, view, glm::vec4(0.15f), glm::vec4(0.7f), glm::vec4(1.f), glm::vec4(0.f), 90.f, vc.frustum.far}); model->getFrame()->updateHierarchyTransform(); @@ -85,7 +85,7 @@ void ViewerWidget::drawModel(GameRenderer& r, ClumpPtr& model) { ObjectRenderer _renderer(world(), vc, 1.f); RenderList renders; _renderer.renderClump(model.get(), glm::mat4(1.0f), nullptr, renders); - r.getRenderer()->drawBatched(renders); + r.getRenderer().drawBatched(renders); drawFrameWidget(model->getFrame().get()); r.renderPostProcess(); @@ -98,8 +98,8 @@ void ViewerWidget::drawObject(GameRenderer &r, GameObject *object) { viewDistance, view, proj); - r.getRenderer()->useProgram(r.worldProg.get()); - r.getRenderer()->setSceneParameters( + r.getRenderer().useProgram(r.worldProg.get()); + r.getRenderer().setSceneParameters( {proj, view, glm::vec4(0.15f), glm::vec4(0.7f), glm::vec4(1.f), glm::vec4(0.f), 90.f, vc.frustum.far}); @@ -111,7 +111,7 @@ void ViewerWidget::drawObject(GameRenderer &r, GameObject *object) { const Renderer::RenderInstruction& b) { return a.sortKey < b.sortKey; }); - r.getRenderer()->drawBatched(renders); + r.getRenderer().drawBatched(renders); r.renderPostProcess(); } @@ -144,12 +144,12 @@ void ViewerWidget::paintGL() { RW_CHECK(_renderer != nullptr, "GameRenderer is null"); auto& r = *_renderer; - r.getRenderer()->invalidate(); + r.getRenderer().invalidate(); r.setViewport(width() * devicePixelRatio(), height() * devicePixelRatio()); glEnable(GL_DEPTH_TEST); - r.getRenderer()->invalidate(); + r.getRenderer().invalidate(); r.setupRender(); switch (_viewMode) { @@ -187,7 +187,7 @@ void ViewerWidget::drawFrameWidget(ModelFrame* f, const glm::mat4& m) { RW_CHECK(_renderer != nullptr, "GameRenderer is null"); if(_renderer != nullptr) { - _renderer->getRenderer()->drawArrays(thisM, _frameWidgetDraw, dp); + _renderer->getRenderer().drawArrays(thisM, _frameWidgetDraw, dp); } for (auto c : f->getChildren()) {