From fa96efd5490dc26b41fcc2d81b7252b4fbd25886 Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Thu, 29 Jul 2021 13:30:13 +0200 Subject: [PATCH] Partial fix for #428. Precision of `Declare` INI setting was erroneously truncated to 6 digits. Reverted back to 7 digits, matching v3.6 behavior. --- source/backend/control/scene.cpp | 8 +++----- source/core/scene/scenedata.h | 6 ++++-- source/parser/parser.cpp | 30 +++++++++++++----------------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/source/backend/control/scene.cpp b/source/backend/control/scene.cpp index 770e01cbf..f32409196 100644 --- a/source/backend/control/scene.cpp +++ b/source/backend/control/scene.cpp @@ -143,28 +143,26 @@ void Scene::StartParser(POVMS_Object& parseOptions) parseOptions.Get(kPOVAttrib_Declare, ds); for(int i = 1; i <= ds.GetListSize(); i++) { - std::ostringstream sstr; POVMS_Attribute a; POVMS_Object d; ds.GetNth(i, d); + std::string ident = d.GetString(kPOVAttrib_Identifier); d.Get(kPOVAttrib_Value, a); switch (a.Type()) { case kPOVMSType_CString: - sstr << "\"" + d.TryGetString(kPOVAttrib_Value, "") + "\""; + sceneData->declaredStrings.insert(make_pair(ident, d.TryGetString(kPOVAttrib_Value, ""))); break; case kPOVMSType_Float: - sstr << d.TryGetFloat(kPOVAttrib_Value, 0.0); + sceneData->declaredNumbers.insert(make_pair(ident, d.TryGetFloat(kPOVAttrib_Value, 0.0))); break; default: // shouldn't happen unless we make a coding error throw POV_EXCEPTION(kParamErr, "Invalid type passed in declare list"); } - - sceneData->declaredVariables.insert(make_pair(d.GetString(kPOVAttrib_Identifier), sstr.str())); } } diff --git a/source/core/scene/scenedata.h b/source/core/scene/scenedata.h index 8d1c5bf83..93e34e6d3 100644 --- a/source/core/scene/scenedata.h +++ b/source/core/scene/scenedata.h @@ -81,7 +81,8 @@ class SceneData { public: - typedef std::map DeclaredVariablesMap; + typedef std::map DeclaredStringsMap; + typedef std::map DeclaredNumbersMap; /// Destructor. ~SceneData(); @@ -203,7 +204,8 @@ class SceneData int defaultFileType; FrameSettings frameSettings; // TODO - move ??? - DeclaredVariablesMap declaredVariables; // TODO - move to parser + DeclaredStringsMap declaredStrings; // TODO - move to parser + DeclaredNumbersMap declaredNumbers; // TODO - move to parser Camera parsedCamera; // TODO - handle differently or move to parser bool clocklessAnimation; // TODO - this is support for an experimental feature and may be changed or removed vector cameras; // TODO - this is support for an experimental feature and may be changed or removed diff --git a/source/parser/parser.cpp b/source/parser/parser.cpp index ab0b313ec..b1a80be19 100644 --- a/source/parser/parser.cpp +++ b/source/parser/parser.cpp @@ -212,25 +212,21 @@ void Parser::Run() Frame_Init (); - for(SceneData::DeclaredVariablesMap::const_iterator i(sceneData->declaredVariables.begin()); i != sceneData->declaredVariables.end(); i++) + for(SceneData::DeclaredStringsMap::const_iterator i(sceneData->declaredStrings.begin()); i != sceneData->declaredStrings.end(); i++) { - if(i->second.length() > 0) - { - SYM_ENTRY *Temp_Entry = nullptr; + SYM_ENTRY *Temp_Entry = nullptr; - if(i->second[0] == '\"') - { - string tmp(i->second, 1, i->second.length() - 2); - Temp_Entry = Add_Symbol(SYM_TABLE_GLOBAL, const_cast(i->first.c_str()), STRING_ID_TOKEN); - Temp_Entry->Data = String_Literal_To_UCS2(const_cast(tmp.c_str()), false); - } - else - { - Temp_Entry = Add_Symbol(SYM_TABLE_GLOBAL, const_cast(i->first.c_str()), FLOAT_ID_TOKEN); - Temp_Entry->Data = Create_Float(); - *(reinterpret_cast(Temp_Entry->Data)) = std::atof(i->second.c_str()); - } - } + Temp_Entry = Add_Symbol(SYM_TABLE_GLOBAL, const_cast(i->first.c_str()), STRING_ID_TOKEN); + Temp_Entry->Data = String_Literal_To_UCS2(const_cast(i->second.c_str()), false); + } + + for (SceneData::DeclaredNumbersMap::const_iterator i(sceneData->declaredNumbers.begin()); i != sceneData->declaredNumbers.end(); i++) + { + SYM_ENTRY *Temp_Entry = nullptr; + + Temp_Entry = Add_Symbol(SYM_TABLE_GLOBAL, const_cast(i->first.c_str()), FLOAT_ID_TOKEN); + Temp_Entry->Data = Create_Float(); + *(reinterpret_cast(Temp_Entry->Data)) = i->second; } IncludeHeader(sceneData->headerFile);