tweak to mesh sprite draws
parent
7f0bf47f07
commit
8ff6e26887
|
@ -0,0 +1,24 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace Kav.Data
|
||||
{
|
||||
public struct MeshSpriteDrawData
|
||||
{
|
||||
public MeshSprite MeshSprite { get; }
|
||||
public SpriteBillboardConstraint BillboardConstraint { get; }
|
||||
public Matrix TransformMatrix { get; }
|
||||
public UVOffsets UVOffsets { get; }
|
||||
|
||||
public MeshSpriteDrawData(
|
||||
MeshSprite meshSprite,
|
||||
SpriteBillboardConstraint billboardConstraint,
|
||||
Matrix transformMatrix,
|
||||
UVOffsets uVOffsets
|
||||
) {
|
||||
MeshSprite = meshSprite;
|
||||
BillboardConstraint = billboardConstraint;
|
||||
TransformMatrix = transformMatrix;
|
||||
UVOffsets = uVOffsets;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace Kav.Data
|
||||
{
|
||||
public struct UVOffsets
|
||||
{
|
||||
public static UVOffsets Default { get; } = new UVOffsets(
|
||||
new Vector2(0, 0), new Vector2(1, 1)
|
||||
);
|
||||
|
||||
// (start / width), (end / width)
|
||||
public Vector2 StartUV { get; }
|
||||
// (start / height), (end / height)
|
||||
public Vector2 EndUV { get; }
|
||||
|
||||
public UVOffsets(Vector2 startUV, Vector2 endUV)
|
||||
{
|
||||
StartUV = startUV;
|
||||
EndUV = endUV;
|
||||
}
|
||||
}
|
||||
}
|
97
Renderer.cs
97
Renderer.cs
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Kav.Data;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
|
@ -117,7 +118,7 @@ namespace Kav
|
|||
public void MeshSpriteRender(
|
||||
RenderTarget2D renderTarget,
|
||||
PerspectiveCamera camera,
|
||||
IEnumerable<(MeshSprite, SpriteBillboardConstraint, Matrix)> meshSpriteBillboardTransforms,
|
||||
IEnumerable<MeshSpriteDrawData> meshSpriteDrawDatas,
|
||||
AmbientLight ambientLight,
|
||||
IEnumerable<PointLight> pointLights,
|
||||
DirectionalLight? directionalLight
|
||||
|
@ -158,17 +159,24 @@ namespace Kav
|
|||
|
||||
var boundingFrustum = new BoundingFrustum(camera.View * camera.Projection);
|
||||
|
||||
foreach (var (sprite, transform) in FrustumCull(boundingFrustum, BillboardTransforms(camera, meshSpriteBillboardTransforms)))
|
||||
foreach (var data in meshSpriteDrawDatas)
|
||||
{
|
||||
DiffuseLitSpriteEffect.NormalMapEnabled = sprite.Normal != null;
|
||||
var matrix = BillboardTransforms(camera, data.TransformMatrix, data.BillboardConstraint);
|
||||
|
||||
DiffuseLitSpriteEffect.World = transform;
|
||||
if (FrustumCull(boundingFrustum, data.MeshSprite, matrix))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
GraphicsDevice.Textures[0] = sprite.Texture;
|
||||
GraphicsDevice.Textures[1] = sprite.Normal;
|
||||
DiffuseLitSpriteEffect.NormalMapEnabled = data.MeshSprite.Normal != null;
|
||||
|
||||
GraphicsDevice.SetVertexBuffer(sprite.VertexBuffer);
|
||||
GraphicsDevice.Indices = sprite.IndexBuffer;
|
||||
DiffuseLitSpriteEffect.World = matrix;
|
||||
|
||||
GraphicsDevice.Textures[0] = data.MeshSprite.Texture;
|
||||
GraphicsDevice.Textures[1] = data.MeshSprite.Normal;
|
||||
|
||||
GraphicsDevice.SetVertexBuffer(data.MeshSprite.VertexBuffer);
|
||||
GraphicsDevice.Indices = data.MeshSprite.IndexBuffer;
|
||||
|
||||
foreach (var pass in DiffuseLitSpriteEffect.CurrentTechnique.Passes)
|
||||
{
|
||||
|
@ -178,7 +186,7 @@ namespace Kav
|
|||
PrimitiveType.TriangleList,
|
||||
0,
|
||||
0,
|
||||
sprite.VertexBuffer.VertexCount,
|
||||
data.MeshSprite.VertexBuffer.VertexCount,
|
||||
0,
|
||||
2
|
||||
);
|
||||
|
@ -186,36 +194,34 @@ namespace Kav
|
|||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<(MeshSprite, Matrix)> BillboardTransforms(
|
||||
private static Matrix BillboardTransforms(
|
||||
PerspectiveCamera camera,
|
||||
IEnumerable<(MeshSprite, SpriteBillboardConstraint, Matrix)> meshSpriteBillboardTransforms
|
||||
Matrix transform,
|
||||
SpriteBillboardConstraint billboardConstraint
|
||||
) {
|
||||
foreach (var (sprite, billboardConstraint, transform) in meshSpriteBillboardTransforms)
|
||||
if (billboardConstraint == SpriteBillboardConstraint.None)
|
||||
{
|
||||
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
|
||||
));
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
else if (billboardConstraint == SpriteBillboardConstraint.Horizontal)
|
||||
{
|
||||
return Matrix.CreateConstrainedBillboard(
|
||||
transform.Translation,
|
||||
camera.Position,
|
||||
Vector3.Up,
|
||||
camera.Forward,
|
||||
camera.Position - transform.Translation
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Matrix.CreateConstrainedBillboard(
|
||||
transform.Translation,
|
||||
camera.Position,
|
||||
Vector3.Up,
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -924,21 +930,14 @@ namespace Kav
|
|||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<Matrix> FrustumCull<T>(
|
||||
private static bool FrustumCull<T>(
|
||||
BoundingFrustum boundingFrustum,
|
||||
T cullable,
|
||||
IEnumerable<Matrix> transforms
|
||||
) where T : ICullable
|
||||
{
|
||||
foreach (var transform in transforms)
|
||||
{
|
||||
var boundingBox = TransformedBoundingBox(cullable.BoundingBox, transform);
|
||||
var containment = boundingFrustum.Contains(boundingBox);
|
||||
if (containment != ContainmentType.Disjoint)
|
||||
{
|
||||
yield return transform;
|
||||
}
|
||||
}
|
||||
Matrix transform
|
||||
) where T : ICullable {
|
||||
var boundingBox = TransformedBoundingBox(cullable.BoundingBox, transform);
|
||||
var containment = boundingFrustum.Contains(boundingBox);
|
||||
return (containment == ContainmentType.Disjoint);
|
||||
}
|
||||
|
||||
private static BoundingBox TransformedBoundingBox(BoundingBox boundingBox, Matrix matrix)
|
||||
|
|
Loading…
Reference in New Issue