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
{
///
/// Layerのクラス
///
public class LayerView
{
private Hashtable renderingViewHash = null;
private Hashtable renderingViewHashInvisible = null;
private ArrayList tableMap = null;
private int layerIndex;
private int width = 32 * 640; // マップの幅(Pixel単位)
private int height = 32 * 480;
private int chipWidth = 32;
private int chipHeight = 32;
private int tableWidth = (32 * 640) / (32 * 8); //テーブルの幅(セル数)
private int tableHeight = (32 * 480) / (32 * 8);
private int tablePieceWidth = 32 * 8; //テーブルのピースの幅(Pixel単位)
private int tablePieceHeight = 32 * 8;
internal int Width
{ get { return width; } }
internal int Height
{ get { return height; } }
internal int ChipWidth
{ get { return chipWidth; } }
internal int ChipHeight
{ get { return chipHeight; } }
internal int TableWidth
{ get { return tableWidth; } }
internal int TableHeight
{ get { return tableHeight; } }
internal int TablePieceWidth
{ get { return tablePieceWidth; } }
internal int TablePieceHeight
{ get { return tablePieceHeight; } }
internal Hashtable RenderingViewHash
{
get { return renderingViewHash; }
}
internal Hashtable RenderingViewHashInvisible
{
get { return renderingViewHashInvisible; }
}
internal ArrayList TableMap
{
get { return tableMap; }
}
internal int LayerIndex
{
set { layerIndex = value; }
get { return layerIndex; }
}
public LayerView()
{
renderingViewHash = new Hashtable();
renderingViewHashInvisible = new Hashtable();
SetSize(width, height, chipWidth, chipHeight);
}
internal bool SetSize(int width, int height, int chipWidth, int chipHeight)
{
this.width = width;
this.height = height;
this.chipWidth = chipWidth;
this.chipHeight = chipHeight;
this.tablePieceWidth = chipWidth * 8;
this.tablePieceHeight = chipHeight * 8;
this.tableWidth = width / this.tablePieceWidth;
this.tableHeight = height / this.tablePieceHeight;
int isz, jsz;
isz = tableHeight;
jsz = tableWidth;
tableMap = new ArrayList();
for(int i = 0 ; i < isz ; i++)
{
tableMap.Add(new ArrayList());
for(int j = 0 ; j < jsz ; j++)
{
((ArrayList)tableMap[i]).Add(new Hashtable());
}
}
return true;
}
internal void CleanUp()
{
}
///
/// GameRenderingViewから派生したクラスのインスタンスを追加
///
/// GameRenderingViewから派生したクラスのインスタンス
public void AddGameRenderingView(GameRenderingView gameRenderingView)
{
gameRenderingView.AddLayer(this);
/*
if(gameRenderingView.LayerVisible && gameRenderingView.Visible)
{
renderingViewHash.Add(gameRenderingView, gameRenderingView);
//gameRenderingView.LayerIndex = 0;
}
else
{
renderingViewHashInvisible.Add(gameRenderingView, gameRenderingView);
//gameRenderingView.LayerIndex = 0;
}
gameRenderingView.Layer = this;
*/
}
///
/// GameRenderingViewから派生したクラスのインスタンスの削除
///
/// GameRenderingViewから派生したクラスのインスタンス
public void RemoveGameRenderingView(GameRenderingView gameRenderingView)
{
gameRenderingView.RemoveLayer(this);
/*
gameRenderingView.Layer = null;
gameRenderingView.LayerIndex = -1;
renderingViewHash.Remove(gameRenderingView);
renderingViewHashInvisible.Remove(gameRenderingView);
*/
}
///
/// 登録されているGameRenderingViewから派生したクラスのインスタンスを
/// すべて削除
///
public void ClearGameRenderingView()
{
foreach(DictionaryEntry de in renderingViewHash)
{
GameRenderingView grv = (GameRenderingView)de.Value;
grv.Layer = null;
grv.LayerIndex = -1;
}
foreach(DictionaryEntry de in renderingViewHashInvisible)
{
GameRenderingView grv = (GameRenderingView)de.Value;
grv.Layer = null;
grv.LayerIndex = -1;
}
renderingViewHash.Clear();
renderingViewHashInvisible.Clear();
}
///
/// 登録されているGameRenderingViewから派生したクラスのインスタンスを
/// すべて消去
///
///
public void DeleteGameRenderingView(GameRenderingManager manager)
{
ArrayList alist = new ArrayList();
foreach(DictionaryEntry de in renderingViewHash)
{
GameRenderingView grv = (GameRenderingView)de.Value;
//grv.Layer = null;
//grv.LayerIndex = -1;
alist.Add(grv);
//manager.DeleteRenderingView(grv);
}
foreach(DictionaryEntry de in renderingViewHashInvisible)
{
GameRenderingView grv = (GameRenderingView)de.Value;
//grv.Layer = null;
//grv.LayerIndex = -1;
alist.Add(grv);
//manager.DeleteRenderingView(grv);
}
foreach (GameRenderingView grv in alist)
{
manager.DeleteRenderingView(grv);
}
renderingViewHash.Clear();
renderingViewHashInvisible.Clear();
}
internal void Render(GameRenderingManager manager)
{
//
int i, j;
int ia, ja;
Point lt = manager.CameraPosition;
Point rb;
rb = new Point(lt.X + manager.Width,
lt.Y + manager.Height);
lt.X /= TablePieceWidth;
lt.Y /= TablePieceHeight;
rb.X /= TablePieceWidth;
rb.Y /= TablePieceHeight;
for(i = lt.Y ; i <= rb.Y ; i++)
{
ia = i % TableHeight;
if(ia < 0) ia += TableHeight;
ArrayList tableList = (ArrayList)TableMap[ia];
for(j = lt.X ; j <= rb.X ; j++)
{
ja = j % TableWidth;
if(ja < 0) ja += TableWidth;
Hashtable hash = (Hashtable)tableList[ja];
foreach(DictionaryEntry de in hash)
{
GameRenderingView grv =
(GameRenderingView)de.Value;
if(grv.Drawed == false)
{
grv.LayerVisible = true;
//grv.LayerIndex = layerIndex;
//grv.Render(manager);
grv.Drawed = true;
}
}
}
}
//
foreach(DictionaryEntry de in renderingViewHash)
{
GameRenderingView grv = (GameRenderingView)de.Value;
grv.LayerIndex = layerIndex;
grv.Render(manager);
}
}
internal void SetLayerMinus1(GameRenderingManager manager)
{
foreach(DictionaryEntry de in renderingViewHash)
{
GameRenderingView grv = (GameRenderingView)de.Value;
grv.LayerIndex = -2;
}
//
int i, j;
int ia, ja;
Point lt = manager.CameraPosition;
Point rb;
rb = new Point(lt.X + manager.Width,
lt.Y + manager.Height);
lt.X /= TablePieceWidth;
lt.Y /= TablePieceHeight;
rb.X /= TablePieceWidth;
rb.Y /= TablePieceHeight;
for(i = lt.Y ; i <= rb.Y ; i++)
{
ia = i % TableHeight;
if(ia < 0) ia += TableHeight;
ArrayList tableList = (ArrayList)TableMap[ia];
for(j = lt.X ; j <= rb.X ; j++)
{
ja = j % TableWidth;
if(ja < 0) ja += TableWidth;
Hashtable hash = (Hashtable)tableList[ja];
foreach(DictionaryEntry de in hash)
{
GameRenderingView grv =
(GameRenderingView)de.Value;
grv.LayerVisible = false;
grv.Drawed = false;
grv.LayerIndex = -2;
}
}
}
}
}
}