reactphysics3d/examples/common/opengl-framework/src/GlutViewer.h
2013-09-15 23:32:42 +02:00

166 lines
5.8 KiB
C++

/********************************************************************************
* OpenGL-Framework *
* Copyright (c) 2013 Daniel Chappuis *
*********************************************************************************
* *
* This software is provided 'as-is', without any express or implied warranty. *
* In no event will the authors be held liable for any damages arising from the *
* use of this software. *
* *
* Permission is granted to anyone to use this software for any purpose, *
* including commercial applications, and to alter it and redistribute it *
* freely, subject to the following restrictions: *
* *
* 1. The origin of this software must not be misrepresented; you must not claim *
* that you wrote the original software. If you use this software in a *
* product, an acknowledgment in the product documentation would be *
* appreciated but is not required. *
* *
* 2. Altered source versions must be plainly marked as such, and must not be *
* misrepresented as being the original software. *
* *
* 3. This notice may not be removed or altered from any source distribution. *
* *
********************************************************************************/
#ifndef GLUT_VIEWER_H
#define GLUT_VIEWER_H
// Libraries
#include "Shader.h"
#include "Camera.h"
#include "maths/Vector2.h"
#include <string>
#include <GL/glew.h>
#ifdef __APPLE__
#include "GLUT/glut.h"
#else
#include "GL/freeglut.h"
#endif
namespace openglframework {
// Class Renderer
class GlutViewer {
protected :
// -------------------- Attributes -------------------- //
// Camera
Camera mCamera;
// Center of the scene
Vector3 mCenterScene;
// Last mouse coordinates on the windows
int mLastMouseX, mLastMouseY;
// Last point computed on a sphere (for camera rotation)
Vector3 mLastPointOnSphere;
// True if the last point computed on a sphere (for camera rotation) is valid
bool mIsLastPointOnSphereValid;
// State of the mouse buttons
bool mIsButtonDown[10];
// GLUT keyboard modifiers
int mModifiers;
// -------------------- Methods -------------------- //
// Initialize the GLUT library
bool initGLUT(int argc, char** argv, const std::string& windowsTitle,
const Vector2& windowsSize, const Vector2& windowsPosition,
bool isMultisamplingActive);
bool mapMouseCoordinatesToSphere(int xMouse, int yMouse, Vector3& spherePoint) const;
public:
// -------------------- Methods -------------------- //
// Constructor
GlutViewer();
// Destructor
virtual ~GlutViewer();
// Initialize the viewer
bool init(int argc, char** argv, const std::string& windowsTitle,
const Vector2& windowsSize, const Vector2& windowsPosition,
bool isMultisamplingActive = false);
// Called when the windows is reshaped
void reshape(int width, int height);
// Set the scene position (where the camera needs to look at)
void setScenePosition(const Vector3& position, float sceneRadius);
// Set the camera so that we can view the whole scene
void resetCameraToViewAll();
// Enable/Disable the multi-sampling for anti-aliasing
void activateMultiSampling(bool isActive) const;
// Zoom the camera
void zoom(int xMouse, int yMouse);
// Translate the camera
void translate(int xMouse, int yMouse);
// Rotate the camera
void rotate(int xMouse, int yMouse);
// Get the camera
Camera& getCamera();
// Called when a GLUT mouse button event occurs
void mouseButtonEvent(int button, int state, int x, int y);
// Called when a GLUT mouse motion event occurs
void mouseMotionEvent(int xMouse, int yMouse);
// Called when a GLUT keyboard event occurs
void keyboardEvent(int key, int xMouse, int yMouse);
// Called when a GLUT special keyboard event occurs
void keyboardSpecialEvent(int key, int xMouse, int yMouse);
// Check the OpenGL errors
static void checkOpenGLErrors();
};
// Set the dimension of the camera viewport
inline void GlutViewer::reshape(int width, int height) {
mCamera.setDimensions(width, height);
glViewport(0, 0, width, height);
glutPostRedisplay();
}
// Set the scene position (where the camera needs to look at)
inline void GlutViewer::setScenePosition(const Vector3& position, float sceneRadius) {
// Set the position and radius of the scene
mCenterScene = position;
mCamera.setSceneRadius(sceneRadius);
// Reset the camera position and zoom in order to view all the scene
resetCameraToViewAll();
}
// Get the camera
inline Camera& GlutViewer::getCamera() {
return mCamera;
}
// Enable/Disable the multi-sampling for anti-aliasing
inline void GlutViewer::activateMultiSampling(bool isActive) const {
(isActive) ? glEnable(GL_MULTISAMPLE) : glDisable(GL_MULTISAMPLE);
}
}
#endif