decouple sprite mesh from textures

sprite_light_experimental
cosmonaut 2020-12-11 18:22:54 -08:00
parent 40ca0402d6
commit 2ff5cb1ca5
5 changed files with 29 additions and 55 deletions

View File

@ -1,21 +1,28 @@
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Kav.Data namespace Kav.Data
{ {
public struct MeshSpriteDrawData public struct MeshSpriteDrawData
{ {
public MeshSprite MeshSprite { get; } public SpriteMesh MeshSprite { get; }
public Texture2D Texture { get; }
public Texture2D Normal { get; }
public SpriteBillboardConstraint BillboardConstraint { get; } public SpriteBillboardConstraint BillboardConstraint { get; }
public Matrix TransformMatrix { get; } public Matrix TransformMatrix { get; }
public UVData UVOffset { get; } public UVData UVOffset { get; }
public MeshSpriteDrawData( public MeshSpriteDrawData(
MeshSprite meshSprite, SpriteMesh meshSprite,
Texture2D texture,
Texture2D normal,
SpriteBillboardConstraint billboardConstraint, SpriteBillboardConstraint billboardConstraint,
Matrix transformMatrix, Matrix transformMatrix,
UVData offset UVData offset
) { ) {
MeshSprite = meshSprite; MeshSprite = meshSprite;
Texture = texture;
Normal = normal;
BillboardConstraint = billboardConstraint; BillboardConstraint = billboardConstraint;
TransformMatrix = transformMatrix; TransformMatrix = transformMatrix;
UVOffset = offset; UVOffset = offset;

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

Binary file not shown.

View File

@ -43,8 +43,8 @@ PixelShaderInput main_vs(VertexShaderInput input)
output.PositionWS = mul(input.Position, World).xyz; output.PositionWS = mul(input.Position, World).xyz;
float2 texCoord; float2 texCoord;
texCoord.x = (input.TexCoord.x / UVOffsetAndDimensions.z) + UVOffsetAndDimensions.x; texCoord.x = (input.TexCoord.x * UVOffsetAndDimensions.z) + UVOffsetAndDimensions.x;
texCoord.y = (input.TexCoord.y / UVOffsetAndDimensions.w) + UVOffsetAndDimensions.y; texCoord.y = (input.TexCoord.y * UVOffsetAndDimensions.w) + UVOffsetAndDimensions.y;
output.TexCoord = texCoord; output.TexCoord = texCoord;
return output; return output;

View File

@ -4,7 +4,7 @@ using Microsoft.Xna.Framework.Graphics;
namespace Kav namespace Kav
{ {
public class MeshSprite : ICullable, IIndexDrawable public class SpriteMesh : ICullable, IIndexDrawable
{ {
public enum FlipOptions public enum FlipOptions
{ {
@ -14,7 +14,6 @@ namespace Kav
Both Both
} }
private static readonly int PixelScale = 40;
private static readonly short[] Indices = new short[] private static readonly short[] Indices = new short[]
{ {
0, 0,
@ -25,21 +24,16 @@ namespace Kav
2 2
}; };
public Texture2D Texture { get; }
public Texture2D Normal { get; }
public IndexBuffer IndexBuffer { get; } public IndexBuffer IndexBuffer { get; }
public VertexBuffer VertexBuffer { get; } public VertexBuffer VertexBuffer { get; }
public BoundingBox BoundingBox { get; } public BoundingBox BoundingBox { get; }
public MeshSprite( public SpriteMesh(
GraphicsDevice graphicsDevice, GraphicsDevice graphicsDevice,
Texture2D texture, int width,
int height,
FlipOptions flipOptions FlipOptions flipOptions
) { ) {
Texture = texture;
Normal = null;
IndexBuffer = new IndexBuffer( IndexBuffer = new IndexBuffer(
graphicsDevice, graphicsDevice,
IndexElementSize.SixteenBits, IndexElementSize.SixteenBits,
@ -48,7 +42,7 @@ namespace Kav
); );
IndexBuffer.SetData(Indices); IndexBuffer.SetData(Indices);
var vertexArray = GenerateVertexArray(Texture, flipOptions); var vertexArray = GenerateVertexArray(width, height, flipOptions);
VertexBuffer = new VertexBuffer( VertexBuffer = new VertexBuffer(
graphicsDevice, graphicsDevice,
@ -61,38 +55,11 @@ namespace Kav
BoundingBox = BoundingBox.CreateFromPoints(Positions(vertexArray)); BoundingBox = BoundingBox.CreateFromPoints(Positions(vertexArray));
} }
public MeshSprite( private static VertexPositionNormalTexture[] GenerateVertexArray(int pixelWidth, int pixelHeight, FlipOptions flipOptions)
GraphicsDevice graphicsDevice,
Texture2D texture,
Texture2D normal,
FlipOptions flipOptions
) {
Texture = texture;
Normal = normal;
IndexBuffer = new IndexBuffer(
graphicsDevice,
IndexElementSize.SixteenBits,
6,
BufferUsage.WriteOnly
);
IndexBuffer.SetData(Indices);
var vertexArray = GenerateVertexArray(Texture, flipOptions);
VertexBuffer = new VertexBuffer(
graphicsDevice,
typeof(VertexPositionNormalTexture),
4,
BufferUsage.WriteOnly
);
VertexBuffer.SetData(vertexArray);
BoundingBox = BoundingBox.CreateFromPoints(Positions(vertexArray));
}
private static VertexPositionNormalTexture[] GenerateVertexArray(Texture2D texture, FlipOptions flipOptions)
{ {
var width = pixelWidth / (float)40;
var height = pixelHeight / (float)40;
VertexPositionNormalTexture[] result = new VertexPositionNormalTexture[4]; VertexPositionNormalTexture[] result = new VertexPositionNormalTexture[4];
var xLeft = 0; var xLeft = 0;
@ -112,19 +79,19 @@ namespace Kav
yBottom = 0; yBottom = 0;
} }
result[0].Position = new Vector3(-texture.Width / 2, texture.Height / 2, 0) / PixelScale; result[0].Position = new Vector3(-width / 2, height / 2, 0);
result[0].Normal = new Vector3(0, 0, 1); result[0].Normal = new Vector3(0, 0, 1);
result[0].TextureCoordinate = new Vector2(xLeft, yTop); result[0].TextureCoordinate = new Vector2(xLeft, yTop);
result[1].Position = new Vector3(texture.Width / 2, texture.Height / 2, 0) / PixelScale; result[1].Position = new Vector3(width / 2, height / 2, 0);
result[1].Normal = new Vector3(0, 0, 1); result[1].Normal = new Vector3(0, 0, 1);
result[1].TextureCoordinate = new Vector2(xRight, yTop); result[1].TextureCoordinate = new Vector2(xRight, yTop);
result[2].Position = new Vector3(-texture.Width / 2, -texture.Height / 2, 0) / PixelScale; result[2].Position = new Vector3(-width / 2, -height / 2, 0);
result[2].Normal = new Vector3(0, 0, 1); result[2].Normal = new Vector3(0, 0, 1);
result[2].TextureCoordinate = new Vector2(xLeft, yBottom); result[2].TextureCoordinate = new Vector2(xLeft, yBottom);
result[3].Position = new Vector3(texture.Width / 2, -texture.Height / 2, 0) / PixelScale; result[3].Position = new Vector3(width / 2, -height / 2, 0);
result[3].Normal = new Vector3(0, 0, 1); result[3].Normal = new Vector3(0, 0, 1);
result[3].TextureCoordinate = new Vector2(xRight, yBottom); result[3].TextureCoordinate = new Vector2(xRight, yBottom);

View File

@ -168,14 +168,14 @@ namespace Kav
continue; continue;
} }
DiffuseLitSpriteEffect.NormalMapEnabled = data.MeshSprite.Normal != null; DiffuseLitSpriteEffect.NormalMapEnabled = data.Normal != null;
DiffuseLitSpriteEffect.World = matrix; DiffuseLitSpriteEffect.World = matrix;
DiffuseLitSpriteEffect.UVOffset = data.UVOffset.Offset; DiffuseLitSpriteEffect.UVOffset = data.UVOffset.Offset;
DiffuseLitSpriteEffect.SubTextureDimensions = data.UVOffset.Percentage; DiffuseLitSpriteEffect.SubTextureDimensions = data.UVOffset.Percentage;
GraphicsDevice.Textures[0] = data.MeshSprite.Texture; GraphicsDevice.Textures[0] = data.Texture;
GraphicsDevice.Textures[1] = data.MeshSprite.Normal; GraphicsDevice.Textures[1] = data.Normal;
GraphicsDevice.SetVertexBuffer(data.MeshSprite.VertexBuffer); GraphicsDevice.SetVertexBuffer(data.MeshSprite.VertexBuffer);
GraphicsDevice.Indices = data.MeshSprite.IndexBuffer; GraphicsDevice.Indices = data.MeshSprite.IndexBuffer;