fix: input handling
This commit is contained in:
parent
a176afab7e
commit
5d19366642
12
INSTALL
Normal file
12
INSTALL
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
+=============+
|
||||||
|
| INSTALL |
|
||||||
|
+=============+
|
||||||
|
|
||||||
|
DEBIAN PACKAGES
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libglew-dev
|
||||||
|
sudo apt-get install libglfw3-dev
|
||||||
|
sudo apt-get install libcglm-dev
|
||||||
|
sudo apt-get install libassimp-dev
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
#ifndef RENDLIB_H
|
#ifndef RENDLIB_H
|
||||||
#define RENDLIB_H
|
#define RENDLIB_H
|
||||||
|
|
||||||
|
#define RENDLIB_INPUT_ESC 0b00000001
|
||||||
|
#define RENDLIB_INPUT_REL 0b00000010
|
||||||
|
#define RENDLIB_INPUT_LEFT 0b00000100
|
||||||
|
#define RENDLIB_INPUT_RIGHT 0b00001000
|
||||||
|
#define RENDLIB_INPUT_BACKW 0b00010000
|
||||||
|
#define RENDLIB_INPUT_FORW 0b00100000
|
||||||
|
|
||||||
enum errs {
|
enum errs {
|
||||||
err_glfw_init = -1,
|
err_glfw_init = -1,
|
||||||
err_glfw_win = -2,
|
err_glfw_win = -2,
|
||||||
|
|
125
rendlib.c
125
rendlib.c
|
@ -14,25 +14,20 @@ int window_width = 960;
|
||||||
int window_height = 540;
|
int window_height = 540;
|
||||||
char *window_title = "rendlib window";
|
char *window_title = "rendlib window";
|
||||||
|
|
||||||
// global settings
|
float fov = 90.0f;
|
||||||
float fov = 80.0f; // default fov
|
float camera_yaw = -90.0f;
|
||||||
float fov_change = 1.0f;
|
float camera_pitch = 0.0f;
|
||||||
vec3 camera_pos = { 0.0f, 0.0f, 20.0f };
|
float camera_sensitivity = 0.02f;
|
||||||
|
float top_movement_speed = 0.2f;
|
||||||
|
vec3 camera_pos = { 0.0f, 0.0f, 50.0f };
|
||||||
vec3 camera_front = { 0.0f, 0.0f, -1.0f };
|
vec3 camera_front = { 0.0f, 0.0f, -1.0f };
|
||||||
vec3 camera_up = { 0.0f, 1.0f, 0.0f };
|
vec3 camera_up = { 0.0f, 1.0f, 0.0f };
|
||||||
struct object *camera_lock = NULL; // is camera locked to any object?
|
|
||||||
float camera_yaw = -90.0f; // x rotation
|
|
||||||
float camera_pitch = 0.0f; // y rotation
|
|
||||||
float camera_sensitivity = 0.01f;
|
|
||||||
float top_movement_speed = 0.2f;
|
|
||||||
vec3 speed = { 0.0f, 0.0f, 0.0f };
|
vec3 speed = { 0.0f, 0.0f, 0.0f };
|
||||||
|
struct object *camera_lock = NULL;
|
||||||
GLint screen_viewport[4]; // viewport: x,y,width,height
|
GLint screen_viewport[4];
|
||||||
int toggle_tracing = 0; // true or false
|
|
||||||
long added_particles = 0;
|
|
||||||
|
|
||||||
// tmp input
|
// tmp input
|
||||||
int inputs[8] = {0,0,0,0,0,0,};
|
char input = 0;
|
||||||
|
|
||||||
// tmp
|
// tmp
|
||||||
struct model *sphere_model;
|
struct model *sphere_model;
|
||||||
|
@ -47,6 +42,13 @@ unsigned int fragment_shader;
|
||||||
const char *object_vertex_shader_location = "assets/shaders/shader.vert";
|
const char *object_vertex_shader_location = "assets/shaders/shader.vert";
|
||||||
const char *object_fragment_shader_location = "assets/shaders/shader.frag";
|
const char *object_fragment_shader_location = "assets/shaders/shader.frag";
|
||||||
|
|
||||||
|
void update_screen_viewport(int x, int y, int width, int height) {
|
||||||
|
GLFWwindow *w = glfwGetCurrentContext();
|
||||||
|
glfwSetCursorPos(w, (width/2), (height/2));
|
||||||
|
glViewport(x, y, width, height);
|
||||||
|
glGetIntegerv(GL_VIEWPORT, screen_viewport);
|
||||||
|
}
|
||||||
|
|
||||||
int load_shader(const char *path, unsigned int shader) {
|
int load_shader(const char *path, unsigned int shader) {
|
||||||
FILE *fp = fopen(path, "r");
|
FILE *fp = fopen(path, "r");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
|
@ -140,21 +142,21 @@ int load_shaders(void) {
|
||||||
|
|
||||||
void handle_input(void) {
|
void handle_input(void) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if (inputs[0]) {
|
if (input & RENDLIB_INPUT_ESC) {
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
inputs[0] = 0;
|
input &= ~RENDLIB_INPUT_ESC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs[1]) {
|
if (input & RENDLIB_INPUT_REL) {
|
||||||
ret = load_shaders();
|
ret = load_shaders();
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "--error: reloading shaders\n");
|
fprintf(stderr, "--error: reloading shaders\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
inputs[1] = 0;
|
input &= ~RENDLIB_INPUT_REL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs[2]) {
|
if (input & RENDLIB_INPUT_LEFT) {
|
||||||
vec3 side_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
vec3 side_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
||||||
vec3 camera_side;
|
vec3 camera_side;
|
||||||
glm_cross(camera_front, camera_up, camera_side);
|
glm_cross(camera_front, camera_up, camera_side);
|
||||||
|
@ -163,7 +165,7 @@ void handle_input(void) {
|
||||||
glm_vec3_sub(camera_pos, camera_side, camera_pos);
|
glm_vec3_sub(camera_pos, camera_side, camera_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs[3]) {
|
if (input & RENDLIB_INPUT_RIGHT) {
|
||||||
vec3 side_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
vec3 side_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
||||||
vec3 camera_side;
|
vec3 camera_side;
|
||||||
glm_cross(camera_front, camera_up, camera_side);
|
glm_cross(camera_front, camera_up, camera_side);
|
||||||
|
@ -172,13 +174,13 @@ void handle_input(void) {
|
||||||
glm_vec3_add(camera_pos, camera_side, camera_pos);
|
glm_vec3_add(camera_pos, camera_side, camera_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs[4]) {
|
if (input & RENDLIB_INPUT_BACKW) {
|
||||||
vec3 front_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
vec3 front_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
||||||
glm_vec3_mul(front_scalar, camera_front, front_scalar);
|
glm_vec3_mul(front_scalar, camera_front, front_scalar);
|
||||||
glm_vec3_sub(camera_pos, front_scalar, camera_pos);
|
glm_vec3_sub(camera_pos, front_scalar, camera_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs[5]) {
|
if (input & RENDLIB_INPUT_FORW) {
|
||||||
vec3 front_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
vec3 front_scalar = {top_movement_speed, top_movement_speed, top_movement_speed };
|
||||||
glm_vec3_mul(front_scalar, camera_front, front_scalar);
|
glm_vec3_mul(front_scalar, camera_front, front_scalar);
|
||||||
glm_vec3_add(camera_pos, front_scalar, camera_pos);
|
glm_vec3_add(camera_pos, front_scalar, camera_pos);
|
||||||
|
@ -186,7 +188,7 @@ void handle_input(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_size(GLFWwindow *w, int width, int height) {
|
void window_size(GLFWwindow *w, int width, int height) {
|
||||||
glViewport(0, 0, width, height);
|
update_screen_viewport(0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display(void) {
|
void display(void) {
|
||||||
|
@ -204,7 +206,6 @@ void display(void) {
|
||||||
|
|
||||||
glClearColor(0.13f, 0.13f, 0.13f, 0.0f);
|
glClearColor(0.13f, 0.13f, 0.13f, 0.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glGetIntegerv(GL_VIEWPORT, screen_viewport);
|
|
||||||
glUseProgram(shader_program);
|
glUseProgram(shader_program);
|
||||||
|
|
||||||
glm_mat4_identity(view);
|
glm_mat4_identity(view);
|
||||||
|
@ -259,13 +260,6 @@ void display(void) {
|
||||||
glm_vec3_add(camera_pos, obj->translation_force, camera_pos);
|
glm_vec3_add(camera_pos, obj->translation_force, camera_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// record path
|
|
||||||
if (toggle_tracing == 1) {
|
|
||||||
if (record_path(obj) == -1) {
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_translate(translation_matrix, obj->position);
|
glm_translate(translation_matrix, obj->position);
|
||||||
|
|
||||||
glUniformMatrix4fv(translation_uniform, 1, GL_FALSE, (float *) translation_matrix);
|
glUniformMatrix4fv(translation_uniform, 1, GL_FALSE, (float *) translation_matrix);
|
||||||
|
@ -338,65 +332,62 @@ void rendlib_bake_graphics(void) {
|
||||||
void keyboard(GLFWwindow *w, int key, int scancode, int action, int mods) {
|
void keyboard(GLFWwindow *w, int key, int scancode, int action, int mods) {
|
||||||
if (action == GLFW_PRESS) {
|
if (action == GLFW_PRESS) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case GLFW_KEY_Q:
|
||||||
case GLFW_KEY_ESCAPE:
|
case GLFW_KEY_ESCAPE:
|
||||||
inputs[0] = 1;
|
input |= RENDLIB_INPUT_ESC;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_R:
|
case GLFW_KEY_R:
|
||||||
inputs[1] = 1;
|
input |= RENDLIB_INPUT_REL;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_A:
|
case GLFW_KEY_A:
|
||||||
inputs[2] = 1;
|
case GLFW_KEY_LEFT:
|
||||||
|
input |= RENDLIB_INPUT_LEFT;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_D:
|
case GLFW_KEY_D:
|
||||||
inputs[3] = 1;
|
case GLFW_KEY_RIGHT:
|
||||||
|
input |= RENDLIB_INPUT_RIGHT;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_S:
|
case GLFW_KEY_S:
|
||||||
inputs[4] = 1;
|
case GLFW_KEY_DOWN:
|
||||||
|
input |= RENDLIB_INPUT_BACKW;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_W:
|
case GLFW_KEY_W:
|
||||||
inputs[5] = 1;
|
case GLFW_KEY_UP:
|
||||||
|
input |= RENDLIB_INPUT_FORW;
|
||||||
break;
|
break;
|
||||||
|
case GLFW_KEY_F11: {
|
||||||
|
GLFWmonitor *m = glfwGetPrimaryMonitor();
|
||||||
|
const GLFWvidmode *vm = glfwGetVideoMode(m);
|
||||||
|
GLFWwindow *w = glfwGetCurrentContext();
|
||||||
|
glfwSetWindowMonitor(w, m, 0, 0, vm->width, vm->height, vm->refreshRate);
|
||||||
|
|
||||||
|
update_screen_viewport(0, 0, vm->width, vm->height);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (action == GLFW_RELEASE) {
|
} else if (action == GLFW_RELEASE) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case GLFW_KEY_A:
|
case GLFW_KEY_A:
|
||||||
inputs[2] = 0;
|
case GLFW_KEY_LEFT:
|
||||||
|
input &= ~RENDLIB_INPUT_LEFT;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_D:
|
case GLFW_KEY_D:
|
||||||
inputs[3] = 0;
|
case GLFW_KEY_RIGHT:
|
||||||
|
input &= ~RENDLIB_INPUT_RIGHT;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_S:
|
case GLFW_KEY_S:
|
||||||
inputs[4] = 0;
|
case GLFW_KEY_DOWN:
|
||||||
|
input &= ~RENDLIB_INPUT_BACKW;
|
||||||
break;
|
break;
|
||||||
case GLFW_KEY_W:
|
case GLFW_KEY_W:
|
||||||
inputs[5] = 0;
|
case GLFW_KEY_UP:
|
||||||
|
input &= ~RENDLIB_INPUT_FORW;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mouse(int button, int state, int x, int y) {
|
|
||||||
switch (button) {
|
|
||||||
case 3:
|
|
||||||
if (fov-fov_change < 0.0f) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fov -= fov_change;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
if (fov+fov_change > 180.0f) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fov += fov_change;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int warped_pointer = 0;
|
int warped_pointer = 0;
|
||||||
int first_pointer = 1;
|
int first_pointer = 1;
|
||||||
void mouse_motion(GLFWwindow *window, double x, double y) {
|
void mouse_motion(GLFWwindow *window, double x, double y) {
|
||||||
|
@ -406,6 +397,7 @@ void mouse_motion(GLFWwindow *window, double x, double y) {
|
||||||
}
|
}
|
||||||
|
|
||||||
warped_pointer = 1;
|
warped_pointer = 1;
|
||||||
|
glGetIntegerv(GL_VIEWPORT, screen_viewport);
|
||||||
GLFWwindow *w = glfwGetCurrentContext();
|
GLFWwindow *w = glfwGetCurrentContext();
|
||||||
glfwSetCursorPos(w, (screen_viewport[2]/2), (screen_viewport[3]/2));
|
glfwSetCursorPos(w, (screen_viewport[2]/2), (screen_viewport[3]/2));
|
||||||
|
|
||||||
|
@ -428,10 +420,10 @@ void mouse_motion(GLFWwindow *window, double x, double y) {
|
||||||
camera_pitch = 89.9f;
|
camera_pitch = 89.9f;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 view_direction;
|
vec3 view_direction = { cos(glm_rad(camera_yaw)) * cos(glm_rad(camera_pitch)),
|
||||||
view_direction[0] = cos(glm_rad(camera_yaw)) * cos(glm_rad(camera_pitch));
|
sin(glm_rad(camera_pitch)),
|
||||||
view_direction[1] = sin(glm_rad(camera_pitch));
|
sin(glm_rad(camera_yaw)) * cos(glm_rad(camera_pitch))
|
||||||
view_direction[2] = sin(glm_rad(camera_yaw)) * cos(glm_rad(camera_pitch));
|
};
|
||||||
glm_normalize_to(view_direction, camera_front);
|
glm_normalize_to(view_direction, camera_front);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,6 +442,7 @@ int rendlib_start_window(int argc, char *argv[]) {
|
||||||
glfwSetWindowSizeCallback(w, window_size);
|
glfwSetWindowSizeCallback(w, window_size);
|
||||||
glfwSetCursorPosCallback(w, mouse_motion);
|
glfwSetCursorPosCallback(w, mouse_motion);
|
||||||
glfwSetKeyCallback(w, keyboard);
|
glfwSetKeyCallback(w, keyboard);
|
||||||
|
glfwSetInputMode(w, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
|
||||||
ret = glewInit();
|
ret = glewInit();
|
||||||
if (ret != GLEW_OK) {
|
if (ret != GLEW_OK) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user