KavTest/KavTest/KavTestGame.cs

357 lines
12 KiB
C#
Raw Normal View History

2020-08-26 21:58:01 +00:00
using System.Collections.Immutable;
2020-08-05 19:21:42 +00:00
using System.IO;
using Encompass;
using KavTest.Components;
2020-08-05 20:57:15 +00:00
using KavTest.Engines;
2020-08-26 23:07:31 +00:00
using KavTest.Extensions;
2020-08-05 19:21:42 +00:00
using KavTest.Messages;
using KavTest.Renderers;
using KavTest.Spawners;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
2020-08-26 21:58:01 +00:00
using MoonTools.Curve;
2020-08-05 19:21:42 +00:00
namespace KavTest
{
class KavTestGame : Game
{
GraphicsDeviceManager graphics;
WorldBuilder WorldBuilder { get; } = new WorldBuilder();
World World { get; set; }
public KavTestGame()
{
graphics = new GraphicsDeviceManager(this);
2020-10-19 10:02:31 +00:00
graphics.PreferredBackBufferWidth = 1600;
graphics.PreferredBackBufferHeight = 900;
2020-09-21 07:44:21 +00:00
graphics.PreferMultiSampling = false;
2020-08-05 19:21:42 +00:00
Content.RootDirectory = "Content";
Window.AllowUserResizing = true;
IsMouseVisible = true;
2020-12-04 23:40:27 +00:00
2020-08-06 23:22:24 +00:00
Microsoft.Xna.Framework.Input.Mouse.IsRelativeMouseModeEXT = true;
2020-08-05 19:21:42 +00:00
}
protected override void LoadContent()
{
2020-08-06 23:54:42 +00:00
base.LoadContent();
2020-08-06 22:29:23 +00:00
}
protected override void UnloadContent()
{
base.UnloadContent();
}
protected override void Initialize()
{
base.Initialize();
2020-08-06 07:10:54 +00:00
var rustyBallModel = Kav.ModelLoader.Load(
2020-08-05 19:21:42 +00:00
GraphicsDevice,
2020-10-02 05:27:41 +00:00
Smuggler.Importer.ImportGLB(
2020-12-04 23:40:27 +00:00
GraphicsDevice,
2020-10-02 05:27:41 +00:00
File.OpenRead("Content/rustysphere.glb")
)
2020-08-05 19:21:42 +00:00
);
2020-10-02 05:27:41 +00:00
rustyBallModel.DisableNormalMaps();
rustyBallModel.DisableAlbedoMaps();
2020-10-05 22:45:43 +00:00
rustyBallModel.DisableMetallicRoughnessMaps();
2020-10-02 05:27:41 +00:00
rustyBallModel.Albedo = Color.DeepSkyBlue;
2020-10-05 22:45:43 +00:00
rustyBallModel.Metallic = 0.5f;
rustyBallModel.Roughness = 0.284f;
2020-08-05 19:21:42 +00:00
2020-08-26 21:58:01 +00:00
var lightBulbModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/cube.glb"))
);
2020-09-16 19:59:31 +00:00
var floorModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/floor.glb"))
);
2020-10-05 22:45:43 +00:00
floorModel.Metallic = 0f;
floorModel.Roughness = 0f;
2020-09-16 19:59:31 +00:00
2020-09-21 07:44:21 +00:00
var avocadoModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/avocado.glb"))
);
2020-10-02 05:27:41 +00:00
var redCylinderModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(
GraphicsDevice,
File.OpenRead("Content/redcylinder.glb")
)
);
var pinkConeModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(
GraphicsDevice,
File.OpenRead("Content/pinkcone.glb")
)
);
var blueTorusModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(
GraphicsDevice,
File.OpenRead("Content/bluetorus.glb")
)
);
2020-10-03 00:30:03 +00:00
var cubeModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(
GraphicsDevice,
File.OpenRead("Content/cube.glb")
)
);
2020-10-16 01:20:41 +00:00
var toonShadeRuinsModel = Kav.ModelLoader.Load(
GraphicsDevice,
Smuggler.Importer.ImportGLB(
GraphicsDevice,
File.OpenRead("Content/ToonShadeRuins.glb")
)
);
2020-10-17 20:53:52 +00:00
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/front.jpg"),
out var skyboxSize,
out _,
out byte[] frontPixels
);
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/back.jpg"),
out _,
out _,
out byte[] backPixels
);
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/right.jpg"),
out _,
out _,
out byte[] rightPixels
);
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/left.jpg"),
out _,
out _,
out byte[] leftPixels
);
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/top.jpg"),
out _,
out _,
out byte[] topPixels
);
Texture2D.TextureDataFromStreamEXT(
File.OpenRead("Content/Skybox/bottom.jpg"),
out _,
out _,
out byte[] bottomPixels
);
var skybox = new TextureCube(GraphicsDevice, skyboxSize, false, SurfaceFormat.Color);
skybox.SetData(CubeMapFace.PositiveZ, frontPixels);
skybox.SetData(CubeMapFace.NegativeZ, backPixels);
skybox.SetData(CubeMapFace.PositiveX, rightPixels);
skybox.SetData(CubeMapFace.NegativeX, leftPixels);
skybox.SetData(CubeMapFace.PositiveY, topPixels);
skybox.SetData(CubeMapFace.NegativeY, bottomPixels);
2020-12-04 23:40:27 +00:00
var mushroomGuyTexture = Texture2D.FromStream(GraphicsDevice, new FileStream("Content/Sprites/mushroomguy.png", FileMode.Open));
WorldBuilder.AddEngine(new InputEngine(this));
2020-08-06 07:00:02 +00:00
WorldBuilder.AddEngine(new AngularVelocityEngine());
2020-08-26 21:58:01 +00:00
WorldBuilder.AddEngine(new MoveAlongCurve3DEngine());
2020-08-06 07:00:02 +00:00
WorldBuilder.AddEngine(new MotionEngine());
WorldBuilder.AddEngine(new CameraEngine());
2020-08-05 19:21:42 +00:00
WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
2020-08-26 21:58:01 +00:00
WorldBuilder.AddEngine(new LightBulbSpawner(lightBulbModel));
2020-09-16 19:59:31 +00:00
WorldBuilder.AddEngine(new StaticModelSpawner());
WorldBuilder.AddEngine(new DirectionalLightSpawner());
2020-12-04 23:40:27 +00:00
WorldBuilder.AddEngine(new BillboardSpriteSpawner());
2020-08-05 19:21:42 +00:00
WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);
2020-09-21 07:44:21 +00:00
// WorldBuilder.SendMessage(new RustyBallSpawnMessage(
// new Transform3D(new Vector3(0, 0, 0)),
// new Vector3(1, 1, -1)
// ));
2020-08-05 22:10:04 +00:00
2020-09-21 07:44:21 +00:00
// WorldBuilder.SendMessage(new RustyBallSpawnMessage(
// new Transform3D(new Vector3(-3, 0, 0)),
// new Vector3(-1, 1, -1)
// ));
2020-08-05 22:10:04 +00:00
2020-09-21 07:44:21 +00:00
// WorldBuilder.SendMessage(new RustyBallSpawnMessage(
// new Transform3D(new Vector3(3, 0, 0)),
// new Vector3(-1, 1, 1)
// ));
2020-08-05 22:10:04 +00:00
2020-10-16 01:20:41 +00:00
// WorldBuilder.SendMessage(new StaticModelSpawnMessage(
// new Transform3D(new Vector3(0, 1, 0), Quaternion.Identity, new Vector3(1f, 1f, 1f)),
// rustyBallModel
// ));
2020-10-02 05:27:41 +00:00
2020-10-17 20:53:52 +00:00
WorldBuilder.SendMessage(new StaticModelSpawnMessage(
new Transform3D(new Vector3(0, -3, 0), Quaternion.Identity, new Vector3(10f, 1f, 10f)),
floorModel
));
2020-09-16 19:59:31 +00:00
2020-10-17 20:53:52 +00:00
WorldBuilder.SendMessage(new StaticModelSpawnMessage(
new Transform3D(
2020-12-04 23:40:27 +00:00
new Vector3(0, 1, 0),
2020-10-17 20:53:52 +00:00
Quaternion.CreateFromAxisAngle(
2020-12-04 23:40:27 +00:00
Vector3.Right,
2020-10-17 20:53:52 +00:00
-Microsoft.Xna.Framework.MathHelper.PiOver2
2020-12-04 23:40:27 +00:00
),
2020-10-17 20:53:52 +00:00
new Vector3(1f, 1f, 1f)
),
redCylinderModel
));
2020-09-21 07:44:21 +00:00
2020-10-02 05:27:41 +00:00
WorldBuilder.SendMessage(new StaticModelSpawnMessage(
2020-10-17 20:53:52 +00:00
new Transform3D(
2020-12-04 23:40:27 +00:00
new Vector3(-3, 1, 0),
2020-10-17 20:53:52 +00:00
Quaternion.CreateFromAxisAngle(
2020-12-04 23:40:27 +00:00
Vector3.Right,
2020-10-17 20:53:52 +00:00
-Microsoft.Xna.Framework.MathHelper.PiOver2
2020-12-04 23:40:27 +00:00
),
2020-10-17 20:53:52 +00:00
new Vector3(1f, 1f, 1f)
),
blueTorusModel
2020-10-02 05:27:41 +00:00
));
2020-10-16 01:20:41 +00:00
2020-10-17 20:53:52 +00:00
WorldBuilder.SendMessage(new StaticModelSpawnMessage(
new Transform3D(
2020-12-04 23:40:27 +00:00
new Vector3(3, 1, 0),
2020-10-17 20:53:52 +00:00
Quaternion.CreateFromAxisAngle(
2020-12-04 23:40:27 +00:00
Vector3.Right,
2020-10-17 20:53:52 +00:00
-Microsoft.Xna.Framework.MathHelper.PiOver2
2020-12-04 23:40:27 +00:00
),
2020-10-17 20:53:52 +00:00
new Vector3(1f, 1f, 1f)
),
cubeModel
));
2020-12-04 23:40:27 +00:00
WorldBuilder.SendMessage(new BillboardSpriteSpawnMessage(
mushroomGuyTexture,
new Vector3(3, 1, 10),
Vector2.Zero,
0,
Vector2.One
));
2020-10-17 20:53:52 +00:00
// WorldBuilder.SendMessage(new StaticModelSpawnMessage(
// Transform3D.Identity,
// toonShadeRuinsModel
// ));
2020-10-20 01:34:57 +00:00
// var lightEntity = WorldBuilder.CreateEntity();
// WorldBuilder.SetComponent(
// lightEntity,
// new Transform3DComponent(
// new Transform3D(
2020-12-04 23:40:27 +00:00
// new Vector3(0, 3, 3),
// Quaternion.Identity,
2020-10-20 01:34:57 +00:00
// new Vector3(0.1f, 0.1f, 0.1f)
// )
// )
// );
// WorldBuilder.SetComponent(
// lightEntity,
// new PointLightComponent(Color.Blue, 1000f)
// );
// WorldBuilder.SetComponent(
// lightEntity,
// new ModelComponent(cubeModel)
// );
for (var i = 0; i < 1; i++)
{
var start = RandomHelper.RandomVector3(2, 5);
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
new Transform3D(start.ToXNAVector(), Quaternion.Identity, new Vector3(0.1f, 0.1f, 0.1f)),
RandomHelper.RandomColor(),
500f,
RandomHelper.RandomLoop(start, 2, 5, 3, 10)
));
}
2020-08-23 01:31:59 +00:00
2020-10-01 21:53:15 +00:00
var ambientLightEntity = WorldBuilder.CreateEntity();
WorldBuilder.SetComponent(ambientLightEntity, new AmbientLightComponent(
2020-10-02 05:27:41 +00:00
new Color(0.4f, 0.4f, 0.4f)
2020-10-01 21:53:15 +00:00
));
2020-09-16 19:59:31 +00:00
WorldBuilder.SendMessage(new DirectionalLightSpawnMessage(
2020-10-05 22:45:43 +00:00
//Quaternion.CreateFromAxisAngle(Vector3.Right, Microsoft.Xna.Framework.MathHelper.Pi / 3f),
Quaternion.CreateFromAxisAngle(Vector3.Right, Microsoft.Xna.Framework.MathHelper.PiOver4),
2020-09-21 07:44:21 +00:00
Color.LightGoldenrodYellow,
0.7f
2020-08-07 08:13:20 +00:00
));
2020-09-16 19:59:31 +00:00
// WorldBuilder.SendMessage(new DirectionalLightSpawnMessage(
// Quaternion.CreateFromAxisAngle(Vector3.Right, Microsoft.Xna.Framework.MathHelper.PiOver4),
// Color.GhostWhite,
// 0.1f
// ));
// WorldBuilder.SendMessage(new DirectionalLightSpawnMessage(
// Quaternion.CreateFromAxisAngle(Vector3.Right, Microsoft.Xna.Framework.MathHelper.PiOver2 + Microsoft.Xna.Framework.MathHelper.PiOver4),
// Color.GhostWhite,
// 0.1f
// ));
2020-08-05 19:21:42 +00:00
var cameraEntity = WorldBuilder.CreateEntity();
2020-08-06 21:21:34 +00:00
WorldBuilder.SetComponent(cameraEntity, new ArcballTransformComponent(
new ArcballTransform(
new Vector3(0, 0, -10),
2020-08-06 23:37:24 +00:00
Microsoft.Xna.Framework.MathHelper.Pi,
2020-08-06 21:21:34 +00:00
0
)
2020-08-06 07:00:02 +00:00
));
2020-09-19 08:06:50 +00:00
WorldBuilder.SetComponent(cameraEntity, new PerspectiveCameraComponent(
Microsoft.Xna.Framework.MathHelper.PiOver4,
16f / 9f,
0.01f,
100f
2020-08-05 19:21:42 +00:00
));
2020-10-17 20:53:52 +00:00
var skyboxEntity = WorldBuilder.CreateEntity();
WorldBuilder.SetComponent(skyboxEntity, new SkyboxComponent(
skybox
));
2020-08-05 19:21:42 +00:00
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);
}
}
}