From 40578ebc8106f7bda6462867fbb3f51349a55848 Mon Sep 17 00:00:00 2001 From: Malin E Date: Tue, 29 Oct 2024 17:02:48 +0100 Subject: [PATCH] Update string versions of distance and time units, start with capital letter * Update RenderableModel to better make use of these predefined units --- include/openspace/util/distanceconversion.h | 96 ++++++++++----------- include/openspace/util/timeconversion.h | 36 ++++---- modules/base/rendering/renderablemodel.cpp | 88 ++++++++++--------- 3 files changed, 113 insertions(+), 107 deletions(-) diff --git a/include/openspace/util/distanceconversion.h b/include/openspace/util/distanceconversion.h index d968f94845..7ce480b650 100644 --- a/include/openspace/util/distanceconversion.h +++ b/include/openspace/util/distanceconversion.h @@ -66,59 +66,59 @@ enum class DistanceUnit { }; // Assumption: Unit names are sequential in memory -constexpr std::string_view DistanceUnitNanometer = "nanometer"; -constexpr std::string_view DistanceUnitMicrometer = "micrometer"; -constexpr std::string_view DistanceUnitMillimeter = "millimeter"; -constexpr std::string_view DistanceUnitCentimeter = "centimeter"; -constexpr std::string_view DistanceUnitDecimeter = "decimeter"; -constexpr std::string_view DistanceUnitMeter = "meter"; -constexpr std::string_view DistanceUnitKilometer = "km"; +constexpr std::string_view DistanceUnitNanometer = "Nanometer"; +constexpr std::string_view DistanceUnitMicrometer = "Micrometer"; +constexpr std::string_view DistanceUnitMillimeter = "Millimeter"; +constexpr std::string_view DistanceUnitCentimeter = "Centimeter"; +constexpr std::string_view DistanceUnitDecimeter = "Decimeter"; +constexpr std::string_view DistanceUnitMeter = "Meter"; +constexpr std::string_view DistanceUnitKilometer = "Kilometer"; constexpr std::string_view DistanceUnitAU = "AU"; -constexpr std::string_view DistanceUnitLighthour = "lighthour"; -constexpr std::string_view DistanceUnitLightday = "lightday"; -constexpr std::string_view DistanceUnitLightmonth = "lightmonth"; -constexpr std::string_view DistanceUnitLightyear = "lightyear"; -constexpr std::string_view DistanceUnitParsec = "parsec"; -constexpr std::string_view DistanceUnitKiloparsec = "kiloparsec"; -constexpr std::string_view DistanceUnitMegaparsec = "megaparsec"; -constexpr std::string_view DistanceUnitGigaparsec = "gigaparsec"; -constexpr std::string_view DistanceUnitGigalightyear = "gigalightyear"; -constexpr std::string_view DistanceUnitThou = "thou"; -constexpr std::string_view DistanceUnitInch = "inch"; -constexpr std::string_view DistanceUnitFoot = "foot"; -constexpr std::string_view DistanceUnitYard = "yard"; -constexpr std::string_view DistanceUnitChain = "chain"; -constexpr std::string_view DistanceUnitFurlong = "furlong"; -constexpr std::string_view DistanceUnitMile = "mile"; -constexpr std::string_view DistanceUnitLeague = "league"; +constexpr std::string_view DistanceUnitLighthour = "Lighthour"; +constexpr std::string_view DistanceUnitLightday = "Lightday"; +constexpr std::string_view DistanceUnitLightmonth = "Lightmonth"; +constexpr std::string_view DistanceUnitLightyear = "Lightyear"; +constexpr std::string_view DistanceUnitParsec = "Parsec"; +constexpr std::string_view DistanceUnitKiloparsec = "Kiloparsec"; +constexpr std::string_view DistanceUnitMegaparsec = "Megaparsec"; +constexpr std::string_view DistanceUnitGigaparsec = "Gigaparsec"; +constexpr std::string_view DistanceUnitGigalightyear = "Gigalightyear"; +constexpr std::string_view DistanceUnitThou = "Thou"; +constexpr std::string_view DistanceUnitInch = "Inch"; +constexpr std::string_view DistanceUnitFoot = "Foot"; +constexpr std::string_view DistanceUnitYard = "Yard"; +constexpr std::string_view DistanceUnitChain = "Chain"; +constexpr std::string_view DistanceUnitFurlong = "Furlong"; +constexpr std::string_view DistanceUnitMile = "Mile"; +constexpr std::string_view DistanceUnitLeague = "League"; // Assumption: Unit names are sequential in memory -constexpr std::string_view DistanceUnitNanometers = "nanometers"; -constexpr std::string_view DistanceUnitMicrometers = "micrometers"; -constexpr std::string_view DistanceUnitMillimeters = "millimeters"; -constexpr std::string_view DistanceUnitCentimeters = "centimeters"; -constexpr std::string_view DistanceUnitDecimeters = "decimeters"; -constexpr std::string_view DistanceUnitMeters = "meters"; -constexpr std::string_view DistanceUnitKilometers = "km"; +constexpr std::string_view DistanceUnitNanometers = "Nanometers"; +constexpr std::string_view DistanceUnitMicrometers = "Micrometers"; +constexpr std::string_view DistanceUnitMillimeters = "Millimeters"; +constexpr std::string_view DistanceUnitCentimeters = "Centimeters"; +constexpr std::string_view DistanceUnitDecimeters = "Decimeters"; +constexpr std::string_view DistanceUnitMeters = "Meters"; +constexpr std::string_view DistanceUnitKilometers = "Kilometers"; constexpr std::string_view DistanceUnitAUs = "AU"; -constexpr std::string_view DistanceUnitLighthours = "lighthours"; -constexpr std::string_view DistanceUnitLightdays = "lightdays"; -constexpr std::string_view DistanceUnitLightmonths = "lightmonths"; -constexpr std::string_view DistanceUnitLightyears = "lightyears"; -constexpr std::string_view DistanceUnitParsecs = "parsecs"; -constexpr std::string_view DistanceUnitKiloparsecs = "kiloparsecs"; -constexpr std::string_view DistanceUnitMegaparsecs = "megaparsecs"; -constexpr std::string_view DistanceUnitGigaparsecs = "gigaparsecs"; -constexpr std::string_view DistanceUnitGigalightyears = "gigalightyears"; -constexpr std::string_view DistanceUnitThous = "thou"; -constexpr std::string_view DistanceUnitInches = "inches"; -constexpr std::string_view DistanceUnitFeet = "feet"; -constexpr std::string_view DistanceUnitYards = "yards"; -constexpr std::string_view DistanceUnitChains = "chains"; -constexpr std::string_view DistanceUnitFurlongs = "furlongs"; -constexpr std::string_view DistanceUnitMiles = "miles"; -constexpr std::string_view DistanceUnitLeagues = "leagues"; +constexpr std::string_view DistanceUnitLighthours = "Lighthours"; +constexpr std::string_view DistanceUnitLightdays = "Lightdays"; +constexpr std::string_view DistanceUnitLightmonths = "Lightmonths"; +constexpr std::string_view DistanceUnitLightyears = "Lightyears"; +constexpr std::string_view DistanceUnitParsecs = "Parsecs"; +constexpr std::string_view DistanceUnitKiloparsecs = "Kiloparsecs"; +constexpr std::string_view DistanceUnitMegaparsecs = "Megaparsecs"; +constexpr std::string_view DistanceUnitGigaparsecs = "Gigaparsecs"; +constexpr std::string_view DistanceUnitGigalightyears = "Gigalightyears"; +constexpr std::string_view DistanceUnitThous = "Thou"; +constexpr std::string_view DistanceUnitInches = "Inches"; +constexpr std::string_view DistanceUnitFeet = "Feet"; +constexpr std::string_view DistanceUnitYards = "Yards"; +constexpr std::string_view DistanceUnitChains = "Chains"; +constexpr std::string_view DistanceUnitFurlongs = "Furlongs"; +constexpr std::string_view DistanceUnitMiles = "Miles"; +constexpr std::string_view DistanceUnitLeagues = "Leagues"; constexpr std::array(DistanceUnit::League) + 1> DistanceUnits = { diff --git a/include/openspace/util/timeconversion.h b/include/openspace/util/timeconversion.h index 2fa2bbdb63..493c5caeb5 100644 --- a/include/openspace/util/timeconversion.h +++ b/include/openspace/util/timeconversion.h @@ -60,26 +60,26 @@ enum class TimeUnit { }; // Assumption: Unit names are sequential in memory -constexpr std::string_view TimeUnitNanosecond = "nanosecond"; -constexpr std::string_view TimeUnitMicrosecond = "microsecond"; -constexpr std::string_view TimeUnitMillisecond = "millisecond"; -constexpr std::string_view TimeUnitSecond = "second"; -constexpr std::string_view TimeUnitMinute = "minute"; -constexpr std::string_view TimeUnitHour = "hour"; -constexpr std::string_view TimeUnitDay = "day"; -constexpr std::string_view TimeUnitMonth = "month"; -constexpr std::string_view TimeUnitYear = "year"; +constexpr std::string_view TimeUnitNanosecond = "Nanosecond"; +constexpr std::string_view TimeUnitMicrosecond = "Microsecond"; +constexpr std::string_view TimeUnitMillisecond = "Millisecond"; +constexpr std::string_view TimeUnitSecond = "Second"; +constexpr std::string_view TimeUnitMinute = "Minute"; +constexpr std::string_view TimeUnitHour = "Hour"; +constexpr std::string_view TimeUnitDay = "Day"; +constexpr std::string_view TimeUnitMonth = "Month"; +constexpr std::string_view TimeUnitYear = "Year"; // Assumption: Unit names are sequential in memory -constexpr std::string_view TimeUnitNanoseconds = "nanoseconds"; -constexpr std::string_view TimeUnitMicroseconds = "microseconds"; -constexpr std::string_view TimeUnitMilliseconds = "milliseconds"; -constexpr std::string_view TimeUnitSeconds = "seconds"; -constexpr std::string_view TimeUnitMinutes = "minutes"; -constexpr std::string_view TimeUnitHours = "hours"; -constexpr std::string_view TimeUnitDays = "days"; -constexpr std::string_view TimeUnitMonths = "months"; -constexpr std::string_view TimeUnitYears = "years"; +constexpr std::string_view TimeUnitNanoseconds = "Nanoseconds"; +constexpr std::string_view TimeUnitMicroseconds = "Microseconds"; +constexpr std::string_view TimeUnitMilliseconds = "Milliseconds"; +constexpr std::string_view TimeUnitSeconds = "Seconds"; +constexpr std::string_view TimeUnitMinutes = "Minutes"; +constexpr std::string_view TimeUnitHours = "Hours"; +constexpr std::string_view TimeUnitDays = "Days"; +constexpr std::string_view TimeUnitMonths = "Months"; +constexpr std::string_view TimeUnitYears = "Years"; constexpr std::array(TimeUnit::Year) + 1> TimeUnits = { TimeUnit::Nanosecond, TimeUnit::Microsecond, TimeUnit::Millisecond, diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 7881a8ddf5..3652725628 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -174,30 +174,13 @@ namespace { // the Renderable. std::filesystem::path geometryFile; - enum class [[codegen::map(openspace::DistanceUnit)]] ScaleUnit { - Nanometer, - Micrometer, - Millimeter, - Centimeter, - Decimeter, - Meter, - Kilometer, - Thou, - Inch, - Foot, - Yard, - Chain, - Furlong, - Mile - }; - // The scale of the model. For example, if the model is in centimeters then // `ModelScale = 'Centimeter'` or `ModelScale = 0.01`. The value that this needs // to be in order for the model to be in the correct scale relative to the rest // of OpenSpace can be tricky to find. Essentially, it depends on the model // software that the model was created with and the original intention of the // modeler. - std::optional> modelScale; + std::optional> modelScale; // By default the given `ModelScale` is used to scale down the model. By setting // this setting to true the scaling is inverted to that the model is instead @@ -215,18 +198,10 @@ namespace { // In format `'YYYY MM DD hh:mm:ss'`. std::optional animationStartTime [[codegen::datetime()]]; - enum class [[codegen::map(openspace::TimeUnit)]] AnimationTimeUnit { - Nanosecond, - Microsecond, - Millisecond, - Second, - Minute - }; - // The time scale for the animation relative to seconds. For example, if the // animation is in milliseconds then `AnimationTimeScale = 0.001` or // `AnimationTimeScale = \"Millisecond\"`. - std::optional> animationTimeScale; + std::optional> animationTimeScale; enum class AnimationMode { Once, @@ -340,11 +315,28 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) _invertModelScale = p.invertModelScale.value_or(_invertModelScale); if (p.modelScale.has_value()) { - if (std::holds_alternative(*p.modelScale)) { - const Parameters::ScaleUnit scaleUnit = - std::get(*p.modelScale); - const DistanceUnit distanceUnit = codegen::map(scaleUnit); - _modelScale = toMeter(distanceUnit); + if (std::holds_alternative(*p.modelScale)) { + const std::string stringUnit = std::get(*p.modelScale); + + // Find matching unit name in list of supported unit names + DistanceUnit distanceUnit; + bool wasFound = false; + for (int i = 0; i < DistanceUnitNamesSingular.size(); ++i) { + if (stringUnit == DistanceUnitNamesSingular[i]) { + wasFound = true; + distanceUnit = DistanceUnits[i]; + } + } + + if (wasFound) { + _modelScale = toMeter(distanceUnit); + } + else { + std::string message = std::format("The given unit name '{}' does not " + "match any currently supported unit names", stringUnit); + LERROR(message); + _modelScale = 1.0; + } } else if (std::holds_alternative(*p.modelScale)) { _modelScale = std::get(*p.modelScale); @@ -367,17 +359,31 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) if (std::holds_alternative(*p.animationTimeScale)) { _animationTimeScale = std::get(*p.animationTimeScale); } - else if (std::holds_alternative( - *p.animationTimeScale - )) + else if (std::holds_alternative(*p.animationTimeScale)) { - const Parameters::AnimationTimeUnit animationTimeUnit = - std::get(*p.animationTimeScale); - const TimeUnit timeUnit = codegen::map(animationTimeUnit); + const std::string stringUnit = std::get(*p.animationTimeScale); - _animationTimeScale = static_cast( - convertTime(1.0, timeUnit, TimeUnit::Second) - ); + // Find matching unit name in list of supported unit names + TimeUnit timeUnit; + bool wasFound = false; + for (int i = 0; i < TimeUnitNamesSingular.size(); ++i) { + if (stringUnit == TimeUnitNamesSingular[i]) { + wasFound = true; + timeUnit = TimeUnits[i]; + } + } + + if (wasFound) { + _animationTimeScale = static_cast( + convertTime(1.0, timeUnit, TimeUnit::Second) + ); + } + else { + std::string message = std::format("The given unit name '{}' does not " + "match any currently supported unit names", stringUnit); + LERROR(message); + _animationTimeScale = 1.0; + } } else { throw ghoul::MissingCaseException();