budnhead/org.budnhead/graphics/SceneWindow.cs

136 lines
2.7 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((DisplayDevice.Default.Width >> 4) * 14, (DisplayDevice.Default.Height>>4) * 14 ,
GraphicsMode.Default,
"nhEngine",
GameWindowFlags.Default,
DisplayDevice.Default,
3, 3,
GraphicsContextFlags.ForwardCompatible)
{
this.primaryViewport = new Viewport();
addViewport(primaryViewport);
lock(Engine.sceneWindows){
Engine.sceneWindows.Add(this);
}
GL.ClearColor(0.1f,0.3f,0.6f,1.0f);
GL.Enable(EnableCap.DepthTest);
GL.Enable(EnableCap.Normalize);
GL.Enable(EnableCap.ScissorTest);
GL.Enable(EnableCap.AlphaTest);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha,BlendingFactorDest.OneMinusSrcAlpha);
}
public Viewport PrimaryViewport {
get { return this.primaryViewport; }
}
public Viewport[] Viewports {
get { return this.viewports.ToArray(); }
}
public override void Dispose()
{
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)
{
lock (Engine.sceneWindows)
{
Engine.sceneWindows.Remove(this);
if (Engine.sceneWindows.Count == 0)
{
Engine.Shutdown();
}
}
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
}
public void paint(){
lock(this){
MakeCurrent();
paintViewports();
paintControls();
SwapBuffers();
}
}
public void paintViewports(){
Engine.ConsumerEnter();
//GL.Clear(ClearBufferMask.ColorBufferBit);
foreach (Viewport viewport in this.viewports){
viewport.paint();
}
Engine.ConsumerExit();
}
public void paintControls(){
}
}
}