fixes
This commit is contained in:
parent
f842a445d7
commit
627ef13727
4 changed files with 45 additions and 31 deletions
|
|
@ -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){
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue