diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 1b5fdcfb..589add91 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -364,7 +364,7 @@ bool Renderer::initialize(core::Window* win) { // Create WMO renderer wmoRenderer = std::make_unique(); - if (!wmoRenderer->initialize()) { + if (!wmoRenderer->initialize(assetManager)) { LOG_WARNING("Failed to initialize WMO renderer"); wmoRenderer.reset(); } diff --git a/src/rendering/terrain_manager.cpp b/src/rendering/terrain_manager.cpp index cafc0e98..c538e882 100644 --- a/src/rendering/terrain_manager.cpp +++ b/src/rendering/terrain_manager.cpp @@ -654,9 +654,9 @@ void TerrainManager::finalizeTile(const std::shared_ptr& pending) { // Upload M2 models to GPU and create instances if (m2Renderer && assetManager) { - if (!m2Renderer->isInitialized()) { - m2Renderer->initialize(assetManager); - } + // Always pass the latest asset manager. initialize() is idempotent and updates + // the pointer even when the renderer was initialized earlier without assets. + m2Renderer->initialize(assetManager); // Upload M2 models immediately (batching was causing hangs) // The 5ms time budget in processReadyTiles() limits the spike @@ -695,9 +695,8 @@ void TerrainManager::finalizeTile(const std::shared_ptr& pending) { // Upload WMO models to GPU and create instances if (wmoRenderer && assetManager) { - if (!wmoRenderer->isInitialized()) { - wmoRenderer->initialize(assetManager); - } + // WMORenderer may be initialized before assets are ready; always re-pass assets. + wmoRenderer->initialize(assetManager); int loadedWMOs = 0; int loadedLiquids = 0;