summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsanine-a <sanine.not@pm.me>2020-05-22 15:19:55 -0500
committersanine-a <sanine.not@pm.me>2020-05-22 15:19:55 -0500
commite02ac3c921d816945324f1a887a0ed1db12f342e (patch)
tree125ce51b1038b786810a1fcb7cf7f536369350ae /src
parent5379b4214696e64902c5e10b3d4ef3d503fddcc4 (diff)
create basic honey_camera
Diffstat (limited to 'src')
-rw-r--r--src/camera.c137
-rw-r--r--src/honey.c4
-rw-r--r--src/shader.c4
-rw-r--r--src/texture.c2
4 files changed, 144 insertions, 3 deletions
diff --git a/src/camera.c b/src/camera.c
new file mode 100644
index 0000000..95636e9
--- /dev/null
+++ b/src/camera.c
@@ -0,0 +1,137 @@
+#include "include/camera.h"
+
+void honey_camera_new(honey_camera* camera,
+ vec3 position,
+ vec3 angle,
+ enum honey_camera_projection projection_type,
+ float aspect_ratio,
+ float near, float far,
+ float fov,
+ float left, float right, float top, float bottom) {
+ glm_vec3_copy(position, camera->position);
+ glm_vec3_copy(angle, camera->angle);
+
+ camera->projection_type = projection_type;
+
+ camera->aspect_ratio = aspect_ratio;
+ camera->near = near;
+ camera->far = far;
+
+ if (projection_type == HONEY_PERSPECTIVE) {
+ camera->fov = fov;
+ }
+ else if (projection_type == HONEY_ORTHOGRAPHIC) {
+ camera->ortho_left = left;
+ camera->ortho_right = right;
+ camera->ortho_top = top;
+ camera->ortho_bottom = bottom;
+ }
+
+ honey_camera_calculate_view(camera);
+ honey_camera_calculate_projection(camera);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_new_perspective(honey_camera* camera,
+ vec3 position,
+ vec3 angle,
+ float aspect_ratio,
+ float near, float far,
+ float fov) {
+ honey_camera_new(camera,
+ position, angle,
+ HONEY_PERSPECTIVE,
+ aspect_ratio, near, far, fov,
+ 0, 0, 0, 0);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_new_orthographic(honey_camera* camera,
+ vec3 position,
+ vec3 angle,
+ float near, float far,
+ float left, float right, float top, float bottom) {
+ honey_camera_new(camera,
+ position, angle,
+ HONEY_ORTHOGRAPHIC,
+ 0,
+ near, far,
+ 0,
+ left, right, top, bottom);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_calculate_look_direction(honey_camera* camera) {
+ float pitch = camera->angle[0];
+ float yaw = camera->angle[1];
+
+ float x = cos(pitch) * cos(yaw);
+ float y = sin(pitch);
+ float z = cos(pitch) * sin(yaw);
+
+ camera->look_direction[0] = x;
+ camera->look_direction[1] = y;
+ camera->look_direction[2] = z;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_calculate_up(honey_camera* camera) {
+ float pitch = camera->angle[0];
+ float yaw = camera->angle[1];
+ float roll = camera->angle[2];
+
+ camera->up[0] = 0;
+ camera->up[1] = 1;
+ camera->up[2] = 0;
+
+ mat3 rot3;
+ mat4 rot4;
+ glm_mat4_identity(rot4);
+ glm_rotate(rot4, roll, camera->look_direction);
+ glm_mat4_pick3(rot4, rot3);
+
+ glm_mat3_mulv(rot3, camera->up, camera->up);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_calculate_right(honey_camera* camera) {
+ glm_vec3_cross(camera->up, camera->look_direction, camera->right);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_calculate_view(honey_camera* camera) {
+ honey_camera_calculate_look_direction(camera);
+ honey_camera_calculate_up(camera);
+ honey_camera_calculate_right(camera);
+
+ glm_look(camera->position, camera->look_direction, camera->up, camera->view);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_camera_calculate_projection(honey_camera* camera) {
+ if (camera->projection_type == HONEY_PERSPECTIVE) {
+ glm_mat4_identity(camera->projection);
+ glm_perspective(camera->fov,
+ camera->aspect_ratio,
+ camera->near,
+ camera->far,
+ camera->projection);
+ }
+ else if (camera->projection_type == HONEY_ORTHOGRAPHIC) {
+ glm_mat4_identity(camera->projection);
+ glm_ortho(camera->ortho_left,
+ camera->ortho_right,
+ camera->ortho_bottom,
+ camera->ortho_top,
+ camera->near,
+ camera->far,
+ camera->projection);
+ }
+}
diff --git a/src/honey.c b/src/honey.c
index b6f783f..e9396f1 100644
--- a/src/honey.c
+++ b/src/honey.c
@@ -28,6 +28,10 @@ honey_window honey_setup(int screen_width, int screen_height, char* window_title
return NULL;
}
+ // Enable blending
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
return window;
}
diff --git a/src/shader.c b/src/shader.c
index b9e13da..d726523 100644
--- a/src/shader.c
+++ b/src/shader.c
@@ -101,10 +101,10 @@ void honey_shader_set_int(honey_shader shader,
void honey_shader_set_mat4(honey_shader shader,
char* matrix_name,
- float* matrix) {
+ mat4 matrix) {
glUseProgram(shader);
unsigned int matrix_location = glGetUniformLocation(shader, matrix_name);
- glUniformMatrix4fv(matrix_location, 1, GL_FALSE, matrix);
+ glUniformMatrix4fv(matrix_location, 1, GL_FALSE, (float*) matrix);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
diff --git a/src/texture.c b/src/texture.c
index c1a5843..dfdbdd2 100644
--- a/src/texture.c
+++ b/src/texture.c
@@ -20,7 +20,7 @@ enum honey_texture_result honey_texture_new(honey_texture* texture,
}
if (alpha_channel) {
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
}
else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data);