From 04d2d13172bb0a442a04023420727bfb5ee029da Mon Sep 17 00:00:00 2001 From: tanolino Date: Wed, 5 Jan 2022 10:10:38 +0100 Subject: [PATCH] Locale independent meter scale `XmlParser::getRealAttribute(...)` will call `strtod` (or `wcstod`) which are both locale dependent. So on a German locale system a scale of 0.01 meter will be parsed to 0. In order to avoid that I use the `fast_atoreal_move()` method. --- code/AssetLib/Collada/ColladaParser.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 8bbdf02cc..971b2a4a1 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -331,7 +331,16 @@ void ColladaParser::ReadAssetInfo(XmlNode &node) { const std::string ¤tName = currentNode.name(); if (currentName == "unit") { mUnitSize = 1.f; - XmlParser::getRealAttribute(currentNode, "meter", mUnitSize); + std::string tUnitSizeString; + if (XmlParser::getStdStrAttribute(currentNode, "meter", tUnitSizeString)) { + try { + fast_atoreal_move(tUnitSizeString.data(), mUnitSize); + } catch (DeadlyImportError die) { + std::string warning("Collada: Failed to parse meter parameter to real number. Exception:\n"); + warning.append(die.what()); + ASSIMP_LOG_WARN(warning.data()); + } + } } else if (currentName == "up_axis") { std::string v; if (!XmlParser::getValueAsString(currentNode, v)) {