|
|
|
@ -44,6 +44,8 @@ void init( void ); |
|
|
|
|
void display( void ); |
|
|
|
|
void reshape( GLFWwindow* window, int w, int h ); |
|
|
|
|
void key_callback( GLFWwindow* window, int key, int scancode, int action, int mods ); |
|
|
|
|
void mouse_button_callback( GLFWwindow* window, int button, int action, int mods ); |
|
|
|
|
void cursor_position_callback( GLFWwindow* window, double x, double y ); |
|
|
|
|
void DrawBoingBall( void ); |
|
|
|
|
void BounceBall( double dt ); |
|
|
|
|
void DrawBoingBallBand( GLfloat long_lo, GLfloat long_hi ); |
|
|
|
@ -80,8 +82,12 @@ typedef enum { DRAW_BALL, DRAW_BALL_SHADOW } DRAW_BALL_ENUM; |
|
|
|
|
typedef struct {float x; float y; float z;} vertex_t; |
|
|
|
|
|
|
|
|
|
/* Global vars */ |
|
|
|
|
int width, height; |
|
|
|
|
GLfloat deg_rot_y = 0.f; |
|
|
|
|
GLfloat deg_rot_y_inc = 2.f; |
|
|
|
|
GLboolean override_pos = GL_FALSE; |
|
|
|
|
GLfloat cursor_x = 0.f; |
|
|
|
|
GLfloat cursor_y = 0.f; |
|
|
|
|
GLfloat ball_x = -RADIUS; |
|
|
|
|
GLfloat ball_y = -RADIUS; |
|
|
|
|
GLfloat ball_x_inc = 1.f; |
|
|
|
@ -251,6 +257,37 @@ void key_callback( GLFWwindow* window, int key, int scancode, int action, int mo |
|
|
|
|
glfwSetWindowShouldClose(window, GL_TRUE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void set_ball_pos ( GLfloat x, GLfloat y ) |
|
|
|
|
{ |
|
|
|
|
ball_x = (width / 2) - x; |
|
|
|
|
ball_y = y - (height / 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void mouse_button_callback( GLFWwindow* window, int button, int action, int mods ) |
|
|
|
|
{ |
|
|
|
|
if (button != GLFW_MOUSE_BUTTON_LEFT) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (action == GLFW_PRESS) |
|
|
|
|
{ |
|
|
|
|
override_pos = GL_TRUE; |
|
|
|
|
set_ball_pos(cursor_x, cursor_y); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
override_pos = GL_FALSE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void cursor_position_callback( GLFWwindow* window, double x, double y ) |
|
|
|
|
{ |
|
|
|
|
cursor_x = x; |
|
|
|
|
cursor_y = y; |
|
|
|
|
|
|
|
|
|
if ( override_pos ) |
|
|
|
|
set_ball_pos(cursor_x, cursor_y); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Draw the Boing ball. |
|
|
|
|
* |
|
|
|
@ -341,6 +378,9 @@ void BounceBall( double delta_t ) |
|
|
|
|
GLfloat sign; |
|
|
|
|
GLfloat deg; |
|
|
|
|
|
|
|
|
|
if ( override_pos ) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
/* Bounce on walls */ |
|
|
|
|
if ( ball_x > (BOUNCE_WIDTH/2 + WALL_R_OFFSET ) ) |
|
|
|
|
{ |
|
|
|
@ -574,7 +614,6 @@ void DrawGrid( void ) |
|
|
|
|
int main( void ) |
|
|
|
|
{ |
|
|
|
|
GLFWwindow* window; |
|
|
|
|
int width, height; |
|
|
|
|
|
|
|
|
|
/* Init GLFW */ |
|
|
|
|
if( !glfwInit() ) |
|
|
|
@ -591,6 +630,8 @@ int main( void ) |
|
|
|
|
|
|
|
|
|
glfwSetFramebufferSizeCallback(window, reshape); |
|
|
|
|
glfwSetKeyCallback(window, key_callback); |
|
|
|
|
glfwSetMouseButtonCallback(window, mouse_button_callback); |
|
|
|
|
glfwSetCursorPosCallback(window, cursor_position_callback); |
|
|
|
|
|
|
|
|
|
glfwMakeContextCurrent(window); |
|
|
|
|
glfwSwapInterval( 1 ); |
|
|
|
|