This commit is contained in:
Jorijn van der Graaf 2025-11-26 02:56:38 +01:00
commit 627ef13727
4 changed files with 45 additions and 31 deletions

View file

@ -6,7 +6,10 @@ using namespace Crafter;
int main() { int main() {
WindowWayland window(1280, 720, "Hello Input!"); 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), //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), //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 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 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); MouseElement mouse(window);
element.children.push_back(&rendering);
element.children.push_back(&mouse); element.children.push_back(&mouse);
window.elements.push_back(&element); 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); element.UpdatePosition(window);
EventListener<MousePoint> clickListener(&mouse.onMouseLeftClick, [&mouse, &window](MousePoint point){ EventListener<MousePoint> clickListener(&mouse.onMouseLeftClick, [&mouse, &window](MousePoint point){

View file

@ -226,6 +226,7 @@ void WindowWayland::RenderElement(Transform* transform) {
} }
void WindowWayland::Render() { void WindowWayland::Render() {
elements.erase(std::remove(elements.begin(), elements.end(), static_cast<Transform*>(nullptr)), elements.end());
std::sort(elements.begin(), elements.end(), [](Transform* a, Transform* b){ return a->z < b->z; }); std::sort(elements.begin(), elements.end(), [](Transform* a, Transform* b){ return a->z < b->z; });
// Clear screen efficiently using memset // Clear screen efficiently using memset
@ -343,38 +344,47 @@ void WindowWayland::pointer_handle_button(void* data, wl_pointer* pointer, std::
window->mouseLeftHeld = true; window->mouseLeftHeld = true;
window->onMouseLeftClick.Invoke(window->currentMousePos); window->onMouseLeftClick.Invoke(window->currentMousePos);
for(MouseElement* element : window->mouseElements) { for(MouseElement* element : window->mouseElements) {
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) { 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<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseLeftClick.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)});
} }
} }
}
} else { } else {
window->mouseLeftHeld = false; window->mouseLeftHeld = false;
window->onMouseLeftRelease.Invoke(window->currentMousePos); window->onMouseLeftRelease.Invoke(window->currentMousePos);
for(MouseElement* element : window->mouseElements) { for(MouseElement* element : window->mouseElements) {
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) { 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<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseLeftRelease.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)});
} }
} }
} }
}
} else if(button == BTN_RIGHT){ } else if(button == BTN_RIGHT){
if(state == WL_POINTER_BUTTON_STATE_PRESSED) { if(state == WL_POINTER_BUTTON_STATE_PRESSED) {
window->mouseRightHeld = true; window->mouseRightHeld = true;
window->onMouseRightClick.Invoke(window->currentMousePos); window->onMouseRightClick.Invoke(window->currentMousePos);
for(MouseElement* element : window->mouseElements) { for(MouseElement* element : window->mouseElements) {
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) { 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<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseRightClick.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)});
} }
} }
}
} else { } else {
window->mouseRightHeld = true; window->mouseRightHeld = true;
window->onMouseRightRelease.Invoke(window->currentMousePos); window->onMouseRightRelease.Invoke(window->currentMousePos);
for(MouseElement* element : window->mouseElements) { for(MouseElement* element : window->mouseElements) {
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) { 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<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseRightRelease.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)});
} }
} }
} }
} }
}
window->mouseElements.erase(std::remove(window->mouseElements.begin(), window->mouseElements.end(), static_cast<MouseElement*>(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) { void WindowWayland::PointerListenerHandleMotion(void* data, wl_pointer* wl_pointer, uint time, wl_fixed_t surface_x, wl_fixed_t surface_y) {
@ -385,6 +395,7 @@ void WindowWayland::PointerListenerHandleMotion(void* data, wl_pointer* wl_point
window->mouseDelta = {window->currentMousePos.x-window->lastMousePos.x, window->currentMousePos.y-window->lastMousePos.y}; window->mouseDelta = {window->currentMousePos.x-window->lastMousePos.x, window->currentMousePos.y-window->lastMousePos.y};
window->onMouseMove.Invoke({window->lastMousePos, window->currentMousePos, window->mouseDelta}); window->onMouseMove.Invoke({window->lastMousePos, window->currentMousePos, window->mouseDelta});
for(MouseElement* element : window->mouseElements) { for(MouseElement* element : window->mouseElements) {
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) { 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<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseMove.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(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)) { 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)) {
@ -394,6 +405,8 @@ void WindowWayland::PointerListenerHandleMotion(void* data, wl_pointer* wl_point
element->onMouseLeave.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)}); element->onMouseLeave.Invoke({FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.x - element->scaled.x) / element->scaled.width), FractionalToMappedBoundless(static_cast<double>(window->currentMousePos.y - element->scaled.y) / element->scaled.height)});
} }
} }
}
window->mouseElements.erase(std::remove(window->mouseElements.begin(), window->mouseElements.end(), static_cast<MouseElement*>(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) { void WindowWayland::PointerListenerHandleEnter(void* data, wl_pointer* wl_pointer, uint serial, wl_surface* surface, wl_fixed_t surface_x, wl_fixed_t surface_y) {

View file

@ -62,27 +62,28 @@ namespace Crafter {
std::vector<Keyframe<T>> keyframes; std::vector<Keyframe<T>> keyframes;
std::uint_fast32_t currentFrame; std::uint_fast32_t currentFrame;
std::chrono::time_point<std::chrono::high_resolution_clock> startedAt; std::chrono::time_point<std::chrono::high_resolution_clock> startedAt;
std::chrono::duration<double> accumulated;
Animation(std::vector<Keyframe<T>>&& keyframes) : keyframes(std::move(keyframes)) {} Animation(std::vector<Keyframe<T>>&& keyframes) : keyframes(std::move(keyframes)) {}
void Start(std::chrono::time_point<std::chrono::high_resolution_clock> time) { void Start(std::chrono::time_point<std::chrono::high_resolution_clock> time) {
currentFrame = 0; currentFrame = 0;
accumulated = std::chrono::duration<double>(0);
startedAt = time; startedAt = time;
} }
T Play(std::chrono::time_point<std::chrono::high_resolution_clock> time) { T Play(std::chrono::time_point<std::chrono::high_resolution_clock> time) {
std::chrono::duration<double> elapsed = time - startedAt; std::chrono::duration<double> elapsed = time - startedAt;
std::chrono::duration<double> accumulated(0);
for (std::uint_fast32_t i = currentFrame; i < keyframes.size(); ++i) { for (; currentFrame < keyframes.size(); ++currentFrame) {
accumulated += keyframes[i].duration; if (elapsed < accumulated + keyframes[currentFrame].duration) {
if (elapsed < accumulated) { std::chrono::duration<double> frameStartTime = accumulated;
std::chrono::duration<double> frameStartTime = accumulated - keyframes[i].duration; auto t = (elapsed - frameStartTime) / keyframes[currentFrame].duration.count();
auto t = (elapsed - frameStartTime) / keyframes[i].duration.count();
currentFrame = i;
return LerpTuple( return LerpTuple(
keyframes[i].startValues, keyframes[currentFrame].startValues,
keyframes[i].endValues, keyframes[currentFrame].endValues,
t.count() t.count()
); );
} else {
accumulated += keyframes[currentFrame].duration;
} }
} }

View file

@ -43,7 +43,7 @@
"debug": true, "debug": true,
"dependencies": [ "dependencies": [
{ {
"path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Event.git", "path":"/home/jorijn/repos/Crafter/Crafter.Event/project.json",
"configuration":"lib-debug" "configuration":"lib-debug"
} }
] ]