| 22 | } |
| 23 | |
| 24 | List<pair<String, float>> CelestialGraphics::drawWorld( |
| 25 | CelestialParameters const& celestialParameters, Maybe<CelestialParameters> const& overrideShadowParameters) { |
| 26 | auto& root = Root::singleton(); |
| 27 | auto assets = root.assets(); |
| 28 | auto liquidsDatabase = root.liquidsDatabase(); |
| 29 | |
| 30 | CelestialParameters shadowParameters = overrideShadowParameters.value(celestialParameters); |
| 31 | |
| 32 | String type = celestialParameters.getParameter("worldType").toString(); |
| 33 | |
| 34 | List<pair<String, float>> layers; |
| 35 | |
| 36 | if (type == "Terrestrial") { |
| 37 | auto terrestrialParameters = as<TerrestrialWorldParameters>(celestialParameters.visitableParameters()); |
| 38 | if (!terrestrialParameters) |
| 39 | return {}; |
| 40 | |
| 41 | auto gfxConfig = jsonMerge(assets->json("/celestial.config:terrestrialGraphics").get("default"), |
| 42 | assets->json("/celestial.config:terrestrialGraphics").get(terrestrialParameters->typeName, JsonObject())); |
| 43 | |
| 44 | auto liquidImages = gfxConfig.getString("liquidImages", ""); |
| 45 | auto baseImages = gfxConfig.getString("baseImages", ""); |
| 46 | auto shadowImages = gfxConfig.getString("shadowImages", ""); |
| 47 | auto baseCount = gfxConfig.getInt("baseCount", 0); |
| 48 | auto dynamicsImages = gfxConfig.getString("dynamicsImages", ""); |
| 49 | float imageScale = celestialParameters.getParameter("imageScale", 1.0f).toFloat(); |
| 50 | |
| 51 | // If the planet has water, then draw the corresponding water image as the |
| 52 | // base layer, otherwise use the bottom most mask image. |
| 53 | if (terrestrialParameters->primarySurfaceLiquid != EmptyLiquidId && !liquidImages.empty()) { |
| 54 | String liquidBaseImage = liquidImages.replace("<liquid>", liquidsDatabase->liquidName(terrestrialParameters->primarySurfaceLiquid)); |
| 55 | layers.append({std::move(liquidBaseImage), imageScale}); |
| 56 | } else { |
| 57 | if (baseCount > 0) { |
| 58 | String baseLayer = strf("{}?hueshift={}", baseImages.replace("<biome>", |
| 59 | terrestrialParameters->primaryBiome).replace("<num>", toString(baseCount)), terrestrialParameters->hueShift); |
| 60 | layers.append({std::move(baseLayer), imageScale}); |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | // Then draw all the biome layers |
| 65 | for (int i = 0; i < baseCount; ++i) { |
| 66 | String baseImage = baseImages.replace("<num>", toString(baseCount - i)); |
| 67 | String hueShiftString, dynamicMaskString; |
| 68 | if (!dynamicsImages.empty()) |
| 69 | dynamicMaskString = "?addmask=" + dynamicsImages.replace("<num>", toString(celestialParameters.randomizeParameterRange(gfxConfig.getArray("dynamicsRange"), i).toInt())); |
| 70 | if (terrestrialParameters->hueShift != 0) |
| 71 | hueShiftString = strf("?hueshift={}", terrestrialParameters->hueShift); |
| 72 | String layer = baseImage + hueShiftString + dynamicMaskString; |
| 73 | layers.append({std::move(layer), imageScale}); |
| 74 | } |
| 75 | |
| 76 | if (!shadowImages.empty()) { |
| 77 | String shadow = shadowImages.replace("<num>", toString(shadowParameters.randomizeParameterRange(gfxConfig.getArray("shadowNumber")).toInt())); |
| 78 | layers.append({std::move(shadow), imageScale}); |
| 79 | } |
| 80 | |
| 81 | } else if (type == "Asteroids") { |
nothing calls this directly
no test coverage detected