CSCI441 OpenGL Library 5.13.0
CS@Mines CSCI441 Computer Graphics Course Library
Loading...
Searching...
No Matches
OpenGL3DEngine.hpp
Go to the documentation of this file.
1
12#ifndef CSCI441_OPENGL3D_ENGINE_HPP
13#define CSCI441_OPENGL3D_ENGINE_HPP
14
15#include "ArcballCam.hpp"
16#include "OpenGLEngine.hpp"
17
18namespace CSCI441 {
19
31 public:
40
49 OpenGL3DEngine& operator=(OpenGL3DEngine&&) noexcept;
50
55 [[maybe_unused]] [[nodiscard]] virtual GLboolean isLeftMouseDown() const noexcept final { return mIsLeftMouseDown; }
60 [[maybe_unused]] virtual void setLeftMouseDown(const GLboolean isDown) final { mIsLeftMouseDown = isDown; }
61
66 [[maybe_unused]] [[nodiscard]] virtual GLboolean isShiftDown() const noexcept final { return mIsShiftDown; }
71 [[maybe_unused]] virtual void setShiftDown(const GLboolean isDown) final { mIsShiftDown = isDown; }
72
77 [[maybe_unused]] [[nodiscard]] virtual glm::vec2 getMousePosition() const noexcept final { return mMousePosition; }
82 [[maybe_unused]] virtual void setMousePosition(const glm::vec2 mousePos) final { mMousePosition = mousePos; }
83
88 [[maybe_unused]] virtual void setArcballCameraAngles( const glm::vec3 angles ) final {
89 mpArcballCamera->setTheta(angles[0] );
90 mpArcballCamera->setPhi(angles[1] );
91 mpArcballCamera->setRadius(angles[2] );
92 }
93
98 [[maybe_unused]] [[nodiscard]] virtual glm::vec3 getArcballCameraEyePoint() const noexcept final { return mpArcballCamera->getPosition(); }
99
104 [[maybe_unused]] [[nodiscard]] virtual glm::vec3 getArcballCameraLookAtPoint() const noexcept final { return mpArcballCamera->getLookAtPoint(); }
109 [[maybe_unused]] virtual void setArcballCameraLookAtPoint(const glm::vec3 lookAtPoint ) final { mpArcballCamera->setLookAtPoint(lookAtPoint); }
110
115 [[maybe_unused]] [[nodiscard]] virtual glm::vec3 getArcballCameraUpVector() const noexcept final { return mpArcballCamera->getUpVector(); }
120 [[maybe_unused]] virtual void setArcballCameraUpVector( const glm::vec3 upVector ) final { mpArcballCamera->setUpVector(upVector); }
121
126 [[maybe_unused]] [[nodiscard]] virtual glm::mat4 getArcballProjectionMatrix() const final { return mpArcballCamera->getProjectionMatrix(); }
127
132 [[maybe_unused]] [[nodiscard]] virtual glm::mat4 getArcballViewMatrix() const final { return mpArcballCamera->getViewMatrix(); }
133
138 [[maybe_unused]] virtual void addToArcballCameraAngles( const glm::vec3 angleAdditions ) final {
139 mpArcballCamera->setTheta(mpArcballCamera->getTheta() + angleAdditions[0] );
140 mpArcballCamera->setPhi(mpArcballCamera->getPhi() + angleAdditions[1] );
141 mpArcballCamera->moveBackward(angleAdditions[2] );
142 }
143
147 [[maybe_unused]] virtual void updateArcballCameraDirection() final {
149 }
150
156 [[maybe_unused]] virtual void handleCameraCursorPosEvent(const double x, const double y) final {
157 const glm::vec2 currMousePos(x, getWindowHeight() - y);
158
159 if( mIsLeftMouseDown ) {
160 if( !mIsShiftDown ) {
161 // rotate the camera by the distance the mouse moved
162 mpArcballCamera->rotate((currMousePos.x - mMousePosition.x) * 0.005f,
163 (mMousePosition.y - currMousePos.y) * 0.005f);
164 } else {
165 // otherwise, update our camera angles theta & phi
166 const GLfloat totChgSq = (currMousePos.x - mMousePosition.x) + (currMousePos.y - mMousePosition.y);
167 mpArcballCamera->moveForward( totChgSq * 0.05f );
168 }
169 }
170
171 setMousePosition(currMousePos);
172 }
173
181 [[maybe_unused]] virtual void handleCameraKeyEvent(const int key, const int scancode, const int action, const int mods) final {
182 if( key == GLFW_KEY_LEFT_SHIFT ) {
183 _isLeftShiftDown = (action == GLFW_PRESS || action == GLFW_REPEAT);
184 } else if( key == GLFW_KEY_RIGHT_SHIFT ) {
185 _isRightShiftDown = (action == GLFW_PRESS || action == GLFW_REPEAT);
186 }
187 mIsShiftDown = _isLeftShiftDown || _isRightShiftDown;
188 }
189
196 [[maybe_unused]] virtual void handleCameraMouseButtonEvent(const int button, const int action, const int mods) final {
197 if( button == GLFW_MOUSE_BUTTON_LEFT ) {
198 mIsLeftMouseDown = (action == GLFW_PRESS);
199 }
200 }
201
207 [[maybe_unused]] virtual void handleCameraScrollEvent(const double xOffset, const double yOffset) {
208 mpArcballCamera->moveForward(static_cast<GLfloat>(yOffset) * 0.2f );
209 }
210
216 [[maybe_unused]] void handleCameraAspectRatioEvent(const int width, const int height) {
217 mpArcballCamera->setAspectRatio( static_cast<GLfloat>(width) / static_cast<GLfloat>(height) );
218 }
219
220 protected:
233 OpenGL3DEngine(int OPENGL_MAJOR_VERSION, int OPENGL_MINOR_VERSION, int WINDOW_WIDTH, int WINDOW_HEIGHT, const char* WINDOW_TITLE, bool WINDOW_RESIZABLE = GLFW_FALSE);
237 ~OpenGL3DEngine() override;
238
243
247 GLboolean mIsShiftDown;
255 glm::vec2 mMousePosition;
256
257 private:
261 GLboolean _isLeftShiftDown;
265 GLboolean _isRightShiftDown;
266
267 void _cleanupChildSelf();
268 void _moveFromSource(OpenGL3DEngine& src);
269 };
270}
271
272//*****************************************************************************************
273
274inline CSCI441::OpenGL3DEngine::OpenGL3DEngine(const int OPENGL_MAJOR_VERSION, const int OPENGL_MINOR_VERSION, const int WINDOW_WIDTH, const int WINDOW_HEIGHT, const char* WINDOW_TITLE, const bool WINDOW_RESIZABLE)
275 : OpenGLEngine(OPENGL_MAJOR_VERSION, OPENGL_MINOR_VERSION, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, WINDOW_RESIZABLE),
276 mpArcballCamera( new CSCI441::ArcballCam(2.0f, 30.0f, static_cast<GLfloat>(WINDOW_WIDTH) / static_cast<GLfloat>(WINDOW_HEIGHT)) ),
277 mIsShiftDown( GL_FALSE ),
278 mIsLeftMouseDown( GL_FALSE ),
279 mMousePosition( glm::vec2(0.0f, 0.0f) ),
280 _isLeftShiftDown(GL_FALSE),
281 _isRightShiftDown(GL_FALSE)
282{
283
284}
285
287 _cleanupChildSelf();
288}
289
292) noexcept : CSCI441::OpenGLEngine( std::move(src) ),
293 mpArcballCamera(nullptr),
294 mIsShiftDown(GL_FALSE),
295 mIsLeftMouseDown(GL_FALSE),
296 mMousePosition( glm::vec2(0.0f, 0.0f) ),
297 _isLeftShiftDown(GL_FALSE),
298 _isRightShiftDown(GL_FALSE)
299{
300 _moveFromSource( src );
301}
302
304 if (this != &src) {
305 _cleanupChildSelf();
306 _moveFromSource(src);
307 }
308
309 OpenGLEngine::operator=( std::move(src) );
310
311 return *this;
312}
313
314inline void CSCI441::OpenGL3DEngine::_cleanupChildSelf() {
315 delete mpArcballCamera;
316 mpArcballCamera = nullptr;
317}
318
319inline void CSCI441::OpenGL3DEngine::_moveFromSource(OpenGL3DEngine& src) {
320 mpArcballCamera = src.mpArcballCamera;
321 src.mpArcballCamera = nullptr;
322
323 mIsShiftDown = src.mIsShiftDown;
324 src.mIsShiftDown = GL_FALSE;
325
326 mIsLeftMouseDown = src.mIsLeftMouseDown;
327 src.mIsLeftMouseDown = GL_FALSE;
328
329 mMousePosition = src.mMousePosition;
330 src.mMousePosition = glm::vec2(0.0f, 0.0f);
331
332 _isLeftShiftDown = src._isLeftShiftDown;
333 src._isLeftShiftDown = GL_FALSE;
334
335 _isRightShiftDown = src._isRightShiftDown;
336 src._isRightShiftDown = GL_FALSE;
337}
338
339#endif // CSCI441_OPENGL3D_ENGINE_HPP
Concrete Arcball Camera implementation with Perspective Projection.
Abstract class engine class to setup window, register callbacks, vaos, textures, and shaders,...
A camera that implements an ArcBall camera model.
Definition: ArcballCam.hpp:23
void recomputeOrientation() override
converts spherical theta & phi to cartesian x,y,z direction vector
Definition: ArcballCam.hpp:120
void moveForward(GLfloat movementFactor) override
updates the camera's position by decreasing the camera's radius
Definition: ArcballCam.hpp:129
void moveBackward(GLfloat movementFactor) override
updates the camera's position by increasing the camera's radius
Definition: ArcballCam.hpp:135
virtual void setRadius(const GLfloat r) final
sets the camera's radius in world space
Definition: Camera.hpp:152
virtual GLfloat getPhi() const final
returns the current phi value in radians
Definition: Camera.hpp:116
virtual void setTheta(const GLfloat t) final
sets the camera's theta angle in radians
Definition: Camera.hpp:142
virtual glm::vec3 getLookAtPoint() const final
returns the current lookAt point in world space
Definition: Camera.hpp:101
virtual glm::mat4 getViewMatrix() const final
returns the current view matrix for the associated camera
Definition: Camera.hpp:91
virtual GLfloat getTheta() const final
returns the current theta value in radians
Definition: Camera.hpp:111
virtual glm::vec3 getPosition() const final
returns the current camera position in world space
Definition: Camera.hpp:96
virtual glm::vec3 getUpVector() const final
returns the current up vector in world space
Definition: Camera.hpp:106
virtual void setLookAtPoint(const glm::vec3 lookAt) final
sets the camera's lookAt point in world space
Definition: Camera.hpp:132
virtual glm::mat4 getProjectionMatrix() const final
returns the current projection matrix for the associated camera
Definition: Camera.hpp:86
virtual void setPhi(const GLfloat p) final
sets the camera's phi angle in radians
Definition: Camera.hpp:147
virtual void setUpVector(const glm::vec3 up) final
sets the camera's up vector in world space
Definition: Camera.hpp:137
virtual void rotate(GLfloat dTheta, GLfloat dPhi)
rotates the camera's POV by adding to theta & phi then ensuring phi stays within the (0,...
Definition: Camera.hpp:243
Abstract Class to run an OpenGL application with a 3D environment. Creates and contains a default ...
Definition: OpenGL3DEngine.hpp:30
void handleCameraAspectRatioEvent(const int width, const int height)
resizes camera aspect ratio
Definition: OpenGL3DEngine.hpp:216
glm::vec2 mMousePosition
current mouse position in screen space
Definition: OpenGL3DEngine.hpp:255
GLboolean mIsShiftDown
if either shift key (left or right) is currently pressed
Definition: OpenGL3DEngine.hpp:247
virtual void setArcballCameraLookAtPoint(const glm::vec3 lookAtPoint) final
set the world space position the arcball camera is looking at and thus centered around
Definition: OpenGL3DEngine.hpp:109
virtual void setMousePosition(const glm::vec2 mousePos) final
set the location of the mouse within the window
Definition: OpenGL3DEngine.hpp:82
virtual void addToArcballCameraAngles(const glm::vec3 angleAdditions) final
moves the arcball spherical object space coordinate by the associated amounts
Definition: OpenGL3DEngine.hpp:138
virtual void setArcballCameraAngles(const glm::vec3 angles) final
sets the object space position of the arcball camera in spherical world coordinates
Definition: OpenGL3DEngine.hpp:88
virtual glm::mat4 getArcballProjectionMatrix() const final
returns the current projection matrix for the arcball camera
Definition: OpenGL3DEngine.hpp:126
virtual glm::vec3 getArcballCameraEyePoint() const noexcept final
the world space position the arcball camera is located at
Definition: OpenGL3DEngine.hpp:98
GLboolean mIsLeftMouseDown
if the mouse left button is currently pressed
Definition: OpenGL3DEngine.hpp:251
virtual GLboolean isShiftDown() const noexcept final
the status of either shift key being down
Definition: OpenGL3DEngine.hpp:66
virtual void handleCameraCursorPosEvent(const double x, const double y) final
moves camera for active cursor movement
Definition: OpenGL3DEngine.hpp:156
CSCI441::ArcballCam * mpArcballCamera
pointer to the ArcballCam object
Definition: OpenGL3DEngine.hpp:242
OpenGL3DEngine & operator=(const OpenGL3DEngine &)=delete
do not allow engines to be copied
virtual void setArcballCameraUpVector(const glm::vec3 upVector) final
sets the world space vector the arcball camera is oriented upwards along
Definition: OpenGL3DEngine.hpp:120
virtual GLboolean isLeftMouseDown() const noexcept final
the status of the left mouse button being down
Definition: OpenGL3DEngine.hpp:55
virtual void handleCameraMouseButtonEvent(const int button, const int action, const int mods) final
tracks left mouse button state
Definition: OpenGL3DEngine.hpp:196
virtual void setLeftMouseDown(const GLboolean isDown) final
set the status of the left mouse button being down
Definition: OpenGL3DEngine.hpp:60
~OpenGL3DEngine() override
cleans up OpenGL 3D Engine by deleting arcball camera object
Definition: OpenGL3DEngine.hpp:286
OpenGL3DEngine(const OpenGL3DEngine &)=delete
do not allow engines to be copied
virtual glm::vec2 getMousePosition() const noexcept final
the location of the mouse within the window
Definition: OpenGL3DEngine.hpp:77
virtual void handleCameraScrollEvent(const double xOffset, const double yOffset)
zooms camera inward/outward based on scroll direction
Definition: OpenGL3DEngine.hpp:207
virtual void setShiftDown(const GLboolean isDown) final
set the status of the shift keys being down
Definition: OpenGL3DEngine.hpp:71
virtual void updateArcballCameraDirection() final
recomputes the arcball camera's world space position
Definition: OpenGL3DEngine.hpp:147
virtual glm::mat4 getArcballViewMatrix() const final
returns the current view matrix for the arcball camera
Definition: OpenGL3DEngine.hpp:132
virtual glm::vec3 getArcballCameraLookAtPoint() const noexcept final
the world space position the arcball camera is looking at and thus centered around
Definition: OpenGL3DEngine.hpp:104
virtual void handleCameraKeyEvent(const int key, const int scancode, const int action, const int mods) final
tracks if either shift key is currently being pressed
Definition: OpenGL3DEngine.hpp:181
virtual glm::vec3 getArcballCameraUpVector() const noexcept final
the world space vector the arcball camera is oriented upwards along
Definition: OpenGL3DEngine.hpp:115
Abstract Class to run an OpenGL application. The following methods must be overridden:
Definition: OpenGLEngine.hpp:39
OpenGLEngine & operator=(const OpenGLEngine &)=delete
do not allow engines to be copied
virtual int getWindowHeight() const noexcept final
Return the height of the window.
Definition: OpenGLEngine.hpp:121
virtual void setAspectRatio(GLfloat aspectRatio) final
updates the camera's aspect ratio
Definition: PerspectiveCamera.hpp:118
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17