using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Rmake.Framework.Logging;
using Rmake.Rendering.APIWrapper;
using Rmake.Rendering.ComponentLayer;
namespace Rmake.GameRendering
{
///
/// GameRendering関連のインスタンスを管理するクラス
///
public class GameRenderingManager
{
private Hashtable sceneViewHash = null;
private ComponentManager componentManager = null;
private Hashtable gameRenderingViews = null;
///
/// 描画領域の幅
///
public int Width
{
get
{
//if(componentManager != null)
//{
return componentManager.Device.Width;
//}
//else
//{
// return 0;
//}
}
set
{
//if(componentManager != null)
//{
componentManager.Device.Width = value;
//}
}
}
///
/// 描画領域の高さ
///
public int Height
{
get
{
//if(componentManager != null)
//{
return componentManager.Device.Height;
//}
//else
//{
// return 0;
//}
}
set
{
//if(componentManager != null)
//{
componentManager.Device.Height = value;
//}
}
}
internal ComponentManager Manager
{
get{ return componentManager; }
}
///
/// Clear関数が呼ばれた際に画面を塗りつぶす色
///
public Color ClearColor
{
get{ return componentManager.ClearColor; }
set{ componentManager.ClearColor = value; }
}
public Hashtable SceneViewHash
{
get { return sceneViewHash; }
}
///
/// カメラの位置
///
public Point CameraPosition
{
get
{
return new Point((int)Camera.M41, (int)Camera.M42);
}
set
{
Matrix camera = Camera;
camera.M41 = value.X;
camera.M42 = value.Y;
Camera = camera;
}
}
///
/// 画面の拡大率
///
public float CameraScale
{
get
{
return 1.0f / Camera.M11;
}
set
{
Matrix camera = Camera;
camera.M11 = 1.0f / value;
camera.M22 = 1.0f / value;
Camera = camera;
}
}
///
/// カメラの変換行列
///
public Matrix Camera
{
get
{
if(componentManager != null)
{
return componentManager.Device.Camera;
}
else
{
Matrix m = Matrix.Translation(0.0f, 0.0f, 0.0f);
//m.Translate(0.0f, 0.0f, 0.0f);
return m;
}
}
set
{
if(componentManager != null)
{
componentManager.Device.Camera = value;
}
}
}
///
/// カメラの変換行列の逆行列
///
public Matrix InverseCamera
{
get
{
if(componentManager != null)
{
return componentManager.Device.InverseCamera;
}
else
{
Matrix m = Matrix.Translation(0.0f, 0.0f, 0.0f);
//m.Translate(0.0f, 0.0f, 0.0f);
return m;
}
}
}
internal Hashtable GameRenderingViews
{
get
{
return gameRenderingViews;
}
}
public GameRenderingManager()
{
sceneViewHash = new Hashtable();
gameRenderingViews = new Hashtable();
}
internal bool Initialize(ComponentManager componentManager)
{
this.componentManager = componentManager;
return true;
}
internal void CleanUp()
{
DeleteAllRenderView();
DeleteAllSceneView();
componentManager = null;
//sceneViewHash.Clear();
}
///
/// すべてのSceneViewを削除する。
///
public void DeleteAllSceneView()
{
foreach(DictionaryEntry de in SceneViewHash)
{
SceneView sceneView = (SceneView)de.Value;
sceneView.DeleteAll();
}
sceneViewHash.Clear();
}
///
/// GameRenderingViewから派生したクラスを消去する。
///
/// GameRenderingViewから派生したクラス
public void DeleteRenderingView(GameRenderingView gameRenderingView)
{
if(gameRenderingView != null)
{
gameRenderingView.BeforeFinalize(this);
gameRenderingView.Finalize(this);
}
}
///
/// すべてのGameRenderingViewを削除する
///
public void DeleteAllRenderView()
{
ArrayList alist = new ArrayList();
foreach (DictionaryEntry de in gameRenderingViews)
{
GameRenderingView gameRenderingView = (GameRenderingView)de.Value;
alist.Add(gameRenderingView);
//DeleteRenderingView(gameRenderingView);
}
foreach (GameRenderingView grv in alist)
{
DeleteRenderingView(grv);
}
}
///
/// Sceneの削除
///
/// Scene
public void DeleteScene(SceneView sceneView)
{
if (sceneView != null)
{
sceneView.DeleteAll();
sceneViewHash.Remove(sceneView);
}
}
///
/// 画面をClearColorで塗りつぶす関数。
/// ZBufferとステンシルバッファも塗りつぶされる。
///
public void Clear()
{
componentManager.Clear();
}
///
/// Sceneの描画。
///
/// Scene
public void Render(SceneView sceneView)
{
if(sceneView != null)
{
sceneView.Render();
componentManager.Render();
sceneView.SetLayerMinus1();
}
}
///
/// コントロールに対して描画。
///
/// 描画対象コントロール。nullならばデフォルトの描画先。
public void Present(Control control)
{
componentManager.Device.Present(control);
}
}
}