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;
155 this->setGravity(this->m_def->gravity);
157 loading_window->SetProgress(10,
_L(
"Initializing Object Subsystem"));
160 loading_window->SetProgress(14,
_L(
"Initializing Shadow Subsystem"));
163 loading_window->SetProgress(17,
_L(
"Initializing Geometry Subsystem"));
166 loading_window->SetProgress(23,
_L(
"Initializing Camera Subsystem"));
170 loading_window->SetProgress(25,
_L(
"Initializing Sky Subsystem"));
171 this->initSkySubSystem();
173 loading_window->SetProgress(27,
_L(
"Initializing Light Subsystem"));
178 loading_window->SetProgress(29,
_L(
"Initializing Fog Subsystem"));
182 loading_window->SetProgress(31,
_L(
"Initializing Vegetation Subsystem"));
183 this->initVegetation();
185 this->fixCompositorClearColor();
187 loading_window->SetProgress(40,
_L(
"Loading Terrain Geometry"));
188 if (!this->m_geometry_manager->InitTerrain(this->m_def->ogre_ter_conf_filename))
193 loading_window->SetProgress(60,
_L(
"Initializing Collision Subsystem"));
194 this->m_collisions =
new Collisions(this->getMaxTerrainSize());
196 loading_window->SetProgress(75,
_L(
"Initializing Script Subsystem"));
197 this->initScripting();
198 this->initAiPresets();
200 loading_window->SetProgress(77,
_L(
"Initializing Water Subsystem"));
203 loading_window->SetProgress(80,
_L(
"Loading Terrain Objects"));
204 this->loadTerrainObjects();
207 this->initTerrainCollisions();
209 loading_window->SetProgress(90,
_L(
"Initializing terrain light properties"));
210 this->m_geometry_manager->UpdateMainLightPosition();
211 this->m_collisions->finishLoadingTerrain();
213 this->LoadTelepoints();
217 loading_window->SetProgress(92,
_L(
"Initializing Overview Map Subsystem"));
220 LOG(
" ===== LOADING TERRAIN ACTORS " + m_cache_entry->fname);
221 loading_window->SetProgress(95,
_L(
"Loading Terrain Actors"));
222 this->LoadPredefinedActors();
224 LOG(
" ===== TERRAIN LOADING DONE " + m_cache_entry->fname);
239 m_sight_range = 5000;
246 if (m_sight_range < UNLIMITED_SIGHTRANGE && App::gfx_sky_mode->getEnum<GfxSkyMode>() !=
GfxSkyMode::SKYX)
266 m_sky_manager =
new SkyManager();
269 if (!m_def->caelum_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->caelum_config))
272 m_sky_manager->LoadCaelumScript(m_def->caelum_config, m_def->caelum_fog_start, m_def->caelum_fog_end);
277 m_sky_manager->LoadCaelumScript(
"ror_default_sky");
286 if (!m_def->skyx_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->skyx_config))
287 SkyX_manager =
new SkyXManager(m_def->skyx_config);
293 if (!m_def->cubemap_config.empty())
311 m_main_light = m_sky_manager->GetSkyMainLight();
316 m_main_light = SkyX_manager->getMainLight();
325 m_main_light->setType(Light::LT_DIRECTIONAL);
326 m_main_light->setDirection(Ogre::Vector3(0.785, -0.423, 0.453).normalisedCopy());
328 m_main_light->setDiffuseColour(m_def->ambient_color);
329 m_main_light->setSpecularColour(m_def->ambient_color);
330 m_main_light->setCastShadows(
true);
331 m_main_light->setShadowFarDistance(1000.0f);
332 m_main_light->setShadowNearClipDistance(-1);
338 if (m_sight_range >= UNLIMITED_SIGHTRANGE)
349 m_paged_detail_factor = 0.2f;
352 m_paged_detail_factor = 0.5f;
355 m_paged_detail_factor = 1.0f;
358 m_paged_detail_factor = 0.0f;
367 if (CompositorManager::getSingleton().hasCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport()))
369 CompositorInstance* co = CompositorManager::getSingleton().getCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport())->_getOriginalSceneCompositor();
372 CompositionTechnique* ct = co->getTechnique();
375 CompositionTargetPass* ctp = ct->getOutputTargetPass();
379 CompositionPass* p = ctp->getPasses()[0];
382 p->setClearColour(Ogre::ColourValue::Black);
397 if (!m_def->has_water)
402 m_wavefield = std::unique_ptr<Wavefield>(
new Wavefield(this->getMaxTerrainSize()));
403 m_wavefield->SetStaticWaterHeight(m_def->water_height);
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_gfx_water = std::unique_ptr<IGfxWater>(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_gfx_water = std::unique_ptr<IGfxWater>(
new GfxWater(this->getMaxTerrainSize(), m_def->water_height));
432 m_gfx_water->SetWaterBottomHeight(m_def->water_bottom_height);
439 m_shadow_manager->loadConfiguration();
444 for (std::string tobj_filename : m_def->tobj_files)
446 m_object_manager->LoadTObjFile(tobj_filename);
452 if (!m_def->traction_map_file.empty())
454 m_collisions->setupLandUse(m_def->traction_map_file.c_str());
460 #ifdef USE_ANGELSCRIPT
466 for (std::string as_filename : m_def->as_files)
468 loaded |= this->getObjectManager()->LoadTerrainScript(as_filename);
479 #endif //USE_ANGELSCRIPT
492 m_cur_gravity = value;
502 return m_collisions->getCollisionAAB();
507 if (!m_geometry_manager)
508 return Vector3::ZERO;
509 return m_geometry_manager->getMaxTerrainSize();
514 return m_geometry_manager->getHeightAt(
x,
z);
519 return m_geometry_manager->getNormalAt(
x,
y,
z);
524 return m_sky_manager;
532 return m_geometry_manager->isFlat();
537 if (m_object_manager)
538 m_object_manager->LoadTelepoints();
543 if (m_object_manager)
544 m_object_manager->LoadPredefinedActors();
549 if (m_object_manager)
550 return m_object_manager->HasPredefinedActors();
556 return m_object_manager->getProceduralManager();
561 return m_cache_entry->fname;
566 return m_cache_entry->resource_group;
569 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)
571 m_object_manager->m_map_entities.push_back(
SurveyMapEntity(type, caption, filename, resource_group, pos, Ogre::Radian(angle),
id));
581 return m_object_manager->m_map_entities;