45 #include <Terrain/OgreTerrainPaging.h>
46 #include <Terrain/OgreTerrainGroup.h>
47 #include <OgreRectangle2D.h>
56 , m_geometry_manager(0)
63 , m_paged_detail_factor(0.0f)
65 , m_hydrax_water(nullptr)
66 , m_cache_entry(entry)
90 if (m_sky_manager !=
nullptr)
92 delete(m_sky_manager);
93 m_sky_manager =
nullptr;
97 if (SkyX_manager !=
nullptr)
100 SkyX_manager =
nullptr;
103 if (m_main_light !=
nullptr)
106 m_main_light =
nullptr;
109 if (m_hydrax_water !=
nullptr)
114 if (m_object_manager !=
nullptr)
116 delete(m_object_manager);
117 m_object_manager =
nullptr;
120 if (m_geometry_manager !=
nullptr)
122 delete(m_geometry_manager);
123 m_geometry_manager =
nullptr;
126 if (m_shadow_manager !=
nullptr)
128 delete(m_shadow_manager);
129 m_shadow_manager =
nullptr;
132 if (m_collisions !=
nullptr)
134 delete(m_collisions);
135 m_collisions =
nullptr;
150 this->setGravity(this->m_def.gravity);
152 loading_window->SetProgress(10,
_L(
"Initializing Object Subsystem"));
155 loading_window->SetProgress(14,
_L(
"Initializing Shadow Subsystem"));
158 loading_window->SetProgress(17,
_L(
"Initializing Geometry Subsystem"));
161 loading_window->SetProgress(23,
_L(
"Initializing Camera Subsystem"));
165 loading_window->SetProgress(25,
_L(
"Initializing Sky Subsystem"));
166 this->initSkySubSystem();
168 loading_window->SetProgress(27,
_L(
"Initializing Light Subsystem"));
173 loading_window->SetProgress(29,
_L(
"Initializing Fog Subsystem"));
177 loading_window->SetProgress(31,
_L(
"Initializing Vegetation Subsystem"));
178 this->initVegetation();
180 this->fixCompositorClearColor();
182 loading_window->SetProgress(40,
_L(
"Loading Terrain Geometry"));
183 if (!this->m_geometry_manager->InitTerrain(this->m_def.ogre_ter_conf_filename))
188 loading_window->SetProgress(60,
_L(
"Initializing Collision Subsystem"));
189 this->m_collisions =
new Collisions(this->getMaxTerrainSize());
191 loading_window->SetProgress(75,
_L(
"Initializing Script Subsystem"));
192 this->initScripting();
193 this->initAiPresets();
195 loading_window->SetProgress(77,
_L(
"Initializing Water Subsystem"));
198 loading_window->SetProgress(80,
_L(
"Loading Terrain Objects"));
199 this->loadTerrainObjects();
202 this->initTerrainCollisions();
204 loading_window->SetProgress(90,
_L(
"Initializing terrain light properties"));
205 this->m_geometry_manager->UpdateMainLightPosition();
206 this->m_collisions->finishLoadingTerrain();
208 this->LoadTelepoints();
212 loading_window->SetProgress(92,
_L(
"Initializing Overview Map Subsystem"));
215 LOG(
" ===== LOADING TERRAIN ACTORS " + m_cache_entry->fname);
216 loading_window->SetProgress(95,
_L(
"Loading Terrain Actors"));
217 this->LoadPredefinedActors();
219 LOG(
" ===== TERRAIN LOADING DONE " + m_cache_entry->fname);
234 m_sight_range = 5000;
241 if (m_sight_range < UNLIMITED_SIGHTRANGE && App::gfx_sky_mode->getEnum<GfxSkyMode>() !=
GfxSkyMode::SKYX)
261 m_sky_manager =
new SkyManager();
264 if (!m_def.caelum_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def.caelum_config))
267 m_sky_manager->LoadCaelumScript(m_def.caelum_config, m_def.caelum_fog_start, m_def.caelum_fog_end);
272 m_sky_manager->LoadCaelumScript(
"ror_default_sky");
281 if (!m_def.skyx_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def.skyx_config))
289 Rectangle2D* rect =
new Rectangle2D(
true);
290 rect->setCorners(-1.0, 1.0, 1.0, -1.0);
292 Ogre::MaterialPtr ptr = Ogre::MaterialManager::getSingleton().getByName(
"tracks/skyboxcol");
293 rect->setMaterial(ptr);
296 rect->setRenderQueueGroup(RENDER_QUEUE_BACKGROUND);
299 AxisAlignedBox aabInf;
300 aabInf.setInfinite();
301 rect->setBoundingBox(aabInf);
305 node->attachObject(rect);
314 m_main_light = m_sky_manager->GetSkyMainLight();
319 m_main_light = SkyX_manager->getMainLight();
329 m_main_light->setType(Light::LT_DIRECTIONAL);
330 m_main_light->setDirection(Ogre::Vector3(0.785, -0.423, 0.453).normalisedCopy());
332 m_main_light->setDiffuseColour(m_def.ambient_color);
333 m_main_light->setSpecularColour(m_def.ambient_color);
334 m_main_light->setCastShadows(
true);
335 m_main_light->setShadowFarDistance(1000.0f);
336 m_main_light->setShadowNearClipDistance(-1);
342 if (m_sight_range >= UNLIMITED_SIGHTRANGE)
353 m_paged_detail_factor = 0.2f;
356 m_paged_detail_factor = 0.5f;
359 m_paged_detail_factor = 1.0f;
362 m_paged_detail_factor = 0.0f;
371 if (CompositorManager::getSingleton().hasCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport()))
373 CompositorInstance* co = CompositorManager::getSingleton().getCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport())->_getOriginalSceneCompositor();
376 CompositionTechnique* ct = co->getTechnique();
379 CompositionTargetPass* ctp = ct->getOutputTargetPass();
382 CompositionPass* p = ctp->getPass(0);
385 p->setClearColour(Ogre::ColourValue::Black);
400 if (!m_def.has_water)
408 if (!m_def.hydrax_conf_file.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def.hydrax_conf_file))
410 m_hydrax_water =
new HydraxWater(m_def.water_height, m_def.hydrax_conf_file);
415 m_hydrax_water =
new HydraxWater(m_def.water_height);
418 m_water = std::unique_ptr<IWater>(m_hydrax_water);
421 TerrainGroup::TerrainIterator ti = m_geometry_manager->getTerrainGroup()->getTerrainIterator();
422 while (ti.hasMoreElements())
424 Ogre::Terrain* t = ti.getNext()->instance;
425 MaterialPtr ptr = t->getMaterial();
426 m_hydrax_water->GetHydrax()->getMaterialManager()->addDepthTechnique(ptr->createTechnique());
431 m_water = std::unique_ptr<IWater>(
new Water(this->getMaxTerrainSize()));
432 m_water->SetStaticWaterHeight(m_def.water_height);
433 m_water->SetWaterBottomHeight(m_def.water_bottom_height);
440 m_shadow_manager->loadConfiguration();
445 for (std::string tobj_filename : m_def.tobj_files)
447 m_object_manager->LoadTObjFile(tobj_filename);
453 if (!m_def.traction_map_file.empty())
455 m_collisions->setupLandUse(m_def.traction_map_file.c_str());
461 #ifdef USE_ANGELSCRIPT
467 for (std::string as_filename : m_def.as_files)
469 loaded |= this->getObjectManager()->LoadTerrainScript(as_filename);
480 #endif //USE_ANGELSCRIPT
488 for (
const std::string& filename: m_def.ai_presets_files)
491 if (Ogre::ResourceGroupManager::getSingleton().resourceExists(this->getTerrainFileResourceGroup(), filename))
497 LOG(
fmt::format(
"[RoR|Terrain] AI presets file '{}' declared in '{}' not found!", filename, this->getTerrainFileName()));
503 LOG(
fmt::format(
"[RoR|Terrain] AI presets file '{}' declared in '{}' has wrong format - the root element is not an array!",
504 filename, this->getTerrainFileName()));
515 m_cur_gravity = value;
525 return m_collisions->getCollisionAAB();
530 if (!m_geometry_manager)
531 return Vector3::ZERO;
532 return m_geometry_manager->getMaxTerrainSize();
537 return m_geometry_manager->getHeightAt(
x,
z);
542 return m_geometry_manager->getNormalAt(
x,
y,
z);
547 return m_sky_manager;
555 return m_geometry_manager->isFlat();
560 if (m_object_manager)
561 m_object_manager->LoadTelepoints();
566 if (m_object_manager)
567 m_object_manager->LoadPredefinedActors();
572 if (m_object_manager)
573 return m_object_manager->HasPredefinedActors();
583 catch (Ogre::Exception& oex)
585 RoR::LogFormat(
"[RoR|Terrain] %s, message: '%s', type: <Ogre::Exception>.", summary, oex.getFullDescription().c_str());
587 catch (std::exception& stex)
589 RoR::LogFormat(
"[RoR|Terrain] %s, message: '%s', type: <std::exception>.", summary, stex.what());
593 RoR::LogFormat(
"[RoR|Terrain] %s, unknown error occurred.", summary);
599 return m_object_manager->getProceduralManager();
604 return m_cache_entry->fname;
609 return m_cache_entry->resource_group;
612 void RoR::Terrain::addSurveyMapEntity(
const std::string& type,
const std::string& filename,
const std::string& resource_group,
const std::string& caption,
const Ogre::Vector3& pos,
float angle,
int id)
614 m_object_manager->m_map_entities.push_back(
SurveyMapEntity(type, caption, filename, resource_group, pos, Ogre::Radian(angle),
id));
624 return m_object_manager->m_map_entities;