Compare commits
88
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39e91b588f
|
||
|
|
7bb1406365
|
||
|
|
438584e4f2
|
||
|
|
acc4fd11eb
|
||
|
|
72bb76dcbc
|
||
|
|
272b66f7f0
|
||
|
|
6637a3692b
|
||
|
|
feeb3b1ba8
|
||
|
|
5a56bf3986
|
||
|
|
1dfc538ae3
|
||
|
|
36c05a9138
|
||
|
|
a8d841c63c
|
||
|
|
8983371806
|
||
|
|
2b4c4bacd6
|
||
|
|
859a4c96ae
|
||
|
|
0e0d576954
|
||
|
|
4a29cb4330
|
||
|
|
e0b86ee3f6
|
||
|
|
b121001db7
|
||
|
|
2059772ad1
|
||
|
|
81aa08485b
|
||
|
|
ecadf0a44c
|
||
|
|
6dfc04378a
|
||
|
|
e3ffcbb596
|
||
|
|
469cd535fd
|
||
|
|
b594e09bdb
|
||
|
|
41b25e4476
|
||
|
|
25607b865c
|
||
|
|
1bf103c894
|
||
|
|
11a480136b
|
||
|
|
e6fcfe0650
|
||
|
|
a8a80cfa47
|
||
|
|
b7f1037b18
|
||
|
|
de51a35734
|
||
|
|
13152a317a
|
||
|
|
5dd5907c43
|
||
|
|
673e53935a
|
||
|
|
dda8258064
|
||
|
|
0c55291f9c
|
||
|
|
c5f6f0cb33
|
||
|
|
391eea100a
|
||
|
|
d70a9970e9
|
||
|
|
0f044538cc
|
||
|
|
546940aa77
|
||
|
|
dc365bc658
|
||
|
|
1ccc7075fa
|
||
|
|
b069f10841
|
||
|
|
bf3eef8d28
|
||
|
|
6298d4c816
|
||
|
|
212ba0c617
|
||
|
|
b4a7260cf2
|
||
|
|
5cf9ff0109
|
||
|
|
69b5e74d91
|
||
|
|
9b69d78118
|
||
|
|
e573523511
|
||
|
|
1317599475
|
||
|
|
1876ab9365
|
||
|
|
ce2dc94121
|
||
|
|
bef8ced350
|
||
|
|
dd038883a0
|
||
|
|
7ad2b8b0c5
|
||
|
|
63fb09189d
|
||
|
|
306ddfed53
|
||
|
|
c2b0fa01db
|
||
|
|
594cf5cca4
|
||
|
|
191bca26d5
|
||
|
|
85a92f8371
|
||
|
|
f3d326c237
|
||
|
|
fda39b3d36
|
||
|
|
8e09025c40
|
||
|
|
2a57b7c08c
|
||
|
|
9d0565f60c
|
||
|
|
4691d158a9
|
||
|
|
57c376a822
|
||
|
|
d72c447875
|
||
|
|
518015afb1
|
||
|
|
e6a60e90d1
|
||
|
|
9d63a17700
|
||
|
|
fd498c5ea2
|
||
|
|
0cc886315d
|
||
|
|
1b9876f64b
|
||
|
|
cd904ea544
|
||
|
|
e43cb41377
|
||
|
|
b2d3d203a2
|
||
|
|
f1a63fe383
|
||
|
|
0501a4f87c
|
||
|
|
3d8b57ead6
|
||
|
|
ac37ce9e12
|
@@ -52,6 +52,7 @@ set(PD_SOURCES
|
||||
source/lithium/drawlist.cpp
|
||||
source/lithium/font.cpp
|
||||
source/lithium/math.cpp
|
||||
source/lithium/pools.cpp
|
||||
|
||||
# UI7
|
||||
source/ui7/io.cpp
|
||||
|
||||
@@ -9,6 +9,7 @@ option(PD_ENABLE_CITRO3D "Enable Citro3D Support (3DS)" OFF)
|
||||
option(PD_ENABLE_VULKAN "Not implemented yet" OFF)
|
||||
option(PD_ENABLE_HID_GLFW "Enable GLFW Input Driver" ON)
|
||||
option(PD_ENABLE_HID_NX "Enable NX Input Driver" OFF)
|
||||
option(PD_ENABLE_HID3DS "Enable 3ds Input Driver" OFF)
|
||||
|
||||
if(NOT WIN32) # cause we are not on windows...
|
||||
set(PD_ENABLE_DIRECTX9 OFF)
|
||||
@@ -21,6 +22,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Nintendo3DS")
|
||||
set(PD_ENABLE_CITRO3D ON)
|
||||
set(PD_ENABLE_HID_GLFW OFF)
|
||||
set(PD_ENABLE_HID_NX OFF)
|
||||
set(PD_ENABLE_HID3DS ON)
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "NintendoSwitch")
|
||||
set(PD_ENABLE_OPENGL2 OFF)
|
||||
set(PD_ENABLE_OPENGL3 ON)
|
||||
@@ -36,6 +38,7 @@ add_library(pd-system STATIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_opengl3.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_directx9.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/gfx_citro3d.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/hid_3ds.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/hid_glfw.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/source/hid_nx.cpp
|
||||
)
|
||||
@@ -64,6 +67,7 @@ target_compile_definitions(pd-system
|
||||
$<$<BOOL:${PD_ENABLE_CITRO3D}>:PD_ENABLE_CITRO3D>
|
||||
$<$<BOOL:${PD_ENABLE_HID_GLFW}>:PD_ENABLE_HID_GLFW>
|
||||
$<$<BOOL:${PD_ENABLE_HID_NX}>:PD_ENABLE_HID_NX>
|
||||
$<$<BOOL:${PD_ENABLE_HID3DS}>:PD_ENABLE_HID3DS>
|
||||
)
|
||||
|
||||
# Palladium
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include <pd/drivers/hid.hpp>
|
||||
|
||||
namespace PD {
|
||||
class Hid3DS : public HidDriver {
|
||||
public:
|
||||
Hid3DS();
|
||||
~Hid3DS();
|
||||
|
||||
void Update() override;
|
||||
|
||||
private:
|
||||
struct Impl;
|
||||
Impl* impl;
|
||||
};
|
||||
} // namespace PD
|
||||
@@ -7,4 +7,5 @@
|
||||
#include <pd_system/gfx_opengl3.hpp>
|
||||
|
||||
// Hid
|
||||
#include <pd_system/hid_3ds.hpp>
|
||||
#include <pd_system/hid_glfw.hpp>
|
||||
@@ -0,0 +1,82 @@
|
||||
#include <pd_system/hid_3ds.hpp>
|
||||
#if defined(PD_ENABLE_HID3DS) && defined(__3DS__)
|
||||
#include <3ds.h>
|
||||
namespace PD {
|
||||
struct Hid3DS::Impl {
|
||||
std::string* Text;
|
||||
bool InTextMode = false;
|
||||
};
|
||||
|
||||
Hid3DS::Hid3DS() : HidDriver("Hid3DS") {
|
||||
impl = new Impl;
|
||||
|
||||
pFlags |= PDHidBackendFlags_HasGamepad;
|
||||
pFlags |= PDHidBackendFlags_HasTouch;
|
||||
|
||||
pGamepad[KEY_A] = HidInternal::Gamepad::A;
|
||||
pGamepad[KEY_B] = HidInternal::Gamepad::B;
|
||||
pGamepad[KEY_X] = HidInternal::Gamepad::X;
|
||||
pGamepad[KEY_Y] = HidInternal::Gamepad::Y;
|
||||
pGamepad[KEY_START] = HidInternal::Gamepad::Start;
|
||||
pGamepad[KEY_SELECT] = HidInternal::Gamepad::Select;
|
||||
pGamepad[KEY_L] = HidInternal::Gamepad::L;
|
||||
pGamepad[KEY_R] = HidInternal::Gamepad::R;
|
||||
pGamepad[KEY_DUP] = HidInternal::Gamepad::DUp;
|
||||
pGamepad[KEY_DDOWN] = HidInternal::Gamepad::DDown;
|
||||
pGamepad[KEY_DLEFT] = HidInternal::Gamepad::DLeft;
|
||||
pGamepad[KEY_DRIGHT] = HidInternal::Gamepad::DRight;
|
||||
pGamepad[KEY_CPAD_UP] = HidInternal::Gamepad::CPUp;
|
||||
pGamepad[KEY_CPAD_DOWN] = HidInternal::Gamepad::CPDown;
|
||||
pGamepad[KEY_CPAD_LEFT] = HidInternal::Gamepad::CPLeft;
|
||||
pGamepad[KEY_CPAD_RIGHT] = HidInternal::Gamepad::CPRight;
|
||||
pGamepad[KEY_CSTICK_UP] = HidInternal::Gamepad::CSUp;
|
||||
pGamepad[KEY_CSTICK_DOWN] = HidInternal::Gamepad::CSDown;
|
||||
pGamepad[KEY_CSTICK_LEFT] = HidInternal::Gamepad::CSLeft;
|
||||
pGamepad[KEY_CSTICK_RIGHT] = HidInternal::Gamepad::CSRight;
|
||||
pGamepad[KEY_ZL] = HidInternal::Gamepad::ZL;
|
||||
pGamepad[KEY_ZR] = HidInternal::Gamepad::ZR;
|
||||
pGamepad[KEY_TOUCH] = HidInternal::Gamepad::Touch;
|
||||
}
|
||||
|
||||
Hid3DS::~Hid3DS() { delete impl; }
|
||||
|
||||
void Hid3DS::Update() {
|
||||
HidDriver::Update(); // clear stats
|
||||
hidScanInput();
|
||||
u32 kd = hidKeysDown();
|
||||
u32 kh = hidKeysHeld();
|
||||
u32 ku = hidKeysUp();
|
||||
|
||||
for (const auto& b : pGamepad) {
|
||||
if (b.first & kd) {
|
||||
pGamepadEvents[0][Event::Down] |= b.second;
|
||||
}
|
||||
if (b.first & kh) {
|
||||
pGamepadEvents[0][Event::Held] |= b.second;
|
||||
}
|
||||
if (b.first & ku) {
|
||||
pGamepadEvents[0][Event::Up] |= b.second;
|
||||
}
|
||||
}
|
||||
|
||||
/*if (pLocked) {
|
||||
SwapTab();
|
||||
}*/
|
||||
touchPosition t;
|
||||
hidTouchRead(&t);
|
||||
pMouse[0] = fvec2(t.px, t.py);
|
||||
}
|
||||
} // namespace PD
|
||||
#else
|
||||
struct GLFWgamepadstate {};
|
||||
namespace PD {
|
||||
|
||||
Hid3DS::Hid3DS() : HidDriver("Hid3DS") {}
|
||||
|
||||
Hid3DS::~Hid3DS() {}
|
||||
|
||||
void Hid3DS::Update() {
|
||||
HidDriver::Update(); // clear stats
|
||||
}
|
||||
} // namespace PD
|
||||
#endif
|
||||
@@ -65,7 +65,7 @@ HidGlfw::HidGlfw(GLFWwindow* win) : HidDriver("HidGlfw") {
|
||||
}
|
||||
}
|
||||
|
||||
HidGlfw::~HidGlfw() {}
|
||||
HidGlfw::~HidGlfw() { delete impl; }
|
||||
|
||||
void HidGlfw::Update() {
|
||||
HidDriver::Update(); // clear stats
|
||||
|
||||
@@ -11,7 +11,7 @@ struct HidNX::Impl {
|
||||
|
||||
HidNX::HidNX() : HidDriver("HidNX") { impl = new Impl; }
|
||||
|
||||
HidNX::~HidNX() {}
|
||||
HidNX::~HidNX() { delete impl; }
|
||||
|
||||
void HidNX::Update() {
|
||||
HidDriver::Update(); // clear stats
|
||||
|
||||
+50
-12
@@ -2,7 +2,8 @@
|
||||
|
||||
#include <pd/core/mat.hpp>
|
||||
#include <pd/drivers/interface.hpp>
|
||||
#include <pd/lithium/command.hpp>
|
||||
#include <pd/lithium/drawlist.hpp>
|
||||
#include <pd/lithium/pools.hpp>
|
||||
#include <pd/lithium/texture.hpp>
|
||||
|
||||
using PDGfxBackendFlags = PD::u32;
|
||||
@@ -37,7 +38,7 @@ class PD_API GfxDriver : public DriverInterface {
|
||||
return Li::Texture();
|
||||
}
|
||||
virtual void DeleteTexture(const Li::Texture& tex) {}
|
||||
virtual void Draw(const Pool<Li::Command>& commands) {}
|
||||
virtual void Draw(const Li::Drawlist& commands) {}
|
||||
Li::Texture::Ptr GetWhiteTexture() { return &pWhite; }
|
||||
PDGfxBackendFlags GetFlags() { return Flags; }
|
||||
|
||||
@@ -110,28 +111,67 @@ class GfxDriverBase : public GfxDriver {
|
||||
pWhite = LoadTexture(img, 16, 16);
|
||||
}
|
||||
|
||||
void Draw(const Pool<Li::Command>& commands) override {
|
||||
void Draw(const Li::Drawlist& dl) override {
|
||||
const auto& commands = dl.Data();
|
||||
if (commands.size() == 0) return;
|
||||
pCountCommands += commands.size();
|
||||
size_t index = 0;
|
||||
|
||||
size_t vtotal = dl.GetNumVertices();
|
||||
size_t itotal = dl.GetNumIndices();
|
||||
|
||||
size_t start_vtx = pVtxPool.size();
|
||||
pVtxPool.Allocate(vtotal);
|
||||
CurrentVertex += vtotal;
|
||||
|
||||
size_t start_idx = pIdxPool.size();
|
||||
pIdxPool.Allocate(itotal);
|
||||
CurrentIndex += itotal;
|
||||
|
||||
size_t current_vtx = start_vtx;
|
||||
size_t current_idx = start_idx;
|
||||
|
||||
const auto& vpool = Li::GetVertexPool();
|
||||
const auto& ipool = Li::GetIndexPool();
|
||||
/** Build Pools */
|
||||
for (size_t i = 0; i < commands.size(); i++) {
|
||||
const auto& cmd = commands[i];
|
||||
if (cmd.VertexCount > 0) {
|
||||
std::memcpy(pVtxPool.begin() + current_vtx,
|
||||
vpool.begin() + cmd.FirstVertex,
|
||||
cmd.VertexCount * sizeof(Li::Vertex));
|
||||
}
|
||||
for (size_t idx = 0; idx < cmd.IndexCount; idx++) {
|
||||
u16 local_idx = ipool[cmd.FirstIndex + idx];
|
||||
pIdxPool[current_idx + idx] = static_cast<u16>(current_vtx + local_idx);
|
||||
}
|
||||
current_vtx += cmd.VertexCount;
|
||||
current_idx += cmd.IndexCount;
|
||||
}
|
||||
|
||||
UploadPools();
|
||||
|
||||
size_t index = 0;
|
||||
size_t ioff = start_idx;
|
||||
|
||||
while (index < commands.size()) {
|
||||
CurrentTex = commands[index].Tex;
|
||||
CurrentTexIsSDF = commands[index].SDF;
|
||||
if (!CurrentTex) {
|
||||
CurrentTex = pWhite.GetID();
|
||||
}
|
||||
size_t startidx = commands[index].FirstIndex;
|
||||
size_t num_indices = 0;
|
||||
while (index < commands.size() &&
|
||||
CurrentTexIsSDF == commands[index].SDF &&
|
||||
(CurrentTex == commands[index].Tex ||
|
||||
(CurrentTex == pWhite.GetID() && commands[index].Tex == 0)) &&
|
||||
commands[index].FirstIndex == startidx + num_indices) {
|
||||
(CurrentTex == pWhite.GetID() && commands[index].Tex == 0))) {
|
||||
num_indices += commands[index].IndexCount;
|
||||
index++;
|
||||
}
|
||||
Submit(num_indices, startidx);
|
||||
pCountDrawcalls++;
|
||||
if (num_indices > 0) {
|
||||
Submit(num_indices, ioff);
|
||||
ioff += num_indices;
|
||||
pCountDrawcalls++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,9 +251,7 @@ class PD_API Gfx {
|
||||
static void SetViewPort(const ivec2& vp) { driver->SetViewPort(vp); }
|
||||
static void SetViewPort(int w, int h) { driver->SetViewPort(w, h); }
|
||||
static void Reset() { driver->Reset(); }
|
||||
static void Draw(const Pool<Li::Command>& commands) {
|
||||
driver->Draw(commands);
|
||||
}
|
||||
static void Draw(const Li::Drawlist& dl) { driver->Draw(dl); }
|
||||
static Li::Texture LoadTexture(const std::vector<PD::u8>& pixels, int w,
|
||||
int h,
|
||||
TextureFormat type = TextureFormat::RGBA32,
|
||||
|
||||
@@ -42,6 +42,10 @@ class PD_API Drawlist {
|
||||
void Copy(Drawlist& other);
|
||||
void Optimize();
|
||||
void Clear();
|
||||
void SetLayer(int layer) { pCurrentLayer = layer; }
|
||||
void LayerUp() { pCurrentLayer++; }
|
||||
void LayerDown() { pCurrentLayer--; }
|
||||
int GetLayer() const { return pCurrentLayer; }
|
||||
|
||||
size_t GetNumVertices() const {
|
||||
size_t count = 0;
|
||||
@@ -126,6 +130,7 @@ class PD_API Drawlist {
|
||||
|
||||
private:
|
||||
Texture pCurrentTexture;
|
||||
int pCurrentLayer = 0;
|
||||
Pool<Command> pCommands;
|
||||
Pool<fvec2> pPath;
|
||||
Pool<Vertex> pVertices;
|
||||
|
||||
@@ -4,4 +4,5 @@
|
||||
#include <pd/lithium/drawlist.hpp>
|
||||
#include <pd/lithium/font.hpp>
|
||||
#include <pd/lithium/math.hpp>
|
||||
#include <pd/lithium/pools.hpp>
|
||||
#include <pd/lithium/vertex.hpp>
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/lithium/vertex.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace Li {
|
||||
PD_API PD::Pool<Vertex>& GetVertexPool();
|
||||
PD_API PD::Pool<u16>& GetIndexPool();
|
||||
PD_API void ResetPools();
|
||||
} // namespace Li
|
||||
} // namespace PD
|
||||
@@ -59,6 +59,7 @@ class PD_API Container {
|
||||
void Init(UI7::IO* io, Li::Drawlist* l) {
|
||||
list = l;
|
||||
this->io = io;
|
||||
pFont = io->Font;
|
||||
// this->screen = io->Ren->CurrentScreen();
|
||||
}
|
||||
|
||||
@@ -75,6 +76,7 @@ class PD_API Container {
|
||||
fvec2 GetPos() { return pos; }
|
||||
/** Getter for Size */
|
||||
fvec2 GetSize() { return size; }
|
||||
Li::Font* GetFont() { return pFont; }
|
||||
/**
|
||||
* Get the Containers Final Position
|
||||
* for Rendering and Input (if it has a parent Object)
|
||||
@@ -193,6 +195,7 @@ class PD_API Container {
|
||||
fvec4 pClipRect;
|
||||
/** Clip Rect used */
|
||||
bool pCLipRectUsed = false;
|
||||
Li::Font* pFont = nullptr;
|
||||
};
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
|
||||
@@ -58,6 +58,8 @@ enum UI7MenuFlags_ {
|
||||
enum UI7LayoutFlags_ {
|
||||
UI7LayoutFlags_None = 0, ///< No Flags used
|
||||
UI7LayoutFlags_UseClipRect = 1 << 0, ///< Enable ClipRect
|
||||
UI7LayoutFlags_HzScrolling = 1 << 1, ///< Scrolling Horizontal
|
||||
UI7LayoutFlags_VtScrolling = 1 << 2, ///< Scrolling Vertical
|
||||
};
|
||||
|
||||
/** UI7 Context Flags */
|
||||
|
||||
@@ -81,6 +81,7 @@ class PD_API IO {
|
||||
u32 NumVertices = 0; ///< Debug Vertices Num
|
||||
u32 NumIndices = 0; ///< Debug Indices Num
|
||||
std::vector<u32> MenuOrder;
|
||||
std::vector<Li::Font*> FontStack;
|
||||
|
||||
// Pools
|
||||
PD::Pool<UI7::Label> LabelPool;
|
||||
@@ -107,6 +108,18 @@ class PD_API IO {
|
||||
return ViewPorts[id.RawID()];
|
||||
}
|
||||
|
||||
void PushFont(Li::Font* f) {
|
||||
FontStack.push_back(Font);
|
||||
Font = f;
|
||||
}
|
||||
|
||||
void PopFont() {
|
||||
if (!FontStack.empty()) {
|
||||
Font = FontStack.back();
|
||||
FontStack.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
UI7::InputHandler InputHandler;
|
||||
};
|
||||
} // namespace UI7
|
||||
|
||||
@@ -127,6 +127,8 @@ class PD_API Layout {
|
||||
void CursorInit();
|
||||
void SameLine();
|
||||
void CursorMove(const fvec2& size);
|
||||
void PushFont(Li::Font* f) { IO.PushFont(f); }
|
||||
void PopFont() { IO.PopFont(); }
|
||||
|
||||
bool ObjectWorkPos(fvec2& movpos);
|
||||
|
||||
@@ -163,6 +165,8 @@ class PD_API Layout {
|
||||
void SetAlign(UI7Align a) { Alignment = a; }
|
||||
void NextAlign(UI7Align a) { TempAlign = a; }
|
||||
|
||||
void HandleScrolling();
|
||||
|
||||
void Update();
|
||||
|
||||
fvec2 DbgScrollOffset() { return ScrollOffset; }
|
||||
|
||||
@@ -110,7 +110,6 @@ class PD_API Menu {
|
||||
void EndTreeNode();
|
||||
|
||||
void HandleFocus();
|
||||
void HandleScrolling();
|
||||
void HandleTitlebarActions();
|
||||
void DrawBaseLayout();
|
||||
|
||||
@@ -120,6 +119,9 @@ class PD_API Menu {
|
||||
}
|
||||
Container* FindObject(u32 id) { return pLayout.FindObject(id); }
|
||||
|
||||
void PushFont(Li::Font* f) { pIO.PushFont(f); }
|
||||
void PopFont() { pIO.PopFont(); }
|
||||
|
||||
void Update();
|
||||
|
||||
void SetSize(PD::fvec2 size) { pLayout.SetSize(size); }
|
||||
|
||||
+42
-14
@@ -1,23 +1,48 @@
|
||||
#include <pd/drivers/gfx.hpp>
|
||||
#include <pd/lithium/command.hpp>
|
||||
#include <pd/lithium/pools.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace Li {
|
||||
|
||||
void Command::Reserve(size_t vtx, size_t idx) {
|
||||
auto& vpool = GetVertexPool();
|
||||
auto& ipool = GetIndexPool();
|
||||
if (VertexCountMax == 0) {
|
||||
FirstVertex = Gfx::AllocateVertices(vtx, (PD::ptr)this);
|
||||
FirstVertex = vpool.size();
|
||||
vpool.Allocate(vtx);
|
||||
VertexCountMax = vtx;
|
||||
} else {
|
||||
Gfx::ExpandVertices(vtx, (PD::ptr)this);
|
||||
VertexCountMax += vtx;
|
||||
if (vpool.size() == FirstVertex + VertexCountMax) {
|
||||
vpool.Allocate(vtx);
|
||||
VertexCountMax += vtx;
|
||||
} else {
|
||||
size_t tmp = FirstVertex;
|
||||
FirstVertex = vpool.size();
|
||||
vpool.Allocate(VertexCountMax + vtx);
|
||||
for (size_t i = 0; i < VertexCount; i++) {
|
||||
vpool[FirstVertex + i] = vpool[tmp + i];
|
||||
}
|
||||
VertexCountMax += vtx;
|
||||
}
|
||||
}
|
||||
if (IndexCountMax == 0) {
|
||||
FirstIndex = Gfx::AllocateIndices(idx, (PD::ptr)this);
|
||||
FirstIndex = ipool.size();
|
||||
ipool.Allocate(idx);
|
||||
IndexCountMax = idx;
|
||||
} else {
|
||||
Gfx::ExpandIndices(idx, (PD::ptr)this);
|
||||
IndexCountMax += idx;
|
||||
if (ipool.size() == FirstIndex + IndexCountMax) {
|
||||
ipool.Allocate(idx);
|
||||
IndexCountMax += idx;
|
||||
} else {
|
||||
size_t tmp = FirstIndex;
|
||||
FirstIndex = ipool.size();
|
||||
ipool.Allocate(IndexCountMax + idx);
|
||||
for (size_t i = 0; i < IndexCount; i++) {
|
||||
ipool[FirstIndex + i] = ipool[tmp + i];
|
||||
}
|
||||
IndexCountMax += idx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,22 +59,25 @@ void Command::Reset() {
|
||||
}
|
||||
|
||||
Command& Command::Add(const Vertex& vtx) {
|
||||
if (VertexCount <= VertexCountMax)
|
||||
Gfx::PutVertex(FirstVertex + VertexCount++, vtx, (PD::ptr)this);
|
||||
if (VertexCount < VertexCountMax) {
|
||||
GetVertexPool()[FirstVertex + VertexCount++] = vtx;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
Command& Command::Add(u16 idx) {
|
||||
if (IndexCount <= IndexCountMax)
|
||||
Gfx::PutIndex(FirstIndex + IndexCount++, FirstVertex + VertexCount + idx,
|
||||
(PD::ptr)this);
|
||||
if (IndexCount < IndexCountMax) {
|
||||
GetIndexPool()[FirstIndex + IndexCount++] =
|
||||
static_cast<u16>(VertexCount + idx);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
Command& Command::Add(u16 a, u16 b, u16 c) {
|
||||
if (IndexCount + 3 <= IndexCountMax) {
|
||||
auto& ip = GetIndexPool();
|
||||
size_t idx = FirstIndex + IndexCount;
|
||||
Gfx::PutIndex(idx + 0, FirstVertex + VertexCount + a, (PD::ptr)this);
|
||||
Gfx::PutIndex(idx + 1, FirstVertex + VertexCount + b, (PD::ptr)this);
|
||||
Gfx::PutIndex(idx + 2, FirstVertex + VertexCount + c, (PD::ptr)this);
|
||||
ip[idx + 0] = static_cast<u16>(VertexCount + a);
|
||||
ip[idx + 1] = static_cast<u16>(VertexCount + b);
|
||||
ip[idx + 2] = static_cast<u16>(VertexCount + c);
|
||||
IndexCount += 3;
|
||||
}
|
||||
return *this;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <pd/drivers/gfx.hpp>
|
||||
#include <pd/lithium/drawlist.hpp>
|
||||
@@ -11,27 +12,44 @@ PD_API Drawlist::Drawlist() { Clear(); }
|
||||
PD_API Drawlist::~Drawlist() { Clear(); }
|
||||
|
||||
PD_API void Drawlist::Merge(Drawlist& other) {
|
||||
size_t start = pCommands.size();
|
||||
pCommands.AppendMove(other.pCommands);
|
||||
for (size_t i = start; i < pCommands.size(); i++) {
|
||||
pCommands[i].Layer += this->pCurrentLayer;
|
||||
}
|
||||
other.Clear();
|
||||
}
|
||||
|
||||
PD_API void Drawlist::Copy(Drawlist& other) {
|
||||
int start = pCommands.size();
|
||||
pCommands.AppendCopy(other.pCommands);
|
||||
for (size_t i = start; i < pCommands.size(); i++) {
|
||||
pCommands[i].Layer += this->pCurrentLayer;
|
||||
}
|
||||
}
|
||||
|
||||
PD_API void Drawlist::Optimize() {}
|
||||
PD_API void Drawlist::Optimize() {
|
||||
if (pCommands.size() <= 1) return;
|
||||
std::stable_sort(pCommands.begin(), pCommands.end(),
|
||||
[](const Command& a, const Command& b) {
|
||||
if (a.Layer != b.Layer) return a.Layer < b.Layer;
|
||||
if (a.SDF != b.SDF) return a.SDF < b.SDF;
|
||||
return a.Tex < b.Tex;
|
||||
});
|
||||
}
|
||||
|
||||
PD_API void Drawlist::Clear() {
|
||||
UnbindTexture();
|
||||
pPath.ResetFast();
|
||||
pVertices.ResetFast();
|
||||
pIndices.ResetFast();
|
||||
pCommands.ResetFast();
|
||||
pCommands.NoReset();
|
||||
pCurrentLayer = 0;
|
||||
}
|
||||
|
||||
/** Command Allocation */
|
||||
PD_API Command& Drawlist::NewCommand() {
|
||||
auto cmd = pCommands.Allocate(1);
|
||||
cmd->Reset();
|
||||
cmd->Layer = pCurrentLayer;
|
||||
cmd->Tex = pCurrentTexture.GetID();
|
||||
return *cmd;
|
||||
}
|
||||
|
||||
@@ -288,7 +288,8 @@ PD_API void Font::CmdTextEx(Drawlist& dl, const fvec2& pos, u32 color,
|
||||
}
|
||||
|
||||
if (cp.Size.x > 0 && cp.Size.y > 0) {
|
||||
if (cmd == nullptr || cmd->Tex != Textures[cp.Tex]) {
|
||||
if (cmd == nullptr || cmd->Tex != Textures[cp.Tex] ||
|
||||
cmd->Layer != dl.GetLayer()) {
|
||||
if (cp.Tex >= Textures.size()) continue;
|
||||
cmd = &dl.NewCommand();
|
||||
cmd->Tex = Textures[cp.Tex];
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#include <pd/lithium/pools.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace Li {
|
||||
static PD::Pool<Vertex> gVertexPool;
|
||||
static PD::Pool<u16> gIndexPool;
|
||||
|
||||
PD_API PD::Pool<Vertex>& GetVertexPool() { return gVertexPool; }
|
||||
PD_API PD::Pool<u16>& GetIndexPool() { return gIndexPool; }
|
||||
|
||||
PD_API void ResetPools() {
|
||||
gVertexPool.NoReset();
|
||||
gIndexPool.NoReset();
|
||||
}
|
||||
} // namespace Li
|
||||
} // namespace PD
|
||||
@@ -49,12 +49,13 @@ PD_API void Button::HandleInput() {
|
||||
PD_API void Button::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->SetFont(GetFont());
|
||||
list->PathRect(FinalPos(), FinalPos() + size, io->FrameRounding);
|
||||
list->PathFill(io->Theme.Get(color));
|
||||
// list->LayerUp();
|
||||
list->LayerUp();
|
||||
list->DrawText(FinalPos() + size * 0.5 - tdim * 0.5, label.c_str(),
|
||||
io->Theme.Get(UI7Color_Text));
|
||||
// list->LayerDown();
|
||||
list->LayerDown();
|
||||
}
|
||||
|
||||
PD_API void Button::Update() {
|
||||
|
||||
@@ -48,6 +48,7 @@ PD_API void Checkbox::HandleInput() {
|
||||
PD_API void Checkbox::Draw() {
|
||||
// Assert(list.get() && io.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->SetFont(GetFont());
|
||||
list->PathRect(FinalPos(), FinalPos() + cbs, io->FrameRounding);
|
||||
list->PathFill(io->Theme.Get(color));
|
||||
if (usr_ref) {
|
||||
|
||||
@@ -44,6 +44,7 @@ PD_API void ColorEdit::HandleInput() {
|
||||
PD_API void ColorEdit::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->SetFont(GetFont());
|
||||
list->PathRect(FinalPos(), FinalPos() + io->ItemRowHeight, io->FrameRounding);
|
||||
list->PathFill(*color_ref);
|
||||
list->DrawText(FinalPos() + fvec2(io->ItemSpace.x + io->ItemRowHeight, 0),
|
||||
@@ -55,16 +56,19 @@ PD_API void ColorEdit::Draw() {
|
||||
layout->SetPosition(FinalPos());
|
||||
DynObj* r = io->DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([=, this](UI7::IO* io, Li::Drawlist* l, Container* thiz) {
|
||||
list->SetFont(thiz->GetFont());
|
||||
thiz->SetSize(layout->GetSize());
|
||||
// l->Layer(30);
|
||||
l->PathRect(thiz->GetPos(), thiz->GetPos() + thiz->GetSize(),
|
||||
io->FrameRounding);
|
||||
l->PathFill(io->Theme.Get(UI7Color_FrameBackground));
|
||||
l->SetLayer(0);
|
||||
});
|
||||
layout->AddObjectEx(r, UI7LytAdd_Front | UI7LytAdd_NoCursorUpdate |
|
||||
UI7LytAdd_NoScrollHandle);
|
||||
r = io->DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([=, this](UI7::IO* io, Li::Drawlist* l, Container* thiz) {
|
||||
list->SetFont(thiz->GetFont());
|
||||
l->PathRect(thiz->FinalPos(), thiz->FinalPos() + io->ItemRowHeight,
|
||||
io->FrameRounding);
|
||||
l->PathFill(*color_ref);
|
||||
@@ -84,7 +88,9 @@ PD_API void ColorEdit::Draw() {
|
||||
layout->Slider<u8>("B", ((u8*)color_ref) + 2);
|
||||
layout->Slider<u8>("A", ((u8*)color_ref) + 3);
|
||||
layout->Update();
|
||||
list->SetLayer(50);
|
||||
list->Merge(layout->GetDrawList());
|
||||
list->SetLayer(0);
|
||||
// io->RegisterDrawList(GetID(), layout->GetDrawList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,11 +86,11 @@ PD_API void DragData<T>::Draw() {
|
||||
FinalPos() + fvec2(off_x, 0) + td + io->FramePadding,
|
||||
io->FrameRounding);
|
||||
list->PathFill(io->Theme.Get(UI7Color_Button));
|
||||
// list->LayerUp();
|
||||
list->LayerUp();
|
||||
list->DrawTextEx(FinalPos() + fvec2(off_x, 0), p.c_str(),
|
||||
io->Theme.Get(UI7Color_Text), LiTextFlags_AlignMid,
|
||||
td + io->FramePadding);
|
||||
// list->LayerDown();
|
||||
list->LayerDown();
|
||||
off_x += td.x + io->ItemSpace.x + io->FramePadding.x;
|
||||
}
|
||||
list->DrawText(FinalPos() + fvec2(off_x, io->FramePadding.y * 0.5),
|
||||
@@ -101,6 +101,7 @@ template <typename T>
|
||||
PD_API void DragData<T>::Update() {
|
||||
// Assert(io.get(), "Did you run Container::Init correctly?");
|
||||
// Probably need to find a faster solution (caching sizes calculated here)
|
||||
list->SetFont(GetFont());
|
||||
float off_x = 0;
|
||||
for (size_t i = 0; i < elm_count; i++) {
|
||||
std::string p;
|
||||
|
||||
@@ -29,11 +29,11 @@ PD_API void Image::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// Assert(img.get(), "Image is nullptr!");
|
||||
// io->Ren->OnScreen(screen);
|
||||
// list->LayerUp();
|
||||
list->LayerUp();
|
||||
list->BindTexture(img);
|
||||
list->DrawRectFilled(FinalPos(), newsize, 0xffffffff);
|
||||
list->UnbindTexture();
|
||||
// list->LayerDown();
|
||||
list->LayerDown();
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -28,6 +28,7 @@ namespace UI7 {
|
||||
PD_API void Label::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->SetFont(GetFont());
|
||||
list->DrawTextEx(FinalPos(), label.c_str(), io->Theme.Get(UI7Color_Text),
|
||||
LiTextFlags_NoOOS,
|
||||
PD::fvec2(0, io->CurrentViewPort.pSize.w));
|
||||
|
||||
@@ -70,6 +70,7 @@ template <typename T>
|
||||
PD_API void Slider<T>::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->SetFont(GetFont());
|
||||
std::string p;
|
||||
if constexpr (std::is_floating_point_v<T>) {
|
||||
p = std::format("{:.{}f}", *data, precision);
|
||||
@@ -84,10 +85,10 @@ PD_API void Slider<T>::Draw() {
|
||||
FinalPos() + fvec2(slp + slw - 2, td.y - 2) + io->FramePadding,
|
||||
io->FrameRounding);
|
||||
list->PathFill(io->Theme.Get(UI7Color_ButtonActive));
|
||||
// list->LayerUp();
|
||||
list->LayerUp();
|
||||
list->DrawTextEx(FinalPos(), p.c_str(), io->Theme.Get(UI7Color_Text),
|
||||
LiTextFlags_AlignMid, fvec2(width, td.y) + io->FramePadding);
|
||||
// list->LayerDown();
|
||||
list->LayerDown();
|
||||
list->DrawText(FinalPos() + fvec2(width + io->FramePadding.x * 2.f,
|
||||
io->FramePadding.y * 0.5),
|
||||
label.c_str(), io->Theme.Get(UI7Color_Text));
|
||||
|
||||
@@ -21,6 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <pd/ui7/containers.hpp>
|
||||
#include <pd/ui7/layout.hpp>
|
||||
|
||||
@@ -122,6 +123,42 @@ PD_API fvec2 Layout::AlignPosition(fvec2 pos, fvec2 size, fvec4 area,
|
||||
return p;
|
||||
}
|
||||
|
||||
PD_API void Layout::HandleScrolling() {
|
||||
if (Flags & UI7LayoutFlags_VtScrolling) {
|
||||
bool allowed = MaxPosition.y > WorkRect.w;
|
||||
if (allowed) {
|
||||
if (PD::Hid::IsEvent(Hid::Event::Down, PD::Hid::Gamepad::Touch) ||
|
||||
PD::Hid::IsEvent(Hid::Event::Down, PD::Hid::Keyboard::MouseLeft)) {
|
||||
ScrollStart = ScrollOffset;
|
||||
}
|
||||
if (IO.InputHandler.DragObject(UI7::ID("sbg" + ID.GetName()),
|
||||
fvec4(Pos, fvec2(0.f)) + WorkRect)) {
|
||||
if (!IO.InputHandler.DragReleasedAW) {
|
||||
ScrollOffset.y =
|
||||
std::clamp(ScrollStart.y + IO.InputHandler.DragSourcePos.y -
|
||||
IO.InputHandler.DragPosition.y,
|
||||
-20.f, MaxPosition.y - WorkRect.w + 20.f);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ScrollOffset.y = 0.f;
|
||||
}
|
||||
|
||||
if (ScrollOffset.y > MaxPosition.y - WorkRect.w) {
|
||||
ScrollOffset.y -= 1.5f;
|
||||
if (ScrollOffset.y < MaxPosition.y - WorkRect.w) {
|
||||
ScrollOffset.y = MaxPosition.y - WorkRect.w;
|
||||
}
|
||||
}
|
||||
if (ScrollOffset.y < 0) {
|
||||
ScrollOffset.y += 1.5f;
|
||||
if (ScrollOffset.y > 0) {
|
||||
ScrollOffset.y = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_API void Layout::Update() {
|
||||
if (Size == fvec2(0.f)) {
|
||||
Size = fvec2(MaxPosition) + IO.MenuPadding * 2;
|
||||
@@ -155,6 +192,7 @@ PD_API void Layout::Update() {
|
||||
Objects.clear();
|
||||
WorkRect = fvec4(fvec2(WorkRect.x, WorkRect.y), Size - IO.MenuPadding);
|
||||
CursorInit();
|
||||
HandleScrolling();
|
||||
}
|
||||
|
||||
/** SECTION CONTAINERS (STOLEN FROM FORMER MENU) */
|
||||
|
||||
+15
-47
@@ -104,6 +104,7 @@ PD_API void Menu::SeparatorText(const std::string& label) {
|
||||
DynObj* r = pIO.DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([=, this](UI7::IO* io, Li::Drawlist* l,
|
||||
UI7::Container* self) {
|
||||
l->SetFont(self->GetFont());
|
||||
fvec2 size = self->GetSize();
|
||||
fvec2 tdim = io->Font->GetTextBounds(label.c_str(), io->FontScale);
|
||||
fvec2 pos = self->FinalPos();
|
||||
@@ -147,45 +148,6 @@ PD_API void Menu::HandleFocus() {
|
||||
}
|
||||
}
|
||||
|
||||
/** Todo: (func name is self describing) */
|
||||
PD_API void Menu::HandleScrolling() {
|
||||
if (Flags & UI7MenuFlags_VtScrolling) {
|
||||
bool allowed =
|
||||
pLayout.MaxPosition.y > (pLayout.WorkRect.w - pLayout.WorkRect.y);
|
||||
if (allowed) {
|
||||
if (PD::Hid::IsEvent(Hid::Event::Down, PD::Hid::Gamepad::Touch)) {
|
||||
pLayout.ScrollStart = pLayout.ScrollOffset;
|
||||
}
|
||||
if (pIO.InputHandler.DragObject(
|
||||
"sbg" + pID.GetName(),
|
||||
fvec4(pLayout.Pos, fvec2(0.f)) + pLayout.WorkRect)) {
|
||||
if (pIO.InputHandler.DragReleasedAW) {
|
||||
} else {
|
||||
pLayout.ScrollOffset.y = std::clamp(
|
||||
pLayout.ScrollStart.y + pIO.InputHandler.DragSourcePos.y -
|
||||
pIO.InputHandler.DragPosition.y,
|
||||
-20.f, pLayout.MaxPosition.y - 220);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pLayout.ScrollOffset.y = 0.f;
|
||||
}
|
||||
|
||||
if (pLayout.ScrollOffset.y > pLayout.MaxPosition.y - 240) {
|
||||
pLayout.ScrollOffset.y -= 1.5;
|
||||
if (pLayout.ScrollOffset.y < pLayout.MaxPosition.y - 240) {
|
||||
pLayout.ScrollOffset.y = pLayout.MaxPosition.y - 240;
|
||||
}
|
||||
}
|
||||
if (pLayout.ScrollOffset.y < 0) {
|
||||
pLayout.ScrollOffset.y += 1.5;
|
||||
if (pLayout.ScrollOffset.y > 0) {
|
||||
pLayout.ScrollOffset.y = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_API void Menu::HandleTitlebarActions() {
|
||||
// Collapse
|
||||
if (!(Flags & UI7MenuFlags_NoCollapse)) {
|
||||
@@ -257,11 +219,12 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
if (!(Flags & UI7MenuFlags_NoResize)) {
|
||||
DynObj* r = pIO.DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([](IO* io, Li::Drawlist* l, UI7::Container* self) {
|
||||
// //l->Layer(1);
|
||||
l->SetLayer(1);
|
||||
l->PathAdd(self->FinalPos() + self->GetSize() - fvec2(0, 20));
|
||||
l->PathAdd(self->FinalPos() + self->GetSize());
|
||||
l->PathAdd(self->FinalPos() + self->GetSize() - fvec2(20, 0));
|
||||
l->PathFill(io->Theme.Get(UI7Color_Button));
|
||||
l->SetLayer(0);
|
||||
});
|
||||
r->SetSize(
|
||||
fvec2(pLayout.GetSize().x, pLayout.GetSize().y - TitleBarHeight));
|
||||
@@ -273,7 +236,7 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
/** Background */
|
||||
DynObj* r = pIO.DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([](IO* io, Li::Drawlist* l, UI7::Container* self) {
|
||||
// l->Layer(0);
|
||||
l->SetLayer(0);
|
||||
l->PathRectEx(self->FinalPos(), self->FinalPos() + self->GetSize(), 10.f,
|
||||
LiPathRectFlags_KeepTop | LiPathRectFlags_KeepBot);
|
||||
l->PathFill(io->Theme.Get(UI7Color_Background));
|
||||
@@ -291,11 +254,12 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
DynObj* r = pIO.DynObjPool.Allocate();
|
||||
*r = UI7::DynObj(
|
||||
[=, this](UI7::IO* io, Li::Drawlist* l, UI7::Container* self) {
|
||||
// l->Layer(20);
|
||||
l->SetFont(self->GetFont());
|
||||
l->SetLayer(20);
|
||||
/** Header Bar */
|
||||
l->DrawRectFilled(self->FinalPos(), self->GetSize(),
|
||||
io->Theme.Get(UI7Color_Header));
|
||||
// l->Layer(21);
|
||||
l->SetLayer(21);
|
||||
/** Inline if statement to shift the Text if collapse sym is shown */
|
||||
/** What the hell is this code btw (didn't found a better way) */
|
||||
l->DrawText(self->FinalPos() +
|
||||
@@ -305,6 +269,7 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
(io->FramePadding.x * 2)),
|
||||
2),
|
||||
pID.GetName().c_str(), io->Theme.Get(UI7Color_Text));
|
||||
l->SetLayer(0);
|
||||
});
|
||||
r->SetSize(fvec2(pLayout.GetSize().x, TitleBarHeight));
|
||||
r->SetPos(0);
|
||||
@@ -316,7 +281,7 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
*r = UI7::DynObj([=, this](UI7::IO* io, Li::Drawlist* l,
|
||||
UI7::Container* self) {
|
||||
/** This sym actually requires layer 21 (i dont know why) */
|
||||
// l->Layer(21);
|
||||
l->SetLayer(21);
|
||||
/**
|
||||
* Symbol (Position Swapping set by pIsOpen ? openpos : closepos;)
|
||||
*/
|
||||
@@ -327,6 +292,7 @@ PD_API void Menu::DrawBaseLayout() {
|
||||
self->FinalPos() +
|
||||
fvec2(pIsOpen ? self->GetSize().x * 0.5 : 0, self->GetSize().y),
|
||||
io->Theme.Get(UI7Color_FrameBackground));
|
||||
l->SetLayer(0);
|
||||
});
|
||||
r->SetSize(TitleBarHeight - pIO.FramePadding.y * 2);
|
||||
r->SetPos(pIO.FramePadding);
|
||||
@@ -358,6 +324,10 @@ PD_API void Menu::Update() {
|
||||
if (pLayout.Size == fvec2(0.f) || Flags & UI7MenuFlags_AlwaysAutoSize) {
|
||||
pLayout.Size = fvec2(pLayout.MaxPosition) + pIO.MenuPadding * 2;
|
||||
}
|
||||
if (Flags & UI7MenuFlags_VtScrolling)
|
||||
pLayout.Flags |= UI7LayoutFlags_VtScrolling;
|
||||
if (Flags & UI7MenuFlags_HzScrolling)
|
||||
pLayout.Flags |= UI7LayoutFlags_HzScrolling;
|
||||
if (!(Flags & UI7MenuFlags_NoTitlebar)) {
|
||||
TitleBarHeight = pIO.FontScale * pIO.Font->PixelHeight + pIO.MenuPadding.y;
|
||||
pLayout.WorkRect.y = 5.f + TitleBarHeight;
|
||||
@@ -368,9 +338,6 @@ PD_API void Menu::Update() {
|
||||
}
|
||||
DrawBaseLayout();
|
||||
pLayout.Update();
|
||||
if (Flags & UI7MenuFlags_VtScrolling || Flags & UI7MenuFlags_HzScrolling) {
|
||||
HandleScrolling();
|
||||
}
|
||||
}
|
||||
|
||||
PD_API bool Menu::BeginTreeNode(const ID& id) {
|
||||
@@ -391,6 +358,7 @@ PD_API bool Menu::BeginTreeNode(const ID& id) {
|
||||
// Object
|
||||
DynObj* r = pIO.DynObjPool.Allocate();
|
||||
*r = UI7::DynObj([=, this](IO* io, Li::Drawlist* l, Container* self) {
|
||||
l->SetFont(self->GetFont());
|
||||
fvec2 ts = self->FinalPos() + fvec2(0, 7);
|
||||
fvec2 pl[2] = {fvec2(10, 5), fvec2(0, 10)};
|
||||
if (n->second) {
|
||||
|
||||
@@ -143,8 +143,11 @@ PD_API void Context::Update() {
|
||||
pMenus[it]->Update(); /** Render */
|
||||
this->pIO.InputHandler.CurrentMenu = 0;
|
||||
}
|
||||
int base_layer = 0;
|
||||
for (int i = (int)FinalList.size() - 1; i >= 0; i--) {
|
||||
pIO.FDL.SetLayer(base_layer);
|
||||
pIO.FDL.Merge(pMenus[FinalList[i]]->pLayout.GetDrawList());
|
||||
base_layer += 100;
|
||||
}
|
||||
pCurrentMenus.clear();
|
||||
pIO.Update();
|
||||
|
||||
@@ -217,6 +217,7 @@ int main(int argc, char** argv) {
|
||||
PD::TT::Beg("MainRaw");
|
||||
PD::Hid::Update();
|
||||
PD::Gfx::NewFrame();
|
||||
PD::Li::ResetPools();
|
||||
// app.Update(pOs->GetViewport(), pList);
|
||||
pList.SetFontscale(0.7);
|
||||
if (PD::Hid::IsEvent(PD::Hid::Event::Down, PD::Hid::Gamepad::CPLeft |
|
||||
@@ -297,13 +298,13 @@ int main(int argc, char** argv) {
|
||||
"#ff00ff");
|
||||
}
|
||||
pList.SetFont(&font);
|
||||
#ifndef __3DS__
|
||||
PD::TT::Beg("BuildUI7Menus");
|
||||
if (auto m = ui7.BeginMenu("Test")) {
|
||||
m->Label("Hello World!");
|
||||
ui7.EndMenu();
|
||||
}
|
||||
if (auto m = ui7.BeginMenu("LI DBG INFO")) {
|
||||
m->PushFont(&debug_font);
|
||||
m->Label("Gfx Driver: {}", PD::Gfx::GetDriverName());
|
||||
m->Separator();
|
||||
m->Label("LI Draw Comamnds: {}", PD::Gfx::GetNumCommands());
|
||||
@@ -311,6 +312,7 @@ int main(int argc, char** argv) {
|
||||
m->Label("GFX Vertices: {}", PD::Gfx::GetNumVertices());
|
||||
m->Label("GFX Triangles: {}", PD::Gfx::GetNumVertices() / 3);
|
||||
m->Label("GFX Indices: {}", PD::Gfx::GetNumIndices());
|
||||
m->PopFont();
|
||||
ui7.EndMenu();
|
||||
}
|
||||
ui7.MetricsMenu();
|
||||
@@ -318,11 +320,10 @@ int main(int argc, char** argv) {
|
||||
PD::TT::Beg("UI7::Context::Update");
|
||||
ui7.Update();
|
||||
PD::TT::End("UI7::Context::Update");
|
||||
#endif
|
||||
PD::Gfx::Reset();
|
||||
PD::TT::Beg("PD::Gfx::Draw");
|
||||
PD::Gfx::Draw(pList);
|
||||
PD::Gfx::Draw(ui7.GetDrawData());
|
||||
PD::Gfx::Draw(pList);
|
||||
PD::TT::End("PD::Gfx::Draw");
|
||||
pList.Clear();
|
||||
PD::TT::End("MainRaw");
|
||||
|
||||
@@ -33,7 +33,7 @@ void HorizonCtr::Init() {
|
||||
romfsInit();
|
||||
osSetSpeedupEnable(true);
|
||||
gfxInitDefault();
|
||||
consoleInit(GFX_BOTTOM, nullptr);
|
||||
// consoleInit(GFX_BOTTOM, nullptr);
|
||||
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
|
||||
impl->Top =
|
||||
C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8);
|
||||
@@ -43,7 +43,7 @@ void HorizonCtr::Init() {
|
||||
C3D_RenderTargetSetOutput(impl->Bottom, GFX_BOTTOM, GFX_LEFT,
|
||||
DisplayTransferFlags);
|
||||
PD::Gfx::UseDriver<PD::GfxCitro3D>();
|
||||
PD::Hid::UseDriver<PD::HidDriver>();
|
||||
PD::Hid::UseDriver<PD::Hid3DS>();
|
||||
}
|
||||
|
||||
void HorizonCtr::Deinit() {
|
||||
@@ -61,14 +61,13 @@ void HorizonCtr::Deinit() {
|
||||
|
||||
bool HorizonCtr::Mainloop() {
|
||||
pViewPort = ivec2(400, 240);
|
||||
hidScanInput();
|
||||
bool _kill = hidKeysUp() & KEY_START;
|
||||
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||
return aptMainLoop() && !_kill;
|
||||
}
|
||||
|
||||
void HorizonCtr::ClearViewPort() {
|
||||
PD::Gfx::SetViewPort(pViewPort);
|
||||
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||
C3D_FrameDrawOn(impl->Top);
|
||||
C3D_RenderTargetClear(impl->Top, C3D_CLEAR_ALL, PD::Color(25, 25, 25, 25), 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user