UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
FAQ
Programming
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes

Unigine::LightWorld Class

Header: #include <UnigineLights.h>
Inherits: Light

This class is used to create world light sources. This type of light source imitates sunlight and uses parallel-split shadow mapping.

Example#

The following code illustrates how to create a world light source and set its parameters (intensity scattering, etc.).

Source code (C++)
#include <UnigineLights.h>
using namespace Unigine;

/* .. */

// creating a world light source and setting its color to white (1.0f, 1.0f, 1.0f, 1.0f)
LightWorldPtr thesun = LightWorld::create(Math::vec4(1.0f, 1.0f, 1.0f, 1.0f));

// setting the name of the world light
thesun->setName("Sun");
	
// setting disable angle of the world light
thesun->setDisableAngle(90.0f);

// setting light intensity
thesun->setIntensity(1.0f);
	
// setting scattering type to sun scattering
thesun->setScattering(LightWorld::SCATTERING_SUN);

Setting Position#

A world light is an infinitely distant light source, so its physical position is not important, only the direction matters, as it defines orientation of shadows. You can change the light's direction via the setRotation() method.

Let's illustrate that by setting the correct position of the Sun for a certain geographic location (latitude, longitude), date and time. To calculate elevation and azimuth values let's use the following sunPosition() function:

sunPosition() function:

Source code (C++)
using namespace Unigine;
/// function calculating azimuth and elevation for the specified date, time (GMT) and geo-coordinates (https://stackoverflow.com/questions/8708048/position-of-the-sun-given-time-of-day-latitude-and-longitude)
void sunPosition(double & elevation, double& azimuth, double lat, double lon, int year = 2012, int month = 12, int day = 22, double hour = 12, int min = 00, int sec = 00) {
	double pi = 3.141592650f;
	double twopi = 2 * pi;
	double deg2rad = pi / 180.0f;

	// get a day of the year, e.g. Feb 1 = 32, Mar 1 = 61 on leap years
	int month_days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
	for (int i = 0; i<month; i++)
		day += month_days[i];
	int leapdays = (year % 4) == 0 && ((year % 400) == 0 || (year % 100) != 0) && day >= 60 && !(month == 2 && day == 60);
	if (leapdays > 0) day++;

	// Get Julian date - 2400000
	hour += min / 60.0f + sec / 3600.0f; // hour plus fraction
	double delta = year - 1949.0f;
	double leap = int(delta / 4.0f); // former leapyears
	double jd = 32916.5f + delta * 365 + leap + day + hour / 24.0f;

	// calculating input for the Atronomer's almanach as the difference between
	// the Julian date and JD 2451545.0 (noon, 1 January 2000)
	double time = jd - 51545.0f;

	// caclulating mean longitude and mean anomaly
	double mnlong = 280.460f + 0.9856474f * time;
	mnlong = remainder(mnlong, 360);
	if (mnlong < 0) mnlong += 360;
	double mnanom = 357.528f + 0.9856003f * time;
	mnanom = remainder(mnanom, 360);
	if (mnanom < 0) mnanom += 360;
	mnanom *= deg2rad;

	// caclulating ecliptic longitude and obliquity of ecliptic
	double eclong = mnlong + 1.915f * Math::sin(mnanom) + 0.020f * Math::sin(2 * mnanom);
	eclong = remainder(eclong, 360);
	if (eclong < 0) eclong += 360;
	double oblqec = 23.439f - 0.0000004f * time;
	eclong *= deg2rad;
	oblqec *= deg2rad;

	// calculating celestial coordinates: right ascension and declination
	double num = Math::cos(oblqec) * Math::sin(eclong);
	double den = Math::cos(eclong);
	double ra = Math::atan(num / den);
	if (den < 0) ra += pi;
	if (den >= 0 && num < 0) ra += twopi;
	double dec = Math::asin(Math::sin(oblqec) * Math::sin(eclong));

	// calculating local coordinates Greenwich mean sidereal time
	double gmst = 6.697375f + 0.0657098242f * time + hour;
	gmst = remainder(gmst, 24);
	if (gmst < 0) gmst += 24.0f;

	// calculating local mean sidereal time
	double lmst = gmst + lon / 15.0f;
	lmst = remainder(lmst, 24);
	if (lmst < 0) lmst += 24.0f;
	lmst = lmst * 15.0f * deg2rad;

	// calulating hour angle
	double ha = lmst - ra;
	if (ha < -pi) ha += twopi;
	if (ha > pi) ha -= twopi;

	// converting latitude to radians
	lat = lat * deg2rad;

	// calculating azimuth and elevation
	elevation = Math::asin(Math::sin(dec) * Math::sin(lat) + Math::cos(dec) * Math::cos(lat) * Math::cos(ha));
	azimuth = Math::asin(-Math::cos(dec) * Math::sin(ha) / Math::cos(elevation));

	// for logic and names, see Spencer, J.W. 1989. Solar Energy. 42(4):353
	int cosAzPos = (0 <= Math::sin(dec) - Math::sin(elevation) * Math::sin(lat));
	int sinAzNeg = (Math::sin(azimuth) < 0);
	if (cosAzPos && sinAzNeg) azimuth += twopi;
	if (!cosAzPos) azimuth = pi - azimuth;

	// return elevation and azimuth
	elevation = elevation / deg2rad;
	azimuth = azimuth / deg2rad;
}

Thus, we can simply set the position of the Sun as follows:

Source code (C++)
int AppWorldLogic::init() {
	/* ... */
	
	// geo-coordinates of a point (latitude and longitude)
	double lat = 56.49771;
	double lon = 84.97437;

	// elevation and azimuth to store calculated values
	double elevation, azimuth;
	
	// getting the default world light source named "sun"
	LightWorldPtr sun = LightWorld::cast(Editor::get()->getNodeByName("sun"));
	if (sun) 
	{
		// calculating azimuth and elevation
		// for the specified date,
		// GMT time and geo-coordinates
		sunPosition(elevation,azimuth, lat, lon, 
					2019, 2, 5, 				// February 5, 2019
					4, 0, 0);					// 04:00:00 (GMT)
		
		// setting real Sun position for the calculated azimuth and elevation values 
		sun->setRotation( quat(90,270,270) * quat(azimuth,0,0) * quat(0,90,0) * quat(elevation,0,0) * quat(90,0,0) );
	}

	return 1;
}

LightWorld Class

Members


static LightWorldPtr create ( const Math::vec4 & color ) #

Constructor. Creates a new world light source with a given color.

Arguments

  • const Math::vec4 & color - Color of the new light source.

static Ptr<LightWorld> cast ( const Ptr<Node> & node ) #

Casts a LightWorld out of the Node instance.

Arguments

  • const Ptr<Node> & node - Pointer to Node.

Return value

Pointer to LightWorld.

static Ptr<LightWorld> cast ( const Ptr<Light> & base ) #

Casts a LightWorld out of the Light instance.

Arguments

  • const Ptr<Light> & base - Pointer to Light.

Return value

Pointer to LightWorld.

void setMode ( int mode ) #

Sets rendering mode for the light source. This option determines whether the light is to be rendered as a dynamic or static one.

Arguments

  • int mode - Light mode, one of the MODE_* variables.

int getMode ( ) #

Returns the current rendering mode for the light source. This option determines whether the light is to be rendered as a dynamic or static one.

Return value

Light mode, one of the MODE_* variables.

void setDisableAngle ( float angle ) #

Sets an angle at which the light source is disabled (shadows and the diffuse component is disabled). However, the light source still affects scattering.

Arguments

  • float angle - Angle at which the light source is disabled.

float getDisableAngle ( ) #

Returns an angle at which the light source is disabled (shadows and the diffuse component is disabled). However, the light source still affects scattering.

Return value

Angle at at which the light source is disabled.

void setNumShadowCascades ( int cascades ) #

Sets the number of shadow cascades with different shadow maps. All the shadow maps have the same resolution, but are applied to different cascades. Thus, close-range shadows are of higher quality and distant ones of lower.

Arguments

  • int cascades - Number of shadow cascades. Accepted values are from 1 to 4. The default is 4.

int getNumShadowCascades ( ) #

Returns the number of shadow cascades with different shadow maps. All the shadow maps have the same resolution, but are applied to different cascades. Thus, close-range shadows are of higher quality and distant ones of lower.

Return value

The number of shadow cascades. The minimum number of cascades is 1, the maximum is 4.

void setScattering ( int scattering ) #

Sets a lighting type for the world light.

Arguments

int getScattering ( ) #

Returns a lighting type set for the world light.

Return value

One of the SCATTERING_* variables.

void setShadowCascadeMode ( int mode ) #

Sets the shadow cascade generation mode for the world light source. There are two modes available:
  • Dynamic - shadow cascades are built dynamically relative to the camera's position.
  • Static - shadow cascades are built relative to the world light's position and baked. This mode is suitable for archviz projects.

Arguments

int getShadowCascadeMode ( ) #

Returns the current shadow cascade generation mode for the world light source. There are two modes available:
  • Dynamic - shadow cascades are built dynamically relative to the camera's position.
  • Static - shadow cascades are built relative to the world light's position and baked. This mode is suitable for archviz projects.

Return value

Shadow cascade mode, one of the SHADOW_CASCADE_MODE_* variables.

void setShadowCascadeBorder ( int num, float r ) #

Sets the multiplier for the distance to the border of the specified shadow cascade at which the corresponding shadows are rendered.

Arguments

  • int num - The number of the cascade in range [0;num_cascades-1].
  • float r - Distance multiplier to be set, in range [0; 1].

float getShadowCascadeBorder ( int num ) #

Returns the multiplier for the distance to the border of the specified shadow cascade at which the corresponding shadows are rendered.

Arguments

  • int num - The number of the cascade in range [0;num_cascades-1].

Return value

Current distance multiplier, in range [0;1].

void setShadowHeight ( float height ) #

Sets the view height of the orthographic projection used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Arguments

  • float height - View height of the orthographic projection used for shadow cascade generation, in units.

float getShadowHeight ( ) #

Returns the current view height of the orthographic projection used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Return value

Current view height of the orthographic projection used for shadow cascade generation, in units.

void setShadowWidth ( float width ) #

Sets the view width of the orthographic projection used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Arguments

  • float width - View width of the orthographic projection used for shadow cascade generation, in units.

float getShadowWidth ( ) #

Returns the current view width of the orthographic projection used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Return value

Current view width of the orthographic projection used for shadow cascade generation, in units.

void setShadowZFar ( float zfar ) #

Sets the distance to the far clipping plane to be used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Arguments

  • float zfar - Distance to the far clipping plane to be used, in units.

float getShadowZFar ( ) #

Returns the current distance to the far clipping plane used for generation of static shadow cascades. Static cascades are generated relative to the world light's position.
Notice
This parameter is available only when the shadow cascade mode of the world light is set to static.

Return value

Distance to the far clipping plane currently used, in units.

static int type ( ) #

Returns the type of the node.

Return value

Light type identifier.
Last update: 2019-07-18