Files
aya/engine/3d/src/LightingParameters.hpp
2025-12-17 16:47:48 +00:00

159 lines
4.1 KiB
C++

/**
@file LightingParameters.h
@maintainer Morgan McGuire, matrix@graphics3d.com
@created 2002-10-05
@edited 2005-06-01
Copyright 2000-2005, Morgan McGuire.
All rights reserved.
*/
#ifndef G3D_LIGHTINGPARAMETERS_H
#define G3D_LIGHTINGPARAMETERS_H
#include "platform.hpp"
#include "Color3.hpp"
#include "Vector3.hpp"
#include "CoordinateFrame.hpp"
#include "GLight.hpp"
namespace G3D
{
#define BROWN_UNIVERSITY_LATITUDE 41.7333f
#define BROWN_UNIVERSITY_LONGITUDE 71.4333f
/* Initital star offset on Jan 1 1970 midnight */
/* Definition of a sidereal day */
#define SIDEREAL_DAY ((23 * HOUR) + (56 * MINUTE) + (4.071f * SECOND))
/**
Provides a reasonable (but not 100% physically correct) set of lighting
parameters based on the time of day. See also G3D::Lighting, which describes
a rich lighting environment.
*/
class LightingParameters
{
public:
/** Multiply this by all emissive values when rendering.
Some algorithms (e.g. contrib/ArticulatedModel/ToneMap) scale
down light intensity to preserve dynamic range.*/
Color3 emissiveScale;
/** Modulate sky box color */
Color3 skyAmbient;
/**
Use this for objects that do not receive directional lighting
(e.g. billboards).
*/
Color3 diffuseAmbient;
/**
Directional light color.
*/
Color3 lightColor;
Color3 ambient;
/** Only one light source, the sun or moon, is active at a given time. */
Vector3 lightDirection;
enum
{
SUN,
MOON
} source;
/** Using physically correct parameters. When false, the sun and moon
travel in a perfectly east-west arc where +x = east and -x = west. */
bool physicallyCorrect;
/** The vector <B>to</B> the sun */
Vector3 trueSunPosition;
Vector3 sunPosition;
/** The vector <B>to</B> the moon */
Vector3 trueMoonPosition;
Vector3 moonPosition;
double moonPhase;
/** The coordinate frame and vector related to the starfield */
CoordinateFrame starFrame;
CoordinateFrame trueStarFrame;
Vector3 starVec;
/* Geographic position */
float geoLatitude;
// float geoLongitude;
Color3 skyAmbient2; // used for some cheap sky gradient (secondary, horizon-level color) -- Max
LightingParameters();
/**
Sets light parameters for the sun/moon based on the
specified time since midnight, as well as geographic
latitude for starfield orientation (positive for north
of the equator and negative for south) and geographic
longitude for sun positioning (postive for east of
Greenwich, and negative for west). The latitude and
longitude is set by default to that of Providence, RI,
USA.
*/
LightingParameters(const GameTime _time, bool _physicallyCorrect = true, float _latitude = BROWN_UNIVERSITY_LATITUDE);
void setTime(const GameTime _time);
void setLatitude(float _latitude);
/**
Returns a directional light composed from the light direction
and color.
*/
GLight directionalLight() const;
};
/** A rich environment lighting model that contains both global and local sources.
See also LightingParameters, a class that describes a sun and moon lighting
model. */
class Lighting
{
private:
Lighting()
: emissiveScale(Color3::white())
{
}
public:
/** Multiply this by all emissive values when rendering.
Some algorithms (e.g. contrib/ArticulatedModel/ToneMap) scale
down light intensity to preserve dynamic range.*/
Color3 emissiveScale;
/** Light reflected from the sky (usually slightly blue) */
Color3 ambientTop;
/** Light reflected from the ground. A simpler code path is taken
if identical to ambientTop. */
Color3 ambientBottom;
/** Color to modulate environment map by */
Color3 environmentMapColor;
/** Local illumination sources that do not cast shadows. */
Array<GLight> lightArray;
/** Local illumination sources that cast shadows. */
Array<GLight> shadowedLightArray;
/** Creates a (dark) environment. */
static Lighting* create()
{
return new Lighting();
}
};
} // namespace G3D
#endif