diffuse sprite effect takes uv data
parent
8ff6e26887
commit
0ebad486c5
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
BIN
Effects/FXB/DiffuseLitSpriteEffect.fxb (Stored with Git LFS)
Binary file not shown.
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
Renderer.cs
28
Renderer.cs
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue