#pragma once /*! * @file gfx.h * Graphics component for the runtime. Abstraction layer for the main graphics routines. */ #include #include #include #include "common/common_types.h" #include "game/kernel/kboot.h" #include "game/system/newpad.h" // forward declarations struct GfxSettings; class GfxDisplay; // enum for rendering pipeline enum class GfxPipeline { Invalid = 0, OpenGL }; enum GfxDisplayMode { Windowed = 0, Fullscreen = 1, Borderless = 2 }; // module for the different rendering pipelines struct GfxRendererModule { std::function init; std::function(int width, int height, const char* title, GfxSettings& settings, bool is_main)> make_display; std::function exit; std::function vsync; std::function sync_path; std::function send_chain; std::function texture_upload_now; std::function texture_relocate; std::function poll_events; std::function&)> set_levels; std::function set_pmode_alp; GfxPipeline pipeline; const char* name; }; // store settings related to the gfx systems // TODO merge with globalsettings struct GfxSettings { // current version of the settings. this should be set up so that newer versions are always higher // than older versions // increment this whenever you change this struct. // there's probably a smarter way to do this (automatically deduce size etc.) static constexpr u64 CURRENT_VERSION = 0x0000'0000'0004'0001; u64 version; // the version of this settings struct. MUST ALWAYS BE THE FIRST THING! Pad::MappingInfo pad_mapping_info; // button mapping Pad::MappingInfo pad_mapping_info_backup; // button mapping backup (see newpad.h) int vsync; // (temp) number of screen update per frame bool debug; // graphics debugging GfxPipeline renderer = GfxPipeline::Invalid; // which rendering pipeline to use. }; // runtime settings static constexpr int PAT_MOD_COUNT = 3; static constexpr int PAT_EVT_COUNT = 7; static constexpr int PAT_MAT_COUNT = 23; struct GfxGlobalSettings { // note: this is actually the size of the display that ISN'T letterboxed // the excess space is what will be letterboxed away. int lbox_w; int lbox_h; // current renderer const GfxRendererModule* renderer; // lod settings, used by bucket renderers int lod_tfrag = 0; int lod_tie = 0; // collision renderer settings bool collision_enable = false; bool collision_wireframe = true; // matching enum in kernel-defs.gc !! enum CollisionRendererMode { None, Mode, Event, Material, Skip } collision_mode = Mode; std::array collision_mode_mask = {UINT32_MAX}; std::array collision_event_mask = {UINT32_MAX}; std::array collision_material_mask = {UINT32_MAX}; u32 collision_skip_mask = UINT32_MAX; }; namespace Gfx { extern GfxGlobalSettings g_global_settings; extern GfxSettings g_settings; const GfxRendererModule* GetCurrentRenderer(); u32 Init(); void Loop(std::function f); u32 Exit(); u32 vsync(); u32 sync_path(); void send_chain(const void* data, u32 offset); void texture_upload_now(const u8* tpage, int mode, u32 s7_ptr); void texture_relocate(u32 destination, u32 source, u32 format); void set_levels(const std::vector& levels); void poll_events(); u64 get_window_width(); u64 get_window_height(); void set_window_size(u64 w, u64 h); void get_window_scale(float* x, float* y); GfxDisplayMode get_fullscreen(); void get_screen_size(s64 vmode_idx, s32* w, s32* h, s32* c); void set_letterbox(int w, int h); void set_fullscreen(GfxDisplayMode mode, int screen); void set_window_lock(bool lock); void input_mode_set(u32 enable); void input_mode_save(); s64 get_mapped_button(s64 pad, s64 button); int PadIsPressed(Pad::Button button, int port); int PadAnalogValue(Pad::Analog analog, int port); // matching enum in kernel-defs.gc !! enum class RendererTreeType { NONE = 0, TFRAG3 = 1, TIE3 = 2, INVALID }; void SetLod(RendererTreeType tree, int lod); bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); void CollisionRendererSetMode(GfxGlobalSettings::CollisionRendererMode mode); } // namespace Gfx