From 4b4013e5c8201276cf26c8c1e68ac62a8e9b7449 Mon Sep 17 00:00:00 2001 From: Niffe Date: Fri, 1 Mar 2024 00:03:19 +0200 Subject: [PATCH] Dynamic sun image Also adds access to sun scale, ray color, and fixes sun rendering in front of satellites --- assets/opensb/sky.config.patch | 23 ++++++++++++++++++++ assets/opensb/sky/orbitals/bluestar.png | Bin 0 -> 10007 bytes assets/opensb/sky/orbitals/orangestar.png | Bin 0 -> 10592 bytes assets/opensb/sky/orbitals/redstar.png | Bin 0 -> 10620 bytes assets/opensb/sky/orbitals/whitestar.png | Bin 0 -> 10804 bytes assets/opensb/sky/orbitals/yellowstar.png | Bin 0 -> 10778 bytes source/game/StarSkyParameters.cpp | 8 +++++++ source/game/StarSkyParameters.hpp | 1 + source/game/StarSkyRenderData.cpp | 9 ++++++-- source/rendering/StarEnvironmentPainter.cpp | 18 ++++++++++----- source/rendering/StarWorldPainter.cpp | 5 ++++- 11 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 assets/opensb/sky.config.patch create mode 100644 assets/opensb/sky/orbitals/bluestar.png create mode 100644 assets/opensb/sky/orbitals/orangestar.png create mode 100644 assets/opensb/sky/orbitals/redstar.png create mode 100644 assets/opensb/sky/orbitals/whitestar.png create mode 100644 assets/opensb/sky/orbitals/yellowstar.png diff --git a/assets/opensb/sky.config.patch b/assets/opensb/sky.config.patch new file mode 100644 index 0000000..e9a7866 --- /dev/null +++ b/assets/opensb/sky.config.patch @@ -0,0 +1,23 @@ +{ + "sun" : { + "rayColor" : [255, 255, 200], + "scale" : 0.7, // base scale, dynamic scaling aplies after it (sun image appears to have a higher scale in osb client?) + "dynamicImage" : { + "enabled" : true, + "images" : { + "whitestar" : "/sky/orbitals/whitestar.png", + "orangestar" : "/sky/orbitals/orangestar.png", + "yellowstar" : "/sky/orbitals/yellowstar.png", + "bluestar" : "/sky/orbitals/bluestar.png", + "redstar" : "/sky/orbitals/redstar.png" + }, + "rayColors" : { + "whitestar" : [199, 245, 255], + "orangestar" : [255, 227, 199], + "yellowstar" : [245, 255, 199], + "bluestar" : [199, 199, 255], + "redstar" : [255, 213, 199] + } + } + } +} \ No newline at end of file diff --git a/assets/opensb/sky/orbitals/bluestar.png b/assets/opensb/sky/orbitals/bluestar.png new file mode 100644 index 0000000000000000000000000000000000000000..d174138fb6bc78b4444aa6c639121ddbc2b60252 GIT binary patch literal 10007 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 )kFT=QqHrt*BH%han=@ zXNg@m@%NQe=-cG+BIZRr74%X>ugdGem#yhh>s|pG8RuMA+rXK0egjBm(bJJDf(jjx z@VWeB&J|9v@+dg@*CJ304lFHTOlJR=87f#qKnO?|H30Wp)RwE8Wc`u~Jo zlLo1>4}EP1Lbg?olG;JVv8-47MGbJg>Yu!b4$!Iz;=N$;bz}NFfl~#acP^iBnAnG& z*ted!bQ|C(LonMx6qp#VkO=3XcYx!2+MN_jMRzIFAPXcDi*5s)QzUC1V-d{-a>hbQ hRemkW0RLCFegQ&IgG)cp-?IP!002ovPDHLkV1int) literal 0 HcmV?d00001 diff --git a/assets/opensb/sky/orbitals/orangestar.png b/assets/opensb/sky/orbitals/orangestar.png new file mode 100644 index 0000000000000000000000000000000000000000..788a070c13dd4e6b9933737b00e4c3ebb4b61a96 GIT binary patch literal 10592 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 literal 0 HcmV?d00001 diff --git a/assets/opensb/sky/orbitals/yellowstar.png b/assets/opensb/sky/orbitals/yellowstar.png new file mode 100644 index 0000000000000000000000000000000000000000..596d8ef45b323f1b07f5099d8145bcc62325118b GIT binary patch literal 10778 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 Y0|T3bPYhfx(*OVf07*qoM6N<$f-9L!wEzGB literal 0 HcmV?d00001 diff --git a/source/game/StarSkyParameters.cpp b/source/game/StarSkyParameters.cpp index 886d882..3eddce5 100644 --- a/source/game/StarSkyParameters.cpp +++ b/source/game/StarSkyParameters.cpp @@ -16,6 +16,7 @@ SkyParameters::SkyParameters(CelestialCoordinate const& coordinate, CelestialDat auto params = celestialDatabase->parameters(coordinate); if (!params) return; + auto systemParams = celestialDatabase->parameters(coordinate.system()); seed = staticRandomU64(params->seed(), "SkySeed"); // Gather up all the CelestialParameters and scales for all the celestial @@ -50,6 +51,8 @@ SkyParameters::SkyParameters(CelestialCoordinate const& coordinate, CelestialDat horizonImages = CelestialGraphics::worldHorizonImages(*params); readVisitableParameters(params->visitableParameters()); + + sunType = systemParams->getParameter("typeName").toString(); } SkyParameters::SkyParameters(SkyParameters const& oldSkyParameters, VisitableWorldParametersConstPtr newVisitableParameters) : SkyParameters() { @@ -108,6 +111,8 @@ SkyParameters::SkyParameters(Json const& config) : SkyParameters() { spaceLevel = config.optFloat("spaceLevel"); surfaceLevel = config.optFloat("surfaceLevel"); + + sunType = config.getString("sunType", ""); } Json SkyParameters::toJson() const { @@ -149,6 +154,7 @@ Json SkyParameters::toJson() const { {"ambientLightLevel", jsonFromMaybe(skyColoring.maybeRight(), [](Color c) { return jsonFromColor(c); })}, {"spaceLevel", jsonFromMaybe(spaceLevel)}, {"surfaceLevel", jsonFromMaybe(surfaceLevel)}, + {"sunType", sunType}, }; } @@ -163,6 +169,7 @@ void SkyParameters::read(DataStream& ds) { ds >> skyColoring; ds >> spaceLevel; ds >> surfaceLevel; + ds >> sunType; } void SkyParameters::write(DataStream& ds) const { @@ -176,6 +183,7 @@ void SkyParameters::write(DataStream& ds) const { ds << skyColoring; ds << spaceLevel; ds << surfaceLevel; + ds << sunType; } void SkyParameters::readVisitableParameters(VisitableWorldParametersConstPtr visitableParameters) { diff --git a/source/game/StarSkyParameters.hpp b/source/game/StarSkyParameters.hpp index 9618e8d..50b476f 100644 --- a/source/game/StarSkyParameters.hpp +++ b/source/game/StarSkyParameters.hpp @@ -44,6 +44,7 @@ struct SkyParameters { Either skyColoring; Maybe spaceLevel; Maybe surfaceLevel; + String sunType; }; DataStream& operator>>(DataStream& ds, SkyParameters& sky); diff --git a/source/game/StarSkyRenderData.cpp b/source/game/StarSkyRenderData.cpp index 367ca45..53a2c4f 100644 --- a/source/game/StarSkyRenderData.cpp +++ b/source/game/StarSkyRenderData.cpp @@ -95,10 +95,15 @@ List SkyRenderData::frontOrbiters(Vec2F const& viewSize) const { List orbiters; if (type == SkyType::Atmospheric || type == SkyType::Atmosphereless) { + String image; + if (settings.queryBool("sun.dynamicImage.enabled", false) && !skyParameters.sunType.empty()) + image = settings.queryString("sun.dynamicImage.images." + skyParameters.sunType, settings.queryString("sun.image")); + else + image = settings.queryString("sun.image"); orbiters.append({SkyOrbiterType::Sun, - 1.0f, + settings.queryFloat("sun.scale", 1.0f), 0.0f, - settings.queryString("sun.image"), + image, Vec2F::withAngle(orbitAngle, settings.queryFloat("sun.radius")) + viewSize / 2}); } else if (type == SkyType::Orbital) { auto planetCenter = Vec2F(viewSize[0] / 2, 0) diff --git a/source/rendering/StarEnvironmentPainter.cpp b/source/rendering/StarEnvironmentPainter.cpp index 7501f77..b5c514e 100644 --- a/source/rendering/StarEnvironmentPainter.cpp +++ b/source/rendering/StarEnvironmentPainter.cpp @@ -380,21 +380,27 @@ void EnvironmentPainter::drawRay(float pixelRatio, // Sum is used to vary the ray intensity based on sky color // Rays show up more on darker backgrounds, so this scales to remove that float sum = std::pow((color[0] + color[1]) * RayColorDependenceScale, RayColorDependenceLevel); + Vec3B rayColor; + if (sky.settings.queryBool("sun.dynamicImage.enabled", false) && !sky.skyParameters.sunType.empty()) + rayColor = jsonToVec3B(sky.settings.query("sun.dynamicImage.rayColors." + sky.skyParameters.sunType, sky.settings.query("sun.rayColor", JsonArray{RayColor[0], RayColor[1], RayColor[2]}))); + else + rayColor = jsonToVec3B(sky.settings.query("sun.rayColor", JsonArray{RayColor[0], RayColor[1], RayColor[2]})); + float sunScale = sky.settings.queryFloat("sun.scale", 1.0f); m_renderer->immediatePrimitives().emplace_back(std::in_place_type_t(), TexturePtr(), - RenderVertex{start + Vec2F(std::cos(angle + width), std::sin(angle + width)) * length, {}, Vec4B(RayColor, 0), 0.0f}, - RenderVertex{start + Vec2F(std::cos(angle + width), std::sin(angle + width)) * SunRadius * pixelRatio, + RenderVertex{start + Vec2F(std::cos(angle + width), std::sin(angle + width)) * length, {}, Vec4B(rayColor, 0), 0.0f}, + RenderVertex{start + Vec2F(std::cos(angle + width), std::sin(angle + width)) * SunRadius * sunScale * pixelRatio, {}, - Vec4B(RayColor, + Vec4B(rayColor, (int)(RayMinUnscaledAlpha + std::abs(m_rayPerlin.get(angle * 896 + time * 30) * RayUnscaledAlphaVariance)) * sum * alpha), 0.0f}, - RenderVertex{start + Vec2F(std::cos(angle), std::sin(angle)) * SunRadius * pixelRatio, + RenderVertex{start + Vec2F(std::cos(angle), std::sin(angle)) * SunRadius * sunScale * pixelRatio, {}, - Vec4B(RayColor, + Vec4B(rayColor, (int)(RayMinUnscaledAlpha + std::abs(m_rayPerlin.get(angle * 626 + time * 30) * RayUnscaledAlphaVariance)) * sum * alpha), 0.0f}, - RenderVertex{start + Vec2F(std::cos(angle), std::sin(angle)) * length, {}, Vec4B(RayColor, 0), 0.0f}); + RenderVertex{start + Vec2F(std::cos(angle), std::sin(angle)) * length, {}, Vec4B(rayColor, 0), 0.0f}); } void EnvironmentPainter::drawOrbiter(float pixelRatio, Vec2F const& screenSize, SkyRenderData const& sky, SkyOrbiter const& orbiter) { diff --git a/source/rendering/StarWorldPainter.cpp b/source/rendering/StarWorldPainter.cpp index e106307..15fb9b9 100644 --- a/source/rendering/StarWorldPainter.cpp +++ b/source/rendering/StarWorldPainter.cpp @@ -66,10 +66,13 @@ void WorldPainter::render(WorldRenderData& renderData, function lightWai m_environmentPainter->renderStars(starAndDebrisRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); m_environmentPainter->renderDebrisFields(starAndDebrisRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); - m_environmentPainter->renderBackOrbiters(orbiterAndPlanetRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); + if (renderData.skyRenderData.type != SkyType::Atmosphereless) + m_environmentPainter->renderBackOrbiters(orbiterAndPlanetRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); m_environmentPainter->renderPlanetHorizon(orbiterAndPlanetRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); m_environmentPainter->renderSky(Vec2F(m_camera.screenSize()), renderData.skyRenderData); m_environmentPainter->renderFrontOrbiters(orbiterAndPlanetRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); + if (renderData.skyRenderData.type == SkyType::Atmosphereless) + m_environmentPainter->renderBackOrbiters(orbiterAndPlanetRatio, Vec2F(m_camera.screenSize()), renderData.skyRenderData); m_renderer->flush();