diff --git a/build/linux/makefile b/build/linux/makefile index fd2de36..591d111 100644 --- a/build/linux/makefile +++ b/build/linux/makefile @@ -11,8 +11,8 @@ OBJS_RELEASE = $(patsubst %.c,.release/%.o,$(SRCS)) OBJS_DEBUG = $(patsubst %.c,.debug/%.o,$(SRCS)) CFLAGS = -Wall -I$(INCLUDE_DIR) -DUSE_GLAD CFLAGS_DEBUG = -g -DGL_DEBUG_CONTEXT -DAL_DEBUG -std=c99 -CFLAGS_RELEASE = -O3 -LFLAGS = -lSDL2 -lopenal -lGL -lsndio -lpthread -ldl -lm +CFLAGS_RELEASE = -O2 +LFLAGS = -lSDL2 -lpthread -ldl -lm -lopenal -lsndio -lGL all: release diff --git a/orgfile.org b/orgfile.org index f020d0d..91440a0 100644 --- a/orgfile.org +++ b/orgfile.org @@ -110,6 +110,7 @@ x Font atlas proper cleanup - Custom rendering for gui ** TODO Allow passsing base path as commandline argument? ** TODO Better handling incase assets folder is not found? +** TODO OpenAL not working in release builds ** DONE 3d sound using OpenAL - State "DONE" from "TODO" [2017-03-23 Thu 01:43] ** TODO Ogg format loading and playback diff --git a/src/bounding_volumes.c b/src/bounding_volumes.c index cb91a1f..20f901c 100644 --- a/src/bounding_volumes.c +++ b/src/bounding_volumes.c @@ -32,23 +32,32 @@ int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Tra int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, struct Transform* transform) { - int intersect_type = IT_INSIDE; - vec3 center; - vec3_add(¢er, &sphere->center, &transform->position); - vec3_mul(¢er, ¢er, &transform->scale); + int intersect_type = IT_INSIDE; + vec3 center; + float radius = sphere->radius; + vec3 abs_pos, abs_scale; + transform_get_absolute_pos(transform, &abs_pos); + transform_get_absolute_scale(transform, &abs_scale); + float max_scale_dimension = fabsf(abs_scale.x); + if(fabsf(abs_scale.y) > max_scale_dimension) max_scale_dimension = fabsf(abs_scale.y); + if(fabsf(abs_scale.z) > max_scale_dimension) max_scale_dimension = fabsf(abs_scale.z); + radius *= max_scale_dimension; + vec3_fill(¢er, 0.f, 0.f, 0.f); + vec3_add(¢er, &sphere->center, &abs_pos); + //vec3_mul(¢er, ¢er, &transform->scale); for(int i = 0; i < 6; i++) { vec3 plane_normal = {frustum[i].x, frustum[i].y, frustum[i].z}; float distance = frustum[i].w; float dot = vec3_dot(&plane_normal, ¢er) + distance; - if(dot < -sphere->radius) + if(dot < -radius) { intersect_type = IT_OUTSIDE; return intersect_type; } - if(fabsf(dot) < sphere->radius) + if(fabsf(dot) < radius) { intersect_type = IT_INTERSECT; return intersect_type; diff --git a/src/camera.c b/src/camera.c index ec94892..e543767 100644 --- a/src/camera.c +++ b/src/camera.c @@ -13,6 +13,7 @@ #include #include #include +#include static struct Camera* camera_list; static int* empty_indices; @@ -264,7 +265,7 @@ static void update_frustum(struct Camera* camera) for(int i = 0; i < 6; i++) { vec3 plane_xyz = {camera->frustum[i].x, camera->frustum[i].y, camera->frustum[i].z}; - float length = vec3_len(&plane_xyz); + float length = fabsf(vec3_len(&plane_xyz)); vec4_scale(&camera->frustum[i], &camera->frustum[i], (1.f / length)); } } diff --git a/src/game.c b/src/game.c index 89878ac..16c58a5 100644 --- a/src/game.c +++ b/src/game.c @@ -147,7 +147,8 @@ void scene_setup(void) int y = rand() % num_suz; int z = rand() % num_suz; x++; y++; z++; - struct Entity* suz = scene_add_as_child("Suzanne", NULL, parent_node); + //struct Entity* suz = scene_add_as_child("Suzanne", NULL, parent_node); + struct Entity* suz = scene_add_new("Suzanne", NULL); struct Model* suz_model = entity_component_add(suz, C_MODEL, "suzanne.pamesh", "Blinn_Phong"); model_set_material_param(suz_model, "diffuse_color", &color); float spec_str = 80.f; diff --git a/src/geometry.c b/src/geometry.c index 1831e7a..49be74c 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -357,7 +357,7 @@ void geom_render(int index, enum Geometry_Draw_Mode draw_mode) } -int geom_render_in_frustum(int index, +int geom_render_in_frustum(int index, vec4* frustum, struct Transform* transform, enum Geometry_Draw_Mode draw_mode) @@ -378,3 +378,9 @@ int geom_render_in_frustum(int index, } return rendered; } + +struct Bounding_Sphere* geom_bounding_sphere_get(int index) +{ + assert(index > -1 && index < array_len(geometry_list)); + return &geometry_list[index].bounding_sphere; +} diff --git a/src/geometry.h b/src/geometry.h index 70a9a4e..e1941e1 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -14,21 +14,22 @@ enum Geometry_Draw_Mode GDM_NUM_DRAWMODES }; -void geom_init(void); -int geom_create_from_file(const char* name); -int geom_find(const char* filename); -void geom_remove(int index); -void geom_cleanup(void); -void geom_render(int index, enum Geometry_Draw_Mode); -int geom_render_in_frustum(int index, - vec4* frustum, - struct Transform* transform, - enum Geometry_Draw_Mode draw_mode); -int geom_create(const char* name, - vec3* vertices, - vec2* uvs, - vec3* normals, - uint* indices, - vec3* vertex_colors); +void geom_init(void); +int geom_create_from_file(const char* name); +int geom_find(const char* filename); +void geom_remove(int index); +void geom_cleanup(void); +void geom_render(int index, enum Geometry_Draw_Mode); +int geom_render_in_frustum(int index, + vec4* frustum, + struct Transform* transform, + enum Geometry_Draw_Mode draw_mode); +int geom_create(const char* name, + vec3* vertices, + vec2* uvs, + vec3* normals, + uint* indices, + vec3* vertex_colors); +struct Bounding_Sphere* geom_bounding_sphere_get(int index); #endif diff --git a/src/model.c b/src/model.c index 7f793af..b59247b 100644 --- a/src/model.c +++ b/src/model.c @@ -11,6 +11,7 @@ #include "light.h" #include "editor.h" #include "variant.h" +#include "bounding_volumes.h" #include "gl_load.h" #include @@ -391,6 +392,7 @@ void model_render_all_debug(struct Camera* camera, const vec4* debug_color) { assert(debug_shader > -1); + int geometry = geom_create_from_file("sphere.pamesh"); shader_bind(debug_shader); { static mat4 mvp; @@ -400,9 +402,23 @@ void model_render_all_debug(struct Camera* camera, struct Model* model = &model_list[i]; struct Entity* entity = entity_get(model->node); struct Transform* transform = entity_component_get(entity, C_TRANSFORM); - int geometry = model->geometry_index; + int geometry_ac = model->geometry_index; + struct Bounding_Sphere* sphere = geom_bounding_sphere_get(geometry_ac); + struct Transform temp_trans; + memcpy(&temp_trans, transform, sizeof(struct Transform)); + temp_trans.node = -1; + vec3_scale(&temp_trans.scale, &temp_trans.scale, sphere->radius); + transform_update_transmat(&temp_trans); + struct Entity* parent = entity_get(entity->parent); + if(parent) + { + struct Transform* parent_transform = entity_component_get(parent, C_TRANSFORM); + mat4_mul(&temp_trans.trans_mat, &temp_trans.trans_mat, &parent_transform->trans_mat); + } + mat4_identity(&mvp); - mat4_mul(&mvp, &camera->view_proj_mat, &transform->trans_mat); + //mat4_mul(&mvp, &camera->view_proj_mat, &transform->trans_mat); + mat4_mul(&mvp, &camera->view_proj_mat, &temp_trans.trans_mat); shader_set_uniform_mat4(debug_shader, "mvp", &mvp); geom_render(geometry, draw_mode); } diff --git a/src/sound.h b/src/sound.h index 07317d1..3442334 100644 --- a/src/sound.h +++ b/src/sound.h @@ -6,7 +6,7 @@ #ifdef AL_DEBUG #define al_check(expr) {expr; sound_error_check(__FILE__, __LINE__, #expr);} #else - #define al_check(expr); + #define al_check(expr) expr; #endif struct Sound_Source diff --git a/src/transform.c b/src/transform.c index 34a6a7c..f14ca4f 100644 --- a/src/transform.c +++ b/src/transform.c @@ -48,17 +48,19 @@ int transform_create(int node) void transform_translate(struct Transform* transform, vec3* amount, enum Transform_Space space) { + vec3 translation_amount; + vec3_assign(&translation_amount, amount); if(space == TS_LOCAL) { - quat_mul_vec3(amount, &transform->rotation, amount); + quat_mul_vec3(&translation_amount, &transform->rotation, &translation_amount); } else if(space == TS_PARENT) { struct Entity* parent = entity_get_parent(transform->node); struct Transform* parent_tran = entity_component_get(parent, C_TRANSFORM); - quat_mul_vec3(amount, &parent_tran->rotation, amount); + quat_mul_vec3(&translation_amount, &parent_tran->rotation, &translation_amount); } - vec3_add(&transform->position, &transform->position, amount); + vec3_add(&transform->position, &transform->position, &translation_amount); transform_update_transmat(transform); } void transform_rotate(struct Transform* transform, @@ -175,7 +177,6 @@ void transform_update_transmat(struct Transform* transform) transform_update_transmat(child_tran); } } - entity_sync_components(entity); } } @@ -211,6 +212,18 @@ void transform_get_absolute_pos(struct Transform* transform, vec3* res) vec3_add(res, res, &transform->position); } +void transform_get_absolute_scale(struct Transform* transform, vec3* res) +{ + struct Entity* entity = entity_get(transform->node); + struct Entity* parent = entity_get(entity->parent); + if(parent) + { + struct Transform* parent_tran = entity_component_get(parent, C_TRANSFORM); + transform_get_absolute_scale(parent_tran, res); + } + vec3_add(res, res, &transform->scale); +} + void transform_get_absolute_rot(struct Transform* transform, quat* res) { struct Entity* entity = entity_get(transform->node); diff --git a/src/transform.h b/src/transform.h index e23e805..51489f6 100644 --- a/src/transform.h +++ b/src/transform.h @@ -32,9 +32,10 @@ void transform_get_up(struct Transform* transform, vec3* res); void transform_get_right(struct Transform* transform, vec3* res); void transform_update_transmat(struct Transform* transform); void transform_get_absolute_pos(struct Transform* transform, vec3* res); +void transform_get_absolute_rot(struct Transform* transform, quat* res); +void transform_get_absolute_scale(struct Transform* transform, vec3* res); void transform_get_absolute_lookat(struct Transform* transform, vec3* res); void transform_get_absolute_up(struct Transform* transform, vec3* res); -void transform_get_absolute_rot(struct Transform* transform, quat* res); void transform_get_absolute_right(struct Transform* transform, vec3* res); void transform_get_absolute_forward(struct Transform* transform, vec3* res);