45#include <Terrain/OgreTerrainPaging.h>
46#include <Terrain/OgreTerrainGroup.h>
55 , m_geometry_manager(0)
62 , m_paged_detail_factor(0.0f)
64 , m_hydrax_water(nullptr)
65 , m_cache_entry(entry)
89 if (m_sky_manager !=
nullptr)
91 delete(m_sky_manager);
92 m_sky_manager =
nullptr;
96 if (SkyX_manager !=
nullptr)
99 SkyX_manager =
nullptr;
102 if (m_main_light !=
nullptr)
105 m_main_light =
nullptr;
108 if (m_hydrax_water !=
nullptr)
113 if (m_object_manager !=
nullptr)
115 delete(m_object_manager);
116 m_object_manager =
nullptr;
119 if (m_geometry_manager !=
nullptr)
121 delete(m_geometry_manager);
122 m_geometry_manager =
nullptr;
125 if (m_shadow_manager !=
nullptr)
127 delete(m_shadow_manager);
128 m_shadow_manager =
nullptr;
131 if (m_collisions !=
nullptr)
133 delete(m_collisions);
134 m_collisions =
nullptr;
154 this->setGravity(this->m_def->gravity);
156 loading_window->SetProgress(10,
_L(
"Initializing Object Subsystem"));
159 loading_window->SetProgress(14,
_L(
"Initializing Shadow Subsystem"));
162 loading_window->SetProgress(17,
_L(
"Initializing Geometry Subsystem"));
165 loading_window->SetProgress(23,
_L(
"Initializing Camera Subsystem"));
169 loading_window->SetProgress(25,
_L(
"Initializing Sky Subsystem"));
170 this->initSkySubSystem();
172 loading_window->SetProgress(27,
_L(
"Initializing Light Subsystem"));
177 loading_window->SetProgress(29,
_L(
"Initializing Fog Subsystem"));
181 loading_window->SetProgress(31,
_L(
"Initializing Vegetation Subsystem"));
182 this->initVegetation();
184 this->fixCompositorClearColor();
186 loading_window->SetProgress(40,
_L(
"Loading Terrain Geometry"));
187 if (!this->m_geometry_manager->InitTerrain(this->m_def->ogre_ter_conf_filename))
192 loading_window->SetProgress(60,
_L(
"Initializing Collision Subsystem"));
193 this->m_collisions =
new Collisions(this->getMaxTerrainSize());
195 loading_window->SetProgress(75,
_L(
"Initializing Script Subsystem"));
196 this->initScripting();
197 this->initAiPresets();
199 loading_window->SetProgress(77,
_L(
"Initializing Water Subsystem"));
202 loading_window->SetProgress(80,
_L(
"Loading Terrain Objects"));
203 this->loadTerrainObjects();
206 this->initTerrainCollisions();
208 loading_window->SetProgress(90,
_L(
"Initializing terrain light properties"));
209 this->m_geometry_manager->UpdateMainLightPosition();
210 this->m_collisions->finishLoadingTerrain();
212 this->LoadTelepoints();
216 loading_window->SetProgress(92,
_L(
"Initializing Overview Map Subsystem"));
219 LOG(
" ===== LOADING TERRAIN ACTORS " + m_cache_entry->fname);
220 loading_window->SetProgress(95,
_L(
"Loading Terrain Actors"));
221 this->LoadPredefinedActors();
223 LOG(
" ===== TERRAIN LOADING DONE " + m_cache_entry->fname);
238 m_sight_range = 5000;
245 if (m_sight_range < UNLIMITED_SIGHTRANGE && App::gfx_sky_mode->getEnum<GfxSkyMode>() !=
GfxSkyMode::SKYX)
265 m_sky_manager =
new SkyManager();
268 if (!m_def->caelum_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->caelum_config))
271 m_sky_manager->LoadCaelumScript(m_def->caelum_config, m_def->caelum_fog_start, m_def->caelum_fog_end);
276 m_sky_manager->LoadCaelumScript(
"ror_default_sky");
285 if (!m_def->skyx_config.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->skyx_config))
286 SkyX_manager =
new SkyXManager(m_def->skyx_config);
292 if (!m_def->cubemap_config.empty())
310 m_main_light = m_sky_manager->GetSkyMainLight();
315 m_main_light = SkyX_manager->getMainLight();
324 m_main_light->setType(Light::LT_DIRECTIONAL);
325 m_main_light->setDirection(Ogre::Vector3(0.785, -0.423, 0.453).normalisedCopy());
327 m_main_light->setDiffuseColour(m_def->ambient_color);
328 m_main_light->setSpecularColour(m_def->ambient_color);
329 m_main_light->setCastShadows(
true);
330 m_main_light->setShadowFarDistance(1000.0f);
331 m_main_light->setShadowNearClipDistance(-1);
337 if (m_sight_range >= UNLIMITED_SIGHTRANGE)
348 m_paged_detail_factor = 0.2f;
351 m_paged_detail_factor = 0.5f;
354 m_paged_detail_factor = 1.0f;
357 m_paged_detail_factor = 0.0f;
366 if (CompositorManager::getSingleton().hasCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport()))
368 CompositorInstance* co = CompositorManager::getSingleton().getCompositorChain(
App::GetCameraManager()->GetCamera()->getViewport())->_getOriginalSceneCompositor();
371 CompositionTechnique* ct = co->getTechnique();
374 CompositionTargetPass* ctp = ct->getOutputTargetPass();
378 CompositionPass* p = ctp->getPasses()[0];
381 p->setClearColour(Ogre::ColourValue::Black);
396 if (!m_def->has_water)
401 m_wavefield = std::unique_ptr<Wavefield>(
new Wavefield(this->getMaxTerrainSize()));
402 m_wavefield->SetStaticWaterHeight(m_def->water_height);
407 if (!m_def->hydrax_conf_file.empty() && ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(m_def->hydrax_conf_file))
409 m_hydrax_water =
new HydraxWater(m_def->water_height, m_def->hydrax_conf_file);
414 m_hydrax_water =
new HydraxWater(m_def->water_height);
417 m_gfx_water = std::unique_ptr<IGfxWater>(m_hydrax_water);
420 TerrainGroup::TerrainIterator ti = m_geometry_manager->getTerrainGroup()->getTerrainIterator();
421 while (ti.hasMoreElements())
423 Ogre::Terrain* t = ti.getNext()->instance;
424 MaterialPtr ptr = t->getMaterial();
425 m_hydrax_water->GetHydrax()->getMaterialManager()->addDepthTechnique(ptr->createTechnique());
430 m_gfx_water = std::unique_ptr<IGfxWater>(
new GfxWater(this->getMaxTerrainSize(), m_def->water_height));
431 m_gfx_water->SetWaterBottomHeight(m_def->water_bottom_height);
438 m_shadow_manager->loadConfiguration();
443 for (std::string tobj_filename : m_def->tobj_files)
445 m_object_manager->LoadTObjFile(tobj_filename);
451 if (!m_def->traction_map_file.empty())
453 m_collisions->setupLandUse(m_def->traction_map_file.c_str());
459#ifdef USE_ANGELSCRIPT
465 for (std::string as_filename : m_def->as_files)
467 loaded |= this->getObjectManager()->LoadTerrainScript(as_filename);
491 m_cur_gravity = value;
501 return m_collisions->getCollisionAAB();
506 if (!m_geometry_manager)
507 return Vector3::ZERO;
508 return m_geometry_manager->getMaxTerrainSize();
513 return m_geometry_manager->getHeightAt(
x,
z);
518 return m_geometry_manager->getNormalAt(
x,
y,
z);
523 return m_sky_manager;
531 return m_geometry_manager->isFlat();
536 if (m_object_manager)
537 m_object_manager->LoadTelepoints();
542 if (m_object_manager)
543 m_object_manager->LoadPredefinedActors();
548 if (m_object_manager)
549 return m_object_manager->HasPredefinedActors();
555 return m_object_manager->getProceduralManager();
560 return m_cache_entry->fname;
565 return m_cache_entry->resource_group;
568void 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)
570 m_object_manager->m_map_entities.push_back(
SurveyMapEntity(type, caption, filename, resource_group, pos, Ogre::Radian(angle),
id));
580 return m_object_manager->m_map_entities;
#define ROR_ASSERT(_EXPR)
void LOG(const char *msg)
Legacy alias - formerly a macro.
A database of user-installed content alias 'mods' (vehicles, terrains...)
#define DEFAULT_TERRAIN_SCRIPT
void setStr(std::string const &str)
Ogre::SceneNode * GetCameraNode()
Ogre::Camera * GetCamera()
void CreateTerrainTextures()
GUI::TopMenubar TopMenubar
GUI::LoadingWindow LoadingWindow
Ogre::SceneManager * GetSceneManager()
ScriptUnitID_t getTerrainScriptUnit() const
void setForwardScriptLogToConsole(bool doForward)
void unloadScript(ScriptUnitID_t unique_id)
Unloads a script.
this class handles all interactions with the Ogre Terrain system
void setGravity(float value)
std::string getTerrainFileResourceGroup()
void delSurveyMapEntities(int id)
void fixCompositorClearColor()
Ogre::Vector3 getMaxTerrainSize()
float getWaterHeight() const
void loadTerrainObjects()
bool HasPredefinedActors()
SkyManager * getSkyManager()
SurveyMapEntityVec & getSurveyMapEntities()
std::string getTerrainName() const
void initTerrainCollisions()
float getHeightAt(float x, float z)
std::string getTerrainFileName()
void 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)
CacheEntryPtr getCacheEntry()
Ogre::Degree getSpawnRot()
Ogre::Vector3 GetNormalAt(float x, float y, float z)
std::string getGUID() const
Terrain(CacheEntryPtr entry, Terrn2DocumentPtr def)
Ogre::AxisAlignedBox getTerrainCollisionAAB()
void LoadPredefinedActors()
Ogre::Vector3 getSpawnPos()
virtual ~Terrain() override
ProceduralManagerPtr getProceduralManager()
Terrn2DocumentPtr GetDef()
< Water physics, see 'wavefield.cfg' in your config directory.
static const float DEFAULT_GRAVITY
earth gravity
std::vector< SurveyMapEntity > SurveyMapEntityVec
CVar * sim_terrain_gui_name
CameraManager * GetCameraManager()
GUIManager * GetGuiManager()
CVar * gfx_vegetation_mode
ScriptEngine * GetScriptEngine()
std::shared_ptr< Terrn2Document > Terrn2DocumentPtr
static const ScriptUnitID_t SCRIPTUNITID_INVALID
@ CAELUM
Caelum (best looking, slower)
@ SKYX
SkyX (best looking, slower)
void EraseIf(std::vector< T, A > &c, Predicate pred)