#region License /* FNA - XNA4 Reimplementation for Desktop Platforms * Copyright 2009-2016 Ethan Lee and the MonoGame Team * * Released under the Microsoft Public License. * See LICENSE for details. */ #endregion #region Using Statements using System; using System.Runtime.InteropServices; #endregion namespace Microsoft.Xna.Framework.Graphics { public class TextureCube : Texture { #region Public Properties /// /// Gets the width and height of the cube map face in pixels. /// /// The width and height of a cube map face in pixels. public int Size { get; private set; } #endregion #region Public Constructor public TextureCube( GraphicsDevice graphicsDevice, int size, bool mipMap, SurfaceFormat format ) { if (graphicsDevice == null) { throw new ArgumentNullException("graphicsDevice"); } GraphicsDevice = graphicsDevice; Size = size; LevelCount = mipMap ? CalculateMipLevels(size) : 1; Format = format; texture = GraphicsDevice.GLDevice.CreateTextureCube( format, size, LevelCount ); } #endregion #region Public SetData Methods public void SetData( CubeMapFace cubeMapFace, T[] data ) where T : struct { SetData( cubeMapFace, 0, null, data, 0, data.Length ); } public void SetData( CubeMapFace cubeMapFace, T[] data, int startIndex, int elementCount ) where T : struct { SetData( cubeMapFace, 0, null, data, startIndex, elementCount ); } public void SetData( CubeMapFace cubeMapFace, int level, Rectangle? rect, T[] data, int startIndex, int elementCount ) where T : struct { if (data == null) { throw new ArgumentNullException("data"); } int xOffset, yOffset, width, height; if (rect.HasValue) { xOffset = rect.Value.X; yOffset = rect.Value.Y; width = rect.Value.Width; height = rect.Value.Height; } else { xOffset = 0; yOffset = 0; width = Math.Max(1, Size >> level); height = Math.Max(1, Size >> level); } GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); GraphicsDevice.GLDevice.SetTextureDataCube( texture, Format, xOffset, yOffset, width, height, cubeMapFace, level, handle.AddrOfPinnedObject(), startIndex, elementCount, Marshal.SizeOf(typeof(T)) ); handle.Free(); } #endregion #region Public GetData Method public void GetData( CubeMapFace cubeMapFace, T[] data ) where T : struct { GetData( cubeMapFace, 0, null, data, 0, data.Length ); } public void GetData( CubeMapFace cubeMapFace, T[] data, int startIndex, int elementCount ) where T : struct { GetData( cubeMapFace, 0, null, data, startIndex, elementCount ); } public void GetData( CubeMapFace cubeMapFace, int level, Rectangle? rect, T[] data, int startIndex, int elementCount ) where T : struct { if (data == null || data.Length == 0) { throw new ArgumentException("data cannot be null"); } if (data.Length < startIndex + elementCount) { throw new ArgumentException( "The data passed has a length of " + data.Length.ToString() + " but " + elementCount.ToString() + " pixels have been requested." ); } GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); GraphicsDevice.GLDevice.GetTextureDataCube( texture, Format, Size, cubeMapFace, level, rect, handle.AddrOfPinnedObject(), startIndex, elementCount, Marshal.SizeOf(typeof(T)) ); handle.Free(); } #endregion } }