protected override void OnRender()
{
base.OnRender();
//update camera orientation
{
Vec3 position, forward, up;
Degree cameraFov = ( fov != 0 ) ? fov : Map.Instance.Fov;
if( !FreeCameraEnabled )
{
OnGetCameraTransform( out position, out forward, out up, ref cameraFov );
}
else
{
position = freeCameraPosition;
forward = freeCameraDirection.GetVector();
up = Vec3.ZAxis;
}
if( cameraFov == 0 )
cameraFov = ( fov != 0 ) ? fov : Map.Instance.Fov;
Camera camera = RendererWorld.Instance.DefaultCamera;
camera.NearClipDistance = Map.Instance.NearFarClipDistance.Minimum;
camera.FarClipDistance = Map.Instance.NearFarClipDistance.Maximum;
camera.FixedUp = up;
camera.Fov = cameraFov;
camera.Position = position;
camera.Direction = forward;
}
//update shadow settings
{
Map map = Map.Instance;
map.ShadowTechnique = GameEngineApp.ShadowTechnique;
if( GameEngineApp.ShadowUseMapSettings )
{
GameEngineApp.ShadowFarDistance = map.InitialShadowFarDistance;
GameEngineApp.ShadowColor = map.InitialShadowColor;
}
map.ShadowColor = GameEngineApp.ShadowColor;
map.ShadowFarDistance = GameEngineApp.ShadowFarDistance;
map.Shadow2DTextureCount = GameEngineApp.Shadow2DTextureCount;
map.ShadowCubicTextureCount = GameEngineApp.ShadowCubicTextureCount;
switch( GameEngineApp.Shadow2DTextureSize )
{
case 256: map.Shadow2DTextureSize = Map.ShadowTextureSizes.Size256x256; break;
case 512: map.Shadow2DTextureSize = Map.ShadowTextureSizes.Size512x512; break;
case 1024: map.Shadow2DTextureSize = Map.ShadowTextureSizes.Size1024x1024; break;
case 2048: map.Shadow2DTextureSize = Map.ShadowTextureSizes.Size2048x2048; break;
default: Log.Warning( "Invalid GameEngineApp.Shadow2DTextureSize value." ); break;
}
switch( GameEngineApp.ShadowCubicTextureSize )
{
case 256: map.ShadowCubicTextureSize = Map.ShadowTextureSizes.Size256x256; break;
case 512: map.ShadowCubicTextureSize = Map.ShadowTextureSizes.Size512x512; break;
case 1024: map.ShadowCubicTextureSize = Map.ShadowTextureSizes.Size1024x1024; break;
case 2048: map.ShadowCubicTextureSize = Map.ShadowTextureSizes.Size2048x2048; break;
default: Log.Warning( "Invalid GameEngineApp.ShadowCubicTextureSize value." ); break;
}
}
//update game specific options
{
//water reflection level
foreach( WaterPlane waterPlane in WaterPlane.Instances )
waterPlane.ReflectionLevel = GameEngineApp.WaterReflectionLevel;
//decorative objects
if( DecorativeObjectManager.Instance != null )
DecorativeObjectManager.Instance.Visible = GameEngineApp.ShowDecorativeObjects;
//HeightmapTerrain
//enable simple rendering for Low material scheme.
foreach( HeightmapTerrain terrain in HeightmapTerrain.Instances )
terrain.SimpleRendering = GameEngineApp.MaterialScheme == MaterialSchemes.Low;
}
//update sound listener
if( SoundWorld.Instance != null )
{
Vec3 position, velocity, forward, up;
OnGetSoundListenerTransform( out position, out velocity, out forward, out up );
SoundWorld.Instance.SetListener( position, velocity, forward, up );
}
}