From 92379f1ae9436e6db0a45bbb9d0704b193f7a08e Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Wed, 26 Aug 2020 16:07:31 -0700 Subject: [PATCH] cube appearance matches light --- KavTest/Components/OverrideAlbedoComponent.cs | 15 ++++ KavTest/Engines/Spawners/LightBulbSpawner.cs | 1 + KavTest/KavTestGame.cs | 66 +++-------------- KavTest/Renderers/SceneRenderer.cs | 17 +++++ KavTest/Utility/RandomHelper.cs | 71 +++++++++++++++++++ 5 files changed, 115 insertions(+), 55 deletions(-) create mode 100644 KavTest/Components/OverrideAlbedoComponent.cs create mode 100644 KavTest/Utility/RandomHelper.cs diff --git a/KavTest/Components/OverrideAlbedoComponent.cs b/KavTest/Components/OverrideAlbedoComponent.cs new file mode 100644 index 0000000..dba30db --- /dev/null +++ b/KavTest/Components/OverrideAlbedoComponent.cs @@ -0,0 +1,15 @@ +using Microsoft.Xna.Framework; +using Encompass; + +namespace KavTest.Components +{ + public struct OverrideAlbedoComponent : IComponent + { + public Vector3 Color { get; } + + public OverrideAlbedoComponent(Vector3 color) + { + Color = color; + } + } +} diff --git a/KavTest/Engines/Spawners/LightBulbSpawner.cs b/KavTest/Engines/Spawners/LightBulbSpawner.cs index 27b97ee..3b3801a 100644 --- a/KavTest/Engines/Spawners/LightBulbSpawner.cs +++ b/KavTest/Engines/Spawners/LightBulbSpawner.cs @@ -22,6 +22,7 @@ namespace KavTest.Spawners AddComponent(entity, new PointLightComponent(message.Color, message.Intensity)); AddComponent(entity, new MoveAlongCurve3DComponent(message.Curve)); AddComponent(entity, new ModelComponent(LightBulbModel)); + AddComponent(entity, new OverrideAlbedoComponent(message.Color.ToVector3())); } } } diff --git a/KavTest/KavTestGame.cs b/KavTest/KavTestGame.cs index d535977..cdd3f88 100644 --- a/KavTest/KavTestGame.cs +++ b/KavTest/KavTestGame.cs @@ -3,6 +3,7 @@ using System.IO; using Encompass; using KavTest.Components; using KavTest.Engines; +using KavTest.Extensions; using KavTest.Messages; using KavTest.Renderers; using KavTest.Spawners; @@ -81,62 +82,17 @@ namespace KavTest new Vector3(-1, 1, 1) )); - var lightMovementSpline = new SplineCurve3D( - ImmutableArray.Create( - 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( - 3f, - 3f - ), - true - ); + for (var i = 0; i < 64; i++) + { + var start = RandomHelper.RandomVector3(-5, 5); - 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 - // )); + WorldBuilder.SendMessage(new LightBulbSpawnMessage( + new Transform3D(start.ToXNAVector(), Quaternion.Identity, new Vector3(0.1f, 0.1f, 0.1f)), + RandomHelper.RandomColor(), + 5f, + RandomHelper.RandomLoop(start, -15, 15, 3, 10) + )); + } var directionalLightEntity = WorldBuilder.CreateEntity(); WorldBuilder.SetComponent(directionalLightEntity, new Transform3DComponent( diff --git a/KavTest/Renderers/SceneRenderer.cs b/KavTest/Renderers/SceneRenderer.cs index 1814a34..fb014db 100644 --- a/KavTest/Renderers/SceneRenderer.cs +++ b/KavTest/Renderers/SceneRenderer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Encompass; using Kav; using KavTest.Components; +using KavTest.Extensions; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -20,6 +21,22 @@ namespace KavTest.Renderers { var transformComponent = GetComponent(entity); var modelComponent = GetComponent(entity); + if (HasComponent(entity)) + { + var overrideAlbedoComponent = GetComponent(entity); + + foreach (var mesh in modelComponent.Model.Meshes) + { + foreach (var meshPart in mesh.MeshParts) + { + if (meshPart.Effect is GBufferEffect gBufferEffect) + { + gBufferEffect.AlbedoTexture = null; + gBufferEffect.Albedo = overrideAlbedoComponent.Color; + } + } + } + } yield return (modelComponent.Model, transformComponent.Transform.TransformMatrix); } } diff --git a/KavTest/Utility/RandomHelper.cs b/KavTest/Utility/RandomHelper.cs new file mode 100644 index 0000000..8e96afa --- /dev/null +++ b/KavTest/Utility/RandomHelper.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Immutable; +using System.Numerics; +using MoonTools.Curve; + +namespace KavTest +{ + public static class RandomHelper + { + private static Random s_random = new Random(); + + public static double RandomDouble(double min, double max) + { + return (s_random.NextDouble() * (max - min)) + min; + } + + public static float RandomFloat(float min, float max) + { + return (float)(RandomDouble(min, max)); + } + + public static int RandomInt(int min, int max) + { + return (int)(Math.Floor(RandomDouble(min, max))); + } + + public static SplineCurve3D RandomLoop(Vector3 start, float minMotion, float maxMotion, float minTime, float maxTime) + { + var midpoint = start + RandomVector3(minMotion, maxMotion); + var controlPointTranslation = RandomVector3(minMotion, maxMotion); + + var curveOne = new QuadraticBezierCurve3D( + start, + start + controlPointTranslation, + midpoint + ); + var curveTwo = new QuadraticBezierCurve3D( + midpoint, + start - controlPointTranslation, // co-linear control points produce smooth curves + start + ); + + return new SplineCurve3D( + ImmutableArray.Create( + curveOne, + curveTwo + ), + ImmutableArray.Create( + RandomFloat(minTime, maxTime / 2), + RandomFloat(minTime, maxTime / 2) + ), + true + ); + } + + public static Vector3 RandomVector3(float min, float max) + { + return new Vector3( + RandomFloat(min, max), + RandomFloat(min, max), + RandomFloat(min, max) + ); + } + + public static Microsoft.Xna.Framework.Color RandomColor() + { + var randomColor = RandomVector3(0f, 1f); + return new Microsoft.Xna.Framework.Color(randomColor.X, randomColor.Y, randomColor.Z); + } + } +}