From dfe48d72a486998dfa4421c093a1a3689b8041e9 Mon Sep 17 00:00:00 2001 From: milek7 Date: Tue, 24 Jul 2018 21:15:50 +0200 Subject: [PATCH] wheel blur, colored shader gamma --- DynObj.cpp | 30 ++++++++++------ DynObj.h | 11 +++--- Model3d.h | 1 + renderer.cpp | 74 +++++++++++++++++++++++++--------------- shaders/mat_colored.frag | 2 +- 5 files changed, 72 insertions(+), 46 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index aa8af6e9..3f07ace7 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -418,12 +418,9 @@ void TDynamicObject::SetPneumatic(bool front, bool red) void TDynamicObject::UpdateAxle(TAnim *pAnim) { // animacja osi - pAnim->smAnimated->SetRotate(float3(1, 0, 0), *pAnim->dWheelAngle); -}; - -void TDynamicObject::UpdateBoogie(TAnim *pAnim) -{ // animacja wózka - pAnim->smAnimated->SetRotate(float3(1, 0, 0), *pAnim->dWheelAngle); + size_t wheel_id = pAnim->dWheelAngle; + pAnim->smAnimated->SetRotate(float3(1, 0, 0), dWheelAngle[wheel_id]); + pAnim->smAnimated->future_transform = glm::rotate((float)glm::radians(m_future_wheels_angle[wheel_id]), glm::vec3(1.0f, 0.0f, 0.0f)); }; void TDynamicObject::UpdateDoorTranslate(TAnim *pAnim) @@ -670,7 +667,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist) animation.yUpdate( &animation ); } } - + if( ( mdModel != nullptr ) && ( ObjSqrDist < ( 50 * 50 ) ) ) { // gdy bliżej niż 50m @@ -3308,7 +3305,7 @@ bool TDynamicObject::Update(double dt, double dt1) glm::dvec3 old_pos = vPosition; Move(dDOMoveLen); - m_last_movement = glm::dvec3(vPosition) - old_pos; + m_future_movement = (glm::dvec3(vPosition) - old_pos) / dt1 * Timer::GetDeltaTime(); if (!bEnabled) // usuwane pojazdy nie mają toru { // pojazd do usunięcia @@ -3405,11 +3402,16 @@ bool TDynamicObject::Update(double dt, double dt1) if (MoverParameters->Vel != 0) { // McZapkie-050402: krecenie kolami: + glm::dvec3 old_wheels = glm::dvec3(dWheelAngle[0], dWheelAngle[1], dWheelAngle[2]); + dWheelAngle[0] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / MoverParameters->WheelDiameterL; // przednie toczne dWheelAngle[1] += MoverParameters->nrot * dt1 * 360.0; // napędne dWheelAngle[2] += 114.59155902616464175359630962821 * MoverParameters->V * dt1 / MoverParameters->WheelDiameterT; // tylne toczne + + m_future_wheels_angle = (glm::dvec3(dWheelAngle[0], dWheelAngle[1], dWheelAngle[2]) - old_wheels) / dt1 * Timer::GetDeltaTime(); + if (dWheelAngle[0] > 360.0) dWheelAngle[0] -= 360.0; // a w drugą stronę jak się kręcą? if (dWheelAngle[1] > 360.0) @@ -3417,6 +3419,7 @@ bool TDynamicObject::Update(double dt, double dt1) if (dWheelAngle[2] > 360.0) dWheelAngle[2] -= 360.0; } + if (pants) // pantograf może być w wagonie kuchennym albo pojeździe rewizyjnym // (np. SR61) { // przeliczanie kątów dla pantografów @@ -3895,6 +3898,11 @@ bool TDynamicObject::Update(double dt, double dt1) return true; // Ra: chyba tak? } +glm::dvec3 TDynamicObject::get_future_movement() const +{ + return m_future_movement; +} + bool TDynamicObject::FastUpdate(double dt) { if (dt == 0.0) @@ -4776,7 +4784,7 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName, } // Ra: ustawianie indeksów osi for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // ilość osi (zabezpieczenie przed błędami w CHK) - pAnimations[i].dWheelAngle = dWheelAngle + 1; // domyślnie wskaźnik na napędzające + pAnimations[i].dWheelAngle = 1; // domyślnie wskaźnik na napędzające i = 0; j = 1; k = 0; @@ -4789,13 +4797,13 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName, { // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum? { - pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających + pAnimations[i++].dWheelAngle = 1; // obrót osi napędzających --k; // następna będzie albo taka sama, albo bierzemy kolejny znak m = 2; // następujące toczne będą miały inną średnicę } else if ((k >= '1') && (k <= '9')) { - pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi tocznych + pAnimations[i++].dWheelAngle = m; // obrót osi tocznych --k; // następna będzie albo taka sama, albo bierzemy kolejny znak } else diff --git a/DynObj.h b/DynObj.h index 02a6d9bc..3da4b844 100644 --- a/DynObj.h +++ b/DynObj.h @@ -124,7 +124,7 @@ public: union { // parametry animacji TAnimValveGear *pValveGear; // współczynniki do animacji parowozu - double *dWheelAngle; // wskaźnik na kąt obrotu osi + int dWheelAngle; // wskaźnik na kąt obrotu osi float *fParam; // różne parametry dla animacji TAnimPant *fParamPants; // różne parametry dla animacji }; @@ -177,7 +177,8 @@ private: // położenie pojazdu w świecie oraz parametry ruchu Math3D::vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!! TDynamicObject * ABuFindNearestObject( TTrack *Track, TDynamicObject *MyPointer, int &CouplNr ); - glm::dvec3 m_last_movement; + glm::dvec3 m_future_movement; + glm::dvec3 m_future_wheels_angle; public: // parametry położenia pojazdu dostępne publicznie @@ -236,7 +237,6 @@ private: void UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery) */ void UpdateAxle(TAnim *pAnim); // animacja osi - void UpdateBoogie(TAnim *pAnim); // animacja wózka void UpdateDoorTranslate(TAnim *pAnim); // animacja drzwi - przesuw void UpdateDoorRotate(TAnim *pAnim); // animacja drzwi - obrót void UpdateDoorFold(TAnim *pAnim); // animacja drzwi - składanie @@ -606,10 +606,7 @@ private: int RouteWish(TTrack *tr); void DestinationSet(std::string to, std::string numer); void OverheadTrack(float o); - glm::dvec3 get_last_movement() const - { - return m_last_movement; - } + glm::dvec3 get_future_movement() const; double MED[9][8]; // lista zmiennych do debugowania hamulca ED static std::string const MED_labels[ 8 ]; diff --git a/Model3d.h b/Model3d.h index 9028a160..07b9506b 100644 --- a/Model3d.h +++ b/Model3d.h @@ -208,6 +208,7 @@ public: return m_material; } void ParentMatrix(float4x4 *m) const; float MaxY( float4x4 const &m ); + glm::mat4 future_transform; void deserialize(std::istream&); void serialize(std::ostream&, diff --git a/renderer.cpp b/renderer.cpp index a9f09907..d793dadb 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -411,7 +411,7 @@ void opengl_renderer::Render_pass(rendermode const Mode) { auto const *vehicle = World.Train->Dynamic(); glm::mat4 mv = OpenGLMatrices.data(GL_MODELVIEW); - future = glm::translate(mv, -glm::vec3(vehicle->get_last_movement())) * glm::inverse(mv); + future = glm::translate(mv, -glm::vec3(vehicle->get_future_movement())) * glm::inverse(mv); } model_ubs.future = glm::mat4(); @@ -1798,7 +1798,7 @@ bool opengl_renderer::Render(TDynamicObject *Dynamic) glm::mat4 future_stack = model_ubs.future; glm::mat4 mv = OpenGLMatrices.data(GL_MODELVIEW); - model_ubs.future *= glm::translate(mv, glm::vec3(Dynamic->get_last_movement())) * glm::inverse(mv); + model_ubs.future *= glm::translate(mv, glm::vec3(Dynamic->get_future_movement())) * glm::inverse(mv); ::glPushMatrix(); ::glTranslated(originoffset.x, originoffset.y, originoffset.z); @@ -2044,13 +2044,20 @@ void opengl_renderer::Render(TSubModel *Submodel) ++m_debugstats.submodels; ++m_debugstats.drawcalls; + glm::mat4 future_stack = model_ubs.future; + if (Submodel->iFlags & 0xC000) { ::glPushMatrix(); if (Submodel->fMatrix) ::glMultMatrixf(Submodel->fMatrix->readArray()); - if (Submodel->b_Anim != TAnimType::at_None) - Submodel->RaAnimation(Submodel->b_Anim); + if (Submodel->b_aAnim != TAnimType::at_None) + { + Submodel->RaAnimation(Submodel->b_aAnim); + + glm::mat4 mv = OpenGLMatrices.data(GL_MODELVIEW); + model_ubs.future *= (mv * Submodel->future_transform) * glm::inverse(mv); + } } if (Submodel->eType < TP_ROTATOR) @@ -2260,7 +2267,10 @@ void opengl_renderer::Render(TSubModel *Submodel) Render(Submodel->Child); if (Submodel->iFlags & 0xC000) + { + model_ubs.future = future_stack; ::glPopMatrix(); + } } /* if( Submodel->b_Anim < at_SecondsJump ) @@ -2750,7 +2760,7 @@ bool opengl_renderer::Render_Alpha(TDynamicObject *Dynamic) glm::mat4 future_stack = model_ubs.future; glm::mat4 mv = OpenGLMatrices.data(GL_MODELVIEW); - model_ubs.future *= glm::translate(mv, glm::vec3(Dynamic->get_last_movement())) * glm::inverse(mv); + model_ubs.future *= glm::translate(mv, glm::vec3(Dynamic->get_future_movement())) * glm::inverse(mv); ::glPushMatrix(); @@ -2859,13 +2869,20 @@ void opengl_renderer::Render_Alpha(TSubModel *Submodel) ++m_debugstats.submodels; ++m_debugstats.drawcalls; + glm::mat4 future_stack = model_ubs.future; + if (Submodel->iFlags & 0xC000) { ::glPushMatrix(); if (Submodel->fMatrix) ::glMultMatrixf(Submodel->fMatrix->readArray()); if (Submodel->b_aAnim != TAnimType::at_None) + { Submodel->RaAnimation(Submodel->b_aAnim); + + glm::mat4 mv = OpenGLMatrices.data(GL_MODELVIEW); + model_ubs.future *= (mv * Submodel->future_transform) * glm::inverse(mv); + } } if (Submodel->eType < TP_ROTATOR) @@ -3050,7 +3067,10 @@ void opengl_renderer::Render_Alpha(TSubModel *Submodel) } if (Submodel->iFlags & 0xC000) + { + model_ubs.future = future_stack; ::glPopMatrix(); + } } /* if( Submodel->b_aAnim < at_SecondsJump ) @@ -3095,34 +3115,34 @@ scene::basic_node *opengl_renderer::Update_Pick_Node() { // m7t: restore picking /* - Render_pass(rendermode::pickscenery); + Render_pass(rendermode::pickscenery); - // determine point to examine - glm::dvec2 mousepos; - glfwGetCursorPos(m_window, &mousepos.x, &mousepos.y); - mousepos.y = Global.iWindowHeight - mousepos.y; // cursor coordinates are flipped compared to opengl + // determine point to examine + glm::dvec2 mousepos; + glfwGetCursorPos(m_window, &mousepos.x, &mousepos.y); + mousepos.y = Global.iWindowHeight - mousepos.y; // cursor coordinates are flipped compared to opengl - glm::ivec2 pickbufferpos; - pickbufferpos = glm::ivec2{mousepos.x * EU07_PICKBUFFERSIZE / std::max(1, Global.iWindowWidth), mousepos.y * EU07_PICKBUFFERSIZE / std::max(1, Global.iWindowHeight)}; + glm::ivec2 pickbufferpos; + pickbufferpos = glm::ivec2{mousepos.x * EU07_PICKBUFFERSIZE / std::max(1, Global.iWindowWidth), mousepos.y * EU07_PICKBUFFERSIZE / std::max(1, Global.iWindowHeight)}; - unsigned char pickreadout[3]; + unsigned char pickreadout[3]; - // m7t: ! replace with PBO and wait frame or two to improve performance - // (and don't clash with control picking) - m_pick_fb->bind(); - ::glReadPixels(pickbufferpos.x, pickbufferpos.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pickreadout); - m_pick_fb->unbind(); + // m7t: ! replace with PBO and wait frame or two to improve performance + // (and don't clash with control picking) + m_pick_fb->bind(); + ::glReadPixels(pickbufferpos.x, pickbufferpos.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pickreadout); + m_pick_fb->unbind(); - auto const nodeindex = pick_index(glm::ivec3{pickreadout[0], pickreadout[1], pickreadout[2]}); - scene::basic_node const *node{nullptr}; - if ((nodeindex > 0) && (nodeindex <= m_picksceneryitems.size())) - { - node = m_picksceneryitems[nodeindex - 1]; - } + auto const nodeindex = pick_index(glm::ivec3{pickreadout[0], pickreadout[1], pickreadout[2]}); + scene::basic_node const *node{nullptr}; + if ((nodeindex > 0) && (nodeindex <= m_picksceneryitems.size())) + { + node = m_picksceneryitems[nodeindex - 1]; + } - m_picksceneryitem = node; - return node; - */ + m_picksceneryitem = node; + return node; + */ return nullptr; } diff --git a/shaders/mat_colored.frag b/shaders/mat_colored.frag index dd564095..40213f0a 100644 --- a/shaders/mat_colored.frag +++ b/shaders/mat_colored.frag @@ -22,7 +22,7 @@ uniform samplerCube envmap; void main() { - vec4 tex_color = vec4(param[0].rgb, 1.0f); + vec4 tex_color = vec4(pow(param[0].rgb, vec3(2.2)), 1.0f); vec3 normal = normalize(f_normal); vec3 refvec = reflect(f_pos.xyz, normal);