using System;
using System.Runtime.InteropServices;
using System.Collections;
using System.Collections.Generic;
using System.Security;
using SFML.Window;
namespace SFML
{
namespace Graphics
{
////////////////////////////////////////////////////////////
///
/// Simple wrapper for Window that allows easy
/// 2D rendering
///
////////////////////////////////////////////////////////////
public class RenderImage : ObjectBase, RenderTarget
{
////////////////////////////////////////////////////////////
///
/// Create the render image with the given dimensions
///
/// Width of the render image
/// Height of the render image
////////////////////////////////////////////////////////////
public RenderImage(uint width, uint height) :
this(width, height, false)
{
}
////////////////////////////////////////////////////////////
///
/// Create the render image with the given dimensions and
/// an optional depth-buffer attached
///
/// Width of the render image
/// Height of the render image
/// Do you want a depth-buffer attached?
////////////////////////////////////////////////////////////
public RenderImage(uint width, uint height, bool depthBuffer) :
base(sfRenderImage_Create(width, height, depthBuffer))
{
myDefaultView = new View(sfRenderImage_GetDefaultView(This));
myImage = new Image(sfRenderImage_GetImage(This));
myCurrentView = myDefaultView;
GC.SuppressFinalize(myDefaultView);
GC.SuppressFinalize(myImage);
}
////////////////////////////////////////////////////////////
///
/// Width of the rendering region of the image
///
////////////////////////////////////////////////////////////
public uint Width
{
get {return sfRenderImage_GetWidth(This);}
}
////////////////////////////////////////////////////////////
///
/// Height of the rendering region of the image
///
////////////////////////////////////////////////////////////
public uint Height
{
get {return sfRenderImage_GetHeight(This);}
}
////////////////////////////////////////////////////////////
///
/// Activate of deactivate the render image as the current target
/// for rendering
///
/// True to activate, false to deactivate (true by default)
/// True if operation was successful, false otherwise
////////////////////////////////////////////////////////////
public bool SetActive(bool active)
{
return sfRenderImage_SetActive(This, active);
}
////////////////////////////////////////////////////////////
///
/// Default view of the render image
///
////////////////////////////////////////////////////////////
public View DefaultView
{
get {return myDefaultView;}
}
////////////////////////////////////////////////////////////
///
/// Current view active in the render image
///
////////////////////////////////////////////////////////////
public View CurrentView
{
get {return myCurrentView;}
set {myCurrentView = value; sfRenderImage_SetView(This, value.This);}
}
////////////////////////////////////////////////////////////
///
/// Get the viewport of a view applied to this target
///
/// Target view
/// Viewport rectangle, expressed in pixels in the current target
////////////////////////////////////////////////////////////
public IntRect GetViewport(View view)
{
return sfRenderImage_GetViewport(This, view.This);
}
////////////////////////////////////////////////////////////
///
/// Convert a point in target coordinates into view coordinates
/// This version uses the current view of the window
///
/// X coordinate of the point to convert, relative to the target
/// Y coordinate of the point to convert, relative to the target
/// Converted point
///
////////////////////////////////////////////////////////////
public Vector2 ConvertCoords(uint x, uint y)
{
return ConvertCoords(x, y, CurrentView);
}
////////////////////////////////////////////////////////////
///
/// Convert a point in target coordinates into view coordinates
/// This version uses the given view
///
/// X coordinate of the point to convert, relative to the target
/// Y coordinate of the point to convert, relative to the target
/// Target view to convert the point to
/// Converted point
///
////////////////////////////////////////////////////////////
public Vector2 ConvertCoords(uint x, uint y, View view)
{
Vector2 point;
sfRenderImage_ConvertCoords(This, x, y, out point.X, out point.Y, view.This);
return point;
}
////////////////////////////////////////////////////////////
///
/// Clear the entire render image with black color
///
////////////////////////////////////////////////////////////
public void Clear()
{
sfRenderImage_Clear(This, Color.Black);
}
////////////////////////////////////////////////////////////
///
/// Clear the entire render image with a single color
///
/// Color to use to clear the image
////////////////////////////////////////////////////////////
public void Clear(Color color)
{
sfRenderImage_Clear(This, color);
}
////////////////////////////////////////////////////////////
///
/// Draw something into the render image
///
/// Object to draw
////////////////////////////////////////////////////////////
public void Draw(Drawable objectToDraw)
{
objectToDraw.Render(this, null);
}
////////////////////////////////////////////////////////////
///
/// Draw something into the render image with a shader
///
/// Object to draw
/// Shader to apply
////////////////////////////////////////////////////////////
public void Draw(Drawable objectToDraw, Shader shader)
{
objectToDraw.Render(this, shader);
}
////////////////////////////////////////////////////////////
///
/// Save the current OpenGL render states and matrices
///
////////////////////////////////////////////////////////////
public void SaveGLStates()
{
sfRenderImage_SaveGLStates(This);
}
////////////////////////////////////////////////////////////
///
/// Restore the previously saved OpenGL render states and matrices
///
////////////////////////////////////////////////////////////
public void RestoreGLStates()
{
sfRenderImage_RestoreGLStates(This);
}
////////////////////////////////////////////////////////////
///
/// Update the contents of the target image
///
////////////////////////////////////////////////////////////
public void Display()
{
sfRenderImage_Display(This);
}
////////////////////////////////////////////////////////////
///
/// Target image of the render image
///
////////////////////////////////////////////////////////////
public Image Image
{
get {return myImage;}
}
////////////////////////////////////////////////////////////
///
/// Tell whether or not the system supports render images
///
////////////////////////////////////////////////////////////
public static bool IsAvailable
{
get {return sfRenderImage_IsAvailable();}
}
////////////////////////////////////////////////////////////
///
/// Provide a string describing the object
///
/// String description of the object
////////////////////////////////////////////////////////////
public override string ToString()
{
return "[RenderImage]" +
" Width(" + Width + ")" +
" Height(" + Height + ")" +
" Image(" + Image + ")" +
" DefaultView(" + DefaultView + ")" +
" CurrentView(" + CurrentView + ")";
}
////////////////////////////////////////////////////////////
///
/// Handle the destruction of the object
///
/// Is the GC disposing the object, or is it an explicit call ?
////////////////////////////////////////////////////////////
protected override void Destroy(bool disposing)
{
if (!disposing)
Context.Global.SetActive(true);
sfRenderImage_Destroy(This);
if (disposing)
{
myDefaultView.Dispose();
myImage.Dispose();
}
if (!disposing)
Context.Global.SetActive(false);
}
private View myCurrentView = null;
private View myDefaultView = null;
private Image myImage = null;
#region Imports
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern IntPtr sfRenderImage_Create(uint Width, uint Height, bool DepthBuffer);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern void sfRenderImage_Destroy(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern void sfRenderImage_Clear(IntPtr This, Color ClearColor);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern uint sfRenderImage_GetWidth(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern uint sfRenderImage_GetHeight(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern bool sfRenderImage_SetActive(IntPtr This, bool Active);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern bool sfRenderImage_SaveGLStates(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern bool sfRenderImage_RestoreGLStates(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern bool sfRenderImage_Display(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern void sfRenderImage_SetView(IntPtr This, IntPtr View);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern IntPtr sfRenderImage_GetView(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern IntPtr sfRenderImage_GetDefaultView(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern IntRect sfRenderImage_GetViewport(IntPtr This, IntPtr TargetView);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern void sfRenderImage_ConvertCoords(IntPtr This, uint WindowX, uint WindowY, out float ViewX, out float ViewY, IntPtr TargetView);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern IntPtr sfRenderImage_GetImage(IntPtr This);
[DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity]
static extern bool sfRenderImage_IsAvailable();
#endregion
}
}
}