add spline based motion
parent
bf913716e7
commit
eb51182760
|
@ -10,3 +10,6 @@
|
||||||
[submodule "Smuggler"]
|
[submodule "Smuggler"]
|
||||||
path = Smuggler
|
path = Smuggler
|
||||||
url = https://gitea.moonside.games/MoonsideGames/Smuggler.git
|
url = https://gitea.moonside.games/MoonsideGames/Smuggler.git
|
||||||
|
[submodule "MoonTools.Curve"]
|
||||||
|
path = MoonTools.Curve
|
||||||
|
url = https://gitea.moonside.games/MoonsideGames/MoonTools.Curve.git
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
using Encompass;
|
||||||
|
using KavTest.Extensions;
|
||||||
|
using MoonTools.Curve;
|
||||||
|
|
||||||
|
namespace KavTest.Components
|
||||||
|
{
|
||||||
|
public struct MoveAlongCurve3DComponent : IComponent
|
||||||
|
{
|
||||||
|
public SplineCurve3D Curve { get; }
|
||||||
|
public float Time { get; }
|
||||||
|
|
||||||
|
public MoveAlongCurve3DComponent(SplineCurve3D curve)
|
||||||
|
{
|
||||||
|
Curve = curve;
|
||||||
|
Time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MoveAlongCurve3DComponent(SplineCurve3D curve, float currentTime)
|
||||||
|
{
|
||||||
|
Curve = curve;
|
||||||
|
Time = currentTime;
|
||||||
|
}
|
||||||
|
public Microsoft.Xna.Framework.Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Curve.Point(Time).ToXNAVector();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,29 @@
|
||||||
|
using Encompass;
|
||||||
|
using KavTest.Components;
|
||||||
|
using KavTest.Messages;
|
||||||
|
|
||||||
|
namespace KavTest.Engines
|
||||||
|
{
|
||||||
|
[Sends(typeof(TranslationMessage))]
|
||||||
|
[Writes(typeof(MoveAlongCurve3DComponent))]
|
||||||
|
[QueryWith(typeof(MoveAlongCurve3DComponent), typeof(Transform3DComponent))]
|
||||||
|
public class MoveAlongCurve3DEngine : Engine
|
||||||
|
{
|
||||||
|
public override void Update(double dt)
|
||||||
|
{
|
||||||
|
foreach (var entity in TrackedEntities)
|
||||||
|
{
|
||||||
|
ref readonly var movealongCurveComponent = ref GetComponent<MoveAlongCurve3DComponent>(entity);
|
||||||
|
ref readonly var transformComponent = ref GetComponent<Transform3DComponent>(entity);
|
||||||
|
|
||||||
|
var newCurve = new MoveAlongCurve3DComponent(
|
||||||
|
movealongCurveComponent.Curve,
|
||||||
|
movealongCurveComponent.Time + (float)dt
|
||||||
|
);
|
||||||
|
|
||||||
|
SendMessage(new TranslationMessage(entity, newCurve.Position - transformComponent.Transform.Position));
|
||||||
|
SetComponent(entity, newCurve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using Encompass;
|
using Encompass;
|
||||||
|
using Kav;
|
||||||
using KavTest.Components;
|
using KavTest.Components;
|
||||||
using KavTest.Messages;
|
using KavTest.Messages;
|
||||||
|
|
||||||
|
@ -6,12 +7,21 @@ namespace KavTest.Spawners
|
||||||
{
|
{
|
||||||
public class LightBulbSpawner : Spawner<LightBulbSpawnMessage>
|
public class LightBulbSpawner : Spawner<LightBulbSpawnMessage>
|
||||||
{
|
{
|
||||||
|
public Model LightBulbModel { get; }
|
||||||
|
|
||||||
|
public LightBulbSpawner(Model lightBulbModel)
|
||||||
|
{
|
||||||
|
LightBulbModel = lightBulbModel;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Spawn(in LightBulbSpawnMessage message)
|
protected override void Spawn(in LightBulbSpawnMessage message)
|
||||||
{
|
{
|
||||||
var entity = CreateEntity();
|
var entity = CreateEntity();
|
||||||
|
|
||||||
AddComponent(entity, new Transform3DComponent(message.Transform));
|
AddComponent(entity, new Transform3DComponent(message.Transform));
|
||||||
AddComponent(entity, new PointLightComponent(message.Color, message.Intensity));
|
AddComponent(entity, new PointLightComponent(message.Color, message.Intensity));
|
||||||
|
AddComponent(entity, new MoveAlongCurve3DComponent(message.Curve));
|
||||||
|
AddComponent(entity, new ModelComponent(LightBulbModel));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace KavTest.Extensions
|
||||||
|
{
|
||||||
|
public static class Vector3Extensions
|
||||||
|
{
|
||||||
|
public static Microsoft.Xna.Framework.Vector3 ToXNAVector(this System.Numerics.Vector3 vector)
|
||||||
|
{
|
||||||
|
return new Microsoft.Xna.Framework.Vector3(vector.X, vector.Y, vector.Z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,7 @@
|
||||||
<ProjectReference Include="..\encompass-cs\encompass-cs\encompass-cs.csproj" />
|
<ProjectReference Include="..\encompass-cs\encompass-cs\encompass-cs.csproj" />
|
||||||
<ProjectReference Include="..\Kav\Kav.Core.csproj" />
|
<ProjectReference Include="..\Kav\Kav.Core.csproj" />
|
||||||
<ProjectReference Include="..\Smuggler\Smuggler.Core.csproj" />
|
<ProjectReference Include="..\Smuggler\Smuggler.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\MoonTools.Curve\Curve\Curve.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="..\build\CopyFNALibs.targets"/>
|
<Import Project="..\build\CopyFNALibs.targets"/>
|
||||||
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
|
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
<ProjectReference Include="..\encompass-cs\encompass-cs\encompass-cs.csproj" />
|
<ProjectReference Include="..\encompass-cs\encompass-cs\encompass-cs.csproj" />
|
||||||
<ProjectReference Include="..\Kav\Kav.Framework.csproj" />
|
<ProjectReference Include="..\Kav\Kav.Framework.csproj" />
|
||||||
<ProjectReference Include="..\Smuggler\Smuggler.Framework.csproj" />
|
<ProjectReference Include="..\Smuggler\Smuggler.Framework.csproj" />
|
||||||
|
<ProjectReference Include="..\MoonTools.Curve\Curve\Curve.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="..\build\CopyFNALibs.targets"/>
|
<Import Project="..\build\CopyFNALibs.targets"/>
|
||||||
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
|
<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System.Collections.Immutable;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Encompass;
|
using Encompass;
|
||||||
using KavTest.Components;
|
using KavTest.Components;
|
||||||
|
@ -7,6 +8,7 @@ using KavTest.Renderers;
|
||||||
using KavTest.Spawners;
|
using KavTest.Spawners;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using MoonTools.Curve;
|
||||||
|
|
||||||
namespace KavTest
|
namespace KavTest
|
||||||
{
|
{
|
||||||
|
@ -50,12 +52,18 @@ namespace KavTest
|
||||||
Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/rustysphere.glb"))
|
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 InputEngine(this));
|
||||||
WorldBuilder.AddEngine(new AngularVelocityEngine());
|
WorldBuilder.AddEngine(new AngularVelocityEngine());
|
||||||
|
WorldBuilder.AddEngine(new MoveAlongCurve3DEngine());
|
||||||
WorldBuilder.AddEngine(new MotionEngine());
|
WorldBuilder.AddEngine(new MotionEngine());
|
||||||
WorldBuilder.AddEngine(new CameraEngine());
|
WorldBuilder.AddEngine(new CameraEngine());
|
||||||
WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
|
WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
|
||||||
WorldBuilder.AddEngine(new LightBulbSpawner());
|
WorldBuilder.AddEngine(new LightBulbSpawner(lightBulbModel));
|
||||||
WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);
|
WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
|
WorldBuilder.SendMessage(new RustyBallSpawnMessage(
|
||||||
|
@ -73,41 +81,62 @@ namespace KavTest
|
||||||
new Vector3(-1, 1, 1)
|
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(
|
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(-5, 2, -5)),
|
new Transform3D(new Vector3(-5, 2, -5), Quaternion.Identity, new Vector3(0.25f, 0.25f, 0.25f)),
|
||||||
Color.White,
|
Color.White,
|
||||||
300f
|
300f,
|
||||||
|
lightMovementSpline
|
||||||
));
|
));
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(5, 2, -5)),
|
// new Transform3D(new Vector3(5, 2, -5)),
|
||||||
Color.Blue,
|
// Color.Blue,
|
||||||
300f
|
// 300f
|
||||||
));
|
// ));
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(-5, -2, -5)),
|
// new Transform3D(new Vector3(-5, -2, -5)),
|
||||||
Color.Red,
|
// Color.Red,
|
||||||
300f
|
// 300f
|
||||||
));
|
// ));
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(-5, 2, 5)),
|
// new Transform3D(new Vector3(-5, 2, 5)),
|
||||||
Color.Yellow,
|
// Color.Yellow,
|
||||||
300f
|
// 300f
|
||||||
));
|
// ));
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(-5, 2, -10)),
|
// new Transform3D(new Vector3(-5, 2, -10)),
|
||||||
Color.Orange,
|
// Color.Orange,
|
||||||
300f
|
// 300f
|
||||||
));
|
// ));
|
||||||
|
|
||||||
WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
// WorldBuilder.SendMessage(new LightBulbSpawnMessage(
|
||||||
new Transform3D(new Vector3(-10, 2, -5)),
|
// new Transform3D(new Vector3(-10, 2, -5)),
|
||||||
Color.CornflowerBlue,
|
// Color.CornflowerBlue,
|
||||||
300f
|
// 300f
|
||||||
));
|
// ));
|
||||||
|
|
||||||
var directionalLightEntity = WorldBuilder.CreateEntity();
|
var directionalLightEntity = WorldBuilder.CreateEntity();
|
||||||
WorldBuilder.SetComponent(directionalLightEntity, new Transform3DComponent(
|
WorldBuilder.SetComponent(directionalLightEntity, new Transform3DComponent(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Encompass;
|
using Encompass;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
|
using MoonTools.Curve;
|
||||||
|
|
||||||
namespace KavTest.Messages
|
namespace KavTest.Messages
|
||||||
{
|
{
|
||||||
|
@ -8,12 +9,14 @@ namespace KavTest.Messages
|
||||||
public Transform3D Transform { get; }
|
public Transform3D Transform { get; }
|
||||||
public Color Color { get; }
|
public Color Color { get; }
|
||||||
public float Intensity { get; }
|
public float Intensity { get; }
|
||||||
|
public SplineCurve3D Curve { get; }
|
||||||
|
|
||||||
public LightBulbSpawnMessage(Transform3D transform, Color color, float intensity)
|
public LightBulbSpawnMessage(Transform3D transform, Color color, float intensity, SplineCurve3D curve)
|
||||||
{
|
{
|
||||||
Transform = transform;
|
Transform = transform;
|
||||||
Color = color;
|
Color = color;
|
||||||
Intensity = intensity;
|
Intensity = intensity;
|
||||||
|
Curve = curve;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 1a14f2595ad83dae3d6a715506bf2f735168416c
|
Loading…
Reference in New Issue