File indexing completed on 2025-10-31 08:16:30
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 #pragma once
0010 
0011 #include <array>
0012 #include <filesystem>
0013 #include <string_view>
0014 
0015 namespace Acts {
0016 
0017 
0018 
0019 struct Color {
0020   
0021   Color() = default;
0022   
0023   Color(const Color&) = default;
0024   
0025   Color(Color&&) = default;
0026   
0027   
0028   Color& operator=(const Color&) = default;
0029   
0030   
0031   Color& operator=(Color&&) = default;
0032 
0033   
0034   
0035   
0036   
0037   constexpr Color(int r, int g, int b) : rgb{r, g, b} {}
0038 
0039   
0040   
0041   constexpr explicit Color(std::array<int, 3> values) : rgb(values) {}
0042 
0043   
0044   
0045   constexpr explicit Color(std::array<double, 3> values) {
0046     rgb[0] = static_cast<int>(values[0] * 255);
0047     rgb[1] = static_cast<int>(values[1] * 255);
0048     rgb[2] = static_cast<int>(values[2] * 255);
0049   }
0050 
0051   
0052   
0053   
0054   
0055   constexpr Color(double r, double g, double b)
0056       : Color{std::array<double, 3>{r, g, b}} {}
0057 
0058  private:
0059   constexpr static int hexToInt(std::string_view hex) {
0060     constexpr auto hexCharToInt = [](char c) {
0061       if (c >= '0' && c <= '9') {
0062         return c - '0';
0063       } else if (c >= 'a' && c <= 'f') {
0064         return c - 'a' + 10;
0065       } else if (c >= 'A' && c <= 'F') {
0066         return c - 'A' + 10;
0067       } else {
0068         throw std::invalid_argument("Invalid hex character");
0069       }
0070     };
0071 
0072     int value = 0;
0073     for (char c : hex) {
0074       value = (value << 4) + hexCharToInt(c);
0075     }
0076     return value;
0077   };
0078 
0079  public:
0080   
0081   
0082   constexpr explicit Color(std::string_view hex) {
0083     if (hex[0] == '#' && hex.size() == 7) {
0084       rgb[0] = hexToInt(hex.substr(1, 2));  
0085       rgb[1] = hexToInt(hex.substr(3, 2));  
0086       rgb[2] = hexToInt(hex.substr(5, 2));  
0087     } else {
0088       throw std::invalid_argument{
0089           "Invalid hex color format. Expected format: #RRGGBB"};
0090     }
0091   }
0092 
0093   
0094   
0095   
0096   int operator[](unsigned int i) const { return rgb.at(i); }
0097 
0098   
0099   
0100   
0101   int& operator[](unsigned int i) { return rgb.at(i); }
0102 
0103   
0104   
0105   
0106   
0107   friend bool operator==(const Color& lhs, const Color& rhs) = default;
0108   
0109   
0110   
0111   
0112   friend std::ostream& operator<<(std::ostream& os, const Color& color) {
0113     os << "[" << color.rgb[0] << ", " << color.rgb[1] << ", " << color.rgb[2]
0114        << "]";
0115     return os;
0116   }
0117 
0118   
0119   std::array<int, 3> rgb{};
0120 };
0121 
0122 
0123 constexpr Color s_defaultSurfaceColor{"#0000aa"};
0124 
0125 constexpr Color s_defaultPortalColor{"#308c48"};
0126 
0127 constexpr Color s_defaultVolumColor{"#ffaa00"};
0128 
0129 
0130 
0131 struct ViewConfig {
0132   
0133   bool visible = true;
0134   
0135   Color color = {250, 0, 0};
0136   
0137   double offset = 0.1;
0138   
0139   double lineThickness = 0.15;
0140   
0141   double surfaceThickness = 0.15;
0142   
0143   unsigned int quarterSegments = 72;
0144   
0145   bool triangulate = false;
0146   
0147   std::filesystem::path outputName = std::filesystem::path("");
0148 };
0149 
0150 static const ViewConfig s_viewSurface = {.color = {170, 170, 170}};
0151 static const ViewConfig s_viewPortal = {.color = Color{"#308c48"}};
0152 static const ViewConfig s_viewSensitive = {.color = {0, 180, 240}};
0153 static const ViewConfig s_viewPassive = {.color = {240, 280, 0}};
0154 static const ViewConfig s_viewVolume = {.color = {220, 220, 0}};
0155 static const ViewConfig s_viewGrid = {.color = {220, 0, 0}};
0156 static const ViewConfig s_viewLine = {.color = {0, 0, 220}};
0157 
0158 }