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;