- Fix LinearAlloc bug not using *sizeof(T)
- Add WaitForRead to net backend
- Add a Get func to Tween
- Skip \r in Text Rendering
- Add Citro3D Max Texsize check
This commit is contained in:
tobid7 2025-05-02 15:09:21 +02:00
parent 13c2869ba8
commit f75f7067ff
10 changed files with 91 additions and 30 deletions

View File

@ -39,7 +39,8 @@ class LinearAlloc : public Allocator<T> {
LinearAlloc() = default;
~LinearAlloc() = default;
T* Allocate(size_t n) override { return (T*)linearAlloc(n); }
/** Never forget the sizeof(T) again (most painful bug i created) */
T* Allocate(size_t n) override { return (T*)linearAlloc(n * sizeof(T)); }
void Deallocate(T* ptr) { linearFree(ptr); }
};
namespace LI {

View File

@ -66,6 +66,20 @@ class NetBackend3DS : public Net::Backend {
bool Listen(int sock_id, int backlog = 5) {
return listen(sock_id, backlog) != -1;
}
bool WaitForRead(int sock_id, int timeout_ms) override {
fd_set set;
FD_ZERO(&set);
FD_SET(sock_id, &set);
timeval timeout{};
timeout.tv_sec = timeout_ms / 1000;
timeout.tv_usec = (timeout_ms % 1000) * 1000;
int result = select(sock_id + 1, &set, nullptr, nullptr, &timeout);
return (result > 0 && FD_ISSET(sock_id, &set));
}
bool Accept(int sock_id, Net::Socket::Ref client) {
int client_soc = accept(sock_id, nullptr, nullptr);
if (client_soc == -1) {

View File

@ -44,7 +44,6 @@ unsigned char li_shader[] = {
};
// clang-format on
size_t li_shader_size = 0x124;
namespace PD {
namespace LI {
GPU_TEXCOLOR GetTexFmt(Texture::Type type) {
@ -170,6 +169,9 @@ PD::LI::Texture::Ref Backend_C3D::LoadTexture(const std::vector<PD::u8>& pixels,
PD::LI::Texture::Type type,
PD::LI::Texture::Filter filter) {
std::cout << "Loading Tex " << std::format("[{}, {}]", w, h) << std::endl;
if (w > 1024 || h > 1024) {
return nullptr;
}
// Don't check here as check done before
PD::LI::Texture::Ref res = PD::LI::Texture::New();
int bpp = GetBPP(type);
@ -226,4 +228,4 @@ PD::LI::Texture::Ref Backend_C3D::LoadTexture(const std::vector<PD::u8>& pixels,
return res;
}
} // namespace LI
} // namespace PD
} // namespace PD

View File

@ -33,6 +33,7 @@ SOFTWARE.
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#endif
#include <pd/net/backend.hpp>
@ -76,17 +77,31 @@ class NetBackendDesktop : public PD::Net::Backend {
#endif
}
bool Bind(int sock_id, u16 port) {
bool Bind(int sock_id, u16 port) override {
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
return bind(sock_id, (sockaddr*)&addr, sizeof(addr)) != -1;
}
bool Listen(int sock_id, int backlog = 5) {
bool Listen(int sock_id, int backlog = 5) override {
return listen(sock_id, backlog) != -1;
}
bool Accept(int sock_id, Net::Socket::Ref client) {
bool WaitForRead(int sock_id, int timeout_ms) override {
fd_set set;
FD_ZERO(&set);
FD_SET(sock_id, &set);
timeval timeout{};
timeout.tv_sec = timeout_ms / 1000;
timeout.tv_usec = (timeout_ms % 1000) * 1000;
int result = select(sock_id + 1, &set, nullptr, nullptr, &timeout);
return (result > 0 && FD_ISSET(sock_id, &set));
}
bool Accept(int sock_id, Net::Socket::Ref client) override {
int client_soc = accept(sock_id, nullptr, nullptr);
if (client_soc == GetInvalidRef()) {
return false;
@ -94,17 +109,17 @@ class NetBackendDesktop : public PD::Net::Backend {
client->pSocket = client_soc;
return true;
}
bool Connect(int sock_id, const std::string& ip, u16 port) {
bool Connect(int sock_id, const std::string& ip, u16 port) override {
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, ip.c_str(), &addr.sin_addr);
return connect(sock_id, (sockaddr*)&addr, sizeof(addr)) != -1;
}
int Send(int sock_id, const std::string& data) {
int Send(int sock_id, const std::string& data) override {
return send(sock_id, data.c_str(), static_cast<int>(data.size()), 0);
}
int Receive(int sock_id, std::string& data, int size = 1024) {
int Receive(int sock_id, std::string& data, int size = 1024) override {
char* tmp = new char[size];
int res = recv(sock_id, tmp, size, 0);
if (res > 0) {

View File

@ -37,16 +37,28 @@ namespace PD {
* @note Safetey checks are disabled for maximum performance
*/
class PD_CORE_API Color {
private:
/** Red Value */
u8 m_r;
/** Green Value */
u8 m_g;
/** Blue Value */
u8 m_b;
/** Alpha Value */
u8 m_a;
public:
/**
* Default Constructor (all variables are set to 0)
*/
Color() : m_r(0), m_g(0), m_b(0), m_a(0) {}
// Color() : m_r(0), m_g(0), m_b(0), m_a(0) {}
constexpr Color() : m_r(0), m_g(0), m_b(0), m_a(0) {}
constexpr ~Color() {}
/**
* Constructor for 32Bit Color Input
* @param color 32Bit Color value
*/
Color(u32 color) {
constexpr Color(u32 color) {
m_a = (color >> 24) & 0xff;
m_b = (color >> 16) & 0xff;
m_g = (color >> 8) & 0xff;
@ -59,7 +71,7 @@ class PD_CORE_API Color {
* @param b Blue Value
* @param a Optional Alpha Value (Defaults to 255)
*/
Color(u8 r, u8 g, u8 b, u8 a = 255) {
constexpr Color(int r, int g, int b, int a = 255) {
m_r = r;
m_g = g;
m_b = b;
@ -73,7 +85,7 @@ class PD_CORE_API Color {
* @param a Optional Alpha Value (Defaults to 1.0f)
* @note There is no Check if the number is between 0.0 and 1.0
*/
Color(float r, float g, float b, float a = 1.f) {
constexpr Color(float r, float g, float b, float a = 1.f) {
m_r = static_cast<u8>(255.f * r);
m_g = static_cast<u8>(255.f * g);
m_b = static_cast<u8>(255.f * b);
@ -87,7 +99,7 @@ class PD_CORE_API Color {
/**
* Unused Deconstructor
*/
~Color() {}
// ~Color() {}
/**
* Create Color Object by Hex String
@ -196,15 +208,24 @@ class PD_CORE_API Color {
* @return 32Bit Color Value
*/
operator u32() const { return Get(); }
private:
/** Red Value */
u8 m_r;
/** Green Value */
u8 m_g;
/** Blue Value */
u8 m_b;
/** Alpha Value */
u8 m_a;
};
namespace Colors {
constexpr Color White = Color(1.f, 1.f, 1.f, 1.f);
constexpr Color Black = Color(0.f, 0.f, 0.f, 1.f);
constexpr Color Red = Color(1.f, 0.f, 0.f, 1.f);
constexpr Color Green = Color(0.f, 1.f, 0.f, 1.f);
constexpr Color Blue = Color(0.f, 0.f, 1.f, 1.f);
constexpr Color Yellow = Color(1.f, 1.f, 0.f, 1.f);
constexpr Color Cyan = Color(0.f, 1.f, 1.f, 1.f);
constexpr Color Magenta = Color(1.f, 0.f, 1.f, 1.f);
constexpr Color Gray = Color(0.5f, 0.5f, 0.5f, 1.f);
constexpr Color LightGray = Color(0.75f, 0.75f, 0.75f, 1.f);
constexpr Color DarkGray = Color(0.25f, 0.25f, 0.25f, 1.f);
constexpr Color Orange = Color(1.f, 0.65f, 0.f, 1.f);
constexpr Color Pink = Color(1.f, 0.75f, 0.8f, 1.f);
constexpr Color Brown = Color(0.6f, 0.4f, 0.2f, 1.f);
constexpr Color Purple = Color(0.5f, 0.f, 0.5f, 1.f);
constexpr Color Teal = Color(0.f, 0.5f, 0.5f, 1.f);
constexpr Color Transparent = Color(0.f, 0.f, 0.f, 0.f);
} // namespace Colors
} // namespace PD

View File

@ -150,11 +150,7 @@ class Tween {
return *this;
}
/**
* Operator that returns the current value calculated
* by time and effect
*/
operator T() {
T Get() const {
float t = 0.f;
switch (effect) {
case EaseInQuad:
@ -203,6 +199,12 @@ class Tween {
}
}
/**
* Operator that returns the current value calculated
* by time and effect
*/
operator T() const { return Get(); }
private:
/** Animation Effect */
Effect effect;

View File

@ -40,6 +40,7 @@ class Backend {
virtual int GetInvalidRef() const = 0;
virtual bool Bind(int sock_id, u16 port) = 0;
virtual bool Listen(int sock_id, int backlog = 5) = 0;
virtual bool WaitForRead(int sock_id, int timeout_ms) = 0;
virtual bool Accept(int sock_id, Socket::Ref client) = 0;
virtual bool Connect(int sock_id, const std::string& ip, u16 port) = 0;
virtual int Send(int sock_id, const std::string& data) = 0;

View File

@ -46,6 +46,7 @@ class PD_NET_API Socket {
bool Create();
bool Bind(u16 port);
bool Listen(int backlog = 5);
bool WaitForRead(int timeout_ms);
bool Accept(Socket::Ref client);
bool Connect(const std::string& ip, u16 port);
int Send(const std::string& data);

View File

@ -239,7 +239,7 @@ PD_LITHIUM_API void Font::CmdTextEx(Vec<Command::Ref> &cmds, const fvec2 &pos,
cmd->Tex = Tex;
for (auto &jt : wline) {
auto cp = GetCodepoint(jt);
if (cp.pInvalid && jt != '\n' && jt != '\t') {
if ((cp.pInvalid && jt != '\n' && jt != '\t') && jt != '\r') {
continue;
}
if (Tex != cp.Tex) {

View File

@ -38,6 +38,10 @@ PD_NET_API bool Socket::Listen(int backlog) {
return backend->Listen(pSocket, backlog);
}
PD_NET_API bool Socket::WaitForRead(int timeout_ms) {
return backend->WaitForRead(pSocket, timeout_ms);
}
PD_NET_API bool Socket::Accept(Socket::Ref client) {
return backend->Accept(pSocket, client);
}