/// <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();
            }
        }
Beispiel #4
0
        /// <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());
        }