121 lines
2.2 KiB
C#
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(){
|
|
}
|
|
}
|
|
|
|
}
|