diff --git a/include/Nazara/Utility/Formats/OBJParser.hpp b/include/Nazara/Utility/Formats/OBJParser.hpp index 3decd248f..90e653f93 100644 --- a/include/Nazara/Utility/Formats/OBJParser.hpp +++ b/include/Nazara/Utility/Formats/OBJParser.hpp @@ -54,7 +54,7 @@ namespace Nz const Vector3f* GetTexCoords() const; unsigned int GetTexCoordCount() const; - bool Parse(); + bool Parse(std::size_t reservedVertexCount = 100); private: bool Advance(bool required = true); diff --git a/src/Nazara/Graphics/Formats/OBJLoader.cpp b/src/Nazara/Graphics/Formats/OBJLoader.cpp index af4378f15..a85a734d0 100644 --- a/src/Nazara/Graphics/Formats/OBJLoader.cpp +++ b/src/Nazara/Graphics/Formats/OBJLoader.cpp @@ -133,8 +133,12 @@ namespace Nz bool Load(Model* model, Stream& stream, const ModelParameters& parameters) { + int reservedVertexCount; + if (!parameters.custom.GetIntegerParameter("NativeOBJLoader_VertexCount", &reservedVertexCount)) + reservedVertexCount = 100; + OBJParser parser(stream); - if (!parser.Parse()) + if (!parser.Parse(reservedVertexCount)) { NazaraError("OBJ parser failed"); return false; diff --git a/src/Nazara/Utility/Formats/OBJParser.cpp b/src/Nazara/Utility/Formats/OBJParser.cpp index 64132f586..c0daf1f84 100644 --- a/src/Nazara/Utility/Formats/OBJParser.cpp +++ b/src/Nazara/Utility/Formats/OBJParser.cpp @@ -82,7 +82,7 @@ namespace Nz return m_texCoords.size(); } - bool OBJParser::Parse() + bool OBJParser::Parse(std::size_t reservedVertexCount) { String matName, meshName; matName = meshName = "default"; @@ -95,10 +95,10 @@ namespace Nz m_positions.clear(); m_texCoords.clear(); - // Beaucoup de meshs font plus de 100 sommets, préparons le terrain - m_normals.reserve(100); - m_positions.reserve(100); - m_texCoords.reserve(100); + // Reserve some space for incoming vertices + m_normals.reserve(reservedVertexCount); + m_positions.reserve(reservedVertexCount); + m_texCoords.reserve(reservedVertexCount); // On va regrouper les meshs par nom et par matériau using FaceVec = std::vector;