fna-workbench

fna-workbench Commit Details


Date:2016-02-06 12:00:26 (9 years 6 months ago)
Author:Ethan Lee
Branch:master
Commit:b85dd819fb3f838a24bd3e9a055fd5d31c81fab9
Parents: 63ac95ee6e2d65ebb5d08ab4b1cbde23c3e6e794
Message:VPCT4 allows direct writing/sorting of sprite vertex data

Changes:

File differences

src/Graphics/SpriteBatch.cs
1010
1111
1212
13
1314
1415
1516
......
7172
7273
7374
74
75
75
76
7677
7778
7879
......
122123
123124
124125
125
126
127
128
129
130
126
127
131128
132129
133130
......
921918
922919
923920
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
943985
944986
945987
946
947
948
988
989
990
991
992
993
994
995
949996
950997
951998
952999
953
954
1000
9551001
9561002
9571003
......
9731019
9741020
9751021
976
1022
1023
9771024
9781025
9791026
......
9821029
9831030
9841031
985
1032
1033
9861034
9871035
9881036
......
9911039
9921040
9931041
994
1042
1043
9951044
9961045
9971046
9981047
9991048
10001049
1001
1002
1003
1004
1005
1006
1050
1051
1052
1053
1054
1055
1056
1057
10071058
1008
1059
10091060
10101061
1011
1062
10121063
10131064
1014
1065
10151066
10161067
10171068
......
11301181
11311182
11321183
1133
1184
1185
11341186
1135
1136
1137
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
11381209
11391210
11401211
11411212
11421213
11431214
1144
1215
11451216
1146
1217
11471218
1148
1219
11491220
11501221
11511222
1152
1223
11531224
1154
1225
11551226
1156
1227
11571228
11581229
11591230
1160
1231
11611232
1162
1233
11631234
1164
1235
11651236
11661237
11671238
#region Using Statements
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
#endregion
private IndexBuffer indexBuffer;
// Local data stored before buffering to GPU
private VertexPositionColorTexture[] vertexInfo;
private SpriteInfo[] spriteData;
private VertexPositionColorTexture4[] vertexInfo;
private Texture2D[] textureInfo;
// Default SpriteBatch Effect
private Effect spriteEffect;
}
GraphicsDevice = graphicsDevice;
vertexInfo = new VertexPositionColorTexture[MAX_VERTICES];
spriteData = new SpriteInfo[MAX_SPRITES];
for (int i = 0; i < MAX_SPRITES; i += 1)
{
spriteData[i].vertices = new VertexPositionColorTexture[4];
}
vertexInfo = new VertexPositionColorTexture4[MAX_SPRITES];
textureInfo = new Texture2D[MAX_SPRITES];
vertexBuffer = new DynamicVertexBuffer(
graphicsDevice,
typeof(VertexPositionColorTexture),
}
// Calculate vertices, finally.
for (int j = 0; j < 4; j += 1)
{
float cornerX = (CornerOffsetX[j] - originX) * destW;
float cornerY = (CornerOffsetY[j] - originY) * destH;
spriteData[numSprites].vertices[j].Position.X = (
(rotationMatrix2X * cornerY) +
(rotationMatrix1X * cornerX) +
destination.X
);
spriteData[numSprites].vertices[j].Position.Y = (
(rotationMatrix2Y * cornerY) +
(rotationMatrix1Y * cornerX) +
destination.Y
);
spriteData[numSprites].vertices[j].Position.Z = depth;
spriteData[numSprites].vertices[j].Color = color;
spriteData[numSprites].vertices[j].TextureCoordinate.X = (CornerOffsetX[j ^ effects] * sourceW) + sourceX;
spriteData[numSprites].vertices[j].TextureCoordinate.Y = (CornerOffsetY[j ^ effects] * sourceH) + sourceY;
}
float cornerX = (CornerOffsetX[0] - originX) * destW;
float cornerY = (CornerOffsetY[0] - originY) * destH;
vertexInfo[numSprites].Position0.X = (
(rotationMatrix2X * cornerY) +
(rotationMatrix1X * cornerX) +
destination.X
);
vertexInfo[numSprites].Position0.Y = (
(rotationMatrix2Y * cornerY) +
(rotationMatrix1Y * cornerX) +
destination.Y
);
cornerX = (CornerOffsetX[1] - originX) * destW;
cornerY = (CornerOffsetY[1] - originY) * destH;
vertexInfo[numSprites].Position1.X = (
(rotationMatrix2X * cornerY) +
(rotationMatrix1X * cornerX) +
destination.X
);
vertexInfo[numSprites].Position1.Y = (
(rotationMatrix2Y * cornerY) +
(rotationMatrix1Y * cornerX) +
destination.Y
);
cornerX = (CornerOffsetX[2] - originX) * destW;
cornerY = (CornerOffsetY[2] - originY) * destH;
vertexInfo[numSprites].Position2.X = (
(rotationMatrix2X * cornerY) +
(rotationMatrix1X * cornerX) +
destination.X
);
vertexInfo[numSprites].Position2.Y = (
(rotationMatrix2Y * cornerY) +
(rotationMatrix1Y * cornerX) +
destination.Y
);
cornerX = (CornerOffsetX[3] - originX) * destW;
cornerY = (CornerOffsetY[3] - originY) * destH;
vertexInfo[numSprites].Position3.X = (
(rotationMatrix2X * cornerY) +
(rotationMatrix1X * cornerX) +
destination.X
);
vertexInfo[numSprites].Position3.Y = (
(rotationMatrix2Y * cornerY) +
(rotationMatrix1Y * cornerX) +
destination.Y
);
vertexInfo[numSprites].TextureCoordinate0.X = (CornerOffsetX[0 ^ effects] * sourceW) + sourceX;
vertexInfo[numSprites].TextureCoordinate0.Y = (CornerOffsetY[0 ^ effects] * sourceH) + sourceY;
vertexInfo[numSprites].TextureCoordinate1.X = (CornerOffsetX[1 ^ effects] * sourceW) + sourceX;
vertexInfo[numSprites].TextureCoordinate1.Y = (CornerOffsetY[1 ^ effects] * sourceH) + sourceY;
vertexInfo[numSprites].TextureCoordinate2.X = (CornerOffsetX[2 ^ effects] * sourceW) + sourceX;
vertexInfo[numSprites].TextureCoordinate2.Y = (CornerOffsetY[2 ^ effects] * sourceH) + sourceY;
vertexInfo[numSprites].TextureCoordinate3.X = (CornerOffsetX[3 ^ effects] * sourceW) + sourceX;
vertexInfo[numSprites].TextureCoordinate3.Y = (CornerOffsetY[3 ^ effects] * sourceH) + sourceY;
vertexInfo[numSprites].Position0.Z = depth;
vertexInfo[numSprites].Position1.Z = depth;
vertexInfo[numSprites].Position2.Z = depth;
vertexInfo[numSprites].Position3.Z = depth;
vertexInfo[numSprites].Color0 = color;
vertexInfo[numSprites].Color1 = color;
vertexInfo[numSprites].Color2 = color;
vertexInfo[numSprites].Color3 = color;
if (sortMode == SpriteSortMode.Immediate)
{
// FIXME: Make sorting less dump, then remove this -flibit
Array.Copy(spriteData[0].vertices, vertexInfo, 4);
vertexBuffer.SetData(vertexInfo, 0, 4, SetDataOptions.None);
vertexBuffer.SetData(
0,
vertexInfo,
0,
1,
VertexPositionColorTexture4.RealStride,
SetDataOptions.None
);
DrawPrimitives(texture, 0, 1);
}
else
{
spriteData[numSprites].texture = texture;
spriteData[numSprites].depth = depth;
textureInfo[numSprites] = texture;
numSprites += 1;
}
}
if (sortMode == SpriteSortMode.Texture)
{
Array.Sort(
spriteData,
textureInfo,
vertexInfo,
0,
numSprites,
TextureCompare
else if (sortMode == SpriteSortMode.BackToFront)
{
Array.Sort(
spriteData,
vertexInfo,
textureInfo,
0,
numSprites,
BackToFrontCompare
else if (sortMode == SpriteSortMode.FrontToBack)
{
Array.Sort(
spriteData,
vertexInfo,
textureInfo,
0,
numSprites,
FrontToBackCompare
);
}
// FIXME: Make sorting less dump, then remove this -flibit
for (int i = 0; i < numSprites; i += 1)
{
Array.Copy(spriteData[i].vertices, 0, vertexInfo, i * 4, 4);
}
vertexBuffer.SetData(vertexInfo, 0, numSprites * 4, SetDataOptions.None);
vertexBuffer.SetData(
0,
vertexInfo,
0,
numSprites,
VertexPositionColorTexture4.RealStride,
SetDataOptions.None
);
curTexture = spriteData[0].texture;
curTexture = textureInfo[0];
for (int i = 0; i < numSprites; i += 1)
{
if (spriteData[i].texture != curTexture)
if (textureInfo[i] != curTexture)
{
DrawPrimitives(curTexture, offset, i - offset);
curTexture = spriteData[i].texture;
curTexture = textureInfo[i];
offset = i;
}
}
#region Private Sprite Data Container Class
private struct SpriteInfo
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct VertexPositionColorTexture4 : IVertexType
{
public VertexPositionColorTexture[] vertices;
public Texture2D texture;
public float depth;
public const int RealStride = 96;
VertexDeclaration IVertexType.VertexDeclaration
{
get
{
throw new NotImplementedException();
}
}
public Vector3 Position0;
public Color Color0;
public Vector2 TextureCoordinate0;
public Vector3 Position1;
public Color Color1;
public Vector2 TextureCoordinate1;
public Vector3 Position2;
public Color Color2;
public Vector2 TextureCoordinate2;
public Vector3 Position3;
public Color Color3;
public Vector2 TextureCoordinate3;
}
#endregion
#region Private Sprite Comparison Classes
private class TextureComparer : IComparer<SpriteInfo>
private class TextureComparer : IComparer<Texture2D>
{
public int Compare(SpriteInfo x, SpriteInfo y)
public int Compare(Texture2D x, Texture2D y)
{
return x.texture.GetHashCode().CompareTo(y.texture.GetHashCode());
return x.GetHashCode().CompareTo(y.GetHashCode());
}
}
private class BackToFrontComparer : IComparer<SpriteInfo>
private class BackToFrontComparer : IComparer<VertexPositionColorTexture4>
{
public int Compare(SpriteInfo x, SpriteInfo y)
public int Compare(VertexPositionColorTexture4 x, VertexPositionColorTexture4 y)
{
return y.depth.CompareTo(x.depth);
return y.Position0.Z.CompareTo(x.Position0.Z);
}
}
private class FrontToBackComparer : IComparer<SpriteInfo>
private class FrontToBackComparer : IComparer<VertexPositionColorTexture4>
{
public int Compare(SpriteInfo x, SpriteInfo y)
public int Compare(VertexPositionColorTexture4 x, VertexPositionColorTexture4 y)
{
return x.depth.CompareTo(y.depth);
return x.Position0.Z.CompareTo(y.Position0.Z);
}
}

Archive Download the corresponding diff file

Branches

Number of commits:
Page rendered in 1.04797s using 13 queries.