#pragma once #include #include #include #include #include #include #define MBGL_DEFINE_TEXTURE(name_) \ struct name_ { \ using Value = ::mbgl::gfx::TextureBinding; \ static constexpr auto name() { \ return #name_; \ } \ } namespace mbgl { namespace gfx { class TextureResource { protected: TextureResource() = default; public: virtual ~TextureResource() = default; }; class Texture { public: Texture(const Size size_, std::unique_ptr&& resource_) : size(size_), resource(std::move(resource_)) { } template T& getResource() const { assert(resource); return static_cast(*resource); } Size size; protected: std::unique_ptr resource; }; class TextureBinding { public: TextureBinding(TextureResource& resource_, TextureFilterType filter_ = TextureFilterType::Nearest, TextureMipMapType mipmap_ = TextureMipMapType::No, TextureWrapType wrapX_ = TextureWrapType::Clamp, TextureWrapType wrapY_ = TextureWrapType::Clamp) : resource(&resource_), filter(filter_), mipmap(mipmap_), wrapX(wrapX_), wrapY(wrapY_) { } TextureResource* resource; TextureFilterType filter; TextureMipMapType mipmap; TextureWrapType wrapX; TextureWrapType wrapY; }; template class TextureBindings; template class TextureBindings> final : public IndexedTuple, TypeList...>> { using Base = IndexedTuple, TypeList...>>; public: template TextureBindings(Args&&... args) : Base(std::forward(args)...) { } }; } // namespace gfx } // namespace mbgl