#region File Description
//-----------------------------------------------------------------------------
// Sky.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
#endregion
namespace GeneratedGeometry
{
///
/// Runtime class for loading and rendering a textured skydome
/// that was created during the build process by the SkyProcessor.
///
public class Sky
{
#region Fields
public Model Model;
public Texture2D Texture;
// The sky texture is a cylinder, so it should wrap from left to right,
// but not from top to bottom. This requires a custom sampler state object.
static readonly SamplerState WrapUClampV = new SamplerState
{
AddressU = TextureAddressMode.Wrap,
AddressV = TextureAddressMode.Clamp,
};
#endregion
///
/// Helper for drawing the skydome mesh.
///
public void Draw(Matrix view, Matrix projection)
{
GraphicsDevice device = Texture.GraphicsDevice;
// Set renderstates for drawing the sky. For maximum efficiency, we draw the sky
// after everything else, with depth mode set to read only. This allows the GPU to
// entirely skip drawing sky in the areas that are covered by other solid objects.
device.DepthStencilState = DepthStencilState.DepthRead;
device.SamplerStates[0] = WrapUClampV;
device.BlendState = BlendState.Opaque;
// Because the sky is infinitely far away, it should not move sideways as the camera
// moves around the world, so we force the view matrix translation to zero. This
// way the sky only takes the camera rotation into account, ignoring its position.
view.Translation = Vector3.Zero;
// The sky should be drawn behind everything else, at the far clip plane.
// We achieve this by tweaking the projection matrix to force z=w.
projection.M13 = projection.M14;
projection.M23 = projection.M24;
projection.M33 = projection.M34;
projection.M43 = projection.M44;
// Draw the sky model.
foreach (ModelMesh mesh in Model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.View = view;
effect.Projection = projection;
effect.Texture = Texture;
effect.TextureEnabled = true;
}
mesh.Draw();
}
// Set modified renderstates back to their default values.
device.DepthStencilState = DepthStencilState.Default;
device.SamplerStates[0] = SamplerState.LinearWrap;
}
}
}