From 0ad2a142c1a9148725bebce19b64cb20edad579a Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Sun, 20 Jan 2019 15:12:59 +0100 Subject: [PATCH] button audio positioning fix --- Button.cpp | 11 +++++------ DynObj.cpp | 4 ---- Model3d.cpp | 40 +++++++++++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/Button.cpp b/Button.cpp index 219c1f64..6b971d9c 100644 --- a/Button.cpp +++ b/Button.cpp @@ -18,11 +18,10 @@ http://mozilla.org/MPL/2.0/. void TButton::Clear(int i) { - pModelOn = nullptr; - pModelOff = nullptr; - m_state = false; - if (i >= 0) - FeedbackBitSet(i); + *this = TButton(); + if( i >= 0 ) { + FeedbackBitSet( i ); + } Update(); // kasowanie bitu Feedback, o ile jakiś ustawiony }; @@ -63,7 +62,7 @@ void TButton::Load( cParser &Parser, TDynamicObject const *Owner ) { std::array sources { Owner->mdKabina, Owner->mdLowPolyInt, Owner->mdModel }; for( auto const *source : sources ) { if( true == Init( submodelname, source, false ) ) { - // got what we wanted, bail out + // got what we wanted, don't need to search further break; } } diff --git a/DynObj.cpp b/DynObj.cpp index a0bcac82..647d4d39 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -4867,8 +4867,6 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co sm->WillBeAnimated(); sm->ParentMatrix(&m); // pobranie macierzy transformacji // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) - if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D - m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, tzn. przed wykonaniem Init() pants[i].fParamPants->vPos.z = m[3][0]; // przesunięcie w bok (asymetria) pants[i].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) @@ -4905,8 +4903,6 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co pants[i].fParamPants->fAngleU = pants[i].fParamPants->fAngleU0; // początkowy kąt // Ra: ze względu na to, że niektóre modele pantografów są zrąbane, ich mierzenie ma obecnie ograniczony sens sm->ParentMatrix(&m); // pobranie macierzy transformacji pivota ślizgu względem wstawienia pojazdu - if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D - m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, tzn. przed wykonaniem Init() float det = Det(m); if (std::fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu na skalowaniu ślizgu { // skalowanie jest w normie, można pobrać wymiary z modelu diff --git a/Model3d.cpp b/Model3d.cpp index 9298035b..2de55e17 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -1111,9 +1111,33 @@ void TSubModel::ColorsSet( glm::vec3 const &Ambient, glm::vec3 const &Diffuse, g */ }; -void TSubModel::ParentMatrix( float4x4 *m ) const { // pobranie transformacji względem wstawienia modelu - // jeśli nie zostało wykonane Init() (tzn. zaraz po wczytaniu T3D), - // to dodatkowy obrót obrót T3D jest wymagany np. do policzenia wysokości pantografów +// pobranie transformacji względem wstawienia modelu +void TSubModel::ParentMatrix( float4x4 *m ) const { + + m->Identity(); + + float4x4 submodelmatrix; + auto *submodel = this; + do { + // for given step in hierarchy there can be custom transformation matrix, or no transformation + // retrieve it... + submodelmatrix.Identity(); + if( submodel->GetMatrix() ) { + submodelmatrix = float4x4( *submodel->GetMatrix() ); + } + // ...potentially adjust transformations of the root matrix if the model wasn't yet initialized... + if( ( submodel->Parent == nullptr ) + && ( false == submodel->m_rotation_init_done ) ) { + // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a nie obrócono jeszcze + submodelmatrix.InitialRotate(); + } + // ...combine the transformations... + *m = submodelmatrix * ( *m ); + // ...and move up the transformation chain for the iteration... + submodel = submodel->Parent; + // ... until we hit the root + } while( submodel != nullptr ); +/* if( fMatrix != nullptr ) { // skopiowanie, bo będziemy mnożyć *m = float4x4( *fMatrix ); @@ -1128,8 +1152,7 @@ void TSubModel::ParentMatrix( float4x4 *m ) const { // pobranie transformacji wz *m = *sm->Parent->GetMatrix() * *m; sm = sm->Parent; } - // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a - // nie obrócono jeszcze +*/ }; // obliczenie maksymalnej wysokości, na początek ślizgu w pantografie @@ -1231,7 +1254,7 @@ TSubModel::offset( float const Geometrytestoffsetthreshold ) const { float4x4 parentmatrix; ParentMatrix( &parentmatrix ); - + auto offset { glm::vec3 { glm::make_mat4( parentmatrix.readArray() ) * glm::vec4 { 0, 0, 0, 1 } } }; if( glm::length( offset ) < Geometrytestoffsetthreshold ) { @@ -1254,11 +1277,6 @@ TSubModel::offset( float const Geometrytestoffsetthreshold ) const { } } - if (!m_rotation_init_done) - // NOTE, HACK: results require flipping if the model wasn't yet initialized, - // TODO: sort out this mess, maybe try unify offset lookups to take place before (or after) initialization, - offset = { -offset.x, offset.z, offset.y }; - return offset; }