#pragma once #include "common.hpp" #include #include #include #include #include #include #include #include #include namespace metaforce { enum class ERglFogMode : uint32_t { None = 0x00, PerspLin = 0x02, PerspExp = 0x04, PerspExp2 = 0x05, PerspRevExp = 0x06, PerspRevExp2 = 0x07, OrthoLin = 0x0A, OrthoExp = 0x0C, OrthoExp2 = 0x0D, OrthoRevExp = 0x0E, OrthoRevExp2 = 0x0F }; enum class ERglCullMode { None = 0, Front = 1, Back = 2, All = 3 }; enum class ERglBlendMode { None = 0, Blend = 1, Logic = 2, Subtract = 3 }; enum class ERglBlendFactor { Zero = 0, One = 1, SrcColor = 2, InvSrcColor = 3, SrcAlpha = 4, InvSrcAlpha = 5, DstAlpha = 6, InvDstAlpha = 7 }; enum class ERglLogicOp { Clear = 0, And = 1, RevAnd = 2, Copy = 3, InvAnd = 4, NoOp = 5, Xor = 6, Or = 7, Nor = 8, Equiv = 9, Inv = 10, RevOr = 11, InvCopy = 12, InvOr = 13, NAnd = 14, Set = 15 }; enum class ERglAlphaFunc { Never = 0, Less = 1, Equal = 2, LEqual = 3, Greater = 4, NEqual = 5, GEqual = 6, Always = 7 }; enum class ERglAlphaOp { And = 0, Or = 1, Xor = 2, XNor = 3 }; enum class ERglEnum { Never = 0, Less = 1, Equal = 2, LEqual = 3, Greater = 4, NEqual = 5, GEqual = 6, Always = 7 }; struct CFogState { zeus::CColor m_color; float m_A = 0.f; float m_B = 0.5f; float m_C = 0.f; ERglFogMode m_mode; }; } // namespace metaforce namespace aurora::gfx { struct TextureRef; struct TextureHandle { std::shared_ptr ref; TextureHandle() = default; TextureHandle(std::shared_ptr&& ref) : ref(std::move(ref)) {} operator bool() const { return ref.operator bool(); } void reset() { ref.reset(); } }; enum class TextureFormat : uint8_t { RGBA8, R8, R32Float, DXT1, DXT3, DXT5, BPTC, }; struct ClipRect { int32_t x; int32_t y; int32_t width; int32_t height; }; enum class CameraFilterType : uint8_t { Passthru, Multiply, Invert, Add, Subtract, Blend, Widescreen, SceneAdd, NoColor, InvDstMultiply, }; enum class ZComp : uint8_t { Never, Less, Equal, LEqual, Greater, NEqual, GEqual, Always, }; [[nodiscard]] bool get_dxt_compression_supported() noexcept; // GX state void set_cull_mode(metaforce::ERglCullMode mode) noexcept; void set_blend_mode(metaforce::ERglBlendMode mode, metaforce::ERglBlendFactor src, metaforce::ERglBlendFactor dst, metaforce::ERglLogicOp op) noexcept; void set_depth_mode(bool compare_enable, metaforce::ERglEnum func, bool update_enable); // Model state void set_alpha_discard(bool v); void update_model_view(const zeus::CMatrix4f& mv, const zeus::CMatrix4f& mv_inv) noexcept; void update_projection(const zeus::CMatrix4f& proj) noexcept; void update_fog_state(const metaforce::CFogState& state) noexcept; void set_viewport(const zeus::CRectangle& rect, float znear, float zfar) noexcept; void set_scissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) noexcept; void resolve_color(const ClipRect& rect, uint32_t bind, bool clear_depth) noexcept; void resolve_depth(const ClipRect& rect, uint32_t bind) noexcept; void add_material_set(/* TODO */) noexcept; void add_model(/* TODO */) noexcept; void queue_aabb(const zeus::CAABox& aabb, const zeus::CColor& color, bool z_only) noexcept; void queue_fog_volume_plane(const ArrayRef& verts, uint8_t pass); void queue_fog_volume_filter(const zeus::CColor& color, bool two_way) noexcept; void queue_textured_quad_verts(CameraFilterType filter_type, const TextureHandle& texture, ZComp z_comparison, bool z_test, const zeus::CColor& color, const ArrayRef& pos, const ArrayRef& uvs, float lod) noexcept; void queue_textured_quad(CameraFilterType filter_type, const TextureHandle& texture, ZComp z_comparison, bool z_test, const zeus::CColor& color, float uv_scale, const zeus::CRectangle& rect, float z, float lod = 0) noexcept; void queue_colored_quad_verts(CameraFilterType filter_type, ZComp z_comparison, bool z_test, const zeus::CColor& color, const ArrayRef& pos) noexcept; void queue_colored_quad(CameraFilterType filter_type, ZComp z_comparison, bool z_test, const zeus::CColor& color, const zeus::CRectangle& rect, float z) noexcept; void queue_movie_player(const TextureHandle& tex_y, const TextureHandle& tex_u, const TextureHandle& tex_v, const zeus::CColor& color, float h_pad, float v_pad) noexcept; TextureHandle new_static_texture_2d(uint32_t width, uint32_t height, uint32_t mips, TextureFormat format, ArrayRef data, zstring_view label) noexcept; TextureHandle new_dynamic_texture_2d(uint32_t width, uint32_t height, uint32_t mips, TextureFormat format, zstring_view label) noexcept; TextureHandle new_render_texture(uint32_t width, uint32_t height, uint32_t color_bind_count, uint32_t depth_bind_count, zstring_view label) noexcept; void write_texture(const TextureHandle& handle, ArrayRef data) noexcept; } // namespace aurora::gfx