budnhead/org.budnhead/graphics/SceneWindow.cs

121 lines
2.2 KiB
C#

using System;
using System.Threading;
using System.Collections.Generic;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using org.budnhead.core;
namespace org.budnhead.graphics
{
public class SceneWindow : GameWindow
{
Scene scene;
Viewport primaryViewport;
List<Viewport> viewports = new List<Viewport>();
internal SceneWindow()
:base(600, 600,
GraphicsMode.Default,
"nhEngine",
GameWindowFlags.Default,
DisplayDevice.Default,
3, 3,
GraphicsContextFlags.ForwardCompatible)
{
this.primaryViewport = new Viewport();
addViewport(primaryViewport);
lock(Engine.sceneWindows){
Engine.sceneWindows.Add(this);
}
}
public Viewport PrimaryViewport {
get { return this.primaryViewport; }
}
public Viewport[] Viewports {
get { return this.viewports.ToArray(); }
}
public override void Dispose()
{
lock (Engine.sceneWindows){
Engine.sceneWindows.Remove(this);
if (Engine.sceneWindows.Count == 0){
Engine.Shutdown();
}
}
base.Dispose();
}
public void addViewport(Viewport viewport){
if (viewport.Parent != null){
viewport.Parent.removeViewport(viewport);
}
this.viewports.Add(viewport);
viewport.Parent = this;
}
public void removeViewport(Viewport viewport){
if ((primaryViewport!=viewport) && (viewports.Contains(viewport))){
viewport.Parent = null;
viewports.Remove(viewport);
}
}
public Scene Scene {
get { return this.primaryViewport.Scene; }
set { lock(this){
this.primaryViewport.Scene = value;
} }
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
paint();
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Dispose();
}
public void paint(){
lock(this){
MakeCurrent();
paintViewports();
paintControls();
SwapBuffers();
}
}
public void paintViewports(){
Engine.ConsumerEnter();
foreach (Viewport viewport in this.viewports){
viewport.paint();
}
Engine.ConsumerExit();
}
public void paintControls(){
}
}
}