WIP: Add CLipRects to UI7 Layouts
- Added Scissor Support to Font Rendering
This commit is contained in:
@@ -90,6 +90,7 @@ file(GLOB_RECURSE PD_FMTFILES CONFIGURE_DEPENDS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/backends/3ds/include/*.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/backends/3ds/include/*.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/backends/desktop/include/*.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/backends/desktop/include/*.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/backends/3ds/include/*.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/backends/3ds/include/*.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/test/source*.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(pd-clang-format
|
add_custom_target(pd-clang-format
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ enum LiTextFlags_ {
|
|||||||
namespace PD {
|
namespace PD {
|
||||||
class Context;
|
class Context;
|
||||||
namespace Li {
|
namespace Li {
|
||||||
|
class DrawList;
|
||||||
class PD_API Font {
|
class PD_API Font {
|
||||||
public:
|
public:
|
||||||
/** Codepoint Data holder */
|
/** Codepoint Data holder */
|
||||||
@@ -93,7 +94,7 @@ class PD_API Font {
|
|||||||
/**
|
/**
|
||||||
* Extended Draw Text Function that vreates a Command List
|
* Extended Draw Text Function that vreates a Command List
|
||||||
*/
|
*/
|
||||||
void CmdTextEx(CmdPool& cmds, const fvec2& pos, u32 color, float scale,
|
void CmdTextEx(DrawList& dl, const fvec2& pos, u32 color, float scale,
|
||||||
const std::string& text, LiTextFlags flags = 0,
|
const std::string& text, LiTextFlags flags = 0,
|
||||||
const fvec2& box = 0);
|
const fvec2& box = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,11 @@ class PD_API Container {
|
|||||||
/** Template function to update internal data (if needed) */
|
/** Template function to update internal data (if needed) */
|
||||||
virtual void Update() {}
|
virtual void Update() {}
|
||||||
|
|
||||||
|
/** Internal function */
|
||||||
|
void PreDraw();
|
||||||
|
/** Internal function */
|
||||||
|
void PostDraw();
|
||||||
|
|
||||||
/** Internal Input Handler */
|
/** Internal Input Handler */
|
||||||
void HandleInternalInput();
|
void HandleInternalInput();
|
||||||
|
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ class PD_API Layout {
|
|||||||
UI7::ID ID;
|
UI7::ID ID;
|
||||||
UI7::IO::Ref IO;
|
UI7::IO::Ref IO;
|
||||||
Li::DrawList::Ref DrawList;
|
Li::DrawList::Ref DrawList;
|
||||||
|
UI7LayoutFlags Flags;
|
||||||
|
|
||||||
// Positioning
|
// Positioning
|
||||||
fvec2 Pos;
|
fvec2 Pos;
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ PD_API void DrawList::DrawText(const fvec2& pos, const std::string& text,
|
|||||||
if (!pCurrentFont) {
|
if (!pCurrentFont) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pCurrentFont->CmdTextEx(pPool, pos, color, pFontScale, text);
|
pCurrentFont->CmdTextEx(*this, pos, color, pFontScale, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
PD_API void DrawList::DrawTextEx(const fvec2& p, const std::string& text,
|
PD_API void DrawList::DrawTextEx(const fvec2& p, const std::string& text,
|
||||||
@@ -297,7 +297,7 @@ PD_API void DrawList::DrawTextEx(const fvec2& p, const std::string& text,
|
|||||||
if (!pCurrentFont) {
|
if (!pCurrentFont) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pCurrentFont->CmdTextEx(pPool, p, color, pFontScale, text, flags, box);
|
pCurrentFont->CmdTextEx(*this, p, color, pFontScale, text, flags, box);
|
||||||
}
|
}
|
||||||
|
|
||||||
PD_API void DrawList::DrawLine(const fvec2& a, const fvec2& b, u32 color,
|
PD_API void DrawList::DrawLine(const fvec2& a, const fvec2& b, u32 color,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ SOFTWARE.
|
|||||||
#define PD_TRUETYPE_IMPLEMENTATION
|
#define PD_TRUETYPE_IMPLEMENTATION
|
||||||
#endif
|
#endif
|
||||||
#include <pd/external/stb_truetype.hpp>
|
#include <pd/external/stb_truetype.hpp>
|
||||||
|
#include <pd/lithium/drawlist.hpp>
|
||||||
#include <pd/lithium/renderer.hpp>
|
#include <pd/lithium/renderer.hpp>
|
||||||
|
|
||||||
#ifdef PD_LI_INCLUDE_FONTS
|
#ifdef PD_LI_INCLUDE_FONTS
|
||||||
@@ -246,7 +247,7 @@ PD_API fvec2 Font::GetTextBounds(const std::string& text, float scale) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
PD_API void Font::CmdTextEx(CmdPool& cmds, const fvec2& pos, u32 color,
|
PD_API void Font::CmdTextEx(DrawList& dl, const fvec2& pos, u32 color,
|
||||||
float scale, const std::string& text,
|
float scale, const std::string& text,
|
||||||
LiTextFlags flags, const fvec2& box) {
|
LiTextFlags flags, const fvec2& box) {
|
||||||
fvec2 off;
|
fvec2 off;
|
||||||
@@ -291,7 +292,7 @@ PD_API void Font::CmdTextEx(CmdPool& cmds, const fvec2& pos, u32 color,
|
|||||||
it = pShortText(it, scale, box - pos, tmp_dim);
|
it = pShortText(it, scale, box - pos, tmp_dim);
|
||||||
}
|
}
|
||||||
auto wline = Strings::MakeWstring(it);
|
auto wline = Strings::MakeWstring(it);
|
||||||
auto cmd = cmds.NewCmd();
|
auto cmd = dl.GetNewCmd();
|
||||||
auto Tex = GetCodepoint(wline[0]).Tex;
|
auto Tex = GetCodepoint(wline[0]).Tex;
|
||||||
if (Tex) {
|
if (Tex) {
|
||||||
cmd->Tex = Tex->Address;
|
cmd->Tex = Tex->Address;
|
||||||
@@ -303,7 +304,7 @@ PD_API void Font::CmdTextEx(CmdPool& cmds, const fvec2& pos, u32 color,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (Tex != cp.Tex) {
|
if (Tex != cp.Tex) {
|
||||||
cmd = cmds.NewCmd();
|
cmd = dl.GetNewCmd();
|
||||||
Tex = cp.Tex;
|
Tex = cp.Tex;
|
||||||
if (Tex) {
|
if (Tex) {
|
||||||
cmd->Tex = Tex->Address;
|
cmd->Tex = Tex->Address;
|
||||||
|
|||||||
@@ -40,5 +40,18 @@ PD_API void Container::HandleScrolling(fvec2 scrolling, fvec4 viewport) {
|
|||||||
PD_API void Container::HandleInternalInput() {
|
PD_API void Container::HandleInternalInput() {
|
||||||
/** Requires Handle Scrolling First */
|
/** Requires Handle Scrolling First */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Internal function */
|
||||||
|
PD_API void Container::PreDraw() {
|
||||||
|
if (pCLipRectUsed) {
|
||||||
|
list->PushClipRect(pClipRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** Internal function */
|
||||||
|
PD_API void Container::PostDraw() {
|
||||||
|
if (pCLipRectUsed) {
|
||||||
|
list->PopClipRect();
|
||||||
|
}
|
||||||
|
}
|
||||||
} // namespace UI7
|
} // namespace UI7
|
||||||
} // namespace PD
|
} // namespace PD
|
||||||
@@ -28,14 +28,8 @@ namespace UI7 {
|
|||||||
PD_API void Label::Draw() {
|
PD_API void Label::Draw() {
|
||||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||||
// io->Ren->OnScreen(screen);
|
// io->Ren->OnScreen(screen);
|
||||||
if (pCLipRectUsed) {
|
|
||||||
list->PushClipRect(pClipRect);
|
|
||||||
}
|
|
||||||
list->DrawTextEx(FinalPos(), label, io->Theme->Get(UI7Color_Text),
|
list->DrawTextEx(FinalPos(), label, io->Theme->Get(UI7Color_Text),
|
||||||
LiTextFlags_NoOOS, PD::fvec2(0, io->CurrentViewPort.w));
|
LiTextFlags_NoOOS, PD::fvec2(0, io->CurrentViewPort.w));
|
||||||
if (pCLipRectUsed) {
|
|
||||||
list->PopClipRect();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PD_API void Label::Update() {
|
PD_API void Label::Update() {
|
||||||
|
|||||||
@@ -125,7 +125,12 @@ PD_API void Layout::Update() {
|
|||||||
it->SetPos(it->GetPos() + Pos);
|
it->SetPos(it->GetPos() + Pos);
|
||||||
it->HandleInput();
|
it->HandleInput();
|
||||||
it->UnlockInput();
|
it->UnlockInput();
|
||||||
|
if (Flags & UI7LayoutFlags_UseClipRect) {
|
||||||
|
it->SetClipRect(fvec4(Pos, Size));
|
||||||
|
}
|
||||||
|
it->PreDraw();
|
||||||
it->Draw();
|
it->Draw();
|
||||||
|
it->PostDraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,14 +30,13 @@ Menu::Menu(const ID& id, IO::Ref io) : pIO(io), pID(id) {
|
|||||||
pLayout = Layout::New(id, io);
|
pLayout = Layout::New(id, io);
|
||||||
TitleBarHeight = pIO->FontScale * pIO->Font->PixelHeight + pIO->MenuPadding.y;
|
TitleBarHeight = pIO->FontScale * pIO->Font->PixelHeight + pIO->MenuPadding.y;
|
||||||
pLayout->WorkRect.y += TitleBarHeight;
|
pLayout->WorkRect.y += TitleBarHeight;
|
||||||
|
pLayout->Flags |= UI7LayoutFlags_UseClipRect;
|
||||||
pLayout->CursorInit();
|
pLayout->CursorInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
PD_API void Menu::Label(const std::string& label) {
|
PD_API void Menu::Label(const std::string& label) {
|
||||||
// Layout API
|
// Layout API
|
||||||
auto r = Label::New(label, pIO);
|
auto r = Label::New(label, pIO);
|
||||||
r->SetClipRect(fvec4(pLayout->GetPosition(),
|
|
||||||
pLayout->GetPosition() + pLayout->GetSize()));
|
|
||||||
pLayout->AddObject(r);
|
pLayout->AddObject(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user