public void RegenTerrain(GraphicsDevice device, WorldState world, Blueprint blueprint)
{
if (VertexBuffer != null)
{
IndexBuffer.Dispose();
BladeIndexBuffer.Dispose();
VertexBuffer.Dispose();
}
/** Convert rectangle to world units **/
var quads = Size.Width;
var quadWidth = WorldSpace.GetWorldFromTile((float)Size.Width / (float)quads);
var quadHeight = WorldSpace.GetWorldFromTile((float)Size.Height / (float)quads);
var numQuads = quads * quads;
TerrainVertex[] Geom = new TerrainVertex[numQuads * 4];
int[] Indexes = new int[numQuads * 6];
int[] BladeIndexes = new int[numQuads * 6];
NumPrimitives = (numQuads * 2);
int geomOffset = 0;
int indexOffset = 0;
int bindexOffset = 0;
var offsetX = WorldSpace.GetWorldFromTile(Size.X);
var offsetY = WorldSpace.GetWorldFromTile(Size.Y);
for (var y = 0; y < quads; y++)
{
for (var x = 0; x < quads; x++)
{
var tl = new Vector3(offsetX + (x * quadWidth), 0.0f, offsetY + (y * quadHeight));
var tr = new Vector3(tl.X + quadWidth, 0.0f, tl.Z);
var bl = new Vector3(tl.X, 0.0f, tl.Z + quadHeight);
var br = new Vector3(tl.X + quadWidth, 0.0f, tl.Z + quadHeight);
Indexes[indexOffset++] = geomOffset;
Indexes[indexOffset++] = (geomOffset + 1);
Indexes[indexOffset++] = (geomOffset + 2);
Indexes[indexOffset++] = (geomOffset + 2);
Indexes[indexOffset++] = (geomOffset + 3);
Indexes[indexOffset++] = geomOffset;
short tx = (short)(x + 1), ty = (short)(y + 1);
if (blueprint.GetFloor(tx,ty,1).Pattern == 0 &&
(blueprint.GetWall(tx,ty, 1).Segments & (WallSegments.HorizontalDiag | WallSegments.VerticalDiag)) == 0)
{
BladeIndexes[bindexOffset++] = geomOffset;
BladeIndexes[bindexOffset++] = (geomOffset + 1);
BladeIndexes[bindexOffset++] = (geomOffset + 2);
BladeIndexes[bindexOffset++] = (geomOffset + 2);
BladeIndexes[bindexOffset++] = (geomOffset + 3);
BladeIndexes[bindexOffset++] = geomOffset;
}
Color tlCol = Color.Lerp(LightGreen, LightBrown, GrassState[y * quads + x]);
Color trCol = Color.Lerp(LightGreen, LightBrown, GrassState[y * quads + ((x + 1) % quads)]);
Color blCol = Color.Lerp(LightGreen, LightBrown, GrassState[((y + 1) % quads) * quads + x]);
Color brCol = Color.Lerp(LightGreen, LightBrown, GrassState[((y + 1) % quads) * quads + ((x + 1) % quads)]);
Geom[geomOffset++] = new TerrainVertex(tl, tlCol.ToVector4(), new Vector2(x * 64, y * 64), GrassState[y * quads + x]);
Geom[geomOffset++] = new TerrainVertex(tr, trCol.ToVector4(), new Vector2((x + 1) * 64, y * 64), GrassState[y * quads + ((x + 1) % quads)]);
Geom[geomOffset++] = new TerrainVertex(br, brCol.ToVector4(), new Vector2((x + 1) * 64, (y + 1) * 64), GrassState[((y + 1) % quads) * quads + ((x + 1) % quads)]);
Geom[geomOffset++] = new TerrainVertex(bl, blCol.ToVector4(), new Vector2(x * 64, (y + 1) * 64), GrassState[((y + 1) % quads) * quads + x]);
}
}
var rand = new Random();
VertexBuffer = new VertexBuffer(device, typeof(TerrainVertex), Geom.Length, BufferUsage.None);
VertexBuffer.SetData(Geom);
IndexBuffer = new IndexBuffer(device, IndexElementSize.ThirtyTwoBits, sizeof(int) * Indexes.Length, BufferUsage.None);
IndexBuffer.SetData(Indexes);
BladePrimitives = (bindexOffset / 3);
BladeIndexBuffer = new IndexBuffer(device, IndexElementSize.ThirtyTwoBits, sizeof(int) * Indexes.Length, BufferUsage.None);
BladeIndexBuffer.SetData(BladeIndexes);
GeomLength = Geom.Length;
}