//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
using System;
using System.Runtime.CompilerServices;
namespace BansheeEngine
{
/** @addtogroup Rendering
* @{
*/
///
/// Base class for all textures. Contains a set of pixels of certain dimensions that can be used for rendering
/// or read/written directly.
///
public class Texture : Resource
{
///
/// Returns the pixel format for the texture surface.
///
public PixelFormat PixelFormat
{
get
{
PixelFormat value;
Internal_GetPixelFormat(mCachedPtr, out value);
return value;
}
}
///
/// Returns a value that signals the engine in what way is the texture expected to be used.
///
public TextureUsage Usage
{
get
{
TextureUsage value;
Internal_GetUsage(mCachedPtr, out value);
return value;
}
}
///
/// Width of the texture in pixels.
///
public int Width
{
get
{
int value;
Internal_GetWidth(mCachedPtr, out value);
return value;
}
}
///
/// Height of the texture in pixels.
///
public int Height
{
get
{
int value;
Internal_GetHeight(mCachedPtr, out value);
return value;
}
}
///
/// Determines does the texture contain gamma corrected data. If true then the GPU will automatically convert
/// the pixels to linear space before reading from the texture, and convert them to gamma space when writing
/// to the texture.
///
public bool GammaCorrection
{
get
{
bool value;
Internal_GetGammaCorrection(mCachedPtr, out value);
return value;
}
}
///
/// Number of samples per pixel. Zero or one mean no multisampling will be used.
///
public int SampleCount
{
get
{
int value;
Internal_GetSampleCount(mCachedPtr, out value);
return value;
}
}
///
/// Returns how many mipmap levels does the texture contain.
///
public int MipmapCount
{
get
{
int value;
Internal_GetMipmapCount(mCachedPtr, out value);
return value;
}
}
///
/// Constructor for the internal use by the runtime.
///
private Texture()
{ }
///
/// Creates a new blank 2D texture.
///
/// Width of the texture in pixels.
/// Height of the texture in pixels.
/// Format of the pixels.
/// Describes planned texture use.
/// If higher than 1, texture containing multiple samples per pixel is created.
/// Should the texture allocate memory for the entire mip-map chain or only the top level.
///
/// If true the texture data is assumed to have be gamma corrected and will be
/// converted back to linear space when sampled on GPU, and converted to gamma space
/// before being written by the GPU.
public static Texture Create2D(int width, int height, PixelFormat format = PixelFormat.R8G8B8A8,
TextureUsage usage = TextureUsage.Default, int numSamples = 1, bool hasMipmaps = false,
bool gammaCorrection = false)
{
Texture texture = new Texture();
Internal_CreateInstance(texture, format, width, height, 1, TextureType.Texture2D, usage, numSamples,
hasMipmaps, gammaCorrection);
return texture;
}
///
/// Creates a new blank 3D texture.
///
/// Width of the texture in pixels.
/// Height of the texture in pixels.
/// Depth of the texture in pixels.
/// Format of the pixels.
/// Describes planned texture use.
/// Should the texture allocate memory for the entire mip-map chain or only the top level.
///
public static Texture Create3D(int width, int height, int depth, PixelFormat format = PixelFormat.R8G8B8A8,
TextureUsage usage = TextureUsage.Default, bool hasMipmaps = false)
{
Texture texture = new Texture();
Internal_CreateInstance(texture, format, width, height, depth, TextureType.Texture3D, usage, 1,
hasMipmaps, false);
return texture;
}
///
/// Creates a new blank cubemap texture.
///
/// Width & height of a single cubemap face in pixels.
/// Format of the pixels.
/// Describes planned texture use.
/// Should the texture allocate memory for the entire mip-map chain or only the top level.
///
/// If true the texture data is assumed to have be gamma corrected and will be
/// converted back to linear space when sampled on GPU, and converted to gamma space
/// before being written by the GPU.
public static Texture CreateCube(int size, PixelFormat format = PixelFormat.R8G8B8A8,
TextureUsage usage = TextureUsage.Default, bool hasMipmaps = false, bool gammaCorrection = false)
{
Texture texture = new Texture();
Internal_CreateInstance(texture, format, size, size, 1, TextureType.TextureCube, usage, 1,
hasMipmaps, gammaCorrection);
return texture;
}
///
/// Returns pixels for the specified mip level & face. Pixels will be read from system memory, which means the
/// texture has to be created with . If the texture was updated from the GPU the
/// pixels retrieved from this method will not reflect that, and you should use instead.
///
/// Mip level to retrieve pixels for. Top level (0) is the highest quality.
/// Face to read the pixels from. Cubemap textures have six faces whose face indices are as
/// specified in the enum. Array textures can have an arbitrary number
/// of faces (if it's a cubemap array it has to be a multiple of 6).
/// A set of pixels for the specified mip level.
public PixelData GetPixels(int mipLevel = 0, int face = 0)
{
return Internal_GetPixels(mCachedPtr, face, mipLevel);
}
///
/// Sets pixels for the specified mip level and face.
///
/// Pixels to assign to the specified mip level. Pixel data must match the mip level size
/// and texture pixel format.
/// Mip level to set pixels for. Top level (0) is the highest quality.
/// Face to set pixels for. Cubemap textures have six faces whose face indices are as
/// specified in the enum. Array textures can have an arbitrary number
/// of faces (if it's a cubemap array it has to be a multiple of 6).
public void SetPixels(PixelData data, int mipLevel = 0, int face = 0)
{
Internal_SetPixels(mCachedPtr, data, face, mipLevel);
}
///
/// Sets pixels for the specified mip level and face.
///
/// Pixels to assign to the specified mip level. Size of the array must match the mip level
/// dimensions. Data is expected to be laid out row by row. Pixels will be automatically
/// converted to the valid pixel format.
/// Mip level to set pixels for. Top level (0) is the highest quality.
/// Face to set pixels for. Cubemap textures have six faces whose face indices are as
/// specified in the enum. Array textures can have an arbitrary number
/// of faces (if it's a cubemap array it has to be a multiple of 6).
public void SetPixels(Color[] data, int mipLevel = 0, int face = 0)
{
Internal_SetPixelsArray(mCachedPtr, data, face, mipLevel);
}
///
/// Reads texture pixels directly from the GPU. This is similar to but the texture doesn't
/// need to be created with , and the data will contain any updates performed by
/// the GPU. This method can be potentially slow as it introduces a CPU-GPU synchronization point. Additionally
/// this method is asynchronous which means the data is not available immediately.
///
/// Mip level to retrieve pixels for. Top level (0) is the highest quality.
/// Face to read the pixels from. Cubemap textures have six faces whose face indices are as
/// specified in the enum. Array textures can have an arbitrary number
/// of faces (if it's a cubemap array it has to be a multiple of 6).
/// object that will contain object when the operation
/// completes.
public AsyncOp GetGPUPixels(int mipLevel = 0, int face = 0)
{
return Internal_GetGPUPixels(mCachedPtr, face, mipLevel);
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetPixelFormat(IntPtr thisPtr, out PixelFormat value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetUsage(IntPtr thisPtr, out TextureUsage value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetWidth(IntPtr thisPtr, out int value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetHeight(IntPtr thisPtr, out int value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetGammaCorrection(IntPtr thisPtr, out bool value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetSampleCount(IntPtr thisPtr, out int value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetMipmapCount(IntPtr thisPtr, out int value);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_CreateInstance(Texture instance, PixelFormat format, int width,
int height, int depth, TextureType texType, TextureUsage usage, int numSamples, bool hasMipmaps,
bool gammaCorrection);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern PixelData Internal_GetPixels(IntPtr thisPtr, int face, int mipLevel);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern AsyncOp Internal_GetGPUPixels(IntPtr thisPtr, int face, int mipLevel);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetPixels(IntPtr thisPtr, PixelData data, int face, int mipLevel);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_SetPixelsArray(IntPtr thisPtr, Color[] data, int face, int mipLevel);
}
///
/// Flags that describe how is a texture used.
///
public enum TextureUsage // Note: Must match C++ enum TextureUsage
{
///
/// A regular texture that is not often or ever updated from the CPU.
///
Default = 0x1,
///
/// A regular texture that is often updated by the CPU.
///
Dynamic = 0x2,
///
/// Texture that can be rendered to by the GPU.
///
Render = 0x200,
///
/// Texture used as a depth/stencil buffer by the GPU.
///
DepthStencil = 0x400,
///
/// Texture that allows load/store operations from the GPU program.
///
LoadStore = 0x800,
///
/// All mesh data will also be cached in CPU memory, making it available for fast read access from the CPU.
///
CPUCached = 0x1000,
///
/// Allows the CPU to directly read the texture data buffers from the GPU.
///
CPUReadable = 0x2000,
}
///
/// Indices for the faces of a cube texture.
///
public enum CubeFace
{
PositiveX = 0,
NegativeX = 1,
PositiveY = 2,
NegativeY = 3,
PositiveZ = 4,
NegativeZ = 5,
}
///
/// Supported texture types.
///
internal enum TextureType // Note: Must match C++ enum TextureType
{
Texture2D = 2,
Texture3D = 3,
TextureCube = 4
}
/** @} */
}