/// <summary> /// Function to build a sampler state from the information provided by the sprite data. /// </summary> /// <param name="graphics">The graphics interface to use.</param> /// <param name="filter">The filter to use.</param> /// <param name="borderColor">The color of the border to use.</param> /// <param name="hWrap">Horizontal wrapping mode.</param> /// <param name="vWrap">Vertical wrapping mode.</param> /// <returns>The sampler state.</returns> private static GorgonSamplerState CreateSamplerState(GorgonGraphics graphics, SampleFilter filter, GorgonColor borderColor, TextureWrap hWrap, TextureWrap vWrap) { var builder = new GorgonSamplerStateBuilder(graphics); switch (filter) { case SampleFilter.MinMagMipLinear when(hWrap == TextureWrap.Clamp) && (vWrap == TextureWrap.Clamp) && (borderColor == GorgonColor.White): return(null); case SampleFilter.MinMagMipPoint when(hWrap == TextureWrap.Clamp) && (vWrap == TextureWrap.Clamp) && (borderColor == GorgonColor.White): return(GorgonSamplerState.PointFiltering); case SampleFilter.MinMagMipLinear when(hWrap == TextureWrap.Wrap) && (vWrap == TextureWrap.Wrap) && (borderColor == GorgonColor.White): return(GorgonSamplerState.Wrapping); case SampleFilter.MinMagMipPoint when(hWrap == TextureWrap.Wrap) && (vWrap == TextureWrap.Wrap) && (borderColor == GorgonColor.White): return(GorgonSamplerState.PointFilteringWrapping); default: return(builder.Wrapping(hWrap, vWrap, borderColor: borderColor) .Filter(filter) .Build()); } }
/// <summary> /// Function to read the sprite data from a stream. /// </summary> /// <param name="stream">The stream containing the sprite.</param> /// <param name="byteCount">The number of bytes to read from the stream.</param> /// <param name="overrideTexture">The texture to assign to the sprite instead of the texture associated with the name stored in the file.</param> /// <returns>A new <see cref="GorgonSprite"/>.</returns> protected override GorgonSprite OnReadFromStream(Stream stream, int byteCount, GorgonTexture2DView overrideTexture) { var reader = new GorgonChunkFileReader(stream, new[] { CurrentFileHeader }); GorgonBinaryReader binReader = null; var sprite = new GorgonSprite(); try { reader.Open(); binReader = reader.OpenChunk(SpriteData); sprite.Size = binReader.ReadValue <DX.Size2F>(); sprite.Anchor = binReader.ReadValue <DX.Vector2>(); // If we do not have alpha test information, then skip writing its data. if (binReader.ReadBoolean()) { sprite.AlphaTest = binReader.ReadValue <GorgonRangeF>(); } // Write out corner data. sprite.CornerOffsets.UpperLeft = binReader.ReadValue <DX.Vector3>(); sprite.CornerOffsets.UpperRight = binReader.ReadValue <DX.Vector3>(); sprite.CornerOffsets.LowerLeft = binReader.ReadValue <DX.Vector3>(); sprite.CornerOffsets.LowerRight = binReader.ReadValue <DX.Vector3>(); sprite.CornerColors.UpperLeft = binReader.ReadValue <GorgonColor>(); sprite.CornerColors.UpperRight = binReader.ReadValue <GorgonColor>(); sprite.CornerColors.LowerLeft = binReader.ReadValue <GorgonColor>(); sprite.CornerColors.LowerRight = binReader.ReadValue <GorgonColor>(); reader.CloseChunk(); if (reader.Chunks.Contains(TextureData)) { binReader = reader.OpenChunk(TextureData); sprite.Texture = LoadTexture(binReader, overrideTexture, out DX.RectangleF textureCoordinates, out int textureArrayIndex); sprite.TextureRegion = textureCoordinates; sprite.TextureArrayIndex = textureArrayIndex; reader.CloseChunk(); } if (!reader.Chunks.Contains(TextureSamplerData)) { return(sprite); } var builder = new GorgonSamplerStateBuilder(Renderer.Graphics); binReader = reader.OpenChunk(TextureSamplerData); binReader.ReadValue(out SampleFilter filter); binReader.ReadValue(out GorgonColor borderColor); binReader.ReadValue(out Comparison compareFunc); binReader.ReadValue(out TextureWrap wrapU); binReader.ReadValue(out TextureWrap wrapV); binReader.ReadValue(out TextureWrap wrapW); binReader.ReadValue(out int maxAnisotropy); binReader.ReadValue(out float minLod); binReader.ReadValue(out float maxLod); binReader.ReadValue(out float mipLodBias); reader.CloseChunk(); sprite.TextureSampler = builder.Wrapping(wrapU, wrapV, wrapW, borderColor) .Filter(filter) .ComparisonFunction(compareFunc) .MaxAnisotropy(maxAnisotropy) .MipLevelOfDetail(minLod, maxLod, mipLodBias) .Build(); return(sprite); } finally { binReader?.Dispose(); reader.Close(); } }
/// <summary> /// Function to read the sprite data from a stream. /// </summary> /// <param name="stream">The stream containing the sprite.</param> /// <param name="byteCount">The number of bytes to read from the stream.</param> /// <param name="overrideTexture">The texture to assign to the sprite instead of the texture associated with the name stored in the file.</param> /// <returns>A new <see cref="GorgonPolySprite"/>.</returns> protected override GorgonPolySprite OnReadFromStream(Stream stream, int byteCount, GorgonTexture2DView overrideTexture) { var reader = new GorgonChunkFileReader(stream, new[] { CurrentFileHeader }); GorgonBinaryReader binReader = null; var sprite = new GorgonPolySpriteBuilder(Renderer); try { reader.Open(); binReader = reader.OpenChunk(SpriteData); sprite.Anchor(binReader.ReadValue <DX.Vector2>()); // If we do not have alpha test information, then skip writing its data. if (binReader.ReadBoolean()) { sprite.AlphaTest(binReader.ReadValue <GorgonRangeF>()); } reader.CloseChunk(); binReader = reader.OpenChunk(VertexData); int vertexCount = binReader.ReadInt32(); for (int i = 0; i < vertexCount; ++i) { sprite.AddVertex(new GorgonPolySpriteVertex(binReader.ReadValue <DX.Vector2>(), binReader.ReadValue <GorgonColor>(), binReader.ReadValue <DX.Vector2>())); } reader.CloseChunk(); if (reader.Chunks.Contains(TextureData)) { binReader = reader.OpenChunk(TextureData); sprite.Texture(LoadTexture(binReader, overrideTexture, out DX.Vector2 textureOffset, out DX.Vector2 textureScale, out int textureArrayIndex)); sprite.TextureArrayIndex(textureArrayIndex); sprite.TextureTransform(textureOffset, textureScale); reader.CloseChunk(); } if (!reader.Chunks.Contains(TextureSamplerData)) { return(sprite.Build()); } var builder = new GorgonSamplerStateBuilder(Renderer.Graphics); binReader = reader.OpenChunk(TextureSamplerData); binReader.ReadValue(out SampleFilter filter); binReader.ReadValue(out GorgonColor borderColor); binReader.ReadValue(out Comparison compareFunc); binReader.ReadValue(out TextureWrap wrapU); binReader.ReadValue(out TextureWrap wrapV); binReader.ReadValue(out TextureWrap wrapW); binReader.ReadValue(out int maxAnisotropy); binReader.ReadValue(out float minLod); binReader.ReadValue(out float maxLod); binReader.ReadValue(out float mipLodBias); reader.CloseChunk(); sprite.TextureSampler(builder.Wrapping(wrapU, wrapV, wrapW, borderColor) .Filter(filter) .ComparisonFunction(compareFunc) .MaxAnisotropy(maxAnisotropy) .MipLevelOfDetail(minLod, maxLod, mipLodBias) .Build()); return(sprite.Build()); } finally { binReader?.Dispose(); reader.Close(); } }
/// <summary>Reads the JSON representation of the object.</summary> /// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader" /> to read from.</param> /// <param name="objectType">Type of the object.</param> /// <param name="existingValue">The existing value of object being read. If there is no existing value then <c>null</c> will be used.</param> /// <param name="hasExistingValue">The existing value has a value.</param> /// <param name="serializer">The calling serializer.</param> /// <returns>The object value.</returns> public override GorgonSamplerState ReadJson(JsonReader reader, Type objectType, GorgonSamplerState existingValue, bool hasExistingValue, JsonSerializer serializer) { if ((reader.TokenType != JsonToken.StartObject) || (_graphics == null)) { return(null); } GorgonColor? borderColor = null; Comparison? compareFunction = null; SampleFilter?filter = null; int? maxAnisotropy = null; float? maxLod = null; float? minLod = null; float? mipLodBias = null; TextureWrap? wrapU = null; TextureWrap? wrapV = null; TextureWrap? wrapW = null; var builder = new GorgonSamplerStateBuilder(_graphics); while ((reader.Read()) && (reader.TokenType != JsonToken.EndObject)) { if (reader.TokenType != JsonToken.PropertyName) { continue; } switch (reader.Value.ToString()) { case "borderColor": borderColor = reader.ReadAsInt32(); break; case "compareFunc": compareFunction = (Comparison?)reader.ReadAsInt32(); break; case "filter": filter = (SampleFilter?)reader.ReadAsInt32(); break; case "maxAnisotropy": maxAnisotropy = reader.ReadAsInt32(); break; case "maxLod": maxLod = (float?)reader.ReadAsDouble(); break; case "minLod": minLod = (float?)reader.ReadAsDouble(); break; case "mipLodBias": mipLodBias = (float?)reader.ReadAsDouble(); break; case "wrapU": wrapU = (TextureWrap?)reader.ReadAsInt32(); break; case "wrapV": wrapV = (TextureWrap?)reader.ReadAsInt32(); break; case "wrapW": wrapW = (TextureWrap?)reader.ReadAsInt32(); break; } } return(builder.Wrapping(wrapU, wrapV, wrapW, borderColor) .MaxAnisotropy(maxAnisotropy ?? 1) .ComparisonFunction(compareFunction ?? Comparison.Never) .Filter(filter ?? SampleFilter.MinMagMipLinear) .MipLevelOfDetail(minLod ?? float.MinValue, maxLod ?? float.MaxValue, mipLodBias ?? 0) .Build()); }