KavTest/KavTest/KavTestGame.cs

190 lines
6.3 KiB
C#

using System.Collections.Immutable;
using System.IO;
using Encompass;
using KavTest.Components;
using KavTest.Engines;
using KavTest.Messages;
using KavTest.Renderers;
using KavTest.Spawners;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MoonTools.Curve;
namespace KavTest
{
class KavTestGame : Game
{
GraphicsDeviceManager graphics;
WorldBuilder WorldBuilder { get; } = new WorldBuilder();
World World { get; set; }
public KavTestGame()
{
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
graphics.PreferMultiSampling = true;
Content.RootDirectory = "Content";
Window.AllowUserResizing = true;
IsMouseVisible = true;
Microsoft.Xna.Framework.Input.Mouse.IsRelativeMouseModeEXT = true;
}
protected override void LoadContent()
{
base.LoadContent();
}
protected override void UnloadContent()
{
base.UnloadContent();
}
protected override void Initialize()
{
base.Initialize();
var rustyBallModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/rustysphere.glb"))
);
var lightBulbModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/cube.glb"))
);
WorldBuilder.AddEngine(new InputEngine(this));
WorldBuilder.AddEngine(new AngularVelocityEngine());
WorldBuilder.AddEngine(new MoveAlongCurve3DEngine());
WorldBuilder.AddEngine(new MotionEngine());
WorldBuilder.AddEngine(new CameraEngine());
WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
WorldBuilder.AddEngine(new LightBulbSpawner(lightBulbModel));
WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
new Transform3D(new Vector3(0, 0, 0)),
new Vector3(1, 1, -1)
));
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
new Transform3D(new Vector3(-3, 0, 0)),
new Vector3(-1, 1, -1)
));
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
new Transform3D(new Vector3(3, 0, 0)),
new Vector3(-1, 1, 1)
));
var lightMovementSpline = new SplineCurve3D(
ImmutableArray.Create<ICurve3D>(
new QuadraticBezierCurve3D(
new System.Numerics.Vector3(-5, 2, -5),
new System.Numerics.Vector3(20, 50, -20),
new System.Numerics.Vector3(10, 20, 10)
),
new QuadraticBezierCurve3D(
new System.Numerics.Vector3(10, 20, 10),
new System.Numerics.Vector3(-20, -50, -10),
new System.Numerics.Vector3(-5, 2, -5)
)
),
ImmutableArray.Create<float>(
3f,
3f
),
true
);
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
new Transform3D(new Vector3(-5, 2, -5), Quaternion.Identity, new Vector3(0.25f, 0.25f, 0.25f)),
Color.White,
300f,
lightMovementSpline
));
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
// new Transform3D(new Vector3(5, 2, -5)),
// Color.Blue,
// 300f
// ));
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
// new Transform3D(new Vector3(-5, -2, -5)),
// Color.Red,
// 300f
// ));
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
// new Transform3D(new Vector3(-5, 2, 5)),
// Color.Yellow,
// 300f
// ));
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
// new Transform3D(new Vector3(-5, 2, -10)),
// Color.Orange,
// 300f
// ));
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
// new Transform3D(new Vector3(-10, 2, -5)),
// Color.CornflowerBlue,
// 300f
// ));
var directionalLightEntity = WorldBuilder.CreateEntity();
WorldBuilder.SetComponent(directionalLightEntity, new Transform3DComponent(
new Transform3D(
Vector3.Zero,
Quaternion.CreateFromAxisAngle(Vector3.Right, Microsoft.Xna.Framework.MathHelper.PiOver2)
)
));
WorldBuilder.SetComponent(directionalLightEntity, new DirectionalLightComponent(
Color.Blue,
2f
));
var cameraEntity = WorldBuilder.CreateEntity();
WorldBuilder.SetComponent(cameraEntity, new ArcballTransformComponent(
new ArcballTransform(
new Vector3(0, 0, -10),
Microsoft.Xna.Framework.MathHelper.Pi,
0
)
));
WorldBuilder.SetComponent(cameraEntity, new CameraComponent(
Matrix.CreatePerspectiveFieldOfView(
Microsoft.Xna.Framework.MathHelper.PiOver4,
16f / 9f,
0.1f,
200f
)
));
World = WorldBuilder.Build();
}
protected override void Update(GameTime gameTime)
{
World.Update(gameTime.ElapsedGameTime.TotalSeconds);
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
World.Draw();
base.Draw(gameTime);
}
}
}