budnhead/bnhdemo/BootStrap.cs

155 lines
4.0 KiB
C#

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);
}
}
}