diff --git a/include/generator/figures/SolarSystem.hpp b/include/generator/figures/SolarSystem.hpp new file mode 100644 index 00000000..07add64b --- /dev/null +++ b/include/generator/figures/SolarSystem.hpp @@ -0,0 +1,77 @@ +/// Copyright 2025 Ana Oliveira, Humberto Gomes, Mariana Rocha, Sara Lopes +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at: +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. + +#pragma once + +#include +#include +#include + +#include "utils/WavefrontOBJ.hpp" + +namespace generator::figures { + +class SolarSystem : public utils::WavefrontOBJ { +private: + tinyxml2::XMLDocument doc; + + void createWorld(); + void configureCamera(); + void generateSolarSystem(float sceneScale, + float sunSizeFactor, + float planetSizeFactor, + float moonSizeFactor, + float distanceFactor, + float asteroidBeltDensity, + float ringSizeFactor); + + tinyxml2::XMLElement *addCelestialBody(tinyxml2::XMLElement *parent, + float x, + float y, + float z, + float size, + const std::string &modelFile, + float angle = 0.0f, + float rotX = 0.0f, + float rotY = 0.0f, + float rotZ = 0.0f); + + void addSatellite(tinyxml2::XMLElement *parent, float x, float y, float z, float size); + + void addRing(tinyxml2::XMLElement *parent, + float scaleX, + float scaleY, + float scaleZ, + float angle, + float rotX, + float rotY, + float rotZ); + + void addAsteroidBelt(tinyxml2::XMLElement *parent, + float minDist, + float maxDist, + int numAsteroids, + float sceneScale); + +public: + SolarSystem(float sceneScale, + float sunSizeFactor, + float planetSizeFactor, + float moonSizeFactor, + float distanceFactor, + float asteroidBeltDensity, + float ringSizeFactor); +}; + +} diff --git a/res/models/solarSystem.3d b/res/models/solarSystem.3d new file mode 100644 index 00000000..e69de29b diff --git a/res/models/torus.3d b/res/models/torus.3d index f4aae046..aab08a81 100644 --- a/res/models/torus.3d +++ b/res/models/torus.3d @@ -1,124 +1,124 @@ -v -7 0 0 -v -7.57295 1.76336 0 -v -9.07295 2.85317 0 -v -10.9271 2.85317 -0 -v -12.4271 1.76336 -0 -v -13 -2.62268e-07 -0 -v -12.4271 -1.76336 -0 -v -10.9271 -2.85317 -0 -v -9.07295 -2.85317 0 -v -7.57295 -1.76336 0 -v -7 5.24537e-07 0 -v -5.66312 0 -4.1145 -v -6.12664 1.76336 -4.45127 -v -7.34017 2.85317 -5.33295 -v -8.84017 2.85317 -6.42276 -v -10.0537 1.76336 -7.30444 -v -10.5172 -2.62268e-07 -7.64121 -v -10.0537 -1.76336 -7.30444 -v -8.84017 -2.85317 -6.42276 -v -7.34017 -2.85317 -5.33295 -v -6.12664 -1.76336 -4.45127 -v -5.66312 5.24537e-07 -4.1145 -v -2.16312 0 -6.6574 -v -2.34017 1.76336 -7.2023 -v -2.8037 2.85317 -8.62889 -v -3.37664 2.85317 -10.3922 -v -3.84017 1.76336 -11.8188 -v -4.01722 -2.62268e-07 -12.3637 -v -3.84017 -1.76336 -11.8188 -v -3.37664 -2.85317 -10.3922 -v -2.80369 -2.85317 -8.62889 -v -2.34017 -1.76336 -7.2023 -v -2.16312 5.24537e-07 -6.6574 -v 2.16312 0 -6.6574 -v 2.34017 1.76336 -7.2023 -v 2.8037 2.85317 -8.62889 -v 3.37665 2.85317 -10.3922 -v 3.84017 1.76336 -11.8188 -v 4.01722 -2.62268e-07 -12.3637 -v 3.84017 -1.76336 -11.8188 -v 3.37665 -2.85317 -10.3922 -v 2.8037 -2.85317 -8.62889 -v 2.34017 -1.76336 -7.2023 -v 2.16312 5.24537e-07 -6.6574 -v 5.66312 0 -4.1145 -v 6.12665 1.76336 -4.45127 -v 7.34017 2.85317 -5.33295 -v 8.84017 2.85317 -6.42276 -v 10.0537 1.76336 -7.30444 -v 10.5172 -2.62268e-07 -7.64121 -v 10.0537 -1.76336 -7.30444 -v 8.84017 -2.85317 -6.42276 -v 7.34017 -2.85317 -5.33294 -v 6.12665 -1.76336 -4.45127 -v 5.66312 5.24537e-07 -4.1145 -v 7 0 6.11959e-07 -v 7.57295 1.76336 6.62048e-07 -v 9.07295 2.85317 7.93182e-07 -v 10.9271 2.85317 9.55273e-07 -v 12.4271 1.76336 1.08641e-06 -v 13 -2.62268e-07 1.1365e-06 -v 12.4271 -1.76336 1.08641e-06 -v 10.9271 -2.85317 9.55273e-07 -v 9.07295 -2.85317 7.93182e-07 -v 7.57295 -1.76336 6.62048e-07 -v 7 5.24537e-07 6.11959e-07 -v 5.66312 0 4.1145 -v 6.12664 1.76336 4.45127 -v 7.34017 2.85317 5.33295 -v 8.84017 2.85317 6.42276 -v 10.0537 1.76336 7.30444 -v 10.5172 -2.62268e-07 7.64121 -v 10.0537 -1.76336 7.30444 -v 8.84017 -2.85317 6.42276 -v 7.34017 -2.85317 5.33295 -v 6.12664 -1.76336 4.45127 -v 5.66312 5.24537e-07 4.1145 -v 2.16312 0 6.6574 -v 2.34017 1.76336 7.2023 -v 2.8037 2.85317 8.62889 -v 3.37665 2.85317 10.3922 -v 3.84017 1.76336 11.8188 -v 4.01722 -2.62268e-07 12.3637 -v 3.84017 -1.76336 11.8188 -v 3.37665 -2.85317 10.3922 -v 2.8037 -2.85317 8.62889 -v 2.34017 -1.76336 7.2023 -v 2.16312 5.24537e-07 6.6574 -v -2.16312 0 6.6574 -v -2.34017 1.76336 7.2023 -v -2.8037 2.85317 8.62889 -v -3.37665 2.85317 10.3922 -v -3.84017 1.76336 11.8188 -v -4.01722 -2.62268e-07 12.3637 -v -3.84017 -1.76336 11.8188 -v -3.37665 -2.85317 10.3922 -v -2.8037 -2.85317 8.62889 -v -2.34017 -1.76336 7.2023 -v -2.16312 5.24537e-07 6.6574 -v -5.66312 0 4.1145 -v -6.12664 1.76336 4.45127 -v -7.34017 2.85317 5.33295 -v -8.84017 2.85317 6.42276 -v -10.0537 1.76336 7.30444 -v -10.5172 -2.62268e-07 7.64121 -v -10.0537 -1.76336 7.30444 -v -8.84017 -2.85317 6.42276 -v -7.34017 -2.85317 5.33295 -v -6.12664 -1.76336 4.45127 -v -5.66312 5.24537e-07 4.1145 -v -7 0 -1.22392e-06 -v -7.57295 1.76336 -1.3241e-06 -v -9.07295 2.85317 -1.58636e-06 -v -10.9271 2.85317 -1.91055e-06 -v -12.4271 1.76336 -2.17281e-06 -v -13 -2.62268e-07 -2.27299e-06 -v -12.4271 -1.76336 -2.17281e-06 -v -10.9271 -2.85317 -1.91055e-06 -v -9.07295 -2.85317 -1.58636e-06 -v -7.57295 -1.76336 -1.3241e-06 -v -7 5.24537e-07 -1.22392e-06 +v -8 0 0 +v -8.38197 1.17557 0 +v -9.38197 1.90211 0 +v -10.618 1.90211 -0 +v -11.618 1.17557 -0 +v -12 -1.74846e-07 -0 +v -11.618 -1.17557 -0 +v -10.618 -1.90211 -0 +v -9.38197 -1.90211 0 +v -8.38197 -1.17557 0 +v -8 3.49691e-07 0 +v -6.47214 0 -4.70228 +v -6.78115 1.17557 -4.9268 +v -7.59017 1.90211 -5.51458 +v -8.59017 1.90211 -6.24112 +v -9.39919 1.17557 -6.82891 +v -9.7082 -1.74846e-07 -7.05342 +v -9.39919 -1.17557 -6.82891 +v -8.59017 -1.90211 -6.24112 +v -7.59017 -1.90211 -5.51458 +v -6.78115 -1.17557 -4.9268 +v -6.47214 3.49691e-07 -4.70228 +v -2.47214 0 -7.60845 +v -2.59017 1.17557 -7.97172 +v -2.89919 1.90211 -8.92278 +v -3.28115 1.90211 -10.0984 +v -3.59017 1.17557 -11.0494 +v -3.7082 -1.74846e-07 -11.4127 +v -3.59017 -1.17557 -11.0494 +v -3.28115 -1.90211 -10.0984 +v -2.89919 -1.90211 -8.92278 +v -2.59017 -1.17557 -7.97172 +v -2.47214 3.49691e-07 -7.60845 +v 2.47214 0 -7.60845 +v 2.59017 1.17557 -7.97172 +v 2.89919 1.90211 -8.92278 +v 3.28115 1.90211 -10.0984 +v 3.59017 1.17557 -11.0494 +v 3.7082 -1.74846e-07 -11.4127 +v 3.59017 -1.17557 -11.0494 +v 3.28115 -1.90211 -10.0984 +v 2.89919 -1.90211 -8.92278 +v 2.59017 -1.17557 -7.97172 +v 2.47214 3.49691e-07 -7.60845 +v 6.47214 0 -4.70228 +v 6.78115 1.17557 -4.9268 +v 7.59017 1.90211 -5.51458 +v 8.59017 1.90211 -6.24112 +v 9.39919 1.17557 -6.82891 +v 9.70821 -1.74846e-07 -7.05342 +v 9.39919 -1.17557 -6.82891 +v 8.59017 -1.90211 -6.24112 +v 7.59017 -1.90211 -5.51458 +v 6.78115 -1.17557 -4.9268 +v 6.47214 3.49691e-07 -4.70228 +v 8 0 6.99382e-07 +v 8.38197 1.17557 7.32775e-07 +v 9.38197 1.90211 8.20198e-07 +v 10.618 1.90211 9.28258e-07 +v 11.618 1.17557 1.01568e-06 +v 12 -1.74846e-07 1.04907e-06 +v 11.618 -1.17557 1.01568e-06 +v 10.618 -1.90211 9.28258e-07 +v 9.38197 -1.90211 8.20197e-07 +v 8.38197 -1.17557 7.32775e-07 +v 8 3.49691e-07 6.99382e-07 +v 6.47214 0 4.70228 +v 6.78115 1.17557 4.9268 +v 7.59017 1.90211 5.51458 +v 8.59017 1.90211 6.24112 +v 9.39919 1.17557 6.82891 +v 9.7082 -1.74846e-07 7.05342 +v 9.39919 -1.17557 6.82891 +v 8.59017 -1.90211 6.24112 +v 7.59017 -1.90211 5.51458 +v 6.78115 -1.17557 4.9268 +v 6.47214 3.49691e-07 4.70228 +v 2.47214 0 7.60845 +v 2.59017 1.17557 7.97172 +v 2.89919 1.90211 8.92278 +v 3.28115 1.90211 10.0984 +v 3.59017 1.17557 11.0494 +v 3.7082 -1.74846e-07 11.4127 +v 3.59017 -1.17557 11.0494 +v 3.28115 -1.90211 10.0984 +v 2.89919 -1.90211 8.92278 +v 2.59017 -1.17557 7.97172 +v 2.47214 3.49691e-07 7.60845 +v -2.47214 0 7.60845 +v -2.59017 1.17557 7.97172 +v -2.89919 1.90211 8.92278 +v -3.28115 1.90211 10.0984 +v -3.59017 1.17557 11.0494 +v -3.70821 -1.74846e-07 11.4127 +v -3.59017 -1.17557 11.0494 +v -3.28115 -1.90211 10.0984 +v -2.89919 -1.90211 8.92278 +v -2.59017 -1.17557 7.97172 +v -2.47214 3.49691e-07 7.60845 +v -6.47214 0 4.70228 +v -6.78115 1.17557 4.9268 +v -7.59017 1.90211 5.51458 +v -8.59017 1.90211 6.24112 +v -9.39919 1.17557 6.82891 +v -9.7082 -1.74846e-07 7.05342 +v -9.39919 -1.17557 6.82891 +v -8.59017 -1.90211 6.24112 +v -7.59017 -1.90211 5.51458 +v -6.78115 -1.17557 4.9268 +v -6.47214 3.49691e-07 4.70228 +v -8 0 -1.39876e-06 +v -8.38197 1.17557 -1.46555e-06 +v -9.38197 1.90211 -1.6404e-06 +v -10.618 1.90211 -1.85652e-06 +v -11.618 1.17557 -2.03136e-06 +v -12 -1.74846e-07 -2.09815e-06 +v -11.618 -1.17557 -2.03136e-06 +v -10.618 -1.90211 -1.85652e-06 +v -9.38197 -1.90211 -1.64039e-06 +v -8.38197 -1.17557 -1.46555e-06 +v -8 3.49691e-07 -1.39876e-06 f 1 12 13 f 1 13 2 f 2 13 14 diff --git a/res/scenes/scene_solarSystem.xml b/res/scenes/scene_solarSystem.xml new file mode 100644 index 00000000..671a7cb1 --- /dev/null +++ b/res/scenes/scene_solarSystem.xml @@ -0,0 +1,20234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/engine/camera/FreeCamera.cpp b/src/engine/camera/FreeCamera.cpp index b4425856..de2a0cd4 100644 --- a/src/engine/camera/FreeCamera.cpp +++ b/src/engine/camera/FreeCamera.cpp @@ -44,7 +44,7 @@ void FreeCamera::updateCameraVectors() { } void FreeCamera::move(MovementDirection direction, float deltaTime) { - const float translationSpeed = 5.0f * deltaTime; + const float translationSpeed = 100.0f * deltaTime; const float rotationSpeed = 1.5f * deltaTime; glm::vec3 horizontalFront = glm::normalize(glm::vec3(front.x, front.y, front.z)); diff --git a/src/generator/figures/SolarSystem.cpp b/src/generator/figures/SolarSystem.cpp new file mode 100644 index 00000000..a1df1b3a --- /dev/null +++ b/src/generator/figures/SolarSystem.cpp @@ -0,0 +1,438 @@ +/// Copyright 2025 Ana Oliveira, Humberto Gomes, Mariana Rocha, Sara Lopes +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. + +#include +#include + +#include "generator/figures/SolarSystem.hpp" + +namespace generator::figures { + +SolarSystem::SolarSystem(float sceneScale, + float sunSizeFactor, + float planetSizeFactor, + float moonSizeFactor, + float distanceFactor, + float asteroidBeltDensity, + float ringSizeFactor) { + createWorld(); + configureCamera(); + generateSolarSystem(sceneScale, + sunSizeFactor, + planetSizeFactor, + moonSizeFactor, + distanceFactor, + asteroidBeltDensity, + ringSizeFactor); +} + +void SolarSystem::createWorld() { + tinyxml2::XMLElement *world = doc.NewElement("world"); + doc.InsertFirstChild(world); + + tinyxml2::XMLElement *window = doc.NewElement("window"); + window->SetAttribute("width", 1024); + window->SetAttribute("height", 768); + world->InsertEndChild(window); +} + +void SolarSystem::configureCamera() { + tinyxml2::XMLElement *camera = doc.NewElement("camera"); + camera->SetAttribute("type", "free"); + doc.FirstChildElement("world")->InsertEndChild(camera); + + std::unordered_map cameraSettings = { + { "position", glm::vec3(200, 150, 300) }, + { "lookAt", glm::vec3(0, 0, 0) }, + { "up", glm::vec3(0, 1, 0) } + }; + + for (const auto &[name, vec] : cameraSettings) { + tinyxml2::XMLElement *element = doc.NewElement(name.c_str()); + element->SetAttribute("x", vec.x); + element->SetAttribute("y", vec.y); + element->SetAttribute("z", vec.z); + camera->InsertEndChild(element); + } + + tinyxml2::XMLElement *projection = doc.NewElement("projection"); + projection->SetAttribute("fov", 75); + projection->SetAttribute("near", 1); + projection->SetAttribute("far", 6000); + camera->InsertEndChild(projection); +} + +void SolarSystem::generateSolarSystem(float sceneScale, + float sunSizeFactor, + float planetSizeFactor, + float moonSizeFactor, + float distanceFactor, + float asteroidBeltDensity, + float ringSizeFactor) { + tinyxml2::XMLElement *world = doc.FirstChildElement("world"); + tinyxml2::XMLElement *solarSystem = doc.NewElement("group"); + world->InsertEndChild(solarSystem); + + tinyxml2::XMLElement *sun = addCelestialBody(solarSystem, + 0, + 0, + 0, + 30 * sceneScale * sunSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + addCelestialBody(sun, + 12 * sceneScale * distanceFactor, + 2 * distanceFactor, + -3 * distanceFactor, + 0.15 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + addCelestialBody(sun, + 20 * sceneScale * distanceFactor, + -1.5 * distanceFactor, + 2 * distanceFactor, + 0.18 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *earth = addCelestialBody(sun, + 28 * sceneScale * distanceFactor, + 0 * distanceFactor, + -3 * distanceFactor, + 0.2 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(earth, + 3 * sceneScale, + 0, + 0, + 0.05 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *mars = addCelestialBody(sun, + 36 * sceneScale * distanceFactor, + 1.5 * distanceFactor, + 5 * distanceFactor, + 0.15 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(mars, + 2 * sceneScale, + 0.5, + 0, + 0.04 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(mars, + -1.5 * sceneScale, + -0.3, + 1, + 0.03 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *jupiter = addCelestialBody(sun, + 56 * sceneScale * distanceFactor, + -2 * distanceFactor, + -6 * distanceFactor, + 0.5 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(jupiter, + 5 * sceneScale, + 3 * sceneScale, + 4, + 0.1 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(jupiter, + -4 * sceneScale, + 2.5 * sceneScale, + -5, + 0.3 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(jupiter, + 3 * sceneScale, + -2 * sceneScale, + 3, + 0.3 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(jupiter, + -3 * sceneScale, + 1 * sceneScale, + -2, + 0.1 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *saturn = addCelestialBody(sun, + 74 * sceneScale * distanceFactor, + 2 * distanceFactor, + -10 * distanceFactor, + 0.4 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(saturn, + 0, + 0, + 0, + 0.6 * sceneScale * ringSizeFactor, + "../models/torus.3d", + 26.7, + 0, + 0, + 1); + addCelestialBody(saturn, + 10 * sceneScale, + 5 * sceneScale, + 7, + 0.15 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(saturn, + -8 * sceneScale, + 4 * sceneScale, + -8, + 0.12 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *uranus = addCelestialBody(sun, + 92 * sceneScale * distanceFactor, + -4 * distanceFactor, + -12 * distanceFactor, + 0.3 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(uranus, + 0, + 0, + 0, + 0.5 * sceneScale * ringSizeFactor, + "../models/torus.3d", + 90, + 1, + 0, + 0); + addCelestialBody(uranus, + 4 * sceneScale, + 2 * sceneScale, + 3, + 0.05 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(uranus, + -3.5 * sceneScale, + 1.5 * sceneScale, + -3, + 0.04 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + tinyxml2::XMLElement *neptune = addCelestialBody(sun, + 110 * sceneScale * distanceFactor, + 5 * distanceFactor, + -15 * distanceFactor, + 0.3 * sceneScale * planetSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + addCelestialBody(neptune, + 0, + 0, + 0, + 0.45 * sceneScale * ringSizeFactor, + "../models/torus.3d", + 28.3, + 0, + 0, + 1); + addCelestialBody(neptune, + 5 * sceneScale, + 2.5 * sceneScale, + 4, + 0.05 * sceneScale * moonSizeFactor, + "../models/sphere.3d", + 0, + 0, + 0, + 0); + + addAsteroidBelt(sun, + 40 * sceneScale * distanceFactor, + 49 * sceneScale * distanceFactor, + 600 * asteroidBeltDensity, + sceneScale); + addAsteroidBelt(sun, + 120 * sceneScale * distanceFactor, + 150 * sceneScale * distanceFactor, + 1400 * asteroidBeltDensity, + sceneScale); +} + +tinyxml2::XMLElement *SolarSystem::addCelestialBody(tinyxml2::XMLElement *parent, + float x, + float y, + float z, + float size, + const std::string &modelFile, + float angle, + float rotX, + float rotY, + float rotZ) { + + tinyxml2::XMLElement *group = doc.NewElement("group"); + parent->InsertEndChild(group); + + tinyxml2::XMLElement *transform = doc.NewElement("transform"); + group->InsertEndChild(transform); + + tinyxml2::XMLElement *translate = doc.NewElement("translate"); + translate->SetAttribute("x", x); + translate->SetAttribute("y", y); + translate->SetAttribute("z", z); + transform->InsertEndChild(translate); + + if (angle != 0) { + tinyxml2::XMLElement *rotate = doc.NewElement("rotate"); + rotate->SetAttribute("angle", angle); + rotate->SetAttribute("x", rotX); + rotate->SetAttribute("y", rotY); + rotate->SetAttribute("z", rotZ); + transform->InsertEndChild(rotate); + } + + tinyxml2::XMLElement *scaleElem = doc.NewElement("scale"); + if (modelFile == "../models/torus.3d") { + scaleElem->SetAttribute("x", size); + scaleElem->SetAttribute("y", size * 0.1); + scaleElem->SetAttribute("z", size); + } else { + scaleElem->SetAttribute("x", size); + scaleElem->SetAttribute("y", size); + scaleElem->SetAttribute("z", size); + } + transform->InsertEndChild(scaleElem); + + tinyxml2::XMLElement *models = doc.NewElement("models"); + group->InsertEndChild(models); + + tinyxml2::XMLElement *model = doc.NewElement("model"); + model->SetAttribute("file", modelFile.c_str()); + models->InsertEndChild(model); + + return group; +} + +void SolarSystem::addAsteroidBelt(tinyxml2::XMLElement *parent, + float minDist, + float maxDist, + int numAsteroids, + float sceneScale) { + tinyxml2::XMLElement *asteroidBelt = doc.NewElement("group"); + parent->InsertEndChild(asteroidBelt); + + std::vector models = { "../models/sphere.3d", + "../models/box.3d", + "../models/cylinder.3d" }; + + for (int i = 0; i < numAsteroids; i++) { + float distance = minDist + static_cast(rand()) / (RAND_MAX / (maxDist - minDist)); + float angle = static_cast(rand()) / (RAND_MAX / 360.0f); + float x = distance * cos(angle); + float z = distance * sin(angle); + float y = static_cast(rand()) / (RAND_MAX / 10.0f) - 5.0f; + + float size = (0.01 + (static_cast(rand()) / RAND_MAX) * (0.06 - 0.01)) * sceneScale; + + std::string modelFile = models[rand() % models.size()]; + + addCelestialBody(asteroidBelt, + x, + y, + z, + size, + modelFile, + static_cast(rand()) / (RAND_MAX / 360.0f), + static_cast(rand()) / RAND_MAX, + static_cast(rand()) / RAND_MAX, + static_cast(rand()) / RAND_MAX); + } +} + +} diff --git a/src/generator/main.cpp b/src/generator/main.cpp index c2e2debb..c1f9e284 100644 --- a/src/generator/main.cpp +++ b/src/generator/main.cpp @@ -22,6 +22,7 @@ #include "generator/figures/KleinBottle.hpp" #include "generator/figures/MobiusStrip.hpp" #include "generator/figures/Plane.hpp" +#include "generator/figures/SolarSystem.hpp" #include "generator/figures/Sphere.hpp" #include "generator/figures/Torus.hpp" #include "utils/WavefrontOBJ.hpp" @@ -29,30 +30,42 @@ namespace generator { void printUsage(const std::string &programName) { std::cerr << "Wrong usage. Here's the correct one:" << std::endl; - std::cerr << " " << programName - << " plane " - << std::endl; - std::cerr << " " << programName - << " box " - << std::endl; - std::cerr << " " << programName - << " sphere " - << std::endl; - std::cerr << " " << programName - << " cone " - << std::endl; - std::cerr << " " << programName - << " cylinder " - << std::endl; - std::cerr << " " << programName - << " torus " - << std::endl; - std::cerr << " " << programName - << " kleinBottle " - << std::endl; - std::cerr << " " << programName - << " mobiusStrip " - << std::endl; + std::cerr + << " " << programName + << " plane " + << std::endl; + std::cerr + << " " << programName + << " box " + << std::endl; + std::cerr + << " " << programName + << " sphere " + << std::endl; + std::cerr + << " " << programName + << " cone " + << std::endl; + std::cerr + << " " << programName + << " cylinder " + << std::endl; + std::cerr + << " " << programName + << " torus " + << std::endl; + std::cerr + << " " << programName + << " kleinBottle " + << std::endl; + std::cerr + << " " << programName + << " mobiusStrip " + << std::endl; + std::cerr + << " " << programName + << " solarSystem " + << std::endl; } float stringToFloat(const std::string &str) { @@ -159,6 +172,36 @@ int main(int argc, char **argv) { figures::MobiusStrip mobius(radius, width, twist, slices, stacks); mobius.writeToFile(file); + } else if (args.at(1) == "solarSystem") { + if (argc == 4) { + double sceneScale = stringToFloat(args.at(2)); + const std::string &file = args.at(3); + + figures::SolarSystem solarSystem(sceneScale, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); + solarSystem.writeToFile(file); + } else if (argc == 10) { + float sceneScale = stringToFloat(args.at(2)); + float sunSizeFactor = stringToFloat(args.at(3)); + float planetSizeFactor = stringToFloat(args.at(4)); + float moonSizeFactor = stringToFloat(args.at(5)); + float distanceFactor = stringToFloat(args.at(6)); + float asteroidBeltDensity = stringToFloat(args.at(7)); + float ringSizeFactor = stringToFloat(args.at(8)); + const std::string &file = args.at(9); + + figures::SolarSystem solarSystem(sceneScale, + sunSizeFactor, + planetSizeFactor, + moonSizeFactor, + distanceFactor, + asteroidBeltDensity, + ringSizeFactor); + + solarSystem.writeToFile(file); + } else { + printUsage(args[0]); + return 1; + } } else { printUsage(args[0]); }