mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 05:09:20 +02:00
removed draw limit in track editor
This commit is contained in:
@@ -33,6 +33,28 @@ int constexpr EU07_REFLECTIONFIDELITYOFFSET { 250 }; // artificial increase of r
|
||||
|
||||
namespace {
|
||||
|
||||
float
|
||||
editor_track_view_range(float const Range, bool const Apply)
|
||||
{
|
||||
if( false == Apply || false == Global.editor_tracks )
|
||||
return Range;
|
||||
float extra = 50000.0f;
|
||||
if( Global.EditorOrtho )
|
||||
extra = Global.EditorOrthoExtent * 3.0f;
|
||||
return Range > extra ? Range : extra;
|
||||
}
|
||||
|
||||
bool
|
||||
editor_far_tracks_only(bool const Apply, scene::basic_cell const *Cell, glm::dvec3 const &Camera, double const SceneryLimit)
|
||||
{
|
||||
if( false == Apply )
|
||||
return false;
|
||||
double nearest = glm::length( Cell->m_area.center - Camera ) - static_cast<double>( Cell->m_area.radius );
|
||||
if( nearest < 0.0 )
|
||||
nearest = 0.0;
|
||||
return nearest > SceneryLimit;
|
||||
}
|
||||
|
||||
// returns material assigned to the submodel, resolving replacable skins. null_handle if no skin set is bound
|
||||
material_handle
|
||||
submodel_material( TSubModel const *Submodel ) {
|
||||
@@ -1875,7 +1897,9 @@ opengl_renderer::Render( scene::basic_region *Region ) {
|
||||
glm::vec3 const cameraposition { m_renderpass.camera.position() };
|
||||
auto const camerax = static_cast<int>( std::floor( cameraposition.x / scene::EU07_SECTIONSIZE + scene::EU07_REGIONSIDESECTIONCOUNT / 2 ) );
|
||||
auto const cameraz = static_cast<int>( std::floor( cameraposition.z / scene::EU07_SECTIONSIZE + scene::EU07_REGIONSIDESECTIONCOUNT / 2 ) );
|
||||
int const segmentcount = 2 * static_cast<int>( std::ceil( m_renderpass.draw_range * Global.fDistanceFactor / scene::EU07_SECTIONSIZE ) );
|
||||
float section_range = m_renderpass.draw_range * Global.fDistanceFactor;
|
||||
section_range = editor_track_view_range( section_range, EditorModeFlag && ( m_renderpass.draw_mode == rendermode::color || m_renderpass.draw_mode == rendermode::pickscenery ) );
|
||||
int const segmentcount = 2 * static_cast<int>( std::ceil( section_range / scene::EU07_SECTIONSIZE ) );
|
||||
int const originx = camerax - segmentcount / 2;
|
||||
int const originz = cameraz - segmentcount / 2;
|
||||
|
||||
@@ -2040,12 +2064,16 @@ opengl_renderer::Render( cell_sequence::iterator First, cell_sequence::iterator
|
||||
|
||||
// cache initial iterator for the second sweep
|
||||
auto first { First };
|
||||
auto const scenery_limit{ static_cast<double>( Global.BaseDrawRange ) * Global.fDistanceFactor + 250.0 };
|
||||
bool const far_paths{ EditorModeFlag && Global.editor_tracks && ( m_renderpass.draw_mode == rendermode::color || m_renderpass.draw_mode == rendermode::pickscenery ) };
|
||||
glm::dvec3 const camera{ m_renderpass.camera.position() };
|
||||
// first pass draws elements which we know are located in section banks, to reduce vbo switching
|
||||
while( First != Last ) {
|
||||
|
||||
auto *cell = First->second;
|
||||
// przeliczenia animacji torów w sektorze
|
||||
cell->RaAnimate( m_framestamp );
|
||||
bool const tracks_only{ editor_far_tracks_only( far_paths, cell, camera, scenery_limit ) };
|
||||
|
||||
switch( m_renderpass.draw_mode ) {
|
||||
case rendermode::color: {
|
||||
@@ -2056,7 +2084,9 @@ opengl_renderer::Render( cell_sequence::iterator First, cell_sequence::iterator
|
||||
|
||||
// render
|
||||
// opaque non-instanced shapes
|
||||
for( auto const &shape : cell->m_shapesopaque ) { Render( shape, false ); }
|
||||
if( false == tracks_only ) {
|
||||
for( auto const &shape : cell->m_shapesopaque ) { Render( shape, false ); }
|
||||
}
|
||||
// tracks
|
||||
// TODO: update after path node refactoring
|
||||
Render( std::begin( cell->m_paths ), std::end( cell->m_paths ) );
|
||||
@@ -2158,8 +2188,10 @@ opengl_renderer::Render( cell_sequence::iterator First, cell_sequence::iterator
|
||||
// render
|
||||
// opaque non-instanced shapes
|
||||
// non-interactive scenery elements get neutral colour
|
||||
::glColor3fv( glm::value_ptr( colors::none ) );
|
||||
for( auto const &shape : cell->m_shapesopaque ) { Render( shape, false ); }
|
||||
if( false == tracks_only ) {
|
||||
::glColor3fv( glm::value_ptr( colors::none ) );
|
||||
for( auto const &shape : cell->m_shapesopaque ) { Render( shape, false ); }
|
||||
}
|
||||
// tracks
|
||||
for( auto *path : cell->m_paths ) {
|
||||
::glColor3fv( glm::value_ptr( pick_color( m_picksceneryitems.size() + 1 ) ) );
|
||||
@@ -2188,6 +2220,8 @@ opengl_renderer::Render( cell_sequence::iterator First, cell_sequence::iterator
|
||||
case rendermode::color:
|
||||
case rendermode::shadows:
|
||||
case rendermode::cabshadows: {
|
||||
if( editor_far_tracks_only( far_paths, cell, camera, scenery_limit ) )
|
||||
break;
|
||||
// TBD, TODO: refactor in to a method to reuse in branch below?
|
||||
// opaque parts of instanced models
|
||||
for( auto *instance : cell->m_instancesopaque ) {
|
||||
@@ -2230,6 +2264,8 @@ opengl_renderer::Render( cell_sequence::iterator First, cell_sequence::iterator
|
||||
break;
|
||||
}
|
||||
case rendermode::pickscenery: {
|
||||
if( editor_far_tracks_only( far_paths, cell, camera, scenery_limit ) )
|
||||
break;
|
||||
// opaque parts of instanced models
|
||||
// same procedure like with regular render, but each node receives custom colour used for picking
|
||||
for( auto *instance : cell->m_instancesopaque ) {
|
||||
|
||||
Reference in New Issue
Block a user