lots of 3d math stuff
parent
305b2d0911
commit
e620cc479a
2
Kav
2
Kav
|
@ -1 +1 @@
|
|||
Subproject commit 2419a89d3245dc7d52f6b4301902f840ea10beaf
|
||||
Subproject commit 4c4150620456c6625cf660d7a81571e4b1f7f9d5
|
|
@ -5,7 +5,7 @@ VisualStudioVersion = 15.0.26124.0
|
|||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KavTest.Core", "KavTest\KavTest.Core.csproj", "{4589302C-174A-4173-9654-CAA6CA1B5220}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "kav", "Kav\kav.csproj", "{08398000-DF30-465A-AE07-E11D108B8A74}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kav", "Kav\Kav.csproj", "{08398000-DF30-465A-AE07-E11D108B8A74}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
|
|
@ -5,7 +5,7 @@ VisualStudioVersion = 15.0.26124.0
|
|||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FNATemplate.Framework", "KavTest\KavTest.Framework.csproj", "{9ED076FA-32C3-4F1E-BB90-549B3A2FA46F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "kav", "Kav\kav.csproj", "{9B2EC2DE-7E2C-4768-B812-43AB4C7E31C5}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kav", "Kav\Kav.csproj", "{9B2EC2DE-7E2C-4768-B812-43AB4C7E31C5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smuggler", "Smuggler\Smuggler.csproj", "{06664804-2B01-46F5-B8EC-07E5E2C1EADC}"
|
||||
EndProject
|
||||
|
|
|
@ -5,7 +5,7 @@ namespace KavTest.Components
|
|||
{
|
||||
public struct AngularVelocityComponent : IComponent
|
||||
{
|
||||
public Vector3 AngularVelocity { get; }
|
||||
public Vector3 AngularVelocity { get; } // should this be a quaternion?
|
||||
|
||||
public AngularVelocityComponent(Vector3 angularVelocity)
|
||||
{
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
using Encompass;
|
||||
using Kav;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Components
|
||||
{
|
||||
public struct CameraComponent : IComponent
|
||||
{
|
||||
public Camera Camera { get; }
|
||||
public Matrix Projection { get; }
|
||||
|
||||
public CameraComponent(Camera camera)
|
||||
public CameraComponent(Matrix projection)
|
||||
{
|
||||
Camera = camera;
|
||||
Projection = projection;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,23 @@
|
|||
using Encompass;
|
||||
using KavTest.Components;
|
||||
using KavTest.Messages;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Engines
|
||||
{
|
||||
[Reads(typeof(AngularVelocityComponent))]
|
||||
[Sends(typeof(LocalRotationMessage))]
|
||||
public class AngularVelocityEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
foreach (var entity in ReadEntities<AngularVelocityComponent>())
|
||||
{
|
||||
ref readonly var angularVelocityComponent = ref GetComponent<AngularVelocityComponent>(entity);
|
||||
var angularVelocity = angularVelocityComponent.AngularVelocity * (float)dt;
|
||||
|
||||
SendMessage(new LocalRotationMessage(entity, Quaternion.CreateFromYawPitchRoll(angularVelocity.X, angularVelocity.Y, angularVelocity.Z)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
using Encompass;
|
||||
using KavTest.Components;
|
||||
using KavTest.Messages;
|
||||
|
||||
namespace KavTest.Engines
|
||||
{
|
||||
[Reads(typeof(CameraComponent))]
|
||||
[Receives(typeof(MoveCameraMessage))]
|
||||
[Sends(typeof(LocalTranslationMessage))]
|
||||
public class CameraEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
if (SomeComponent<CameraComponent>())
|
||||
{
|
||||
var cameraEntity = ReadEntity<CameraComponent>();
|
||||
|
||||
foreach (var moveMessage in ReadMessages<MoveCameraMessage>())
|
||||
{
|
||||
SendMessage(new LocalTranslationMessage(cameraEntity, moveMessage.Translation * (float)dt));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using Encompass;
|
||||
using KavTest.Messages;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace KavTest.Engines
|
||||
{
|
||||
[Sends(typeof(MoveCameraMessage))]
|
||||
public class InputEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
var keyboardState = Keyboard.GetState();
|
||||
|
||||
if (keyboardState.IsKeyDown(Keys.W))
|
||||
{
|
||||
SendMessage(new MoveCameraMessage(new Vector3(0, 0, -5)));
|
||||
}
|
||||
|
||||
if (keyboardState.IsKeyDown(Keys.A))
|
||||
{
|
||||
SendMessage(new MoveCameraMessage(new Vector3(-5, 0, 0)));
|
||||
}
|
||||
|
||||
if (keyboardState.IsKeyDown(Keys.S))
|
||||
{
|
||||
SendMessage(new MoveCameraMessage(new Vector3(0, 0, 5)));
|
||||
}
|
||||
|
||||
if (keyboardState.IsKeyDown(Keys.D))
|
||||
{
|
||||
SendMessage(new MoveCameraMessage(new Vector3(5, 0, 0)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
using Encompass;
|
||||
using KavTest.Components;
|
||||
using KavTest.Messages;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Engines
|
||||
{
|
||||
[Reads(typeof(Transform3DComponent))]
|
||||
[Receives(
|
||||
typeof(TranslationMessage),
|
||||
typeof(LocalTranslationMessage),
|
||||
typeof(LocalRotationMessage)
|
||||
)]
|
||||
[Writes(typeof(Transform3DComponent))]
|
||||
public class MotionEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
foreach (var entity in ReadEntities<Transform3DComponent>())
|
||||
{
|
||||
ref readonly var transformComponent = ref GetComponent<Transform3DComponent>(entity);
|
||||
|
||||
Vector3 translation = Vector3.Zero;
|
||||
Vector3 localTranslation = Vector3.Zero;
|
||||
|
||||
Quaternion rotation = Quaternion.Identity;
|
||||
Quaternion localRotation = Quaternion.Identity;
|
||||
|
||||
foreach (var message in ReadMessagesWithEntity<TranslationMessage>(entity))
|
||||
{
|
||||
translation += message.Translation;
|
||||
}
|
||||
|
||||
foreach (var message in ReadMessagesWithEntity<LocalTranslationMessage>(entity))
|
||||
{
|
||||
localTranslation += message.Translation;
|
||||
}
|
||||
|
||||
foreach (var message in ReadMessagesWithEntity<LocalRotationMessage>(entity))
|
||||
{
|
||||
localRotation *= message.Rotation;
|
||||
}
|
||||
|
||||
var newTransform =
|
||||
transformComponent.Transform.
|
||||
TranslateLocal(localTranslation).
|
||||
RotateLocal(localRotation).
|
||||
Translate(translation);
|
||||
|
||||
|
||||
SetComponent(entity, new Transform3DComponent(newTransform));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
using Encompass;
|
||||
using KavTest.Components;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Engines
|
||||
{
|
||||
[Reads(typeof(Transform3DComponent), typeof(AngularVelocityComponent))]
|
||||
[Writes(typeof(Transform3DComponent))]
|
||||
public class RotationEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
foreach (var entity in ReadEntities<AngularVelocityComponent>())
|
||||
{
|
||||
if (HasComponent<Transform3DComponent>(entity))
|
||||
{
|
||||
ref readonly var angularVelocityComponent = ref GetComponent<AngularVelocityComponent>(entity);
|
||||
ref readonly var transformComponent = ref GetComponent<Transform3DComponent>(entity);
|
||||
|
||||
var angularVelocity = angularVelocityComponent.AngularVelocity * (float)dt;
|
||||
|
||||
SetComponent(entity, new Transform3DComponent(transformComponent.Transform.Rotate(angularVelocity)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -30,7 +30,6 @@
|
|||
<ProjectReference Include="..\encompass-cs\encompass-cs\encompass-cs.csproj" />
|
||||
<ProjectReference Include="..\Kav\Kav.csproj" />
|
||||
<ProjectReference Include="..\Smuggler\Smuggler.csproj" />
|
||||
<ProjectReference Include="..\NoAlloq\NoAlloq\NoAlloq.csproj" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\build\CopyFNALibs.targets"/>
|
||||
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
|
||||
|
|
|
@ -33,10 +33,13 @@ namespace KavTest
|
|||
{
|
||||
var rustyBallModel = ModelLoader.Load(
|
||||
GraphicsDevice,
|
||||
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/cube.glb"))
|
||||
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/rustysphere.glb"))
|
||||
);
|
||||
|
||||
WorldBuilder.AddEngine(new RotationEngine());
|
||||
WorldBuilder.AddEngine(new InputEngine());
|
||||
WorldBuilder.AddEngine(new AngularVelocityEngine());
|
||||
WorldBuilder.AddEngine(new MotionEngine());
|
||||
WorldBuilder.AddEngine(new CameraEngine());
|
||||
WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
|
||||
WorldBuilder.AddEngine(new LightBulbSpawner());
|
||||
WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);
|
||||
|
@ -47,12 +50,12 @@ namespace KavTest
|
|||
));
|
||||
|
||||
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
|
||||
new Transform3D(new Vector3(-5, 0, 0)),
|
||||
new Transform3D(new Vector3(-3, 0, 0)),
|
||||
new Vector3(-1, 1, -1)
|
||||
));
|
||||
|
||||
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
|
||||
new Transform3D(new Vector3(5, 0, 0)),
|
||||
new Transform3D(new Vector3(3, 0, 0)),
|
||||
new Vector3(-1, 1, 1)
|
||||
));
|
||||
|
||||
|
@ -62,11 +65,22 @@ namespace KavTest
|
|||
300f
|
||||
));
|
||||
|
||||
var cameraMatrix = Matrix.CreateLookAt(new Vector3(10, 0, 0), Vector3.Zero, Vector3.Up);
|
||||
var cameraTransform = new Transform3D(
|
||||
new Vector3(0, 0, -10),
|
||||
Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.Pi),
|
||||
Vector3.One
|
||||
);
|
||||
|
||||
var cameraEntity = WorldBuilder.CreateEntity();
|
||||
WorldBuilder.SetComponent(cameraEntity, new Transform3DComponent(
|
||||
cameraTransform
|
||||
));
|
||||
WorldBuilder.SetComponent(cameraEntity, new CameraComponent(
|
||||
new Kav.Camera(
|
||||
cameraMatrix
|
||||
Matrix.CreatePerspectiveFieldOfView(
|
||||
MathHelper.PiOver4,
|
||||
16f / 9f,
|
||||
0.1f,
|
||||
200f
|
||||
)
|
||||
));
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
using Encompass;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Messages
|
||||
{
|
||||
public struct LocalRotationMessage : IMessage, IHasEntity
|
||||
{
|
||||
public Entity Entity { get; }
|
||||
public Quaternion Rotation { get; }
|
||||
|
||||
public LocalRotationMessage(Entity entity, Quaternion rotation)
|
||||
{
|
||||
Entity = entity;
|
||||
Rotation = rotation;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
using Encompass;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Messages
|
||||
{
|
||||
public struct LocalTranslationMessage : IMessage, IHasEntity
|
||||
{
|
||||
public Entity Entity { get; }
|
||||
public Vector3 Translation { get; }
|
||||
|
||||
public LocalTranslationMessage(Entity entity, Vector3 translation)
|
||||
{
|
||||
Entity = entity;
|
||||
Translation = translation;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
using Encompass;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Messages
|
||||
{
|
||||
public struct MoveCameraMessage : IMessage
|
||||
{
|
||||
public Vector3 Translation { get; }
|
||||
|
||||
public MoveCameraMessage(Vector3 translation)
|
||||
{
|
||||
Translation = translation;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
using Encompass;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace KavTest.Messages
|
||||
{
|
||||
public struct TranslationMessage : IMessage, IHasEntity
|
||||
{
|
||||
public Entity Entity { get; }
|
||||
public Vector3 Translation { get; }
|
||||
|
||||
public TranslationMessage(Entity entity, Vector3 translation)
|
||||
{
|
||||
Entity = entity;
|
||||
Translation = translation;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -53,11 +53,18 @@ namespace KavTest.Renderers
|
|||
{
|
||||
if (SomeComponent<CameraComponent>())
|
||||
{
|
||||
var cameraComponent = ReadComponent<CameraComponent>();
|
||||
var cameraEntity = ReadEntity<CameraComponent>();
|
||||
var transformComponent = GetComponent<Transform3DComponent>(cameraEntity);
|
||||
var cameraComponent = GetComponent<CameraComponent>(cameraEntity);
|
||||
|
||||
var camera = new Kav.Camera(
|
||||
transformComponent.Transform.TransformMatrix,
|
||||
cameraComponent.Projection
|
||||
);
|
||||
|
||||
Kav.Renderer.Render(
|
||||
GraphicsDevice,
|
||||
cameraComponent.Camera,
|
||||
camera,
|
||||
Models,
|
||||
PointLights
|
||||
);
|
||||
|
|
|
@ -4,57 +4,73 @@ namespace KavTest
|
|||
{
|
||||
public struct Transform3D : System.IEquatable<Transform3D>
|
||||
{
|
||||
public Matrix TransformMatrix { get; private set; }
|
||||
public static Transform3D Identity = new Transform3D(Vector3.Zero, Quaternion.Identity, Vector3.One);
|
||||
|
||||
public Vector3 Position { get; private set; }
|
||||
public Matrix TransformMatrix { get; }
|
||||
public Vector3 Position { get; }
|
||||
public Quaternion Orientation { get; }
|
||||
public Vector3 Scale { get; }
|
||||
|
||||
public Vector3 Forward { get { return TransformMatrix.Forward; } }
|
||||
public Vector3 Right { get { return TransformMatrix.Right; } }
|
||||
public Vector3 Up { get { return TransformMatrix.Up; } }
|
||||
|
||||
public Transform3D(Vector3 position, Quaternion orientation, Vector3 scale)
|
||||
{
|
||||
Position = position;
|
||||
TransformMatrix = CreateTransformMatrix(position, orientation, scale);
|
||||
Orientation = orientation;
|
||||
Scale = scale;
|
||||
TransformMatrix = CreateTransformMatrix(Position, Orientation, Scale);
|
||||
}
|
||||
|
||||
public Transform3D(Vector3 position, Quaternion orientation)
|
||||
{
|
||||
Position = position;
|
||||
Orientation = orientation;
|
||||
Scale = Vector3.One;
|
||||
TransformMatrix = CreateTransformMatrix(Position, Orientation, Scale);
|
||||
}
|
||||
|
||||
public Transform3D(Vector3 position)
|
||||
{
|
||||
Position = position;
|
||||
TransformMatrix = CreateTransformMatrix(position, Quaternion.Identity, Vector3.One);
|
||||
}
|
||||
|
||||
public Transform3D(Matrix matrix)
|
||||
{
|
||||
Position = matrix.Translation;
|
||||
TransformMatrix = matrix;
|
||||
Orientation = Quaternion.Identity;
|
||||
Scale = Vector3.One;
|
||||
TransformMatrix = CreateTransformMatrix(Position, Orientation, Scale);
|
||||
}
|
||||
|
||||
public Transform3D WithPosition(Vector3 position)
|
||||
{
|
||||
return Translate(position - TransformMatrix.Translation);
|
||||
return Translate(position - Position);
|
||||
}
|
||||
|
||||
public Transform3D Translate(Vector3 translation)
|
||||
{
|
||||
return new Transform3D(Matrix.CreateTranslation(translation) * TransformMatrix);
|
||||
return new Transform3D(Position + translation, Orientation, Scale);
|
||||
}
|
||||
|
||||
public Transform3D Rotate(Quaternion other)
|
||||
public Transform3D TranslateLocal(Vector3 translation)
|
||||
{
|
||||
return new Transform3D(Matrix.CreateFromQuaternion(other) * TransformMatrix);
|
||||
return Translate(Vector3.Transform(translation, Orientation));
|
||||
}
|
||||
|
||||
public Transform3D Rotate(float yaw, float pitch, float roll)
|
||||
public Transform3D RotateLocal(Quaternion other)
|
||||
{
|
||||
return Rotate(Quaternion.CreateFromYawPitchRoll(
|
||||
return new Transform3D(Position, Orientation * other, Scale);
|
||||
}
|
||||
|
||||
public Transform3D RotateLocal(float yaw, float pitch, float roll)
|
||||
{
|
||||
return RotateLocal(Quaternion.CreateFromYawPitchRoll(
|
||||
yaw,
|
||||
pitch,
|
||||
roll
|
||||
));
|
||||
}
|
||||
|
||||
public Transform3D Rotate(Vector3 eulerAngles)
|
||||
public Transform3D RotateLocal(Vector3 eulerAngles)
|
||||
{
|
||||
return Rotate(Quaternion.CreateFromYawPitchRoll(
|
||||
return RotateLocal(Quaternion.CreateFromYawPitchRoll(
|
||||
eulerAngles.X,
|
||||
eulerAngles.Y,
|
||||
eulerAngles.Z
|
||||
|
@ -63,9 +79,7 @@ namespace KavTest
|
|||
|
||||
public Transform3D Compose(Transform3D other)
|
||||
{
|
||||
return new Transform3D(
|
||||
other.TransformMatrix * TransformMatrix
|
||||
);
|
||||
return new Transform3D(Position + other.Position, Orientation * other.Orientation, Scale * other.Scale);
|
||||
}
|
||||
|
||||
private static Matrix CreateTransformMatrix(Vector3 position, Quaternion orientation, Vector3 scale)
|
||||
|
|
Loading…
Reference in New Issue