#region File Description
//-----------------------------------------------------------------------------
// Viewer.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Storage;
using RobotGameData.Camera;
#endregion
namespace RobotGameData.Render
{
#region Enum
public enum ViewerWidth
{
Invalid = 0,
Width480 = 853,
Width720 = 1280,
Width1080 = 1920,
}
public enum ViewerHeight
{
Invalid = 0,
Height480 = 480,
Height720 = 720,
Height1080 = 1080,
}
#endregion
#region ViewCamera
///
/// a view class with a viewport and a camera.
/// With the split-screen mode, there can be more than one viewport and one camera.
///
public class ViewCamera
{
#region Fields
int count = 0;
List viewport = new List();
List camera = new List();
#endregion
#region Properties
public int Count
{
get { return count; }
}
public CameraBase FirstCamera
{
get { return camera[0]; }
}
#endregion
#region Constructors
public ViewCamera()
{
count = 0;
viewport.Clear();
camera.Clear();
}
public ViewCamera(CameraBase camera, Rectangle? viewportRectangle)
{
Add(camera, viewportRectangle);
}
#endregion
///
/// adds a camera and viewport.
///
///
///
public void Add(CameraBase camera, Rectangle? viewportRectangle)
{
this.camera.Add(camera);
Viewport newViewport = FrameworkCore.Game.GraphicsDevice.Viewport;
if (viewportRectangle == null)
{
newViewport.X = 0;
newViewport.Y = 0;
newViewport.Width = FrameworkCore.Game.GraphicsDevice.Viewport.Width;
newViewport.Height = FrameworkCore.Game.GraphicsDevice.Viewport.Height;
}
else
{
newViewport.X = viewportRectangle.Value.X;
newViewport.Y = viewportRectangle.Value.Y;
newViewport.Width = viewportRectangle.Value.Width;
newViewport.Height = viewportRectangle.Value.Height;
}
this.viewport.Add(newViewport);
count++;
}
///
/// removes the camera by index.
///
///
public void Remove(int index)
{
viewport.RemoveAt(index);
camera.RemoveAt(index);
}
///
/// resize the camera and viewport by index.
///
/// an index of camera
/// screen x-position
/// screen y-position
/// screen width
/// screen height
public void Resize(int index, int x, int y, int width, int height)
{
CameraBase camera = GetCamera(index);
camera.Resize(width, height);
Viewport newViewport = GetViewport(index);
newViewport.X = x;
newViewport.Y = y;
newViewport.Width = width;
newViewport.Height = height;
this.viewport[index] = newViewport;
}
public CameraBase GetCamera(int index)
{
return this.camera[index];
}
public Viewport GetViewport(int index)
{
return this.viewport[index];
}
}
#endregion
///
/// This contains and manages RenderContext class and a 3D camera.
/// Viewer may have several cameras.
///
public class Viewer
{
#region Fields
RenderContext renderContext = null;
Dictionary viewCameraList =
new Dictionary();
ViewCamera currentViewCamera = null;
ViewCamera defaultViewCamera = null;
Viewport defaultViewport;
RenderFog basicFog = null;
RenderLighting basicLighting = null;
#endregion
#region Properties
public static Viewport CurrentViewport
{
get { return FrameworkCore.Game.GraphicsDevice.Viewport; }
}
public Viewport DefaultViewport
{
get { return defaultViewport; }
set { defaultViewport = value; }
}
public int ViewWidth
{
get { return this.defaultViewport.Width; }
}
public int ViewHeight
{
get { return this.defaultViewport.Height; }
}
public int ViewPosX
{
get { return this.defaultViewport.X; }
}
public int ViewPosY
{
get { return this.defaultViewport.Y; }
}
public RenderContext RenderContext
{
get { return renderContext; }
}
public GameSceneNode Scene3DRoot
{
get { return RenderContext.Scene3DRoot; }
}
public Color ClearColor
{
get { return this.RenderContext.ClearColor; }
set { this.RenderContext.ClearColor = value; }
}
public RenderFog BasicFog
{
get { return this.basicFog; }
set { this.basicFog = value; }
}
public RenderLighting BasicLighting
{
get { return this.basicLighting; }
set { this.basicLighting = value; }
}
#endregion
///
/// Constructor.
///
/// game
public Viewer(Game game)
{
renderContext = new RenderContext(game);
}
///
/// initialize members and creates default camera.
///
public void Initialize()
{
// initialize the RenderContext
renderContext.Initialize();
this.defaultViewport = FrameworkCore.Game.GraphicsDevice.Viewport;
// creates default camera
{
defaultViewCamera = new ViewCamera(new CameraBase(), null);
// default camera setting
defaultViewCamera.FirstCamera.SetView(Vector3.Zero, Vector3.Forward,
Vector3.Up);
defaultViewCamera.FirstCamera.SetPespective(MathHelper.PiOver4,
(float)ViewWidth,
(float)ViewHeight, 1.0f, 1000.0f);
currentViewCamera = defaultViewCamera;
}
}
///
/// resize the default camera.
///
/// screen width
/// screen height
public void Resize(int width, int height)
{
this.defaultViewport.Width = width;
this.defaultViewport.Height = height;
}
///
/// update cameras.
///
public void Update(GameTime gameTime)
{
// Update the current camera
ViewCamera viewCamera = CurrentCamera;
for (int i = 0; i < viewCamera.Count; i++)
{
CameraBase camera = viewCamera.GetCamera(i);
camera.Update(gameTime);
}
// Update scene models in the render context
renderContext.Update(gameTime);
}
public void Dispose()
{
if (renderContext != null)
{
renderContext.Dispose();
renderContext = null;
}
}
///
/// draws the render context.
///
///
public void Draw(GameTime gameTime)
{
renderContext.Draw(gameTime);
}
///
/// adds a camera.
///
/// key name
/// view camera
public void AddCamera(string key, ViewCamera viewCamera)
{
// New camera add
viewCamera.FirstCamera.Name = key;
viewCameraList.Add(key, viewCamera);
}
///
/// removes the camera by index.
///
///
public void RemoveCamera(string key)
{
viewCameraList.Remove(key);
}
public void RemoveAllCamera()
{
viewCameraList.Clear();
}
public ViewCamera GetViewCamera(string key)
{
// Compare valid camera
if (viewCameraList.ContainsKey(key) == false)
return null;
return viewCameraList[key];
}
///
/// sets to current camera.
///
/// key name
public bool SetCurrentCamera(string key)
{
// Set a current camera
currentViewCamera = GetViewCamera(key);
if (currentViewCamera == null)
return false;
return true;
}
public ViewCamera CurrentCamera
{
get { return currentViewCamera; }
}
///
/// changes to current camera by key name.
///
///
public void ChangeCamera(string key)
{
SetCurrentCamera(key);
}
}
}