From 367e2795ae19fce1ec59588f3bc964c3add6d30b Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Tue, 8 Dec 2020 15:29:28 -0800 Subject: [PATCH] decouple billboard constraints from meshsprite --- Geometry/MeshSprite.cs | 9 ++---- Renderer.cs | 69 ++++++++++++++++++++++++------------------ 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/Geometry/MeshSprite.cs b/Geometry/MeshSprite.cs index dce9752..33a673e 100644 --- a/Geometry/MeshSprite.cs +++ b/Geometry/MeshSprite.cs @@ -19,7 +19,6 @@ namespace Kav public Texture2D Texture { get; } public Texture2D Normal { get; } - public SpriteBillboardConstraint BillboardConstraint { get; } public IndexBuffer IndexBuffer { get; } public VertexBuffer VertexBuffer { get; } @@ -27,12 +26,10 @@ namespace Kav public MeshSprite( GraphicsDevice graphicsDevice, - Texture2D texture, - SpriteBillboardConstraint billboardConstraint + Texture2D texture ) { Texture = texture; Normal = null; - BillboardConstraint = billboardConstraint; IndexBuffer = new IndexBuffer( graphicsDevice, @@ -58,12 +55,10 @@ namespace Kav public MeshSprite( GraphicsDevice graphicsDevice, Texture2D texture, - Texture2D normal, - SpriteBillboardConstraint billboardConstraint + Texture2D normal ) { Texture = texture; Normal = normal; - BillboardConstraint = billboardConstraint; IndexBuffer = new IndexBuffer( graphicsDevice, diff --git a/Renderer.cs b/Renderer.cs index 5eabb74..d85af09 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -104,7 +104,7 @@ namespace Kav public void MeshSpriteRender( RenderTarget2D renderTarget, PerspectiveCamera camera, - IEnumerable<(MeshSprite, Matrix)> meshSpriteTransforms, + IEnumerable<(MeshSprite, SpriteBillboardConstraint, Matrix)> meshSpriteBillboardTransforms, AmbientLight ambientLight, IEnumerable pointLights, DirectionalLight? directionalLight @@ -145,34 +145,11 @@ namespace Kav var boundingFrustum = new BoundingFrustum(camera.View * camera.Projection); - foreach (var (sprite, transform) in FrustumCull(boundingFrustum, meshSpriteTransforms)) + foreach (var (sprite, transform) in FrustumCull(boundingFrustum, BillboardTransforms(camera, meshSpriteBillboardTransforms))) { DiffuseLitSpriteEffect.NormalMapEnabled = sprite.Normal != null; - if (sprite.BillboardConstraint == SpriteBillboardConstraint.None) - { - DiffuseLitSpriteEffect.World = transform; - } - else if (sprite.BillboardConstraint == SpriteBillboardConstraint.Horizontal) - { - DiffuseLitSpriteEffect.World = Matrix.CreateConstrainedBillboard( - transform.Translation, - camera.Position, - Vector3.Up, - camera.Forward, - camera.Position - transform.Translation - ); - } - else - { - DiffuseLitSpriteEffect.World = Matrix.CreateConstrainedBillboard( - transform.Translation, - camera.Position, - Vector3.Up, - null, - null - ); - } + DiffuseLitSpriteEffect.World = transform; GraphicsDevice.Textures[0] = sprite.Texture; GraphicsDevice.Textures[1] = sprite.Normal; @@ -196,6 +173,39 @@ namespace Kav } } + private IEnumerable<(MeshSprite, Matrix)> BillboardTransforms( + PerspectiveCamera camera, + IEnumerable<(MeshSprite, SpriteBillboardConstraint, Matrix)> meshSpriteBillboardTransforms + ) { + foreach (var (sprite, billboardConstraint, transform) in meshSpriteBillboardTransforms) + { + if (billboardConstraint == SpriteBillboardConstraint.None) + { + yield return (sprite, transform); + } + else if (billboardConstraint == SpriteBillboardConstraint.Horizontal) + { + yield return (sprite, Matrix.CreateConstrainedBillboard( + transform.Translation, + camera.Position, + Vector3.Up, + camera.Forward, + camera.Position - transform.Translation + )); + } + else + { + yield return (sprite, Matrix.CreateConstrainedBillboard( + transform.Translation, + camera.Position, + Vector3.Up, + null, + null + )); + } + } + } + // Renders a series of drawable-transform pairs using an effect that has a World matrix. // Effect must be pre-configured!! public static void CullAndRenderIndexed( @@ -243,7 +253,6 @@ namespace Kav public static int FillAndSetBuffersForInstancing( GraphicsDevice graphicsDevice, - BoundingFrustum boundingFrustum, T drawable, IEnumerable transforms, V[] vertexData, @@ -251,7 +260,7 @@ namespace Kav ) where T : ICullable, IIndexDrawable where V : struct, IVertexType, IHasTranslation { int numInstances = 0; - foreach (var transform in FrustumCull(boundingFrustum, drawable, transforms)) + foreach (var transform in transforms) { vertexData[numInstances].Translation = transform.Translation; numInstances += 1; @@ -385,13 +394,14 @@ namespace Kav var numInstances = FillAndSetBuffersForInstancing( GraphicsDevice, - new BoundingFrustum(camera.View * camera.Projection), drawable, transforms, PositionInstanceVertices, PositionInstanceVertexBuffer ); + if (numInstances == 0) { return; } + RenderInstanced( GraphicsDevice, drawable, @@ -738,7 +748,6 @@ namespace Kav var numInstances = FillAndSetBuffersForInstancing( GraphicsDevice, - new BoundingFrustum(SimpleDepthEffectInstanced.View * SimpleDepthEffectInstanced.Projection), drawable, transforms, PositionInstanceVertices,