private static void AddSpriteFace(Chunk chunk, Vector3[] faceOffsetVertices, Vector3 positionOffset, Voxel voxel, Int2 textureIndicies, VertexSprite[] vertices, uint[] indexes, int vertexOffset, int vertexIndex, int faceOffset) { for (var m = 0; m < faceOffsetVertices.Length; m++) { var position = faceOffsetVertices[m] + chunk.OffsetVector + positionOffset; var textureOffset = FaceBuildInfo.UvOffsetIndexes[m]; vertices[vertexOffset + m + faceOffset * 4] = new VertexSprite(position, textureIndicies.X + textureOffset.X, textureIndicies.Y + textureOffset.Y, voxel.MetaData, voxel.CompositeLight); } var indexOffset = (vertexIndex * 6 * 2) + (faceOffset * 6 * 2); indexes[indexOffset + 0] = (uint)(vertexOffset + 0 + faceOffset * 4); indexes[indexOffset + 1] = (uint)(vertexOffset + 2 + faceOffset * 4); indexes[indexOffset + 2] = (uint)(vertexOffset + 3 + faceOffset * 4); indexes[indexOffset + 3] = (uint)(vertexOffset + 0 + faceOffset * 4); indexes[indexOffset + 4] = (uint)(vertexOffset + 1 + faceOffset * 4); indexes[indexOffset + 5] = (uint)(vertexOffset + 2 + faceOffset * 4); indexes[indexOffset + 6] = (uint)(vertexOffset + 2 + faceOffset * 4); indexes[indexOffset + 7] = (uint)(vertexOffset + 1 + faceOffset * 4); indexes[indexOffset + 8] = (uint)(vertexOffset + 0 + faceOffset * 4); indexes[indexOffset + 9] = (uint)(vertexOffset + 3 + faceOffset * 4); indexes[indexOffset + 10] = (uint)(vertexOffset + 2 + faceOffset * 4); indexes[indexOffset + 11] = (uint)(vertexOffset + 0 + faceOffset * 4); }
private static BufferDefinition <VertexSprite> BuildSprite(Chunk chunk, Device device) { if (WorldSettings.IsChangeTrackingEnabled && !chunk.BuildingContext.IsSpriteChanged) { return(chunk.Buffers.BufferSprite); } var numberOfFaces = chunk.BuildingContext.SpriteBlocks.Count * 2 + chunk.BuildingContext.SingleSidedSpriteBlocks.Count; if (numberOfFaces == 0) { return(null); } var vertices = new VertexSprite[numberOfFaces * 4]; var indexes = new uint[numberOfFaces * 12]; var secondFaceOffset = chunk.BuildingContext.SpriteBlocks.Count; for (var n = 0; n < chunk.BuildingContext.SpriteBlocks.Count; n++) { var flatIndex = chunk.BuildingContext.SpriteBlocks[n]; var index = chunk.FromFlatIndex(flatIndex); var vertexOffset = n * 4; var positionOffset = new Vector3(index.X, index.Y, index.Z); var voxel = chunk.GetVoxel(flatIndex); var definition = voxel.GetDefinition(); AddSpriteFace(chunk, FaceBuildInfo.SpriteVertices.Left, positionOffset, voxel, definition.TextureIndexes.Faces[(byte)Face.Left], vertices, indexes, vertexOffset, n, 0); AddSpriteFace(chunk, FaceBuildInfo.SpriteVertices.Right, positionOffset, voxel, definition.TextureIndexes.Faces[(byte)Face.Right], vertices, indexes, vertexOffset, n, secondFaceOffset); } var thirdFaceOffset = secondFaceOffset * 2; for (var n = 0; n < chunk.BuildingContext.SingleSidedSpriteBlocks.Count; n++) { var flatIndex = chunk.BuildingContext.SingleSidedSpriteBlocks[n]; var index = chunk.FromFlatIndex(flatIndex); var vertexOffset = n * 4; var voxel = chunk.GetVoxel(flatIndex); var positionOffset = new Vector3(index.X, index.Y, index.Z) + SingleSidedOffsets[(byte)voxel.Orientation]; var definition = voxel.GetDefinition(); var face = FaceBuildInfo.FaceVertices.Faces[(byte)voxel.Orientation]; AddSpriteFace(chunk, face, positionOffset, voxel, definition.TextureIndexes.Faces[(byte)Face.Left], vertices, indexes, vertexOffset, n, thirdFaceOffset); } //return null; return(new BufferDefinition <VertexSprite>(device, vertices, indexes)); }