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 viewports = new List(); 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(){ } } }