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