#region CPL License /* Nuclex Framework Copyright (C) 2002-2009 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; namespace Nuclex.Graphics.SpecialEffects.Sky { /// Renders a skybox consisting of 6 separate faces /// /// /// This class doesn't make any assumptions about the effect and texture you're /// using to render the sky box, it simply takes care of the vertex buffer setup /// and allows you to conveniently render a skybox using your own textures, /// effects and graphics device settings. /// /// /// The skybox vertices do not provide any texture coordinates because the /// texture /// /// public class SkyboxCube : IDisposable { /// Initializes as new skybox cube /// Graphics device the skybox cube lives on public SkyboxCube(GraphicsDevice graphicsDevice) { this.graphicsDevice = graphicsDevice; this.vertexBuffer = new VertexBuffer( graphicsDevice, typeof(SkyboxVertex), vertices.Length, BufferUsage.None ); this.vertexBuffer.SetData(vertices); } /// /// Immediately releases all resources owned by the instance /// public void Dispose() { if(this.vertexBuffer != null) { this.vertexBuffer.Dispose(); this.vertexBuffer = null; } } /// /// Prepares the skybox for drawing by selecting its vertex buffer and adjusting /// the state of the graphics device as neccessary /// public void AssignVertexBuffer() { this.graphicsDevice.SetVertexBuffer(this.vertexBuffer); } /// Draws the northern face of the skybox public void DrawNorthernFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); } /// Draws the eastern face of the skybox public void DrawEasternFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 4, 2); } /// Draws the southern face of the skybox public void DrawSouthernFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 8, 2); } /// Draws the western face of the skybox public void DrawWesternFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 12, 2); } /// Draws the upper face of the skybox public void DrawUpperFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 16, 2); } /// Draws the lower face of the skybox public void DrawLowerFace() { this.graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 20, 2); } /// Vertices used to construct a skybox private static readonly SkyboxVertex[] vertices = { // Northern face new SkyboxVertex(new Vector3(-0.5f, +0.5f, -0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, +0.5f, -0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, -0.5f, -0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, -0.5f), new Vector2(0.0f, 1.0f)), // Eastern face new SkyboxVertex(new Vector3(+0.5f, +0.5f, -0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, +0.5f, +0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, -0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, +0.5f), new Vector2(0.0f, 1.0f)), // Southern face new SkyboxVertex(new Vector3(+0.5f, +0.5f, +0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, +0.5f, +0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, +0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(-0.5f, -0.5f, +0.5f), new Vector2(0.0f, 1.0f)), // Western face new SkyboxVertex(new Vector3(-0.5f, +0.5f, +0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, +0.5f, -0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, -0.5f, +0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(-0.5f, -0.5f, -0.5f), new Vector2(0.0f, 1.0f)), // Upper face new SkyboxVertex(new Vector3(-0.5f, +0.5f, +0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, +0.5f, +0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, +0.5f, -0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(+0.5f, +0.5f, -0.5f), new Vector2(0.0f, 1.0f)), // Lower face new SkyboxVertex(new Vector3(-0.5f, -0.5f, -0.5f), new Vector2(1.0f, 0.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, -0.5f), new Vector2(0.0f, 0.0f)), new SkyboxVertex(new Vector3(-0.5f, -0.5f, +0.5f), new Vector2(1.0f, 1.0f)), new SkyboxVertex(new Vector3(+0.5f, -0.5f, +0.5f), new Vector2(0.0f, 1.0f)) }; /// GraphicsDevice the skybox is rendered with private GraphicsDevice graphicsDevice; /// Vertex buffer storing the vertices of the skybox private VertexBuffer vertexBuffer; } } // namespace Nuclex.Graphics.SpecialEffects.Sky