mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-21 22:59:19 +02:00
gauge animation precision fix, visualization fix for turntable animations, mouse control repeat rate tweak, rudimentary framebuffer implementation
This commit is contained in:
@@ -14,13 +14,6 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "Console.h"
|
#include "Console.h"
|
||||||
#include "logs.h"
|
#include "logs.h"
|
||||||
|
|
||||||
TButton::TButton()
|
|
||||||
{
|
|
||||||
iFeedbackBit = 0;
|
|
||||||
bData = NULL;
|
|
||||||
Clear();
|
|
||||||
};
|
|
||||||
|
|
||||||
void TButton::Clear(int i)
|
void TButton::Clear(int i)
|
||||||
{
|
{
|
||||||
pModelOn = nullptr;
|
pModelOn = nullptr;
|
||||||
|
|||||||
2
Button.h
2
Button.h
@@ -36,7 +36,7 @@ class TButton
|
|||||||
play( PSound Sound );
|
play( PSound Sound );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TButton();
|
TButton() = default;
|
||||||
void Clear(int const i = -1);
|
void Clear(int const i = -1);
|
||||||
inline void FeedbackBitSet(int const i) {
|
inline void FeedbackBitSet(int const i) {
|
||||||
iFeedbackBit = 1 << i; };
|
iFeedbackBit = 1 << i; };
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ void TGauge::DecValue(double fNewDesired)
|
|||||||
void
|
void
|
||||||
TGauge::UpdateValue( double fNewDesired, PSound Fallbacksound ) {
|
TGauge::UpdateValue( double fNewDesired, PSound Fallbacksound ) {
|
||||||
|
|
||||||
if( static_cast<int>( std::round( ( fDesiredValue - fOffset ) / fScale ) ) == static_cast<int>( fNewDesired ) ) {
|
if( static_cast<int>( std::round( 100.0 * ( fDesiredValue - fOffset ) / fScale ) ) == static_cast<int>( 100.0 * fNewDesired ) ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fDesiredValue = fNewDesired * fScale + fOffset;
|
fDesiredValue = fNewDesired * fScale + fOffset;
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ float Global::Overcast { 0.1f }; // NOTE: all this weather stuff should be moved
|
|||||||
opengl_light Global::DayLight;
|
opengl_light Global::DayLight;
|
||||||
int Global::DynamicLightCount { 3 };
|
int Global::DynamicLightCount { 3 };
|
||||||
bool Global::ScaleSpecularValues { true };
|
bool Global::ScaleSpecularValues { true };
|
||||||
|
bool Global::RenderShadows { false };
|
||||||
bool Global::bRollFix = true; // czy wykonać przeliczanie przechyłki
|
bool Global::bRollFix = true; // czy wykonać przeliczanie przechyłki
|
||||||
bool Global::bJoinEvents = false; // czy grupować eventy o tych samych nazwach
|
bool Global::bJoinEvents = false; // czy grupować eventy o tych samych nazwach
|
||||||
int Global::iHiddenEvents = 1; // czy łączyć eventy z torami poprzez nazwę toru
|
int Global::iHiddenEvents = 1; // czy łączyć eventy z torami poprzez nazwę toru
|
||||||
@@ -544,6 +545,11 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> Global::ScaleSpecularValues;
|
Parser >> Global::ScaleSpecularValues;
|
||||||
}
|
}
|
||||||
|
else if( token == "shadows" ) {
|
||||||
|
// shadow render toggle
|
||||||
|
Parser.getTokens();
|
||||||
|
Parser >> Global::RenderShadows;
|
||||||
|
}
|
||||||
else if (token == "smoothtraction")
|
else if (token == "smoothtraction")
|
||||||
{
|
{
|
||||||
// podwójna jasność ambient
|
// podwójna jasność ambient
|
||||||
|
|||||||
@@ -226,6 +226,7 @@ class Global
|
|||||||
static opengl_light DayLight;
|
static opengl_light DayLight;
|
||||||
static int DynamicLightCount;
|
static int DynamicLightCount;
|
||||||
static bool ScaleSpecularValues;
|
static bool ScaleSpecularValues;
|
||||||
|
static bool RenderShadows;
|
||||||
|
|
||||||
static int iSlowMotion;
|
static int iSlowMotion;
|
||||||
static TDynamicObject *changeDynObj;
|
static TDynamicObject *changeDynObj;
|
||||||
|
|||||||
21
Track.cpp
21
Track.cpp
@@ -1267,31 +1267,32 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
|||||||
}
|
}
|
||||||
vertex_array vertices;
|
vertex_array vertices;
|
||||||
Segment->RenderLoft(vertices, origin, bpts1, iTrapezoid ? -4 : 4, fTexLength);
|
Segment->RenderLoft(vertices, origin, bpts1, iTrapezoid ? -4 : 4, fTexLength);
|
||||||
|
if( ( Bank != 0 ) && ( true == Geometry2.empty() ) ) {
|
||||||
|
Geometry2.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||||
|
}
|
||||||
if( ( Bank == 0 ) && ( false == Geometry2.empty() ) ) {
|
if( ( Bank == 0 ) && ( false == Geometry2.empty() ) ) {
|
||||||
// special variant, replace existing data for a turntable track
|
// special variant, replace existing data for a turntable track
|
||||||
GfxRenderer.Replace( vertices, Geometry2[ 0 ] );
|
GfxRenderer.Replace( vertices, Geometry2[ 0 ] );
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Geometry2.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (TextureID1)
|
if (TextureID1)
|
||||||
{ // szyny - generujemy dwie, najwyżej rysować się będzie jedną
|
{ // szyny - generujemy dwie, najwyżej rysować się będzie jedną
|
||||||
vertex_array vertices;
|
vertex_array vertices;
|
||||||
|
if( ( Bank != 0 ) && ( true == Geometry1.empty() ) ) {
|
||||||
|
Segment->RenderLoft( vertices, origin, rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
||||||
|
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||||
|
vertices.clear(); // reuse the scratchpad
|
||||||
|
Segment->RenderLoft( vertices, origin, rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
||||||
|
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||||
|
}
|
||||||
if( ( Bank == 0 ) && ( false == Geometry1.empty() ) ) {
|
if( ( Bank == 0 ) && ( false == Geometry1.empty() ) ) {
|
||||||
|
// special variant, replace existing data for a turntable track
|
||||||
Segment->RenderLoft( vertices, origin, rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
Segment->RenderLoft( vertices, origin, rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
||||||
GfxRenderer.Replace( vertices, Geometry1[ 0 ] );
|
GfxRenderer.Replace( vertices, Geometry1[ 0 ] );
|
||||||
vertices.clear(); // reuse the scratchpad
|
vertices.clear(); // reuse the scratchpad
|
||||||
Segment->RenderLoft( vertices, origin, rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
Segment->RenderLoft( vertices, origin, rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
||||||
GfxRenderer.Replace( vertices, Geometry1[ 1 ] );
|
GfxRenderer.Replace( vertices, Geometry1[ 1 ] );
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Segment->RenderLoft( vertices, origin, rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
|
||||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
|
||||||
vertices.clear(); // reuse the scratchpad
|
|
||||||
Segment->RenderLoft( vertices, origin, rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength );
|
|
||||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case tt_Switch: // dla zwrotnicy dwa razy szyny
|
case tt_Switch: // dla zwrotnicy dwa razy szyny
|
||||||
|
|||||||
@@ -125,9 +125,11 @@ mouse_input::button( int const Button, int const Action ) {
|
|||||||
// TODO: pass correct entity id once the missing systems are in place
|
// TODO: pass correct entity id once the missing systems are in place
|
||||||
m_relay.post( mousecommand, 0, 0, Action, 0 );
|
m_relay.post( mousecommand, 0, 0, Action, 0 );
|
||||||
m_updateaccumulator = 0.0; // prevent potential command repeat right after issuing one
|
m_updateaccumulator = 0.0; // prevent potential command repeat right after issuing one
|
||||||
|
/*
|
||||||
if( mousecommand == user_command::mastercontrollerincrease ) {
|
if( mousecommand == user_command::mastercontrollerincrease ) {
|
||||||
m_updateaccumulator -= 0.15; // extra pause on first increase of master controller
|
m_updateaccumulator -= 0.15; // extra pause on first increase of master controller
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
switch( mousecommand ) {
|
switch( mousecommand ) {
|
||||||
case user_command::mastercontrollerincrease:
|
case user_command::mastercontrollerincrease:
|
||||||
case user_command::mastercontrollerdecrease:
|
case user_command::mastercontrollerdecrease:
|
||||||
|
|||||||
144
renderer.cpp
144
renderer.cpp
@@ -120,10 +120,9 @@ opengl_renderer::Init( GLFWwindow *Window ) {
|
|||||||
m_lights.emplace_back( light );
|
m_lights.emplace_back( light );
|
||||||
}
|
}
|
||||||
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
|
// pick buffer resources
|
||||||
if( true == m_framebuffersupport ) {
|
if( true == m_framebuffersupport ) {
|
||||||
// try to create the pick buffer. RGBA8 2D texture, 24 bit depth texture, 1024x512
|
// try to create the pick buffer. RGBA8 2D texture, 24 bit depth texture, 1024x1024 (height of 512 would suffice but, eh)
|
||||||
int const width { 1024 };
|
|
||||||
int const height { 512 };
|
|
||||||
// texture
|
// texture
|
||||||
::glGenTextures( 1, &m_picktexture );
|
::glGenTextures( 1, &m_picktexture );
|
||||||
::glBindTexture( GL_TEXTURE_2D, m_picktexture );
|
::glBindTexture( GL_TEXTURE_2D, m_picktexture );
|
||||||
@@ -131,18 +130,17 @@ opengl_renderer::Init( GLFWwindow *Window ) {
|
|||||||
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
|
||||||
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||||
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||||
::glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL );
|
::glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_pickbuffersize, m_pickbuffersize, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL );
|
||||||
// depth buffer
|
// depth buffer
|
||||||
::glGenRenderbuffersEXT( 1, &m_pickdepthbuffer );
|
::glGenRenderbuffersEXT( 1, &m_pickdepthbuffer );
|
||||||
::glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_pickdepthbuffer );
|
::glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_pickdepthbuffer );
|
||||||
::glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height );
|
::glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, m_pickbuffersize, m_pickbuffersize );
|
||||||
// create and set up the framebuffer
|
// create and assemble the framebuffer
|
||||||
::glGenFramebuffersEXT( 1, &m_pickframebuffer );
|
::glGenFramebuffersEXT( 1, &m_pickframebuffer );
|
||||||
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_pickframebuffer );
|
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_pickframebuffer );
|
||||||
::glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_picktexture, 0 );
|
::glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_picktexture, 0 );
|
||||||
::glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_pickdepthbuffer );
|
::glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_pickdepthbuffer );
|
||||||
//-------------------------
|
// check if we got it working
|
||||||
//Does the GPU support current FBO configuration?
|
|
||||||
GLenum status = ::glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
|
GLenum status = ::glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
|
||||||
if( status == GL_FRAMEBUFFER_COMPLETE_EXT ) {
|
if( status == GL_FRAMEBUFFER_COMPLETE_EXT ) {
|
||||||
WriteLog( "Picking framebuffer setup complete" );
|
WriteLog( "Picking framebuffer setup complete" );
|
||||||
@@ -154,6 +152,41 @@ opengl_renderer::Init( GLFWwindow *Window ) {
|
|||||||
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch back to primary render target for now
|
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch back to primary render target for now
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
// shadowmap resources
|
||||||
|
if( ( true == Global::RenderShadows )
|
||||||
|
&& ( true == m_framebuffersupport ) ) {
|
||||||
|
// texture:
|
||||||
|
::glGenTextures( 1, &m_shadowtexture );
|
||||||
|
::glBindTexture( GL_TEXTURE_2D, m_shadowtexture );
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||||
|
// enable shadow comparison: true (ie not in shadow) if r<=texture...
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE );
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
|
||||||
|
// ...shadow comparison should generate an INTENSITY result
|
||||||
|
::glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY );
|
||||||
|
::glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, m_shadowbuffersize, m_shadowbuffersize, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );
|
||||||
|
// create and assemble the framebuffer
|
||||||
|
::glGenFramebuffersEXT( 1, &m_shadowframebuffer );
|
||||||
|
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_shadowframebuffer );
|
||||||
|
::glDrawBuffer( GL_NONE ); // we won't be rendering colour data, so can skip the colour attachment
|
||||||
|
::glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_shadowtexture, 0 );
|
||||||
|
// check if we got it working
|
||||||
|
GLenum status = ::glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
|
||||||
|
if( status == GL_FRAMEBUFFER_COMPLETE_EXT ) {
|
||||||
|
WriteLog( "Shadows framebuffer setup complete" );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ErrorLog( "Shadows framebuffer setup failed" );
|
||||||
|
m_framebuffersupport = false;
|
||||||
|
Global::RenderShadows = false;
|
||||||
|
}
|
||||||
|
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch back to primary render target for now
|
||||||
|
::glDrawBuffer( GL_BACK );
|
||||||
|
}
|
||||||
|
|
||||||
::glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
|
::glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
|
||||||
// preload some common textures
|
// preload some common textures
|
||||||
WriteLog( "Loading common gfx data..." );
|
WriteLog( "Loading common gfx data..." );
|
||||||
@@ -205,7 +238,9 @@ opengl_renderer::Render_pass( rendermode const Mode ) {
|
|||||||
|
|
||||||
// TODO: run shadowmap pass before color
|
// TODO: run shadowmap pass before color
|
||||||
|
|
||||||
// ::glViewport( 0, 0, Global::ScreenWidth, Global::ScreenHeight );
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
|
::glViewport( 0, 0, Global::ScreenWidth, Global::ScreenHeight );
|
||||||
|
#endif
|
||||||
if( World.InitPerformed() ) {
|
if( World.InitPerformed() ) {
|
||||||
auto const skydomecolour = World.Environment.m_skydome.GetAverageColor();
|
auto const skydomecolour = World.Environment.m_skydome.GetAverageColor();
|
||||||
::glClearColor( skydomecolour.x, skydomecolour.y, skydomecolour.z, 0.0f ); // kolor nieba
|
::glClearColor( skydomecolour.x, skydomecolour.y, skydomecolour.z, 0.0f ); // kolor nieba
|
||||||
@@ -234,9 +269,33 @@ opengl_renderer::Render_pass( rendermode const Mode ) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case rendermode::shadows: {
|
||||||
|
|
||||||
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
|
::glViewport( 0, 0, m_pickbuffersize, m_pickbuffersize ); // TODO: separate shadow buffer
|
||||||
|
#endif
|
||||||
|
::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||||
|
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
|
||||||
|
if( World.InitPerformed() ) {
|
||||||
|
// setup
|
||||||
|
m_renderpass.draw_range = 500.0f; // 1.5km square centered around camera
|
||||||
|
Render_projection();
|
||||||
|
Render_camera();
|
||||||
|
::glDepthFunc( GL_LEQUAL );
|
||||||
|
// render
|
||||||
|
// opaque parts...
|
||||||
|
Render_setup();
|
||||||
|
Render( &World.Ground );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case rendermode::pickcontrols: {
|
case rendermode::pickcontrols: {
|
||||||
|
|
||||||
// ::glViewport( 0, 0, 1024, 512 );
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
|
::glViewport( 0, 0, m_pickbuffersize, m_pickbuffersize );
|
||||||
|
#endif
|
||||||
::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||||
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
|
||||||
@@ -259,7 +318,9 @@ opengl_renderer::Render_pass( rendermode const Mode ) {
|
|||||||
|
|
||||||
case rendermode::pickscenery: {
|
case rendermode::pickscenery: {
|
||||||
|
|
||||||
// ::glViewport( 0, 0, 1024, 512 );
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
|
::glViewport( 0, 0, m_pickbuffersize, m_pickbuffersize );
|
||||||
|
#endif
|
||||||
::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||||
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
|
||||||
@@ -319,6 +380,12 @@ opengl_renderer::Render_projection() {
|
|||||||
*/
|
*/
|
||||||
case rendermode::shadows: {
|
case rendermode::shadows: {
|
||||||
// TODO: set parallel projection
|
// TODO: set parallel projection
|
||||||
|
::gluPerspective(
|
||||||
|
Global::FieldOfView,
|
||||||
|
1.f,
|
||||||
|
// std::max( 1.0f, (float)Global::ScreenWidth ) / std::max( 1.0f, (float)Global::ScreenHeight ),
|
||||||
|
2.f,
|
||||||
|
m_renderpass.draw_range * Global::fDistanceFactor );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,7 +413,7 @@ opengl_renderer::Render_camera() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case rendermode::shadows: {
|
case rendermode::shadows: {
|
||||||
m_renderpass.camera.position() = Global::pCameraPosition - glm::dvec3{ Global::DayLight.direction * 750.f };
|
m_renderpass.camera.position() = Global::pCameraPosition - glm::dvec3{ Global::DayLight.direction * 250.f };
|
||||||
m_renderpass.camera.position().y = std::max( 50.0, m_renderpass.camera.position().y ); // prevent shadow source from dipping too low
|
m_renderpass.camera.position().y = std::max( 50.0, m_renderpass.camera.position().y ); // prevent shadow source from dipping too low
|
||||||
viewmatrix = glm::lookAt(
|
viewmatrix = glm::lookAt(
|
||||||
m_renderpass.camera.position(),
|
m_renderpass.camera.position(),
|
||||||
@@ -1258,6 +1325,9 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
// rysuj gdy element nieprzezroczysty
|
// rysuj gdy element nieprzezroczysty
|
||||||
switch( m_renderpass.draw_mode ) {
|
switch( m_renderpass.draw_mode ) {
|
||||||
case rendermode::color: {
|
case rendermode::color: {
|
||||||
|
// NOTE: code disabled as normalization marking doesn't take into account scaling propagation down hierarchy chains
|
||||||
|
// for the time being we'll do with enforced worst-case scaling method, when speculars are enabled
|
||||||
|
#ifdef EU07_USE_OPTIMIZED_NORMALIZATION
|
||||||
switch( Submodel->m_normalizenormals ) {
|
switch( Submodel->m_normalizenormals ) {
|
||||||
case TSubModel::normalize: {
|
case TSubModel::normalize: {
|
||||||
::glEnable( GL_NORMALIZE ); break; }
|
::glEnable( GL_NORMALIZE ); break; }
|
||||||
@@ -1266,6 +1336,11 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
default: {
|
default: {
|
||||||
break; }
|
break; }
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if( true == m_renderspecular ) {
|
||||||
|
::glEnable( GL_NORMALIZE );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// material configuration:
|
// material configuration:
|
||||||
// textures...
|
// textures...
|
||||||
if( Submodel->TextureID < 0 ) { // zmienialne skóry
|
if( Submodel->TextureID < 0 ) { // zmienialne skóry
|
||||||
@@ -1280,6 +1355,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
if( ( true == m_renderspecular ) && ( Global::DayLight.specular.a > 0.01f ) ) {
|
if( ( true == m_renderspecular ) && ( Global::DayLight.specular.a > 0.01f ) ) {
|
||||||
// specular strength in legacy models is set uniformly to 150, 150, 150 so we scale it down for opaque elements
|
// specular strength in legacy models is set uniformly to 150, 150, 150 so we scale it down for opaque elements
|
||||||
::glMaterialfv( GL_FRONT, GL_SPECULAR, glm::value_ptr( Submodel->f4Specular * Global::DayLight.specular.a * m_specularopaquescalefactor ) );
|
::glMaterialfv( GL_FRONT, GL_SPECULAR, glm::value_ptr( Submodel->f4Specular * Global::DayLight.specular.a * m_specularopaquescalefactor ) );
|
||||||
|
::glEnable( GL_RESCALE_NORMAL );
|
||||||
}
|
}
|
||||||
// ...luminance
|
// ...luminance
|
||||||
if( Global::fLuminance < Submodel->fLight ) {
|
if( Global::fLuminance < Submodel->fLight ) {
|
||||||
@@ -1298,6 +1374,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
// restore default (lack of) brightness
|
// restore default (lack of) brightness
|
||||||
::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( colors::none ) );
|
::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( colors::none ) );
|
||||||
}
|
}
|
||||||
|
#ifdef EU07_USE_OPTIMIZED_NORMALIZATION
|
||||||
switch( Submodel->m_normalizenormals ) {
|
switch( Submodel->m_normalizenormals ) {
|
||||||
case TSubModel::normalize: {
|
case TSubModel::normalize: {
|
||||||
::glDisable( GL_NORMALIZE ); break; }
|
::glDisable( GL_NORMALIZE ); break; }
|
||||||
@@ -1306,6 +1383,11 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
default: {
|
default: {
|
||||||
break; }
|
break; }
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if( true == m_renderspecular ) {
|
||||||
|
::glDisable( GL_NORMALIZE );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case rendermode::shadows:
|
case rendermode::shadows:
|
||||||
@@ -1800,6 +1882,9 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
// renderowanie obiektów OpenGL
|
// renderowanie obiektów OpenGL
|
||||||
if( Submodel->iAlpha & Submodel->iFlags & 0x2F ) // rysuj gdy element przezroczysty
|
if( Submodel->iAlpha & Submodel->iFlags & 0x2F ) // rysuj gdy element przezroczysty
|
||||||
{
|
{
|
||||||
|
// NOTE: code disabled as normalization marking doesn't take into account scaling propagation down hierarchy chains
|
||||||
|
// for the time being we'll do with enforced worst-case scaling method, when speculars are enabled
|
||||||
|
#ifdef EU07_USE_OPTIMIZED_NORMALIZATION
|
||||||
switch( Submodel->m_normalizenormals ) {
|
switch( Submodel->m_normalizenormals ) {
|
||||||
case TSubModel::normalize: {
|
case TSubModel::normalize: {
|
||||||
::glEnable( GL_NORMALIZE ); break; }
|
::glEnable( GL_NORMALIZE ); break; }
|
||||||
@@ -1808,6 +1893,11 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
default: {
|
default: {
|
||||||
break; }
|
break; }
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if( true == m_renderspecular ) {
|
||||||
|
::glEnable( GL_NORMALIZE );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// textures...
|
// textures...
|
||||||
if( Submodel->TextureID < 0 ) { // zmienialne skóry
|
if( Submodel->TextureID < 0 ) { // zmienialne skóry
|
||||||
Bind( Submodel->ReplacableSkinId[ -Submodel->TextureID ] );
|
Bind( Submodel->ReplacableSkinId[ -Submodel->TextureID ] );
|
||||||
@@ -1838,6 +1928,7 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
// restore default (lack of) brightness
|
// restore default (lack of) brightness
|
||||||
::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( colors::none ) );
|
::glMaterialfv( GL_FRONT, GL_EMISSION, glm::value_ptr( colors::none ) );
|
||||||
}
|
}
|
||||||
|
#ifdef EU07_USE_OPTIMIZED_NORMALIZATION
|
||||||
switch( Submodel->m_normalizenormals ) {
|
switch( Submodel->m_normalizenormals ) {
|
||||||
case TSubModel::normalize: {
|
case TSubModel::normalize: {
|
||||||
::glDisable( GL_NORMALIZE ); break; }
|
::glDisable( GL_NORMALIZE ); break; }
|
||||||
@@ -1846,6 +1937,11 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
default: {
|
default: {
|
||||||
break; }
|
break; }
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if( true == m_renderspecular ) {
|
||||||
|
::glDisable( GL_NORMALIZE );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( Submodel->eType == TP_FREESPOTLIGHT ) {
|
else if( Submodel->eType == TP_FREESPOTLIGHT ) {
|
||||||
@@ -1954,12 +2050,14 @@ opengl_renderer::Update_Pick_Control() {
|
|||||||
glm::dvec2 mousepos;
|
glm::dvec2 mousepos;
|
||||||
glfwGetCursorPos( m_window, &mousepos.x, &mousepos.y );
|
glfwGetCursorPos( m_window, &mousepos.x, &mousepos.y );
|
||||||
mousepos.y = Global::ScreenHeight - mousepos.y; // cursor coordinates are flipped compared to opengl
|
mousepos.y = Global::ScreenHeight - mousepos.y; // cursor coordinates are flipped compared to opengl
|
||||||
/*
|
|
||||||
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
glm::ivec2 pickbufferpos {
|
glm::ivec2 pickbufferpos {
|
||||||
mousepos.x * 1024.0f / Global::ScreenWidth,
|
mousepos.x * m_pickbuffersize / Global::ScreenWidth,
|
||||||
mousepos.y * 512.0f / Global::ScreenHeight };
|
mousepos.y * m_pickbuffersize / Global::ScreenHeight };
|
||||||
*/
|
#else
|
||||||
glm::ivec2 pickbufferpos{ mousepos };
|
glm::ivec2 pickbufferpos{ mousepos };
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned char pickreadout[4];
|
unsigned char pickreadout[4];
|
||||||
::glReadPixels( pickbufferpos.x, pickbufferpos.y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, pickreadout );
|
::glReadPixels( pickbufferpos.x, pickbufferpos.y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, pickreadout );
|
||||||
@@ -1998,12 +2096,14 @@ opengl_renderer::Update_Pick_Node() {
|
|||||||
glm::dvec2 mousepos;
|
glm::dvec2 mousepos;
|
||||||
glfwGetCursorPos( m_window, &mousepos.x, &mousepos.y );
|
glfwGetCursorPos( m_window, &mousepos.x, &mousepos.y );
|
||||||
mousepos.y = Global::ScreenHeight - mousepos.y; // cursor coordinates are flipped compared to opengl
|
mousepos.y = Global::ScreenHeight - mousepos.y; // cursor coordinates are flipped compared to opengl
|
||||||
/*
|
|
||||||
|
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
||||||
glm::ivec2 pickbufferpos {
|
glm::ivec2 pickbufferpos {
|
||||||
mousepos.x * 1024.0f / Global::ScreenWidth,
|
mousepos.x * m_pickbuffersize / Global::ScreenWidth,
|
||||||
mousepos.y * 512.0f / Global::ScreenHeight };
|
mousepos.y * m_pickbuffersize / Global::ScreenHeight };
|
||||||
*/
|
#else
|
||||||
glm::ivec2 pickbufferpos{ mousepos };
|
glm::ivec2 pickbufferpos{ mousepos };
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned char pickreadout[4];
|
unsigned char pickreadout[4];
|
||||||
::glReadPixels( pickbufferpos.x, pickbufferpos.y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, pickreadout );
|
::glReadPixels( pickbufferpos.x, pickbufferpos.y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, pickreadout );
|
||||||
@@ -2198,15 +2298,13 @@ opengl_renderer::Init_caps() {
|
|||||||
WriteLog( "Supported extensions:" + std::string((char *)glGetString( GL_EXTENSIONS )) );
|
WriteLog( "Supported extensions:" + std::string((char *)glGetString( GL_EXTENSIONS )) );
|
||||||
|
|
||||||
WriteLog( std::string("Render path: ") + ( Global::bUseVBO ? "VBO" : "Display lists" ) );
|
WriteLog( std::string("Render path: ") + ( Global::bUseVBO ? "VBO" : "Display lists" ) );
|
||||||
#ifdef EU07_USE_PICKING_FRAMEBUFFER
|
|
||||||
if( GLEW_EXT_framebuffer_object ) {
|
if( GLEW_EXT_framebuffer_object ) {
|
||||||
m_framebuffersupport = true;
|
m_framebuffersupport = true;
|
||||||
WriteLog( "Framebuffer objects enabled" );
|
WriteLog( "Framebuffer objects enabled" );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
WriteLog( "Framebuffer objects not supported, resorting to back buffer rendering" );
|
WriteLog( "Framebuffer objects not supported, resorting to back buffer rendering where possible" );
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if( Global::iMultisampling )
|
if( Global::iMultisampling )
|
||||||
WriteLog( "Using multisampling x" + std::to_string( 1 << Global::iMultisampling ) );
|
WriteLog( "Using multisampling x" + std::to_string( 1 << Global::iMultisampling ) );
|
||||||
// ograniczenie maksymalnego rozmiaru tekstur - parametr dla skalowania tekstur
|
// ograniczenie maksymalnego rozmiaru tekstur - parametr dla skalowania tekstur
|
||||||
|
|||||||
@@ -254,7 +254,11 @@ private:
|
|||||||
GLuint m_pickframebuffer { 0 }; // TODO: refactor pick framebuffer stuff into an object
|
GLuint m_pickframebuffer { 0 }; // TODO: refactor pick framebuffer stuff into an object
|
||||||
GLuint m_picktexture { 0 };
|
GLuint m_picktexture { 0 };
|
||||||
GLuint m_pickdepthbuffer { 0 };
|
GLuint m_pickdepthbuffer { 0 };
|
||||||
|
int m_pickbuffersize { 1024 }; // size of (square) textures bound with the pick framebuffer
|
||||||
#endif
|
#endif
|
||||||
|
GLuint m_shadowframebuffer { 0 };
|
||||||
|
GLuint m_shadowtexture { 0 };
|
||||||
|
int m_shadowbuffersize { 2048 };
|
||||||
GLUquadricObj *m_quadric { nullptr }; // helper object for drawing debug mode scene elements
|
GLUquadricObj *m_quadric { nullptr }; // helper object for drawing debug mode scene elements
|
||||||
|
|
||||||
geometry_handle m_billboardgeometry { 0, 0 };
|
geometry_handle m_billboardgeometry { 0, 0 };
|
||||||
|
|||||||
Reference in New Issue
Block a user