From 1f0e948d341a286a3a40feb38bbfc2a29c787446 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 8 Feb 2026 20:45:59 -0800 Subject: [PATCH] Skip M2 collision queries during taxi instead of rendering Reverted M2 rendering skip. Instead disable M2 collision/floor queries during taxi (externalFollow mode) for performance. M2 models remain visible but don't affect movement, grounding, or camera collision during flight paths. --- src/rendering/camera_controller.cpp | 16 ++++++++-------- src/rendering/renderer.cpp | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index 603409f6..3a99891c 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -355,7 +355,7 @@ void CameraController::update(float deltaTime) { auto wh = wmoRenderer->getFloorHeight(targetPos.x, targetPos.y, targetPos.z + 2.0f); if (wh && (!floorH || *wh > *floorH)) floorH = wh; } - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { auto mh = m2Renderer->getFloorHeight(targetPos.x, targetPos.y, targetPos.z); if (mh && (!floorH || *mh > *floorH)) floorH = mh; } @@ -390,7 +390,7 @@ void CameraController::update(float deltaTime) { } } - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { glm::vec3 adjusted; if (m2Renderer->checkCollision(stepPos, candidate, adjusted)) { candidate.x = adjusted.x; @@ -470,7 +470,7 @@ void CameraController::update(float deltaTime) { } } - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { glm::vec3 adjusted; if (m2Renderer->checkCollision(stepPos, candidate, adjusted)) { candidate.x = adjusted.x; @@ -508,7 +508,7 @@ void CameraController::update(float deltaTime) { // 2. Multi-sample for M2 objects (rugs, planks, bridges, ships) — // these are narrow and need offset probes to detect reliably. - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { constexpr float FOOTPRINT = 0.4f; const glm::vec2 offsets[] = { {0.0f, 0.0f}, @@ -653,7 +653,7 @@ void CameraController::update(float deltaTime) { } // M2 raycast collision: zoom in when camera would clip through doodads - if (m2Renderer && currentDistance > MIN_DISTANCE) { + if (m2Renderer && !externalFollow_ && currentDistance > MIN_DISTANCE) { glm::vec3 camRayOrigin = pivot; glm::vec3 camRayDir = camDir; float m2HitDist = m2Renderer->raycastBoundingBoxes(camRayOrigin, camRayDir, currentDistance); @@ -764,7 +764,7 @@ void CameraController::update(float deltaTime) { std::optional m2H; if (terrainManager) terrainH = terrainManager->getHeightAt(newPos.x, newPos.y); if (wmoRenderer) wmoH = wmoRenderer->getFloorHeight(newPos.x, newPos.y, feetZ + 2.0f); - if (m2Renderer) m2H = m2Renderer->getFloorHeight(newPos.x, newPos.y, feetZ + 1.0f); + if (m2Renderer && !externalFollow_) m2H = m2Renderer->getFloorHeight(newPos.x, newPos.y, feetZ + 1.0f); auto floorH = selectHighestFloor(terrainH, wmoH, m2H); constexpr float MIN_SWIM_WATER_DEPTH = 1.8f; inWater = (floorH && ((*waterH - *floorH) >= MIN_SWIM_WATER_DEPTH)) || (isOcean && !floorH); @@ -877,7 +877,7 @@ void CameraController::update(float deltaTime) { if (wmoRenderer) { wmoH = wmoRenderer->getFloorHeight(x, y, wmoProbeZ); } - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { m2H = m2Renderer->getFloorHeight(x, y, m2ProbeZ); } auto base = selectReachableFloor(terrainH, wmoH, feetZ, 1.0f); @@ -1090,7 +1090,7 @@ void CameraController::reset() { if (wmoRenderer) { wmoH = wmoRenderer->getFloorHeight(x, y, floorProbeZ + 4.0f); } - if (m2Renderer) { + if (m2Renderer && !externalFollow_) { m2H = m2Renderer->getFloorHeight(x, y, floorProbeZ + 4.0f); } auto h = selectReachableFloor(terrainH, wmoH, refZ, 16.0f); diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 63b5ffe0..6d475e37 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -1582,7 +1582,7 @@ void Renderer::renderWorld(game::World* world) { } // Render M2 doodads (trees, rocks, etc.) - if (m2Renderer && camera && !taxiFlight_) { + if (m2Renderer && camera) { // Dim M2 lighting when player is inside a WMO if (cameraController) { m2Renderer->setInsideInterior(cameraController->isInsideWMO()); @@ -2305,8 +2305,8 @@ void Renderer::renderShadowPass() { shadowShaderWrapper.releaseProgram(); // Don't let wrapper delete our program } - // Render M2 doodads into shadow map (skip during taxi for performance) - if (m2Renderer && !taxiFlight_) { + // Render M2 doodads into shadow map + if (m2Renderer) { m2Renderer->renderShadow(shadowShaderProgram); }