diff --git a/include/rendering/camera_controller.hpp b/include/rendering/camera_controller.hpp index 63b90a80..1759f679 100644 --- a/include/rendering/camera_controller.hpp +++ b/include/rendering/camera_controller.hpp @@ -64,6 +64,7 @@ public: bool isRightMouseHeld() const { return rightMouseDown; } bool isSitting() const { return sitting; } bool isSwimming() const { return swimming; } + bool isInsideWMO() const { return cachedInsideWMO; } const glm::vec3* getFollowTarget() const { return followTarget; } glm::vec3* getFollowTargetMutable() { return followTarget; } diff --git a/include/rendering/m2_renderer.hpp b/include/rendering/m2_renderer.hpp index 86ac8f22..8360ea54 100644 --- a/include/rendering/m2_renderer.hpp +++ b/include/rendering/m2_renderer.hpp @@ -22,7 +22,6 @@ namespace rendering { class Shader; class Camera; -class WMORenderer; /** * GPU representation of an M2 model @@ -277,10 +276,10 @@ public: } void clearShadowMap() { shadowEnabled = false; } - void setWMORenderer(WMORenderer* wmo) { wmoRenderer = wmo; } + void setInsideInterior(bool inside) { insideInterior = inside; } private: - WMORenderer* wmoRenderer = nullptr; + bool insideInterior = false; pipeline::AssetManager* assetManager = nullptr; std::unique_ptr shader; diff --git a/src/rendering/m2_renderer.cpp b/src/rendering/m2_renderer.cpp index 6eecf3b2..8567ae64 100644 --- a/src/rendering/m2_renderer.cpp +++ b/src/rendering/m2_renderer.cpp @@ -1,5 +1,4 @@ #include "rendering/m2_renderer.hpp" -#include "rendering/wmo_renderer.hpp" #include "rendering/texture.hpp" #include "rendering/shader.hpp" #include "rendering/camera.hpp" @@ -1495,14 +1494,7 @@ void M2Renderer::render(const Camera& camera, const glm::mat4& view, const glm:: shader->setUniform("uModel", instance.modelMatrix); shader->setUniform("uFadeAlpha", fadeAlpha); - - // Dim M2 objects inside WMO interiors - bool interior = false; - if (wmoRenderer && entry.distSq < 200.0f * 200.0f) { - interior = wmoRenderer->isInsideInteriorWMO( - instance.position.x, instance.position.y, instance.position.z); - } - shader->setUniform("uInteriorDarken", interior); + shader->setUniform("uInteriorDarken", insideInterior); // Upload bone matrices if model has skeletal animation bool useBones = model.hasAnimation && !model.disableAnimation && !instance.boneMatrices.empty(); @@ -2406,9 +2398,9 @@ bool M2Renderer::checkCollision(const glm::vec3& from, const glm::vec3& to, if (allowEscapeRelax) { continue; } - if ((model.collisionSteppedLowPlatform || model.collisionSteppedFountain) && stepableLowObject) { + if (stepableLowObject && nearTop) { // Already on/near top surface: don't apply lateral push that ejects - // the player from the object when landing. + // the player from the object (carpets, platforms, etc). continue; } // Gentle fallback push for overlapping cases. diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 1d5cedb8..b698d635 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -185,9 +185,6 @@ bool Renderer::initialize(core::Window* win) { // Create M2 renderer (for doodads) m2Renderer = std::make_unique(); - if (wmoRenderer) { - m2Renderer->setWMORenderer(wmoRenderer.get()); - } // Note: M2 renderer needs asset manager, will be initialized when terrain loads // Create zone manager @@ -1301,6 +1298,10 @@ void Renderer::renderWorld(game::World* world) { // Render M2 doodads (trees, rocks, etc.) if (m2Renderer && camera) { + // Dim M2 lighting when player is inside a WMO + if (cameraController) { + m2Renderer->setInsideInterior(cameraController->isInsideWMO()); + } auto m2Start = std::chrono::steady_clock::now(); m2Renderer->render(*camera, view, projection); m2Renderer->renderSmokeParticles(*camera, view, projection);