# 0.2.6-2

- Add Scissor (CLIP RECT) to lithium commands and UI7 Drawlist API
- Enable ClipRect to UI7::Menu (probably create a enable/disable flag)
This commit is contained in:
2025-03-05 20:18:00 +01:00
parent 229d54f088
commit 5375d0f3a9
13 changed files with 148 additions and 57 deletions

View File

@ -26,14 +26,35 @@ SOFTWARE.
#include <cstring>
#include <memory>
#include <pd/image/img_edit.hpp>
#include <pd/image/image.hpp>
#include <pd/image/img_convert.hpp>
namespace PD {
void ImgEdit::Load(const std::string& path) {
u8* buf = stbi_load(path.c_str(), &w, &h, &fmt, 4);
buffer.assign(buf, buf + (w * h * 4));
stbi_image_free(buf);
void Image::Load(const std::string& path) {
u8* img = stbi_load(path.c_str(), &w, &h, &fmt, 4);
if (fmt == 3) {
stbi_image_free(img);
img = stbi_load(path.c_str(), &w, &h, &fmt, 3);
buffer.resize(w * h * 4);
PD::ImgConvert::RGB24toRGBA32(
buffer, std::vector<u8>(img, img + (w * h * 3)), w, h);
} else {
buffer.assign(img, img + (w * h * 4));
stbi_image_free(img);
}
}
void ImgEdit::Load(const std::vector<u8>& buf) {}
void ImgEdit::Copy(const std::vector<u8>& buf, int w, int h, int fmt) {}
void Image::Load(const std::vector<u8>& buf) {
u8* img = stbi_load_from_memory(buf.data(), buf.size(), &w, &h, &fmt, 4);
if (fmt == 3) {
stbi_image_free(img);
img = stbi_load_from_memory(buf.data(), buf.size(), &w, &h, &fmt, 3);
buffer.resize(w * h * 4);
PD::ImgConvert::RGB24toRGBA32(
buffer, std::vector<u8>(img, img + (w * h * 3)), w, h);
} else {
buffer.assign(img, img + (w * h * 4));
stbi_image_free(img);
}
}
void Image::Copy(const std::vector<u8>& buf, int w, int h, int fmt) {}
} // namespace PD

View File

@ -465,11 +465,17 @@ void Renderer::Render(Screen::Ref s) {
while (index < cmds.size()) {
C3D_Tex* tex = cmds[index]->Tex()->GetTex();
auto mode = cmds[index]->Rendermode();
auto smode = cmds[index]->GetScissorMode();
auto spos = cmds[index]->ScissorRect();
C3D_SetScissor((GPU_SCISSORMODE)smode, s->GetSize().y() - spos.w(),
s->GetSize().x() - spos.z(), s->GetSize().y() - spos.y(),
s->GetSize().x() - spos.x());
UpdateRenderMode(mode);
u32 start_vtx = vertex_idx;
u32 start_idx = index_idx;
while (index < cmds.size() && cmds[index]->Tex()->GetTex() == tex &&
cmds[index]->Rendermode() == mode) {
cmds[index]->Rendermode() == mode &&
cmds[index]->GetScissorMode() == smode) {
auto c = cmds[index];
// Indices
for (size_t i = 0; i < c->IndexList().size(); i++) {

View File

@ -27,11 +27,12 @@ SOFTWARE.
#include <tex3ds.h>
#include <pd/app/error.hpp>
#include <pd/core/bit_util.hpp>
#include <pd/core/io.hpp>
#include <pd/core/timetrace.hpp>
#include <pd/lithium/texture.hpp>
#include <pd/core/bit_util.hpp>
#include <pd/image/image.hpp>
#include <pd/image/img_convert.hpp>
#include <pd/lithium/texture.hpp>
namespace PD {
GPU_TEXCOLOR GetTexFmt(Texture::Type type) {
@ -115,51 +116,24 @@ void Texture::Delete() {
void Texture::LoadFile(const std::string& path) {
PD::TT::Scope st("texldr-" + path);
Delete();
int w = 0, h = 0, c = 0;
u8* image = stbi_load(path.c_str(), &w, &h, &c, 4);
PD::Assert(image != nullptr, "Unable to load image: " + path);
if (w > 1024 || h > 1024) {
stbi_image_free(image);
PD::Image img(path);
PD::Assert(img.GetBuffer().size(), "Unable to load image: " + path);
if (img.Width() > 1024 || img.Height() > 1024) {
PD::Error("Width or heigt is > 1024");
return;
}
std::vector<u8> buf;
if (c == 3) {
stbi_image_free(image);
image = stbi_load(path.c_str(), &w, &h, &c, 3);
buf.resize(w * h * 4);
PD::ImgConvert::RGB24toRGBA32(
buf, std::vector<u8>(image, image + (w * h * 3)), w, h);
} else {
buf.assign(image, image + (w * h * 4));
stbi_image_free(image);
}
MakeTex(buf, w, h);
MakeTex(img, img.Width(), img.Height());
}
void Texture::LoadMemory(const std::vector<u8>& data) {
Delete();
int w, h, c;
u8* image = stbi_load_from_memory(data.data(), data.size(), &w, &h, &c, 4);
if (image == nullptr) {
PD::Image img(data);
PD::Assert(img.GetBuffer().size(), "Unable to load image from Memory!");
if (img.Width() > 1024 || img.Height() > 1024) {
PD::Error("Width or heigt is > 1024");
return;
}
if (w > 1024 || h > 1024) {
stbi_image_free(image);
return;
}
std::vector<u8> buf;
if (c == 3) {
stbi_image_free(image);
image = stbi_load_from_memory(data.data(), data.size(), &w, &h, &c, 3);
buf.resize(w * h * 4);
PD::ImgConvert::RGB24toRGBA32(
buf, std::vector<u8>(image, image + (w * h * 3)), w, h);
} else {
buf.assign(image, image + (w * h * 4));
stbi_image_free(image);
}
MakeTex(buf, w, h);
MakeTex(img, img.Width(), img.Height());
}
void Texture::LoadPixels(const std::vector<u8>& pixels, int w, int h, Type type,

View File

@ -35,6 +35,10 @@ void DrawList::AddRectangle(vec2 pos, vec2 szs, const UI7Color& clr) {
ren->UseTex();
ren->SetupCommand(cmd);
cmd->Layer(base + layer);
if (!clip_rects.empty()) {
cmd->SetScissorMode(LI::ScissorMode_Normal);
cmd->ScissorRect(clip_rects.top());
}
ren->QuadCommand(cmd, rect, vec4(0.f, 1.f, 1.f, 0.f), clr);
commands.push_back(std::make_pair(
ren->CurrentScreen()->ScreenType() == Screen::Bottom, cmd));
@ -49,6 +53,10 @@ void DrawList::AddTriangle(vec2 pos0, vec2 pos1, vec2 pos2,
ren->UseTex();
ren->SetupCommand(cmd);
cmd->Layer(base + layer);
if (!clip_rects.empty()) {
cmd->SetScissorMode(LI::ScissorMode_Normal);
cmd->ScissorRect(clip_rects.top());
}
ren->TriangleCommand(cmd, pos0, pos1, pos2, clr);
commands.push_back(std::make_pair(
ren->CurrentScreen()->ScreenType() == Screen::Bottom, cmd));
@ -76,6 +84,10 @@ void DrawList::AddText(vec2 pos, const std::string& text, const UI7Color& clr,
e->second->SetPos(pos);
e->second->SetColor(clr);
e->second->SetLayer(layer);
if (!clip_rects.empty()) {
e->second->SetScissorMode(LI::ScissorMode_Normal);
e->second->ScissorRect(clip_rects.top());
}
e->second->Draw();
////// STILL LEAVING THE OLD CODE BELOW AS IT IS MAYBE NEEDED //////
@ -107,6 +119,10 @@ void DrawList::AddImage(vec2 pos, Texture::Ref img, vec2 size) {
ren->UseTex(img);
ren->SetupCommand(cmd);
cmd->Layer(base + layer);
if (!clip_rects.empty()) {
cmd->SetScissorMode(LI::ScissorMode_Normal);
cmd->ScissorRect(clip_rects.top());
}
ren->QuadCommand(cmd, rect, img->GetUV(), 0xffffffff);
commands.push_back(std::make_pair(
ren->CurrentScreen()->ScreenType() == Screen::Bottom, cmd));
@ -123,6 +139,10 @@ void DrawList::AddLine(const vec2& a, const vec2& b, const UI7Color& clr,
ren->UseTex();
ren->SetupCommand(cmd);
cmd->Layer(base + layer);
if (!clip_rects.empty()) {
cmd->SetScissorMode(LI::ScissorMode_Normal);
cmd->ScissorRect(clip_rects.top());
}
ren->QuadCommand(cmd, line, vec4(0.f, 1.f, 1.f, 0.f), clr);
commands.push_back(std::make_pair(
ren->CurrentScreen()->ScreenType() == Screen::Bottom, cmd));

View File

@ -108,6 +108,7 @@ void UI7::Menu::Update(float delta) {
if (!scroll_anim.IsFinished()) {
scrolling_off = scroll_anim;
}
main->PushClipRect(vec4(5, tbh, view_area.z() - 12, view_area.w()));
std::vector<int> tbr;
for (int i = 0; i < (int)objects.size(); i++) {
auto& it = objects[i];
@ -131,6 +132,7 @@ void UI7::Menu::Update(float delta) {
for (auto it : tbr) {
idobjs.erase(idobjs.begin() + it);
}
main->PopClipRect();
this->back->Process();
this->main->Process();
this->front->Process();