diff --git a/Kav b/Kav index 47242e4..ca6c914 160000 --- a/Kav +++ b/Kav @@ -1 +1 @@ -Subproject commit 47242e4f52d11b16ec4bc5b630d5d58869dedd92 +Subproject commit ca6c91446e7a36c72db4f50ba6d7b6ab91a35605 diff --git a/KavTest/Components/MeshSpriteComponent.cs b/KavTest/Components/MeshSpriteComponent.cs new file mode 100644 index 0000000..18c3ce5 --- /dev/null +++ b/KavTest/Components/MeshSpriteComponent.cs @@ -0,0 +1,16 @@ +using Encompass; +using Kav; + +namespace KavTest +{ + public struct MeshSpriteComponent : IComponent + { + public MeshSprite MeshSprite { get; } + + public MeshSpriteComponent( + MeshSprite meshSprite + ) { + MeshSprite = meshSprite; + } + } +} diff --git a/KavTest/Engines/Spawners/BillboardSpriteSpawner.cs b/KavTest/Engines/Spawners/BillboardSpriteSpawner.cs deleted file mode 100644 index 449adc8..0000000 --- a/KavTest/Engines/Spawners/BillboardSpriteSpawner.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Encompass; -using KavTest.Components; -using KavTest.Messages; -using Microsoft.Xna.Framework; - -namespace KavTest.Spawners -{ - public class BillboardSpriteSpawner : Spawner - { - protected override void Spawn(in BillboardSpriteSpawnMessage message) - { - var entity = CreateEntity(); - - var transform = new Transform3D( - message.Position, - Quaternion.Identity, - new Vector3(message.Scale, 1) - ); - - AddComponent(entity, new Transform3DComponent(transform)); - AddComponent(entity, new SpriteComponent( - message.Texture, - message.Origin, - message.Rotation, - message.BillboardConstraint - )); - } - } -} diff --git a/KavTest/Engines/Spawners/MeshSpriteSpawner.cs b/KavTest/Engines/Spawners/MeshSpriteSpawner.cs new file mode 100644 index 0000000..5a56f66 --- /dev/null +++ b/KavTest/Engines/Spawners/MeshSpriteSpawner.cs @@ -0,0 +1,18 @@ +using Encompass; +using KavTest.Components; +using KavTest.Messages; +using Microsoft.Xna.Framework; + +namespace KavTest.Spawners +{ + public class MeshSpriteSpawner : Spawner + { + protected override void Spawn(in MeshSpriteSpawnMessage message) + { + var entity = CreateEntity(); + + AddComponent(entity, new Transform3DComponent(message.Transform)); + AddComponent(entity, new MeshSpriteComponent(message.MeshSprite)); + } + } +} diff --git a/KavTest/KavTestGame.cs b/KavTest/KavTestGame.cs index 5e0d740..406eb5d 100644 --- a/KavTest/KavTestGame.cs +++ b/KavTest/KavTestGame.cs @@ -171,6 +171,12 @@ namespace KavTest var mushroomGuyTexture = Texture2D.FromStream(GraphicsDevice, new FileStream("Content/Sprites/mushroomguy.png", FileMode.Open)); + var mushroomGuyMeshSprite = new Kav.MeshSprite( + GraphicsDevice, + mushroomGuyTexture, + Kav.SpriteBillboardConstraint.None + ); + WorldBuilder.AddEngine(new InputEngine(this)); WorldBuilder.AddEngine(new AngularVelocityEngine()); WorldBuilder.AddEngine(new MoveAlongCurve3DEngine()); @@ -180,7 +186,7 @@ namespace KavTest WorldBuilder.AddEngine(new LightBulbSpawner(lightBulbModel)); WorldBuilder.AddEngine(new StaticModelSpawner()); WorldBuilder.AddEngine(new DirectionalLightSpawner()); - WorldBuilder.AddEngine(new BillboardSpriteSpawner()); + WorldBuilder.AddEngine(new MeshSpriteSpawner()); WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0); // WorldBuilder.SendMessage(new RustyBallSpawnMessage( @@ -244,12 +250,9 @@ namespace KavTest cubeModel )); - WorldBuilder.SendMessage(new BillboardSpriteSpawnMessage( - mushroomGuyTexture, - new Vector3(3, -2, 8), - 0f, - new Vector2(mushroomGuyTexture.Width, mushroomGuyTexture.Height) * 0.025f, - Kav.SpriteBillboardConstraint.Full + WorldBuilder.SendMessage(new MeshSpriteSpawnMessage( + new Transform3D(new Vector3(3, 0, 11), Quaternion.Identity, Vector3.One), + mushroomGuyMeshSprite )); // WorldBuilder.SendMessage(new StaticModelSpawnMessage( diff --git a/KavTest/Messages/BillboardSpriteSpawnMessage.cs b/KavTest/Messages/BillboardSpriteSpawnMessage.cs deleted file mode 100644 index 6159397..0000000 --- a/KavTest/Messages/BillboardSpriteSpawnMessage.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Encompass; -using Kav; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; - -namespace KavTest.Messages -{ - public struct BillboardSpriteSpawnMessage : IMessage - { - public Texture2D Texture { get; } - public Vector3 Position { get; } - public Vector2 Origin { get; } - public float Rotation { get; } - public Vector2 Scale { get; } - public SpriteBillboardConstraint BillboardConstraint { get; } - - public BillboardSpriteSpawnMessage( - Texture2D texture, - Vector3 position, - float rotation, - Vector2 scale, - SpriteBillboardConstraint billboardConstraint - ) { - Texture = texture; - Origin = new Vector2(texture.Width / 2, texture.Height); - Position = position; - Rotation = rotation; - Scale = scale; - BillboardConstraint = billboardConstraint; - } - } -} diff --git a/KavTest/Messages/MeshSpriteSpawnMessage.cs b/KavTest/Messages/MeshSpriteSpawnMessage.cs new file mode 100644 index 0000000..41f58cc --- /dev/null +++ b/KavTest/Messages/MeshSpriteSpawnMessage.cs @@ -0,0 +1,19 @@ +using Encompass; +using Kav; + +namespace KavTest.Messages +{ + public struct MeshSpriteSpawnMessage : IMessage + { + public Transform3D Transform { get; } + public MeshSprite MeshSprite { get; } + + public MeshSpriteSpawnMessage( + Transform3D transform, + MeshSprite meshSprite + ) { + Transform = transform; + MeshSprite = meshSprite; + } + } +} diff --git a/KavTest/Renderers/SceneRenderer.cs b/KavTest/Renderers/SceneRenderer.cs index c52d6ad..6cfe9c9 100644 --- a/KavTest/Renderers/SceneRenderer.cs +++ b/KavTest/Renderers/SceneRenderer.cs @@ -78,37 +78,34 @@ namespace KavTest.Renderers } } - private Kav.DirectionalLight DirectionalLight() + private Kav.DirectionalLight? DirectionalLight() { - var entity = ReadEntity(); - var transformComponent = GetComponent(entity); - var directionalLightComponent = GetComponent(entity); + if (SomeComponent()) + { + var entity = ReadEntity(); + var transformComponent = GetComponent(entity); + var directionalLightComponent = GetComponent(entity); - return new Kav.DirectionalLight( - transformComponent.Transform.Forward, - directionalLightComponent.Color, - directionalLightComponent.Intensity - ); + return new Kav.DirectionalLight( + transformComponent.Transform.Forward, + directionalLightComponent.Color, + directionalLightComponent.Intensity + ); + } + else + { + return null; + } } - private IEnumerable Sprites() + private IEnumerable<(MeshSprite, Matrix)> MeshSpriteTransforms() { - foreach (var entity in ReadEntitiesAsEnumerable()) + foreach (var entity in ReadEntitiesAsEnumerable()) { var transformComponent = GetComponent(entity); - var spriteComponent = GetComponent(entity); + var spriteComponent = GetComponent(entity); - yield return new Sprite( - spriteComponent.Texture, - transformComponent.Transform.Position, - spriteComponent.Origin, - spriteComponent.Rotation, - new Vector2( - transformComponent.Transform.Scale.X, - transformComponent.Transform.Scale.Y - ), - spriteComponent.BillboardConstraint - ); + yield return (spriteComponent.MeshSprite, transformComponent.Transform.TransformMatrix); } } @@ -200,11 +197,11 @@ namespace KavTest.Renderers ReadComponent().Skybox ); - Renderer.BillboardSpriteRender( + Renderer.MeshSpriteRender( BillboardTarget, camera, ModelTransforms, - Sprites(), + MeshSpriteTransforms(), AmbientLight, PointLights, DirectionalLight()