diffuse sprite effect takes uv data

tiled_draw_refactor
cosmonaut 2020-12-10 13:53:55 -08:00
parent 8ff6e26887
commit 0ebad486c5
8 changed files with 93 additions and 55 deletions

View File

@ -2,23 +2,23 @@ using Microsoft.Xna.Framework;
namespace Kav.Data namespace Kav.Data
{ {
public struct MeshSpriteDrawData public struct MeshSpriteDrawData
{ {
public MeshSprite MeshSprite { get; } public MeshSprite MeshSprite { get; }
public SpriteBillboardConstraint BillboardConstraint { get; } public SpriteBillboardConstraint BillboardConstraint { get; }
public Matrix TransformMatrix { get; } public Matrix TransformMatrix { get; }
public UVOffsets UVOffsets { get; } public UVData UVOffset { get; }
public MeshSpriteDrawData( public MeshSpriteDrawData(
MeshSprite meshSprite, MeshSprite meshSprite,
SpriteBillboardConstraint billboardConstraint, SpriteBillboardConstraint billboardConstraint,
Matrix transformMatrix, Matrix transformMatrix,
UVOffsets uVOffsets UVData offset
) { ) {
MeshSprite = meshSprite; MeshSprite = meshSprite;
BillboardConstraint = billboardConstraint; BillboardConstraint = billboardConstraint;
TransformMatrix = transformMatrix; TransformMatrix = transformMatrix;
UVOffsets = uVOffsets; UVOffset = offset;
} }
} }
} }

19
Data/UVData.cs Normal file
View File

@ -0,0 +1,19 @@
using Microsoft.Xna.Framework;
namespace Kav.Data
{
public struct UVData
{
public Vector2 Offset { get; }
public Vector2 Percentage { get; }
public UVData(
Vector2 positionInAtlas,
Vector2 subTextureDimensions,
Vector2 atlasDimensions
) {
Percentage = subTextureDimensions / atlasDimensions;
Offset = positionInAtlas / atlasDimensions;
}
}
}

View File

@ -1,22 +0,0 @@
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;
}
}
}

View File

@ -1,3 +1,4 @@
using Kav.Data;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
@ -10,6 +11,8 @@ namespace Kav
EffectParameter directionalLightDirectionParam; EffectParameter directionalLightDirectionParam;
EffectParameter directionalLightColorParam; EffectParameter directionalLightColorParam;
EffectParameter uvOffsetAndDimensionsParam;
EffectParameter worldParam; EffectParameter worldParam;
EffectParameter worldViewProjectionParam; EffectParameter worldViewProjectionParam;
EffectParameter worldInverseTransposeParam; EffectParameter worldInverseTransposeParam;
@ -30,6 +33,9 @@ namespace Kav
Matrix view = Matrix.Identity; Matrix view = Matrix.Identity;
Matrix projection = Matrix.Identity; Matrix projection = Matrix.Identity;
Vector2 uvOffset;
Vector2 subTextureDimensions;
EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All; EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All;
public bool NormalMapEnabled public bool NormalMapEnabled
@ -109,6 +115,26 @@ namespace Kav
} }
} }
public Vector2 UVOffset
{
get { return uvOffset; }
set
{
uvOffset = value;
dirtyFlags |= EffectDirtyFlags.UVOrDimensions;
}
}
public Vector2 SubTextureDimensions
{
get { return subTextureDimensions; }
set
{
subTextureDimensions = value;
dirtyFlags |= EffectDirtyFlags.UVOrDimensions;
}
}
public DiffuseLitSpriteEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.DiffuseLitSpriteEffect) public DiffuseLitSpriteEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.DiffuseLitSpriteEffect)
{ {
CacheEffectParameters(); CacheEffectParameters();
@ -142,6 +168,16 @@ namespace Kav
dirtyFlags &= ~EffectDirtyFlags.WorldViewProj; dirtyFlags &= ~EffectDirtyFlags.WorldViewProj;
} }
if ((dirtyFlags & EffectDirtyFlags.UVOrDimensions) != 0)
{
uvOffsetAndDimensionsParam.SetValue(new Vector4(
UVOffset.X, UVOffset.Y,
SubTextureDimensions.X, SubTextureDimensions.Y
));
dirtyFlags &= ~EffectDirtyFlags.UVOrDimensions;
}
if ((dirtyFlags & EffectDirtyFlags.PixelShaderIndex) != 0) if ((dirtyFlags & EffectDirtyFlags.PixelShaderIndex) != 0)
{ {
int shaderIndex = 0; int shaderIndex = 0;
@ -166,6 +202,8 @@ namespace Kav
directionalLightDirectionParam = Parameters["DirectionalLightDirection"]; directionalLightDirectionParam = Parameters["DirectionalLightDirection"];
directionalLightColorParam = Parameters["DirectionalLightColor"]; directionalLightColorParam = Parameters["DirectionalLightColor"];
uvOffsetAndDimensionsParam = Parameters["UVOffsetAndDimensions"];
shaderIndexParam = Parameters["ShaderIndex"]; shaderIndexParam = Parameters["ShaderIndex"];
} }
} }

View File

@ -11,6 +11,7 @@ namespace Kav
VertexShaderIndex = 8, VertexShaderIndex = 8,
PixelShaderIndex = 16, PixelShaderIndex = 16,
ViewProj = 32, ViewProj = 32,
UVOrDimensions = 64,
All = -1 All = -1
} }
} }

BIN
Effects/FXB/DiffuseLitSpriteEffect.fxb (Stored with Git LFS)

Binary file not shown.

View File

@ -5,23 +5,19 @@
DECLARE_TEXTURE(Texture, 0); DECLARE_TEXTURE(Texture, 0);
DECLARE_TEXTURE(Normal, 1); DECLARE_TEXTURE(Normal, 1);
BEGIN_CONSTANTS float3 AmbientColor;
float3 AmbientColor _ps(c0) _cb(c0); float3 PointLightPositions[8];
float3 PointLightColors[8];
float3 PointLightPositions[8] _ps(c1) _cb(c1); float3 DirectionalLightDirection;
float3 PointLightColors[8] _ps(c9) _cb(c9); float3 DirectionalLightColor;
float3 DirectionalLightDirection _ps(c17) _cb(c17); float4 UVOffsetAndDimensions;
float3 DirectionalLightColor _ps(c18) _cb(c18);
MATRIX_CONSTANTS float4x4 WorldInverseTranspose;
float4x4 World;
float4x4 WorldInverseTranspose _ps(c19) _cb(c19); float4x4 WorldViewProjection;
float4x4 World _vs(c0) _cb(c23);
float4x4 WorldViewProjection _vs(c4) _cb(c27);
END_CONSTANTS
struct VertexShaderInput struct VertexShaderInput
{ {
@ -43,10 +39,14 @@ PixelShaderInput main_vs(VertexShaderInput input)
PixelShaderInput output; PixelShaderInput output;
output.Position = mul(input.Position, WorldViewProjection); output.Position = mul(input.Position, WorldViewProjection);
output.TexCoord = input.TexCoord;
output.NormalWS = normalize(mul(input.Normal, (float3x3)WorldInverseTranspose)); output.NormalWS = normalize(mul(input.Normal, (float3x3)WorldInverseTranspose));
output.PositionWS = mul(input.Position, World).xyz; output.PositionWS = mul(input.Position, World).xyz;
float2 texCoord;
texCoord.x = (input.TexCoord.x / UVOffsetAndDimensions.z) + UVOffsetAndDimensions.x;
texCoord.y = (input.TexCoord.y / UVOffsetAndDimensions.w) + UVOffsetAndDimensions.y;
output.TexCoord = texCoord;
return output; return output;
} }

View File

@ -171,6 +171,8 @@ namespace Kav
DiffuseLitSpriteEffect.NormalMapEnabled = data.MeshSprite.Normal != null; DiffuseLitSpriteEffect.NormalMapEnabled = data.MeshSprite.Normal != null;
DiffuseLitSpriteEffect.World = matrix; DiffuseLitSpriteEffect.World = matrix;
DiffuseLitSpriteEffect.UVOffset = data.UVOffset.Offset;
DiffuseLitSpriteEffect.SubTextureDimensions = data.UVOffset.Percentage;
GraphicsDevice.Textures[0] = data.MeshSprite.Texture; GraphicsDevice.Textures[0] = data.MeshSprite.Texture;
GraphicsDevice.Textures[1] = data.MeshSprite.Normal; GraphicsDevice.Textures[1] = data.MeshSprite.Normal;
@ -232,7 +234,7 @@ namespace Kav
BoundingFrustum boundingFrustum, BoundingFrustum boundingFrustum,
IEnumerable<(T, Matrix)> drawableTransformPairs, IEnumerable<(T, Matrix)> drawableTransformPairs,
U effect U effect
) where T : IIndexDrawable, ICullable where U : Effect, IHasWorldMatrix ) where T : IIndexDrawable, ICullable where U : Effect, IHasWorldMatrix
{ {
foreach (var (drawable, transform) in FrustumCull(boundingFrustum, drawableTransformPairs)) foreach (var (drawable, transform) in FrustumCull(boundingFrustum, drawableTransformPairs))
{ {
@ -315,7 +317,7 @@ namespace Kav
RenderTarget2D renderTarget, RenderTarget2D renderTarget,
PerspectiveCamera camera, PerspectiveCamera camera,
IEnumerable<(T, Matrix)> drawableTransforms IEnumerable<(T, Matrix)> drawableTransforms
) where T : ICullable, IIndexDrawable ) where T : ICullable, IIndexDrawable
{ {
GraphicsDevice.SetRenderTarget(renderTarget); GraphicsDevice.SetRenderTarget(renderTarget);
GraphicsDevice.DepthStencilState = DepthStencilState.Default; GraphicsDevice.DepthStencilState = DepthStencilState.Default;
@ -350,7 +352,7 @@ namespace Kav
RenderIndexed( RenderIndexed(
GraphicsDevice, GraphicsDevice,
UnitCube.Meshes[0].MeshParts[0], UnitCube.Meshes[0].MeshParts[0],
SkyboxEffect SkyboxEffect
); );
@ -498,7 +500,7 @@ namespace Kav
DeferredPointLightEffect.Projection = camera.Projection; DeferredPointLightEffect.Projection = camera.Projection;
RenderIndexed( RenderIndexed(
GraphicsDevice, GraphicsDevice,
UnitSphere.Meshes[0].MeshParts[0], UnitSphere.Meshes[0].MeshParts[0],
DeferredPointLightEffect DeferredPointLightEffect
); );
@ -688,8 +690,8 @@ namespace Kav
for (var i = 0; i < shadowMapData.NumShadowCascades; i++) for (var i = 0; i < shadowMapData.NumShadowCascades; i++)
{ {
RenderDirectionalShadowMapIndexed( RenderDirectionalShadowMapIndexed(
shadowMapData, shadowMapData,
i, i,
drawableTransforms drawableTransforms
); );
} }
@ -708,9 +710,9 @@ namespace Kav
SimpleDepthEffect.Projection = shadowMapData.LightSpaceProjections[shadowCascadeIndex]; SimpleDepthEffect.Projection = shadowMapData.LightSpaceProjections[shadowCascadeIndex];
CullAndRenderIndexed( CullAndRenderIndexed(
GraphicsDevice, GraphicsDevice,
new BoundingFrustum(SimpleDepthEffect.View * SimpleDepthEffect.Projection), new BoundingFrustum(SimpleDepthEffect.View * SimpleDepthEffect.Projection),
drawableTransforms, drawableTransforms,
SimpleDepthEffect SimpleDepthEffect
); );
} }
@ -751,7 +753,7 @@ namespace Kav
SimpleDepthEffectInstanced.Projection = shadowMapData.LightSpaceProjections[shadowCascadeIndex]; SimpleDepthEffectInstanced.Projection = shadowMapData.LightSpaceProjections[shadowCascadeIndex];
RenderInstanced( RenderInstanced(
GraphicsDevice, GraphicsDevice,
drawable, drawable,
instanceVertexBuffer, instanceVertexBuffer,
numInstances, numInstances,
@ -828,8 +830,8 @@ namespace Kav
CullAndRenderIndexed( CullAndRenderIndexed(
GraphicsDevice, GraphicsDevice,
new BoundingFrustum(LinearDepthEffect.View * LinearDepthEffect.Projection), new BoundingFrustum(LinearDepthEffect.View * LinearDepthEffect.Projection),
modelTransforms, modelTransforms,
LinearDepthEffect LinearDepthEffect
); );
} }
@ -841,7 +843,7 @@ namespace Kav
VertexBuffer instanceVertexBuffer, VertexBuffer instanceVertexBuffer,
int numInstances, int numInstances,
PointLight pointLight PointLight pointLight
) where T : ICullable, IIndexDrawable ) where T : ICullable, IIndexDrawable
{ {
GraphicsDevice.DepthStencilState = DepthStencilState.Default; GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.BlendState = BlendState.Opaque;