add vertex deduplication range to config, multiply tolerancescale through whole chain

This commit is contained in:
milek7
2022-03-12 18:39:32 +01:00
parent d2b93f0cbb
commit 043ef610f2
5 changed files with 18 additions and 6 deletions

View File

@@ -488,6 +488,11 @@ global_settings::ConfigParse(cParser &Parser) {
Parser.getTokens(1, false); Parser.getTokens(1, false);
Parser >> iConvertModels; Parser >> iConvertModels;
} }
else if (token == "convertindexrange")
{
Parser.getTokens(1, false);
Parser >> iConvertIndexRange;
}
else if (token == "file.binary.terrain") else if (token == "file.binary.terrain")
{ {
// binary terrain (de)serialization // binary terrain (de)serialization

View File

@@ -70,6 +70,7 @@ struct global_settings {
std::string SceneryFile; std::string SceneryFile;
std::string local_start_vehicle{ "EU07-424" }; std::string local_start_vehicle{ "EU07-424" };
int iConvertModels{ 0 }; // tworzenie plików binarnych int iConvertModels{ 0 }; // tworzenie plików binarnych
int iConvertIndexRange{ 1000 }; // range of duplicate vertex scan
bool file_binary_terrain{ true }; // enable binary terrain (de)serialization bool file_binary_terrain{ true }; // enable binary terrain (de)serialization
// logs // logs
int iWriteLogEnabled{ 3 }; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy torów int iWriteLogEnabled{ 3 }; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy torów

View File

@@ -455,7 +455,8 @@ std::pair<int, int> TSubModel::Load( cParser &parser, bool dynamic )
// transformation matrix // transformation matrix
fMatrix = new float4x4(); fMatrix = new float4x4();
readMatrix(parser, *fMatrix); // wczytanie transform readMatrix(parser, *fMatrix); // wczytanie transform
float transformscale = 1.0f; if (Parent != nullptr)
transformscalestack = Parent->transformscalestack;
if( !fMatrix->IdentityIs() ) { if( !fMatrix->IdentityIs() ) {
iFlags |= 0x8000; // transform niejedynkowy - trzeba go przechować iFlags |= 0x8000; // transform niejedynkowy - trzeba go przechować
// check the scaling // check the scaling
@@ -473,7 +474,7 @@ std::pair<int, int> TSubModel::Load( cParser &parser, bool dynamic )
rescale : rescale :
normalize ); normalize );
} }
transformscale = (scale.x + scale.y + scale.z) / 3.0f; transformscalestack *= (scale.x + scale.y + scale.z) / 3.0f;
} }
if (eType < TP_ROTATOR) if (eType < TP_ROTATOR)
{ // wczytywanie wierzchołków { // wczytywanie wierzchołków
@@ -655,7 +656,7 @@ std::pair<int, int> TSubModel::Load( cParser &parser, bool dynamic )
} }
} }
Vertices.resize( m_geometry.vertex_count ); // in case we had some degenerate triangles along the way Vertices.resize( m_geometry.vertex_count ); // in case we had some degenerate triangles along the way
gfx::calculate_indices( Indices, Vertices, transformscale ); gfx::calculate_indices( Indices, Vertices, transformscalestack );
gfx::calculate_tangents( Vertices, Indices, GL_TRIANGLES ); gfx::calculate_tangents( Vertices, Indices, GL_TRIANGLES );
// update values potentially changed by indexing // update values potentially changed by indexing
m_geometry.index_count = Indices.size(); m_geometry.index_count = Indices.size();
@@ -2195,13 +2196,17 @@ void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
break; break;
} }
SubModel = new TSubModel(); SubModel = new TSubModel();
SubModel->Parent = GetFromName(parent);
if (SubModel->Parent == nullptr && parent != "none")
ErrorLog("Bad model: parent for sub-model \"" + SubModel->pName +"\" doesn't exist or is located later in the model data", logtype::model);
{ {
auto const result { SubModel->Load( parser, dynamic ) }; auto const result { SubModel->Load( parser, dynamic ) };
m_indexcount += result.first; m_indexcount += result.first;
m_vertexcount += result.second; m_vertexcount += result.second;
} }
// będzie potrzebne do wyliczenia pozycji, np. pantografu
SubModel->Parent = AddToNamed(parent.c_str(), SubModel); AddTo(SubModel->Parent, SubModel);
parser.getTokens(); parser.getTokens();
parser >> token; parser >> token;

View File

@@ -105,6 +105,7 @@ private:
float4x4 *fMatrix = nullptr; // pojedyncza precyzja wystarcza float4x4 *fMatrix = nullptr; // pojedyncza precyzja wystarcza
int iMatrix; // w pliku binarnym jest numer matrycy int iMatrix; // w pliku binarnym jest numer matrycy
}; };
float transformscalestack { 1.0f }; // tolerancescale used in calculate_indices for whole matrix chain
int iTexture { 0 }; // numer nazwy tekstury, -1 wymienna, 0 brak int iTexture { 0 }; // numer nazwy tekstury, -1 wymienna, 0 brak
float fLight { -1.0f }; // próg jasności światła do zadziałania selfillum float fLight { -1.0f }; // próg jasności światła do zadziałania selfillum
glm::vec4 glm::vec4

View File

@@ -202,7 +202,7 @@ void calculate_indices( index_array &Indices, vertex_array &Vertices, float tole
// if found, remap these to use our current vertex instead // if found, remap these to use our current vertex instead
auto vertex { Vertices[ idx ] }; auto vertex { Vertices[ idx ] };
auto matchiter { std::cbegin( Vertices ) + idx }; auto matchiter { std::cbegin( Vertices ) + idx };
for( auto matchidx = idx + 1; matchidx < Indices.size() && matchidx < idx + 1000; ++matchidx ) { for( auto matchidx = idx + 1; matchidx < Indices.size() && matchidx < idx + Global.iConvertIndexRange; ++matchidx ) {
++matchiter; ++matchiter;
if( ( glm::all( glm::epsilonEqual( vertex.position, matchiter->position, matchtolerance ) ) ) if( ( glm::all( glm::epsilonEqual( vertex.position, matchiter->position, matchtolerance ) ) )
&& ( glm::all( glm::epsilonEqual( vertex.normal, matchiter->normal, matchtolerance ) ) ) && ( glm::all( glm::epsilonEqual( vertex.normal, matchiter->normal, matchtolerance ) ) )