Compare commits

..

No commits in common. "52acb4044c032a9965e39e45e2edfc7b06a64d5c" and "38cc784ec866de9b5be61d1368b70a2cc899b180" have entirely different histories.

4 changed files with 22 additions and 188 deletions

View file

@ -5,15 +5,8 @@
#include "KeyStateManager.h" #include "KeyStateManager.h"
#include <iostream> #include <iostream>
// Initialize static members
std::map<unsigned char,bool> KeyStateManager::ascii_keys_status = {}; std::map<unsigned char,bool> KeyStateManager::ascii_keys_status = {};
std::map<int,bool> KeyStateManager::special_keys_status = {}; std::map<int,bool> KeyStateManager::special_keys_status = {};
std::map<int,bool> KeyStateManager::mouse_button_status = {};
Vec2i KeyStateManager::current_mouse_delta;
Vec2i KeyStateManager::last_mouse_delta;
Vec2i KeyStateManager::last_mouse_position;
void KeyStateManager::register_glut_callbacks() void KeyStateManager::register_glut_callbacks()
{ {
@ -21,16 +14,8 @@ void KeyStateManager::register_glut_callbacks()
glutKeyboardUpFunc(KeyStateManager::key_up); glutKeyboardUpFunc(KeyStateManager::key_up);
glutSpecialFunc(KeyStateManager::special_key_press); glutSpecialFunc(KeyStateManager::special_key_press);
glutSpecialUpFunc(KeyStateManager::special_key_up); glutSpecialUpFunc(KeyStateManager::special_key_up);
glutMouseFunc(KeyStateManager::mouse_click);
glutPassiveMotionFunc(KeyStateManager::mouse_movement);
glutMotionFunc(KeyStateManager::mouse_movement);
} }
// ==================
// Keyboard
// ==================
bool KeyStateManager::is_key_pressed(unsigned char key) bool KeyStateManager::is_key_pressed(unsigned char key)
{ {
if (ascii_keys_status.find(key) == ascii_keys_status.end()) if (ascii_keys_status.find(key) == ascii_keys_status.end())
@ -52,25 +37,21 @@ bool KeyStateManager::is_special_key_pressed(int key)
void KeyStateManager::key_press(unsigned char event_key, int mouse_x, int mouse_y) void KeyStateManager::key_press(unsigned char event_key, int mouse_x, int mouse_y)
{ {
update_key(event_key,true); update_key(event_key,true);
mouse_movement(mouse_x,mouse_y);
} }
void KeyStateManager::key_up(unsigned char event_key, int mouse_x, int mouse_y) void KeyStateManager::key_up(unsigned char event_key, int mouse_x, int mouse_y)
{ {
update_key(event_key,false); update_key(event_key,false);
mouse_movement(mouse_x,mouse_y);
} }
void KeyStateManager::special_key_press(int event_key, int mouse_x, int mouse_y) void KeyStateManager::special_key_press(int event_key, int mouse_x, int mouse_y)
{ {
update_special_key(event_key,true); update_special_key(event_key,true);
mouse_movement(mouse_x,mouse_y);
} }
void KeyStateManager::special_key_up(int event_key, int mouse_x, int mouse_y) void KeyStateManager::special_key_up(int event_key, int mouse_x, int mouse_y)
{ {
update_special_key(event_key,false); update_special_key(event_key,false);
mouse_movement(mouse_x,mouse_y);
} }
void KeyStateManager::update_key(unsigned char event_key, bool new_status) void KeyStateManager::update_key(unsigned char event_key, bool new_status)
@ -96,58 +77,3 @@ void KeyStateManager::update_special_key(int event_key, bool new_status)
special_keys_status.insert({event_key,new_status}); special_keys_status.insert({event_key,new_status});
} }
} }
// ==================
// Mouse
// ==================
void KeyStateManager::mouse_movement(int mouse_x, int mouse_y)
{
Vec2i current_frame;
current_frame.x = mouse_x;
current_frame.y = mouse_y;
Vec2i frame_delta = current_frame - last_mouse_position;
current_mouse_delta.x += frame_delta.x;
current_mouse_delta.y += frame_delta.y;
last_mouse_position = current_frame;
std::cout << frame_delta.x << "," << frame_delta.y << std::endl;
}
void KeyStateManager::mouse_click(int mouse_button, int button_state, int mouse_x, int mouse_y)
{
bool new_status = button_state == GLUT_DOWN;
if (mouse_button_status.find(mouse_button) != mouse_button_status.end())
{
mouse_button_status.at(mouse_button) = new_status;
}
else
{
mouse_button_status.insert({mouse_button,new_status});
}
mouse_movement(mouse_x,mouse_y);
}
bool KeyStateManager::is_mouse_button_pressed(int mouse_button)
{
if (mouse_button_status.find(mouse_button) == mouse_button_status.end())
{
return false;
}
return mouse_button_status.at(mouse_button);
}
const Vec2i& KeyStateManager::get_mouse_delta(bool update)
{
if (update)
{
last_mouse_delta = current_mouse_delta;
current_mouse_delta.x = 0;
current_mouse_delta.y = 0;
}
return last_mouse_delta;
}

View file

@ -8,10 +8,8 @@
#include <map> #include <map>
#include <GL/glut.h> #include <GL/glut.h>
#include "types.h"
/// Handles the key events from glut and keep the status of keys up to date.
/// Handles the key and mouse events from glut and keep their status up to date.
/// "Static class" /// "Static class"
class KeyStateManager { class KeyStateManager {
public: public:
@ -23,34 +21,16 @@ public:
static bool is_key_pressed(unsigned char key); static bool is_key_pressed(unsigned char key);
static bool is_special_key_pressed(int key); static bool is_special_key_pressed(int key);
static bool is_mouse_button_pressed(int mouse_button);
/// Updates and returns the movement of the mouse.
/// \param update If true, updates the mouse delta that will be returned
/// \return Updated displacement on each axis between the two last updates.
static const Vec2i& get_mouse_delta(bool update = false);
// Glut callbacks for input events // Glut callbacks for input events
static void key_press(unsigned char event_key, int mouse_x, int mouse_y); static void key_press(unsigned char event_key, int mouse_x, int mouse_y);
static void key_up(unsigned char event_key, int mouse_x, int mouse_y); static void key_up(unsigned char event_key, int mouse_x, int mouse_y);
static void special_key_press(int event_key, int mouse_x, int mouse_y); static void special_key_press(int event_key, int mouse_x, int mouse_y);
static void special_key_up(int event_key, int mouse_x, int mouse_y); static void special_key_up(int event_key, int mouse_x, int mouse_y);
static void mouse_click(int mouse_button, int button_state, int mouse_x, int mouse_y);
/// Accumulates the movements of the mouse
static void mouse_movement(int mouse_x, int mouse_y);
private: private:
// The maps are used to keep track of the keys which were pressed or released during runtime. // The maps are used to keep track of the keys which were pressed or released during runtime.
static std::map<unsigned char,bool> ascii_keys_status; static std::map<unsigned char,bool> ascii_keys_status;
static std::map<int,bool> special_keys_status; static std::map<int,bool> special_keys_status;
static std::map<int,bool> mouse_button_status;
// Updated by callback
static Vec2i current_mouse_delta;
// Updated on user request
static Vec2i last_mouse_delta;
static Vec2i last_mouse_position;
// These functions are called by *_press and *_up to update their values // These functions are called by *_press and *_up to update their values
static void update_key(unsigned char event_key, bool new_status); static void update_key(unsigned char event_key, bool new_status);

View file

@ -13,11 +13,7 @@ static Texture raptor_texture;
void manage_inputs() void manage_inputs()
{ {
if (KeyStateManager::is_mouse_button_pressed(GLUT_LEFT_BUTTON)) if (KeyStateManager::is_key_pressed(' '))
{
glClearColor(0,0,0.5,1);
}
else if (KeyStateManager::is_key_pressed(' '))
{ {
glClearColor(0.5,0,0,1); glClearColor(0.5,0,0,1);
} }
@ -50,7 +46,7 @@ void display()
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
gluLookAt(10, 7.5, 10, gluLookAt(7.5, 7.5, 7.5,
0, 0, 1, 0, 0, 1,
0, 1, 0); 0, 1, 0);

View file

@ -15,48 +15,6 @@ struct CoordinatesVector
{ {
T coordinates[N]; T coordinates[N];
// Use SFINAE to declare the function if and only if the type is arithmetic
template <typename Scalar>
typename std::enable_if<std::is_arithmetic<Scalar>::value,CoordinatesVector<T,N>>::type
operator*(const Scalar& scalar)
{
CoordinatesVector result;
for (unsigned int i = 0;i<N;i++)
{
result.coordinates[i] = coordinates[i] * scalar;
}
}
CoordinatesVector operator+(const CoordinatesVector<T,N>& op)
{
CoordinatesVector result;
for (unsigned int i = 0;i<N;i++)
{
result.coordinates[i] = coordinates[i] + op.coordinates[i];
}
return result;
}
CoordinatesVector operator-(const CoordinatesVector<T,N>& op)
{
CoordinatesVector result;
for (unsigned int i = 0;i<N;i++)
{
result.coordinates[i] = coordinates[i] - op.coordinates[i];
}
return result;
}
CoordinatesVector& operator=(const CoordinatesVector<T,N>& original)
{
if (this != &original)
{
std::copy(std::begin(original.coordinates), std::end(original.coordinates), std::begin(coordinates));
}
return *this;
}
friend std::fstream& operator>>(std::fstream& stream, CoordinatesVector<T,N>& vector) friend std::fstream& operator>>(std::fstream& stream, CoordinatesVector<T,N>& vector)
{ {
for (unsigned int i = 0;i<N;i++) for (unsigned int i = 0;i<N;i++)
@ -69,68 +27,42 @@ struct CoordinatesVector
template <typename T> template <typename T>
struct Vec2 : public CoordinatesVector<T,2> struct CoordinatesVector<T,2>
{ {
T& x = CoordinatesVector<T,2>::coordinates[0]; T coordinates[2];
T& y = CoordinatesVector<T,2>::coordinates[1]; T& x = coordinates[0];
T& y = coordinates[1];
Vec2() = default; friend std::fstream& operator>>(std::fstream& stream, CoordinatesVector<T,2>& vec2)
// Cast-copy constructor in order to use the operators of the mother class.
Vec2(const CoordinatesVector<T,2>& origin)
{ {
if (this != &origin) stream >> vec2.x >> vec2.y;
{ return stream;
std::copy(std::begin(origin.coordinates),std::end(origin.coordinates),std::begin(CoordinatesVector<T,2>::coordinates));
}
}
Vec2& operator=(const Vec2<T>& origin)
{
if (this != &origin)
{
std::copy(std::begin(origin.coordinates), std::end(origin.coordinates), std::begin(CoordinatesVector<T,2>::coordinates));
}
return *this;
} }
}; };
template <typename T> template <typename T>
struct Vec3 : CoordinatesVector<T,3> struct CoordinatesVector<T,3>
{ {
T coordinates[3];
T& x = CoordinatesVector<T,3>::coordinates[0]; T& x = coordinates[0];
T& y = CoordinatesVector<T,3>::coordinates[1]; T& y = coordinates[1];
T& z = CoordinatesVector<T,3>::coordinates[2]; T& z = coordinates[2];
Vec3() = default; friend std::fstream& operator>>(std::fstream& stream, CoordinatesVector<T,3>& vec3)
// Cast-copy constructor in order to use the operators of the mother class.
Vec3(const CoordinatesVector<T,3>& origin)
{ {
if (this != &origin) stream >> vec3.x >> vec3.y >> vec3.z;
{ return stream;
std::copy(std::begin(origin.coordinates),std::end(origin.coordinates),std::begin(CoordinatesVector<T,2>::coordinates));
}
}
Vec3& operator=(const Vec3<T>& original)
{
if (this != &original)
{
std::copy(std::begin(original.coordinates), std::end(original.coordinates), std::begin(CoordinatesVector<T,3>::coordinates));
}
return *this;
} }
}; };
// Define aliases for common types // Define aliases for common types
typedef Vec2<int> Vec2i; typedef CoordinatesVector<int,2> Vec2i;
typedef Vec2<float> Vec2f; typedef CoordinatesVector<float,2> Vec2f;
typedef Vec3<int> Vec3i; typedef CoordinatesVector<int,3> Vec3i;
typedef Vec3<float> Vec3f; typedef CoordinatesVector<float,3> Vec3f;
#endif //TESTS_OPENGL_TYPES_H #endif //TESTS_OPENGL_TYPES_H