From e6fc00a8adec84ebdb309a7d0e1b993d079e1f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Fri, 22 Jan 2016 00:40:42 +0100 Subject: [PATCH] Moon's fractal noise is not saved in scenery This will make the moon rendering repeatable --- src/definition/AtmosphereDefinition.cpp | 2 ++ src/definition/CelestialBodyDefinition.cpp | 2 ++ src/definition/CelestialBodyDefinition.h | 4 ++++ src/render/software/MoonRenderer.cpp | 18 +++++++++--------- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/definition/AtmosphereDefinition.cpp b/src/definition/AtmosphereDefinition.cpp index fff300b..18ecb79 100644 --- a/src/definition/AtmosphereDefinition.cpp +++ b/src/definition/AtmosphereDefinition.cpp @@ -6,6 +6,7 @@ #include "PackStream.h" #include "RandomGenerator.h" #include "FloatNode.h" +#include "NoiseNode.h" #include "GodRaysDefinition.h" #include "CelestialBodyDefinition.h" @@ -108,6 +109,7 @@ void AtmosphereDefinition::applyPreset(AtmospherePreset preset, RandomGenerator moon->propRadius()->setValue(1737.4 * Scenery::KM_TO_UNIT); moon->propPhi()->setValue(0.5); moon->propTheta()->setValue(0.3); + moon->propNoise()->setConfig(0.4, 0.2, 0.8, 1.1); model = ATMOSPHERE_MODEL_BRUNETON; diff --git a/src/definition/CelestialBodyDefinition.cpp b/src/definition/CelestialBodyDefinition.cpp index d67a091..a45b5c2 100644 --- a/src/definition/CelestialBodyDefinition.cpp +++ b/src/definition/CelestialBodyDefinition.cpp @@ -4,6 +4,7 @@ #include "Vector3.h" #include "FloatNode.h" #include "Scenery.h" +#include "NoiseNode.h" CelestialBodyDefinition::CelestialBodyDefinition(DefinitionNode *parent, const string &name) : DefinitionNode(parent, name) { @@ -11,6 +12,7 @@ CelestialBodyDefinition::CelestialBodyDefinition(DefinitionNode *parent, const s phi = new FloatNode(this, "phi"); theta = new FloatNode(this, "theta"); radius = new FloatNode(this, "radius"); + noise = new NoiseNode(this, "noise"); } Vector3 CelestialBodyDefinition::getGlobalDirection() const { diff --git a/src/definition/CelestialBodyDefinition.h b/src/definition/CelestialBodyDefinition.h index 8a4bd7e..e7191a4 100644 --- a/src/definition/CelestialBodyDefinition.h +++ b/src/definition/CelestialBodyDefinition.h @@ -24,6 +24,9 @@ class DEFINITIONSHARED_EXPORT CelestialBodyDefinition : public DefinitionNode { inline FloatNode *propRadius() const { return radius; } + inline NoiseNode *propNoise() const { + return noise; + } /** * Get the normalized direction of the celestial body, from the center of the earth. @@ -48,6 +51,7 @@ class DEFINITIONSHARED_EXPORT CelestialBodyDefinition : public DefinitionNode { FloatNode *phi; FloatNode *theta; FloatNode *radius; + NoiseNode *noise; }; } } diff --git a/src/render/software/MoonRenderer.cpp b/src/render/software/MoonRenderer.cpp index 6e60a34..97899ef 100644 --- a/src/render/software/MoonRenderer.cpp +++ b/src/render/software/MoonRenderer.cpp @@ -7,16 +7,14 @@ #include "Geometry.h" #include "SurfaceMaterial.h" #include "FloatNode.h" -#include "NoiseFunctionSimplex.h" +#include "FractalNoise.h" +#include "NoiseNode.h" class MoonRenderer::pimpl { public: pimpl() : definition(NULL, "moon") { - // TODO Put noise in scenery - noise.setScaling(0.2); } CelestialBodyDefinition definition; - NoiseFunctionSimplex noise; }; MoonRenderer::MoonRenderer(CelestialBodyDefinition *moon_node) : DefinitionWatcher("MoonRenderer"), impl(new pimpl()) { @@ -35,7 +33,7 @@ void MoonRenderer::nodeChanged(const DefinitionNode *, const DefinitionDiff *, c bool MoonRenderer::getLightsAt(vector &result, const Vector3 &location) const { LightComponent light; - // TODO Don't add if its contribution is negligible + // TODO Don't add if its contribution is negligible or below horizon // TODO Take moon phase into account light.color = Color(0.03, 0.03, 0.03); @@ -63,21 +61,23 @@ Color MoonRenderer::getColor(const Vector3 &eye, const Vector3 &direction, Light auto p1 = nearest.sub(moon_location).normalize(); auto coords = p1.toSpherical(); + auto noise = impl->definition.propNoise()->getGenerator(); + double precision = 0.00001; coords.phi += precision; auto p2 = Vector3(coords); - p2 = p2.scale(1.0 - precision * fabs(impl->noise.get3d(0.01, p2.x, p2.y, p2.z))); + p2 = p2.scale(1.0 - precision * fabs(noise->get3d(0.01, p2.x, p2.y, p2.z))); coords.phi -= precision; coords.theta += precision; auto p3 = Vector3(coords); - p3 = p3.scale(1.0 - precision * fabs(impl->noise.get3d(0.01, p3.x, p3.y, p3.z))); + p3 = p3.scale(1.0 - precision * fabs(noise->get3d(0.01, p3.x, p3.y, p3.z))); auto normal = p1.getNormal3(p2, p3); - double gradient = - 2.3 + 8.0 * impl->noise.get3d(0.01, 0.3 * p1.x + 12.0, 0.3 * p1.y - 4.8, -0.3 * p1.z + 7.4); + double gradient = 2.0 + 10.0 * noise->get3d(0.01, 0.3 * p1.x + 12.0, 0.3 * p1.y - 4.8, -0.3 * p1.z + 7.4); SurfaceMaterial material(Color(gradient, gradient, gradient)); + material.hardness = 0.3; auto moon_color = lighting->apply(eye, nearest, normal, material); if (dist <= 0.05) {