46 #include <Terrain/OgreTerrainPaging.h>
47 #include <Terrain/OgreTerrainGroup.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))
282 SkyX_manager =
new SkyXManager(m_def->skyx_config);
288 if (!m_def->cubemap_config.empty())
306 m_main_light = m_sky_manager->GetSkyMainLight();
311 m_main_light = SkyX_manager->getMainLight();
320 m_main_light->setType(Light::LT_DIRECTIONAL);
321 m_main_light->setDirection(Ogre::Vector3(0.785, -0.423, 0.453).normalisedCopy());
323 m_main_light->setDiffuseColour(m_def->ambient_color);
324 m_main_light->setSpecularColour(m_def->ambient_color);
325 m_main_light->setCastShadows(
true);
326 m_main_light->setShadowFarDistance(1000.0f);
327 m_main_light->setShadowNearClipDistance(-1);
333 if (m_sight_range >= UNLIMITED_SIGHTRANGE)
344 m_paged_detail_factor = 0.2f;
347 m_paged_detail_factor = 0.5f;
350 m_paged_detail_factor = 1.0f;
353 m_paged_detail_factor = 0.0f;
362 if (CompositorManager::getSingleton().hasCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport()))
364 CompositorInstance* co = CompositorManager::getSingleton().getCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport())->_getOriginalSceneCompositor();
367 CompositionTechnique* ct = co->getTechnique();
370 CompositionTargetPass* ctp = ct->getOutputTargetPass();
374 CompositionPass* p = ctp->getPasses()[0];
377 p->setClearColour(Ogre::ColourValue::Black);
392 if (!m_def->has_water)
400 if (!m_def->hydrax_conf_file.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->hydrax_conf_file))
402 m_hydrax_water =
new HydraxWater(m_def->water_height, m_def->hydrax_conf_file);
407 m_hydrax_water =
new HydraxWater(m_def->water_height);
410 m_water = std::unique_ptr<IWater>(m_hydrax_water);
413 TerrainGroup::TerrainIterator ti = m_geometry_manager->getTerrainGroup()->getTerrainIterator();
414 while (ti.hasMoreElements())
416 Ogre::Terrain* t = ti.getNext()->instance;
417 MaterialPtr ptr = t->getMaterial();
418 m_hydrax_water->GetHydrax()->getMaterialManager()->addDepthTechnique(ptr->createTechnique());
423 m_water = std::unique_ptr<IWater>(
new Water(this->getMaxTerrainSize()));
424 m_water->SetStaticWaterHeight(m_def->water_height);
425 m_water->SetWaterBottomHeight(m_def->water_bottom_height);
432 m_shadow_manager->loadConfiguration();
437 for (std::string tobj_filename : m_def->tobj_files)
439 m_object_manager->LoadTObjFile(tobj_filename);
445 if (!m_def->traction_map_file.empty())
447 m_collisions->setupLandUse(m_def->traction_map_file.c_str());
453 #ifdef USE_ANGELSCRIPT
459 for (std::string as_filename : m_def->as_files)
461 loaded |= this->getObjectManager()->LoadTerrainScript(as_filename);
472 #endif //USE_ANGELSCRIPT
485 m_cur_gravity = value;
495 return m_collisions->getCollisionAAB();
500 if (!m_geometry_manager)
501 return Vector3::ZERO;
502 return m_geometry_manager->getMaxTerrainSize();
507 return m_geometry_manager->getHeightAt(
x,
z);
512 return m_geometry_manager->getNormalAt(
x,
y,
z);
517 return m_sky_manager;
525 return m_geometry_manager->isFlat();
530 if (m_object_manager)
531 m_object_manager->LoadTelepoints();
536 if (m_object_manager)
537 m_object_manager->LoadPredefinedActors();
542 if (m_object_manager)
543 return m_object_manager->HasPredefinedActors();
549 return m_object_manager->getProceduralManager();
554 return m_cache_entry->fname;
559 return m_cache_entry->resource_group;
562 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)
564 m_object_manager->m_map_entities.push_back(
SurveyMapEntity(type, caption, filename, resource_group, pos, Ogre::Radian(angle),
id));
574 return m_object_manager->m_map_entities;