diff --git a/dependencies/subprojects/animationwindow/include/AnimationWindow.h b/dependencies/subprojects/animationwindow/include/AnimationWindow.h index e0c56482f5d9b8dcba9decbcb3c81bee0416dfe6..89d692cf880a166c580d3507e4be23b81ddfebe1 100644 --- a/dependencies/subprojects/animationwindow/include/AnimationWindow.h +++ b/dependencies/subprojects/animationwindow/include/AnimationWindow.h @@ -41,7 +41,7 @@ class AnimationWindow { private: void show_frame(); void update_gui(); - TDT4102::Point getWindowDimensions(); + TDT4102::Point getWindowDimensions() const; void startNuklearDraw(TDT4102::Point location, std::string uniqueWindowName, unsigned int width = 0, unsigned int height = 0); void endNuklearDraw(); void destroy(); @@ -54,7 +54,7 @@ class AnimationWindow { std::vector<std::reference_wrapper<TDT4102::Widget>> widgets; - TDT4102::Color backgroundColour = TDT4102::Color::white; + TDT4102::Color backgroundColor = TDT4102::Color::white; // SDL related context SDL_Window* windowHandle = nullptr; @@ -69,6 +69,7 @@ class AnimationWindow { std::unordered_map<KeyboardKey, bool> currentKeyStates; bool currentLeftMouseButtonState = false; bool currentRightMouseButtonState = false; + float deltaMouseWheel = 0; public: explicit AnimationWindow(int x = 50, int y = 50, int width = 1024, int height = 768, const std::string& title = "Animation Window"); @@ -105,8 +106,8 @@ class AnimationWindow { void draw_arc(TDT4102::Point center, int width, int height, int start_degree, int end_degree, TDT4102::Color color = TDT4102::Color::black); // And these functions are for handling input - bool is_key_down(KeyboardKey key); - TDT4102::Point get_mouse_coordinates(); + bool is_key_down(KeyboardKey key) const; + TDT4102::Point get_mouse_coordinates() const; bool is_left_mouse_button_down() const; bool is_right_mouse_button_down() const; @@ -119,9 +120,11 @@ class AnimationWindow { void show_error_dialog(const std::string& message) const; // Getters for the window dimensions - int width(); - int height(); + int get_width() const; + int get_height() const; void setBackgroundColor(TDT4102::Color newBackgroundColor); + + float get_delta_mouse_wheel() const; }; } // namespace TDT4102 diff --git a/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp b/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp index 2013c1963668f610bb0c12b7def230ff28328747..cea352b737acaa7b5b071492aeeadf09405eaf0d 100644 --- a/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp +++ b/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp @@ -41,7 +41,7 @@ TDT4102::AnimationWindow::AnimationWindow(int x, int y, int width, int height, c } // Default window background colour - SDL_SetRenderDrawColor(rendererHandle, backgroundColour.redChannel, backgroundColour.greenChannel, backgroundColour.blueChannel, backgroundColour.alphaChannel); + SDL_SetRenderDrawColor(rendererHandle, backgroundColor.redChannel, backgroundColor.greenChannel, backgroundColor.blueChannel, backgroundColor.alphaChannel); SDL_RenderClear(rendererHandle); SDL_RendererInfo rendererInfo; @@ -77,6 +77,7 @@ void TDT4102::AnimationWindow::destroy() { void TDT4102::AnimationWindow::show_frame() { SDL_RenderPresent(rendererHandle); + deltaMouseWheel = 0; SDL_Event event; nk_input_begin(context); @@ -102,6 +103,8 @@ void TDT4102::AnimationWindow::show_frame() { } else if (event.button.button == SDL_BUTTON_RIGHT) { currentRightMouseButtonState = false; } + } else if (event.type == SDL_MOUSEWHEEL) { + deltaMouseWheel = event.wheel.preciseY; // The amount scrolled vertically, positive away from the user and negative toward the user } nk_sdl_handle_event(&event); @@ -128,7 +131,7 @@ void TDT4102::AnimationWindow::next_frame() { // Colour must be reset as a previously drawn element may have changed the current colour if (!keepPreviousFrame) { - SDL_SetRenderDrawColor(rendererHandle, backgroundColour.redChannel, backgroundColour.greenChannel, backgroundColour.blueChannel, backgroundColour.alphaChannel); + SDL_SetRenderDrawColor(rendererHandle, backgroundColor.redChannel, backgroundColor.greenChannel, backgroundColor.blueChannel, backgroundColor.alphaChannel); SDL_RenderClear(rendererHandle); } @@ -302,14 +305,14 @@ void TDT4102::AnimationWindow::draw_arc(TDT4102::Point center, int width, int he SDL_RenderDrawLines(rendererHandle, internal::circleBorderBuffer.data(), internal::SLICES_PER_CIRCLE); } -bool TDT4102::AnimationWindow::is_key_down(KeyboardKey key) { +bool TDT4102::AnimationWindow::is_key_down(KeyboardKey key) const { if (currentKeyStates.count(key) == 0) { return false; } return currentKeyStates.at(key); } -TDT4102::Point TDT4102::AnimationWindow::get_mouse_coordinates() { +TDT4102::Point TDT4102::AnimationWindow::get_mouse_coordinates() const { int mouseX, mouseY; SDL_GetMouseState(&mouseX, &mouseY); return {mouseX, mouseY}; @@ -328,17 +331,17 @@ void TDT4102::AnimationWindow::show_error_dialog(const std::string& message) con SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", message.c_str(), windowHandle); } -TDT4102::Point TDT4102::AnimationWindow::getWindowDimensions() { +TDT4102::Point TDT4102::AnimationWindow::getWindowDimensions() const { TDT4102::Point dimensions; SDL_GetRendererOutputSize(rendererHandle, &dimensions.x, &dimensions.y); return dimensions; } -int TDT4102::AnimationWindow::width() { +int TDT4102::AnimationWindow::get_width() const { return getWindowDimensions().x; } -int TDT4102::AnimationWindow::height() { +int TDT4102::AnimationWindow::get_height() const { return getWindowDimensions().y; } @@ -350,6 +353,10 @@ bool TDT4102::AnimationWindow::is_right_mouse_button_down() const { return currentRightMouseButtonState; } +float TDT4102::AnimationWindow::get_delta_mouse_wheel() const { + return deltaMouseWheel; +} + void TDT4102::AnimationWindow::startNuklearDraw(TDT4102::Point location, std::string uniqueWindowName, unsigned int width, unsigned int height) { // Make window transparent; we just want to see individual GUI elements struct nk_style* s = &context->style; @@ -390,5 +397,5 @@ void TDT4102::AnimationWindow::endNuklearDraw() { } void TDT4102::AnimationWindow::setBackgroundColor(TDT4102::Color newBackgroundColor) { - backgroundColour = newBackgroundColor; + backgroundColor = newBackgroundColor; } diff --git a/dependencies/testproject_featuredemo.cpp b/dependencies/testproject_featuredemo.cpp index 7017cd5ff8155d67418223657f75fa64098741c5..8cba7a85152b697f6c7db6d37d836cb9be867917 100644 --- a/dependencies/testproject_featuredemo.cpp +++ b/dependencies/testproject_featuredemo.cpp @@ -76,8 +76,8 @@ int main(int argc, char* argv[]) { std::vector<Ball> circles; circles.resize(5000); for (unsigned int i = 0; i < circles.size(); i++) { - circles.at(i).x = randint(0, window.width()); - circles.at(i).y = randint(0, window.height()); + circles.at(i).x = randint(0, window.get_width()); + circles.at(i).y = randint(0, window.get_height()); circles.at(i).radius = randint(5, 10); circles.at(i).xSpeed = float(randint(-400, 400)) / 100.0f; circles.at(i).ySpeed = float(randint(-400, 400)) / 100.0f; @@ -106,8 +106,8 @@ int main(int argc, char* argv[]) { window.draw_image(mousePosition, image); bool allAtCenter = true; for (Ball& ball : circles) { - float gravityX = (float(window.width()) / 2.0f) - ball.x; - float gravityY = (float(window.height()) / 2.0f) - ball.y; + float gravityX = (float(window.get_width()) / 2.0f) - ball.x; + float gravityY = (float(window.get_height()) / 2.0f) - ball.y; float absoluteSpeed = std::max(std::sqrt(gravityX * gravityX + gravityY * gravityY), 3.0f); const float gravity = 0.07f; ball.xSpeed += (gravityX / absoluteSpeed) * gravity; @@ -126,7 +126,7 @@ int main(int argc, char* argv[]) { } else if(ball.y + ball.radius < 0) { ball.y = window.h() + ball.radius; }*/ - if ((std::abs(ball.x - float(window.width()) / 2.0f) > 1.0f) && (std::abs(ball.y - float(window.height()) / 2.0f) > 1.0f)) { + if ((std::abs(ball.x - float(window.get_width()) / 2.0f) > 1.0f) && (std::abs(ball.y - float(window.get_height()) / 2.0f) > 1.0f)) { allAtCenter = false; } window.draw_circle({int(ball.x), int(ball.y)}, ball.radius, ball.colour, TDT4102::Color::black);