using System; using System.IO; using System.Drawing; using System.Drawing.Imaging; using OpenTK.Graphics.OpenGL4; using OpenTK; using OpenTK.Audio.OpenAL; using OpenTK.Audio; using ImageSharp; using ImageSharp.Processing; using org.budnhead.graphics; using org.budnhead.audio; using org.budnhead.core; using org.budnhead.tools; namespace bnhdemo { public static class BootStrap { static SquaredMap map; static Actor trackedActor; static GLCamera trackingCamera; static GLCamera primaryCamera; static Viewport ballisticViewport; public static void Main(string[] args){ Engine.InitializeGraphics(); Engine.SceneWindows[0].Scene = new Scene(); primaryCamera = new GLCamera(); primaryCamera.CameraController.SceneWindow = Engine.SceneWindows[0]; Engine.SceneWindows[0].PrimaryViewport.SceneOrientation = primaryCamera; primaryCamera.Position = new Vector3(600,550,200); primaryCamera.lookAt(new Vector3(125,125,192)); primaryCamera.Top = new Vector3(0,0,1); primaryCamera.setFoV(MathHelper.PiOver4); ballisticViewport = new Viewport(); ballisticViewport.Width = 0.2f; ballisticViewport.Height = 0.2f; ballisticViewport.Top = 0.0f; ballisticViewport.Right = 1.0f; ballisticViewport.Visible = false; ballisticViewport.BackgroundColor = new Vector3(0.3f,0.3f,0.9f); ballisticViewport.Scene = Engine.SceneWindows[0].Scene; trackingCamera = new GLCamera(); trackingCamera.Top = Vector3.UnitZ; trackingCamera.setFoV(MathHelper.PiOver4); ballisticViewport.SceneOrientation = trackingCamera; Engine.SceneWindows[0].addViewport(ballisticViewport); loadMap(); Engine.SceneWindows[0].Visible = true; Engine.SceneWindows[0].KeyPress += (sender, e) => { switch (e.KeyChar){ case 'r': SceneWindow sw = Engine.createSceneWindow(); sw.Visible = true; sw.Scene = new Scene(Engine.SceneWindows[0].Scene); sw.PrimaryViewport.SceneOrientation = trackingCamera; break; case 'p': Engine.UpdatesPaused = !Engine.UpdatesPaused; break; case ' ': Console.WriteLine("Fire Ballistic..."); BallisticActor ba = new BallisticActor(0); ba.Position.Value = map.ground(new Vector2(10,10)); ba.Velocity.Value = new Vector3(1,1,1).Normalized(); ba.Velocity.Value *= 98.0f; ba.fire(); trackedActor = ba; ballisticViewport.Visible = true; break; case ',': if (Engine.TimeScale > 0){ Engine.TimeScale -= 0.05f; } break; case '.': if (Engine.TimeScale < 5.0f){ Engine.TimeScale += 0.05f; } break; case 'w': primaryCamera.Position += new Vector3( primaryCamera.View.Xy.Normalized()); break; case 's': primaryCamera.Position -= new Vector3( primaryCamera.View.Xy.Normalized()); break; case 'a': primaryCamera.Position -= Vector3.Cross( new Vector3( primaryCamera.View.Xy.Normalized()), Vector3.UnitZ); break; case 'd': primaryCamera.Position += Vector3.Cross( new Vector3( primaryCamera.View.Xy.Normalized()), Vector3.UnitZ); break; } }; Engine.AfterUpdate += delegate { if ((trackedActor != null)&&(trackingCamera != null)){ if (trackedActor.IsActive){ Vector3 nv = trackedActor.Velocity.BufferedValue.Normalized(); trackingCamera.Position = trackedActor.Position.BufferedValue - (nv * 5) + (Vector3.UnitZ * 2);; trackingCamera.View = trackedActor.Velocity.BufferedValue; //primaryCamera.lookAt(trackedActor.Position.BufferedValue); if ((trackedActor.Velocity.BufferedValue.Z > 0) && (trackedActor.Velocity.Value.Z < 0)){ Engine.UpdatesPaused = true; } } else { trackedActor = null; ballisticViewport.Visible = false; } } }; Engine.run(); } public static void loadMap(){ ImageSharp.Image i = ImageSharp.Image.Load( new FileStream("M3-wip.png",FileMode.Open)); i.Flip(ImageSharp.Processing.FlipType.Vertical); map = new SquaredMap(i); Engine.SceneWindows[0].Scene.RootObject.addChild(map); } } }