#ifndef XNA_GRAPHICS_SAMPLERSTATE_HPP #define XNA_GRAPHICS_SAMPLERSTATE_HPP #include "gresource.hpp" #include "shared.hpp" #include #include namespace xna { //Defines modes for addressing texels using texture coordinates that are outside of the typical range of 0.0 to 1.0. enum class TextureAddressMode { //Tile the texture at every integer junction. //For example, for u values between 0 and 3, the texture is repeated three times; no mirroring is performed. Wrap, //Similar to Wrap, except that the texture is flipped at every integer junction. //For u values between 0 and 1, for example, the texture is addressed normally; between 1 and 2, the texture is flipped (mirrored); between 2 and 3, the texture is normal again, and so on. Mirror, //Texture coordinates outside the range [0.0, 1.0] are set to the texture color at 0.0 or 1.0, respectively. Clamp, //Texture coordinates outside the range [0.0, 1.0] are set to the border color specified. Border, //Similar to Mirror and Clamp. //Takes the absolute value of the texture coordinate (thus, mirroring around 0), and then clamps to the maximum value. MirrorOnce }; //Defines filtering types during texture sampling. enum class TextureFilter { //Use linear filtering. Linear, //Use point filtering. Point, //Use anisotropic filtering. Anisotropic, //Use linear filtering to shrink or expand, and point filtering between mipmap levels (mip). LinearMipPoint, //Use point filtering to shrink (minify) or expand (magnify), and linear filtering between mipmap levels. PointMipLinear, //Use linear filtering to shrink, point filtering to expand, and linear filtering between mipmap levels. MinLinearMagPointMipLinear, //Use linear filtering to shrink, point filtering to expand, and point filtering between mipmap levels. MinLinearMagPointMipPoint, //Use point filtering to shrink, linear filtering to expand, and linear filtering between mipmap levels. MinPointMagLinearMipLinear, //Use point filtering to shrink, linear filtering to expand, and point filtering between mipmap levels. MinPointMagLinearMipPoint, }; struct SamplerStateImplementation; //Contains sampler state, which determines how to sample texture data. class SamplerState : public GraphicsResource { public: SamplerState(); SamplerState(std::shared_ptr const& device); //Gets or sets the maximum anisotropy. The default value is 0. void MaxAnisotropy(uint32_t value); //Gets or sets the maximum anisotropy. The default value is 0. uint32_t MaxAnisotropy() const; //Gets or sets the type of filtering during sampling. void Filter(TextureFilter value); //Gets or sets the type of filtering during sampling. TextureFilter Filter() const; ////Gets or sets the texture-address mode for the u-coordinate. void AddressU(TextureAddressMode value); //Gets or sets the texture-address mode for the u-coordinate. TextureAddressMode AddressU() const; //Gets or sets the texture-address mode for the v-coordinate. TextureAddressMode AddressV() const; //Gets or sets the texture-address mode for the v-coordinate. void AddressV(TextureAddressMode value); //Gets or sets the texture-address mode for the w-coordinate. TextureAddressMode AddressW() const; ////Gets or sets the texture-address mode for the w-coordinate. void AddressW(TextureAddressMode value); //Gets or sets the mipmap LOD bias. The default value is 0. void MipMapLevelOfDetailBias(float value); //Gets or sets the mipmap LOD bias. The default value is 0. float MipMapLevelOfDetailBias() const; //Gets or sets the level of detail (LOD) index of the largest map to use. float MaxMipLevel() const; //Gets or sets the level of detail (LOD) index of the largest map to use. void MaxMipLevel(float value); //Gets or sets the level of detail (LOD) index of the smaller map to use. void MinMipLevel(float value); //Gets or sets the level of detail (LOD) index of the smaller map to use. float MinMipLevel() const; //Contains default state for point filtering and texture coordinate wrapping. static std::unique_ptr PoinWrap(); //Contains default state for point filtering and texture coordinate clamping. static std::unique_ptr PointClamp(); //Contains default state for linear filtering and texture coordinate wrapping. static std::unique_ptr LinearWrap(); //Contains default state for linear filtering and texture coordinate clamping. static std::unique_ptr LinearClamp(); //Contains default state for anisotropic filtering and texture coordinate wrapping. static std::unique_ptr AnisotropicWrap(); //Contains default state for anisotropic filtering and texture coordinate clamping. static std::unique_ptr AnisotropicClamp(); ComparisonFunction Comparison() const; void Comparison(ComparisonFunction value); bool Initialize(); bool Apply(); std::unique_ptr Implementation; }; //Collection of SamplerState objects. class SamplerStateCollection { public: SamplerStateCollection(){} SamplerStateCollection(size_t size) : samplers(size){} SamplerStateCollection(std::vector> const& samplers) : samplers(samplers) {} std::shared_ptr operator[](size_t index) { if (index >= samplers.size()) return nullptr; return samplers[index]; } constexpr size_t Count() const { return samplers.size(); } void Apply(GraphicsDevice const& device); public: std::vector> samplers; }; } #endif