From c46c0bccd92b444533a69cd2b2a0242078e54cbe Mon Sep 17 00:00:00 2001 From: "arthur.jamet" Date: Sat, 22 May 2021 01:47:45 +0200 Subject: [PATCH] better management of drawing/display states for window --- lib/Ray/sources/Camera/Camera2D.cpp | 2 +- lib/Ray/sources/Camera/Camera2D.hpp | 2 +- lib/Ray/sources/Camera/Camera3D.cpp | 2 +- lib/Ray/sources/Camera/Camera3D.hpp | 2 +- lib/Ray/sources/Window.cpp | 53 ++++++++++++++++++----------- lib/Ray/sources/Window.hpp | 44 +++++++++++++++++------- sources/main.cpp | 8 ++--- 7 files changed, 73 insertions(+), 40 deletions(-) diff --git a/lib/Ray/sources/Camera/Camera2D.cpp b/lib/Ray/sources/Camera/Camera2D.cpp index 34d08300..27379153 100644 --- a/lib/Ray/sources/Camera/Camera2D.cpp +++ b/lib/Ray/sources/Camera/Camera2D.cpp @@ -58,7 +58,7 @@ Matrix RAY::Camera::Camera2D::getMatrix(void) const return GetCameraMatrix2D(this->_camera); } -const ::Camera2D &RAY::Camera::Camera2D::getCamera(void) const +RAY::Camera::Camera2D::operator ::Camera2D() const { return this->_camera; } diff --git a/lib/Ray/sources/Camera/Camera2D.hpp b/lib/Ray/sources/Camera/Camera2D.hpp index 0b3cf3e5..ed82e785 100644 --- a/lib/Ray/sources/Camera/Camera2D.hpp +++ b/lib/Ray/sources/Camera/Camera2D.hpp @@ -53,7 +53,7 @@ namespace RAY::Camera { Matrix getMatrix(void) const override; //! @brief get camera struct - const ::Camera2D &getCamera(void) const; + operator ::Camera2D() const; private: ::Camera2D _camera; diff --git a/lib/Ray/sources/Camera/Camera3D.cpp b/lib/Ray/sources/Camera/Camera3D.cpp index d422715f..00b5aed3 100644 --- a/lib/Ray/sources/Camera/Camera3D.cpp +++ b/lib/Ray/sources/Camera/Camera3D.cpp @@ -72,7 +72,7 @@ void RAY::Camera::Camera3D::setMode(Mode mode) this->_mode = mode; } -const ::Camera3D &RAY::Camera::Camera3D::getCamera(void) const +RAY::Camera::Camera3D::operator ::Camera3D() const { return this->_camera; } diff --git a/lib/Ray/sources/Camera/Camera3D.hpp b/lib/Ray/sources/Camera/Camera3D.hpp index 8fcba6c8..4edc6bfb 100644 --- a/lib/Ray/sources/Camera/Camera3D.hpp +++ b/lib/Ray/sources/Camera/Camera3D.hpp @@ -63,7 +63,7 @@ namespace RAY::Camera { void setMode(Mode mode); //! @brief get camera struct - const ::Camera3D &getCamera(void) const; + operator ::Camera3D() const; private: ::Camera3D _camera; diff --git a/lib/Ray/sources/Window.cpp b/lib/Ray/sources/Window.cpp index 6040f87d..de8f08da 100644 --- a/lib/Ray/sources/Window.cpp +++ b/lib/Ray/sources/Window.cpp @@ -21,7 +21,8 @@ RAY::Window::Window(int width, int height, std::string title, unsigned flags, bo _dimensions(width, height), _title(std::move(title)), _isOpen(openNow), - _flags(flags) + _flags(flags), + _drawingState(IDLE), _displayState(NONE) { if (openNow) this->open(); @@ -93,34 +94,48 @@ void RAY::Window::clear(const RAY::Color &color) ClearBackground(color); } -void RAY::Window::beginDrawing(void) +void RAY::Window::setDrawingState(enum RAY::Window::drawingState state) { - ::BeginDrawing(); + if (state == this->_drawingState) + return; + switch (state) + { + case DRAWING: + BeginDrawing(); + break; + case IDLE: + EndDrawing(); + break; + } + this->_drawingState = state; } -void RAY::Window::endDrawing(void) +void RAY::Window::useCamera(RAY::Camera::Camera2D &camera) { - ::EndDrawing(); + this->_displayState = RAY::Window::TWO_DIMENSIONNAL; + BeginMode2D(camera); } -void RAY::Window::beginMode2D(Camera::Camera2D &camera) +void RAY::Window::useCamera(RAY::Camera::Camera3D &camera) { - BeginMode2D(camera.getCamera()); + this->_displayState = RAY::Window::THREE_DIMENSIONNAL; + BeginMode3D(camera); } -void RAY::Window::beginMode3D(Camera::Camera3D &camera) +void RAY::Window::unuseCamera(void) { - BeginMode3D(camera.getCamera()); -} - -void RAY::Window::endMode2D(void) -{ - EndMode2D(); -} - -void RAY::Window::endMode3D(void) -{ - EndMode3D(); + switch (this->_displayState) + { + case THREE_DIMENSIONNAL: + EndMode3D(); + break; + case TWO_DIMENSIONNAL: + EndMode2D(); + break; + default: + break; + } + this->_displayState = NONE; } void RAY::Window::setTitle(const std::string &title) diff --git a/lib/Ray/sources/Window.hpp b/lib/Ray/sources/Window.hpp index ccafda43..a612070b 100644 --- a/lib/Ray/sources/Window.hpp +++ b/lib/Ray/sources/Window.hpp @@ -74,25 +74,35 @@ namespace RAY { //! @param color The color to clear the screen (default: black) void clear(const Color &color = BLACK); - //! @brief Setup canvas (framebuffer) to start drawing - //! @brief Must be called before first draw of iteration - void beginDrawing(void); + //! @brief Different states of the draw-ability of the window + enum drawingState { + //! @brief Must be called after last draw of iteration + IDLE, + //! @brief Must be called before first draw of iteration + DRAWING, + }; - //! @brief End canvas drawing and swap buffers (double buffering) - //! @info Must be called after last draw of iteration - void endDrawing(void); + //! @brief Different states of the view of the window + enum displayState { + //! @brief When a custom 2D camera is used + TWO_DIMENSIONNAL, + //! @brief When a custom 3D camera is used + THREE_DIMENSIONNAL, + //! @brief When no camera is used + NONE, + }; + + //! @brief Set drawing state of the window + void setDrawingState(enum drawingState); //! @brief Initialize 2D mode with custom camera (2D) - void beginMode2D(Camera::Camera2D &camera); + void useCamera(Camera::Camera2D &camera); //! @brief Initialize 3D mode with custom camera (2D) - void beginMode3D(Camera::Camera3D &camera); + void useCamera(Camera::Camera3D &camera); - //! @brief Ends 2D mode with custom camera - void endMode2D(void); - - //! @brief Ends 3D mode and returns to default 2D orthographic mode - void endMode3D(void); + //! @brief Ends current view mode and returns to default mode + void unuseCamera(void); //! @brief Set the window title void setTitle(const std::string &title); @@ -111,9 +121,11 @@ namespace RAY { //! @brief Draw a 3d mesh with material and transform void draw(const Mesh &mesh, const Material &material, const Matrix &transform); + private: //! @brief Creates window, and opens it if openNow is set to true Window(int width, int height, std::string title, unsigned flags = 0, bool openNow = true); + //! @brief Dimension of window RAY::Vector2 _dimensions; @@ -125,6 +137,12 @@ namespace RAY { //! @brief flags for the window (ex: FLAG_WINDOW_RESIZABLE) unsigned int _flags; + + //! @brief Current window draw-state + enum drawingState _drawingState; + + //! @brief Current window draw-state + enum displayState _displayState; }; } diff --git a/sources/main.cpp b/sources/main.cpp index 53831cdc..9b3272fa 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -60,11 +60,11 @@ int main() // Draw //---------------------------------------------------------------------------------- - window.beginDrawing(); + window.setDrawingState(RAY::Window::DRAWING); window.clear(RAYWHITE); - window.beginMode3D(camera); + window.useCamera(camera); window.draw(grid); @@ -97,9 +97,9 @@ int main() } } - window.endMode3D(); + window.unuseCamera(); - window.endDrawing(); + window.setDrawingState(RAY::Window::IDLE); //---------------------------------------------------------------------------------- }