From 627ef137279c2b19deec3ecdb599d6226fe3967e Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Wed, 26 Nov 2025 02:56:38 +0100 Subject: [PATCH] fixes --- examples/HelloUI/main.cpp | 10 ++--- .../Crafter.Graphics-Window_wayland.cpp | 45 ++++++++++++------- interfaces/Crafter.Graphics-Animation.cppm | 19 ++++---- project.json | 2 +- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/examples/HelloUI/main.cpp b/examples/HelloUI/main.cpp index a6845bb..5f72961 100644 --- a/examples/HelloUI/main.cpp +++ b/examples/HelloUI/main.cpp @@ -6,7 +6,10 @@ using namespace Crafter; int main() { WindowWayland window(1280, 720, "Hello Input!"); - Transform element( + RenderingElement element( + true, + 2, + 1, FractionalToMapped(0.5), //anchorX: relative position where this elements x anchor (top-left) is placed to its parent x anchor FractionalToMapped(0.5), //anchorY: relative position where this elements y anchor (top-left) is placed to its parent y anchor FractionalToMapped(0.5), //relativeSizeX: the relative x size this element should be scaled to compared to its parent @@ -17,14 +20,11 @@ int main() { false //ignoreScaling: wether this element ignores the scaling of the window, if true its size will be scaled according to the window scale ); - RenderingElement rendering(2, 1); MouseElement mouse(window); - - element.children.push_back(&rendering); element.children.push_back(&mouse); window.elements.push_back(&element); - rendering.buffer = {{255, 0, 0 ,255}, {0, 255, 0 ,255}}; + element.buffer = {{255, 0, 0 ,255}, {0, 255, 0 ,255}}; element.UpdatePosition(window); EventListener clickListener(&mouse.onMouseLeftClick, [&mouse, &window](MousePoint point){ diff --git a/implementations/Crafter.Graphics-Window_wayland.cpp b/implementations/Crafter.Graphics-Window_wayland.cpp index a2ce396..ee43711 100644 --- a/implementations/Crafter.Graphics-Window_wayland.cpp +++ b/implementations/Crafter.Graphics-Window_wayland.cpp @@ -189,7 +189,7 @@ void WindowWayland::RenderElement(Transform* transform) { // Bounds check for source buffer if (src_x >= 0 && src_x < static_cast(src_width) && src_y >= 0 && src_y < static_cast(src_height)) { - + // Direct copy for opaque elements (skip blending) framebuffer[y * width + x] = src_buffer[src_y * src_width + src_x]; } @@ -226,6 +226,7 @@ void WindowWayland::RenderElement(Transform* transform) { } void WindowWayland::Render() { + elements.erase(std::remove(elements.begin(), elements.end(), static_cast(nullptr)), elements.end()); std::sort(elements.begin(), elements.end(), [](Transform* a, Transform* b){ return a->z < b->z; }); // Clear screen efficiently using memset @@ -341,18 +342,22 @@ void WindowWayland::pointer_handle_button(void* data, wl_pointer* pointer, std:: if (button == BTN_LEFT) { if(state == WL_POINTER_BUTTON_STATE_PRESSED) { window->mouseLeftHeld = true; - window->onMouseLeftClick.Invoke(window->currentMousePos); + window->onMouseLeftClick.Invoke(window->currentMousePos); for(MouseElement* element : window->mouseElements) { - if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseLeftClick.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(element) { + if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseLeftClick.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + } } } } else { window->mouseLeftHeld = false; window->onMouseLeftRelease.Invoke(window->currentMousePos); for(MouseElement* element : window->mouseElements) { - if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseLeftRelease.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(element) { + if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseLeftRelease.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + } } } } @@ -361,20 +366,25 @@ void WindowWayland::pointer_handle_button(void* data, wl_pointer* pointer, std:: window->mouseRightHeld = true; window->onMouseRightClick.Invoke(window->currentMousePos); for(MouseElement* element : window->mouseElements) { - if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseRightClick.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(element) { + if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseRightClick.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + } } } } else { window->mouseRightHeld = true; window->onMouseRightRelease.Invoke(window->currentMousePos); for(MouseElement* element : window->mouseElements) { - if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseRightRelease.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(element) { + if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseRightRelease.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + } } } } } + window->mouseElements.erase(std::remove(window->mouseElements.begin(), window->mouseElements.end(), static_cast(nullptr)), window->mouseElements.end()); } void WindowWayland::PointerListenerHandleMotion(void* data, wl_pointer* wl_pointer, uint time, wl_fixed_t surface_x, wl_fixed_t surface_y) { @@ -385,15 +395,18 @@ void WindowWayland::PointerListenerHandleMotion(void* data, wl_pointer* wl_point window->mouseDelta = {window->currentMousePos.x-window->lastMousePos.x, window->currentMousePos.y-window->lastMousePos.y}; window->onMouseMove.Invoke({window->lastMousePos, window->currentMousePos, window->mouseDelta}); for(MouseElement* element : window->mouseElements) { - if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseMove.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); - if(!(window->lastMousePos.x >= element->scaled.x && window->lastMousePos.x <= element->scaled.x+element->scaled.width && window->lastMousePos.y > element->scaled.y && window->lastMousePos.y < element->scaled.y+element->scaled.height)) { - element->onMouseEnter.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(element) { + if(window->currentMousePos.x >= element->scaled.x && window->currentMousePos.x <= element->scaled.x+element->scaled.width && window->currentMousePos.y > element->scaled.y && window->currentMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseMove.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + if(!(window->lastMousePos.x >= element->scaled.x && window->lastMousePos.x <= element->scaled.x+element->scaled.width && window->lastMousePos.y > element->scaled.y && window->lastMousePos.y < element->scaled.y+element->scaled.height)) { + element->onMouseEnter.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); + } + } else if(window->lastMousePos.x >= element->scaled.x && window->lastMousePos.x <= element->scaled.x+element->scaled.width && window->lastMousePos.y > element->scaled.y && window->lastMousePos.y < element->scaled.y+element->scaled.height) { + element->onMouseLeave.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); } - } else if(window->lastMousePos.x >= element->scaled.x && window->lastMousePos.x <= element->scaled.x+element->scaled.width && window->lastMousePos.y > element->scaled.y && window->lastMousePos.y < element->scaled.y+element->scaled.height) { - element->onMouseLeave.Invoke({FractionalToMappedBoundless(static_cast(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); } } + window->mouseElements.erase(std::remove(window->mouseElements.begin(), window->mouseElements.end(), static_cast(nullptr)), window->mouseElements.end()); } void WindowWayland::PointerListenerHandleEnter(void* data, wl_pointer* wl_pointer, uint serial, wl_surface* surface, wl_fixed_t surface_x, wl_fixed_t surface_y) { diff --git a/interfaces/Crafter.Graphics-Animation.cppm b/interfaces/Crafter.Graphics-Animation.cppm index 76f2f9c..c432b80 100644 --- a/interfaces/Crafter.Graphics-Animation.cppm +++ b/interfaces/Crafter.Graphics-Animation.cppm @@ -62,27 +62,28 @@ namespace Crafter { std::vector> keyframes; std::uint_fast32_t currentFrame; std::chrono::time_point startedAt; + std::chrono::duration accumulated; Animation(std::vector>&& keyframes) : keyframes(std::move(keyframes)) {} void Start(std::chrono::time_point time) { currentFrame = 0; + accumulated = std::chrono::duration(0); startedAt = time; } T Play(std::chrono::time_point time) { std::chrono::duration elapsed = time - startedAt; - std::chrono::duration accumulated(0); - for (std::uint_fast32_t i = currentFrame; i < keyframes.size(); ++i) { - accumulated += keyframes[i].duration; - if (elapsed < accumulated) { - std::chrono::duration frameStartTime = accumulated - keyframes[i].duration; - auto t = (elapsed - frameStartTime) / keyframes[i].duration.count(); + for (; currentFrame < keyframes.size(); ++currentFrame) { + if (elapsed < accumulated + keyframes[currentFrame].duration) { + std::chrono::duration frameStartTime = accumulated; + auto t = (elapsed - frameStartTime) / keyframes[currentFrame].duration.count(); - currentFrame = i; return LerpTuple( - keyframes[i].startValues, - keyframes[i].endValues, + keyframes[currentFrame].startValues, + keyframes[currentFrame].endValues, t.count() ); + } else { + accumulated += keyframes[currentFrame].duration; } } diff --git a/project.json b/project.json index 4d6880d..22464e8 100644 --- a/project.json +++ b/project.json @@ -43,7 +43,7 @@ "debug": true, "dependencies": [ { - "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Event.git", + "path":"/home/jorijn/repos/Crafter/Crafter.Event/project.json", "configuration":"lib-debug" } ]