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); } } }