From d2f49a124fae47ee75ceb8a1511674d2522f78b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Thu, 26 Dec 2013 16:35:29 +0100 Subject: [PATCH] Added moon basic lighting --- .../software/AtmosphereModelBruneton.cpp | 9 +++++++- src/render/software/NightSky.cpp | 21 ++++++++++++++----- src/render/software/TerrainRenderer.cpp | 6 ++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/render/software/AtmosphereModelBruneton.cpp b/src/render/software/AtmosphereModelBruneton.cpp index 1a21ad5..330e155 100644 --- a/src/render/software/AtmosphereModelBruneton.cpp +++ b/src/render/software/AtmosphereModelBruneton.cpp @@ -1254,7 +1254,14 @@ void AtmosphereModelBruneton::fillLightingStatus(LightStatus *status, const Vect Vector3 s = sun_position.sub(x).normalize(); muS = up.dotProduct(s); - sun.color = _transmittanceWithShadow(r0, muS); + if (altitude * WORLD_SCALING > RL) + { + sun.color = parent->getScenery()->getAtmosphere()->sun_color; + } + else + { + sun.color = _transmittanceWithShadow(r0, muS); + } sun.direction = s.scale(-1.0); sun.reflection = ISun; sun.altered = 1; diff --git a/src/render/software/NightSky.cpp b/src/render/software/NightSky.cpp index a8bfa72..8376ab5 100644 --- a/src/render/software/NightSky.cpp +++ b/src/render/software/NightSky.cpp @@ -3,6 +3,14 @@ #include "Color.h" #include "Vector3.h" #include "Geometry.h" +#include "SoftwareRenderer.h" +#include "SurfaceMaterial.h" + +#define WORLD_SCALING 0.05 +#define MOON_DISTANCE 384403.0 +#define MOON_DISTANCE_SCALED (MOON_DISTANCE / WORLD_SCALING) +#define MOON_RADIUS 1737.4 +#define MOON_RADIUS_SCALED (MOON_RADIUS / WORLD_SCALING) NightSky::NightSky(SoftwareRenderer* renderer): renderer(renderer) @@ -26,19 +34,22 @@ const Color NightSky::getColor(double altitude, const Vector3 &direction) // Get stars // Get moon - Vector3 moon_direction(0.3, 0.4, -0.3); - moon_direction.normalize(); + Vector3 moon_direction = Vector3(0.9, 0.5, -0.6).normalize(); if (moon_direction.dotProduct(direction) >= 0) { - Vector3 moon_position = moon_direction.scale(100.0); - double moon_radius = 1.0; + Vector3 moon_position = moon_direction.scale(MOON_DISTANCE_SCALED); + double moon_radius = MOON_RADIUS_SCALED * 5.0; Vector3 hit1, hit2; int hits = Geometry::rayIntersectSphere(location, direction, moon_position, moon_radius, &hit1, &hit2); if (hits > 1) { double dist = hit2.sub(hit1).getNorm() / moon_radius; // distance between intersection points (relative to radius) - Color moon_color(0.3, 0.3, 0.3); + Vector3 nearest = (hit1.sub(location).getNorm() > hit2.sub(location).getNorm()) ? hit2 : hit1; + SurfaceMaterial moon_material(Color(3.0, 3.0, 3.0, 1.0)); + moon_material.validate(); + + Color moon_color = renderer->applyLightingToSurface(nearest, nearest.sub(moon_position).normalize(), moon_material); if (dist <= 0.05) { moon_color.a *= 1.0 - dist / 0.05; diff --git a/src/render/software/TerrainRenderer.cpp b/src/render/software/TerrainRenderer.cpp index cd55247..66ad070 100644 --- a/src/render/software/TerrainRenderer.cpp +++ b/src/render/software/TerrainRenderer.cpp @@ -192,6 +192,12 @@ bool TerrainRenderer::applyLightFilter(LightComponent &light, const Vector3 &at) Vector3 inc_vector, direction_to_light, cursor; double inc_value, inc_base, inc_factor, height, diff, light_factor, smoothing, length; + if (at.y > definition->getHeightInfo().max_height) + { + // Location is above terrain, don't bother + return true; + } + direction_to_light = light.direction.scale(-1.0); if (direction_to_light.y < -0.05) {