#pragma once #include #include #include #include #include #include #include #include #include #define MAKEFLAG(x) (1 << x) using PDTextFlags = unsigned int; enum PDTextFlags_ { PDTextFlags_None = 0, //< Align is Left and Other things are disabled PDTextFlags_AlignRight = MAKEFLAG(0), PDTextFlags_AlignMid = MAKEFLAG(1), PDTextFlags_Shaddow = MAKEFLAG(2), // TextBuf Killer lol (doubled Text) PDTextFlags_Wrap = MAKEFLAG(3), PDTextFlags_Short = MAKEFLAG(4), PDTextFlags_Scroll = MAKEFLAG(5), }; using PDLithiumFlags = unsigned int; enum PDLithiumFlags_ { PDLithiumFlags_None = 0, PDLithiumFlags_TMS = MAKEFLAG(0), // Text Map System PDLithiumFlags_LRS = MAKEFLAG(1), // Layer Render System PDLithiumFlags_FCS = MAKEFLAG(2), // Floor Coords System PDLithiumFlags_Default = PDLithiumFlags_TMS, }; namespace Palladium { class LIFont { public: struct CPI { CPI() : codepoint(0), uv(NVec4()), tex(nullptr), szs(NVec2()), off(0.f), invalid(false) {} CPI(bool iv) : codepoint(0), uv(NVec4()), tex(nullptr), szs(NVec2()), off(0.f), invalid(iv) {} unsigned int codepoint; NVec4 uv; Texture::Ref tex; NVec2 szs; float off; bool invalid; }; LIFont() = default; ~LIFont() = default; PD_SMART_CTOR(LIFont) void LoadTFF(const std::string path, int px_size = 32); void LoadBitmapFont(const std::string& path); void LoadSystemFont(); int GetPixelHeight(); CPI GetCodepoint(unsigned int c); std::string GetName() { return name; }; bool IsSystemFont() { return sysfnt; } void Dump(); private: bool sysfnt = false; std::string name; int pixel_height; std::map cpmap; std::vector tex; }; class LI { public: struct Vtx { Vtx() {} Vtx(NVec2 xy, float u, float v, unsigned int clr) { // Coords pos[0] = xy[0]; pos[1] = xy[1]; pos[2] = 0.f; // UV uv[0] = u; uv[1] = v; col = clr; } NVec3 pos; NVec2 uv; unsigned int col; }; /// CMD TYPES /// /// 0 = SKIP /// 2 = TRIANGLE /// 1 = RECT /// 3 = Circle ///////////////// struct Cmd { NVec4 top; NVec4 bot; NVec4 uv; int layer = 0; int cmd_type = 0; bool fcs = false; // Floor Coords System unsigned int clr = 0; bool sfr = false; // SysFontRender Texture::Ref tex = nullptr; int index = 0; }; /// Text Box /// /// System to Make GetTextDiemnsions /// and Short/Wrap faster struct TextBox { NVec2 size; float time_created; // Optional bool optinal = false; std::string text; }; LI() = default; ~LI() = default; static void Init(); static void Exit(); // Settings static void EnableFeature(PDLithiumFlags flag) { flags |= flag; } static void DisableFeature(PDLithiumFlags flag) { flags &= ~flag; } static PDLithiumFlags& GetFeatures() { return flags; } static void OnScreen(bool bottom); static void Render(C3D_RenderTarget* top, C3D_RenderTarget* bot); static NVec2 GetScreenSize() { return screen_size; } static LIFont::Ref GetFont() { return font; } static void SetFont(LIFont::Ref i) { font_update = true; font = i; } static void UseTexture(Texture::Ref tex = nullptr) { active_texture = tex ? tex : single_color; } static bool IsBottomScreen() { return bottom_screen; } static float GetTextScale() { return text_scale; } static void SetTextScale(float scale) { font_update = true; text_scale = scale; } static void DefaultTextScale() { font_update = true; text_scale = default_text_size; } static void Layer(int v) { layer = v; } static int Layer() { return layer; } static void NewLayer() { layer++; } static NVec2 GetTextDimensions(const std::string& text); static std::string ShortText(const std::string& in, int maxlen, NVec2& dim); static std::string WrapText(const std::string& in, int maxlen, NVec2& dim); // Drawing Functions static void DrawRect(NVec2 pos, NVec2 size, unsigned int color, NVec4 uvs); static void DrawLine(NVec2 a, NVec2 b, unsigned int clr, int t = 1); static void DrawCircle(NVec2 pos, float r, unsigned int color, int segments); static void DrawRect(NVec2 pos, NVec2 size, unsigned int color) { UseTexture(); DrawRect(pos, size, color, NVec4(0, 1, 1, 0)); } static void DrawTriangle(NVec2 a, NVec2 b, NVec2 c, unsigned int color); static void DrawImage(NVec2 pos, Texture::Ref tex, NVec2 size, NVec4 uvs) { UseTexture(tex); DrawRect(pos, size, 0xffffffff, uvs); } static void DrawText(NVec2 pos, unsigned int color, const std::string& text, PDTextFlags flags = 0, NVec2 ap = NVec2()); static int Vertices() { return num_vertices; } static int Indices() { return num_indices; } static int Drawcalls() { return num_drawcalls; } static int DarwCommands() { return num_commands; } static size_t GetMaxVerticesNum() { return vertex_buffer.size(); } private: static void RotateCorner(NVec2& v, float s, float c); static void MakeRect(NVec4& top, NVec4& bot, NVec2 pos, NVec2 szs, float angle = 0.f); static bool CompareCommands(const Cmd& a, const Cmd& b); static void RenderFrame(bool bottom); /// CTX /// static PDLithiumFlags flags; // Font Stuff // Default Font Size in (px) static const float default_font_size; static const float default_text_size; static float text_scale; // Renderer Stuff static NVec2 screen_size; static bool bottom_screen; static int layer; static std::vector draw_lists[2]; static Texture::Ref active_texture; static Texture::Ref single_color; static std::vector> vertex_buffer; static std::vector> idx_buffer; static size_t vertex_index; static size_t idx_index; static LIFont::Ref font; static bool font_update; static bool sysfont_render; static std::map text_sizes; static int cmd_index; // Debug static int num_vertices; static int num_drawcalls; static int num_commands; static int num_indices; // Shader static DVLB_s* li7_dvlb; static shaderProgram_s li7_prog; static C3D_AttrInfo li7_attr; static int uLoc_proj; }; } // namespace Palladium