From 01183bbe5d70b2dca7b63644ae40126b16a9c415 Mon Sep 17 00:00:00 2001 From: shariq Date: Wed, 31 May 2017 23:38:28 +0500 Subject: [PATCH] Fixed frustum culling bug --- orgfile.org | 3 ++- src/bounding_volumes.c | 15 ++++++++------- src/bounding_volumes.h | 13 +++++++------ src/geometry.c | 24 ++++++++++++------------ src/geometry.h | 6 +++--- src/model.c | 2 +- 6 files changed, 33 insertions(+), 30 deletions(-) diff --git a/orgfile.org b/orgfile.org index b693486..5acc83f 100644 --- a/orgfile.org +++ b/orgfile.org @@ -233,7 +233,8 @@ x Font atlas proper cleanup ** TODO Ingame console and console commands etc ** TODO Allow binding/unbinding input maps to functions at runtime, for example if input map "Recompute" is triggered, it would call some function that can recompute bounding spheres. ** TODO Better handling of wav format checking at load time -** TODO Fix frustum culling bugs +** DONE Fix frustum culling bugs +- State "DONE" from "TODO" [2017-05-31 Wed 23:38] ** DONE Array-based Hashmaps - State "DONE" from "TODO" [2017-05-07 Sun 18:42] ** TODO Sprite sheet animations diff --git a/src/bounding_volumes.c b/src/bounding_volumes.c index c686fb1..c8f157f 100644 --- a/src/bounding_volumes.c +++ b/src/bounding_volumes.c @@ -4,8 +4,9 @@ #include -int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Transform* transform) +int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Entity* entity) { + struct Transform* transform = &entity->transform; vec3 min, max, size, center, half_ext, half_size; vec3_fill(&min, 0.f, 0.f, 0.f); vec3_fill(&max, 0.f, 0.f, 0.f); @@ -36,7 +37,7 @@ int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Tra return IT_INSIDE; } -int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, struct Transform* transform) +int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, struct Entity* entity) { int intersect_type = IT_INSIDE; vec3 center, abs_pos, abs_scale; @@ -45,8 +46,8 @@ int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, s vec3_fill(&abs_pos, 0.f, 0.f, 0.f); vec3_fill(&abs_scale, 0.f, 0.f, 0.f); - transform_get_absolute_pos(transform, &abs_pos); - transform_get_absolute_scale(transform, &abs_scale); + transform_get_absolute_pos(entity, &abs_pos); + transform_get_absolute_scale(entity, &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); @@ -74,16 +75,16 @@ int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, s return intersect_type; } -int bv_intersect_frustum_point(vec4* frustum, const vec3* point) +bool bv_intersect_frustum_point(vec4* frustum, const vec3* point) { - int success = 1; + bool success = true; for(int i = 0; i < 6; i++) { if((frustum[i].x * point->x + frustum[i].y * point->y + frustum[i].z * point->z + frustum[i].w) < 0 ) - success = 0; + success = false; } return success; } diff --git a/src/bounding_volumes.h b/src/bounding_volumes.h index 36d20f6..113dbca 100644 --- a/src/bounding_volumes.h +++ b/src/bounding_volumes.h @@ -1,9 +1,10 @@ -#ifndef bounding_volumes_H -#define bounding_volumes_H +#ifndef BOUNDING_VOLUMES_H +#define BOUNDING_VOLUMES_H #include "linmath.h" +#include "num_types.h" -struct Transform; +struct Entity; struct Bounding_Box { @@ -35,8 +36,8 @@ enum Frustum_Planes FP_NUM_PLANES }; -int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Transform* transform); -int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, struct Transform* transform); -int bv_intersect_frustum_point(vec4* frustum, const vec3* point); +int bv_intersect_frustum_box(vec4* frustum, struct Bounding_Box* box, struct Entity* entity); +int bv_intersect_frustum_sphere(vec4* frustum, struct Bounding_Sphere* sphere, struct Entity* entity); +bool bv_intersect_frustum_point(vec4* frustum, const vec3* point); #endif diff --git a/src/geometry.c b/src/geometry.c index cd1109a..484c004 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -371,24 +371,24 @@ void geom_render(int index, enum Geometry_Draw_Mode draw_mode) int geom_render_in_frustum(int index, vec4* frustum, - struct Transform* transform, + struct Entity* entity, enum Geometry_Draw_Mode draw_mode) { - int rendered = 0; - struct Geometry* geometry = &geometry_list[index]; - int intersection = bv_intersect_frustum_sphere(frustum, &geometry->bounding_sphere, transform); + struct Geometry* geometry = &geometry_list[index]; + int indices_rendered = 0; + int intersection = bv_intersect_frustum_sphere(frustum, &geometry->bounding_sphere, entity); if(intersection == IT_INTERSECT || intersection == IT_INSIDE) { geom_render(index, draw_mode); - rendered = array_len(geometry->indices); - intersection = bv_intersect_frustum_box(frustum, &geometry->bounding_box, transform); - if(intersection == IT_INTERSECT || intersection == IT_INSIDE) - { - geom_render(index, draw_mode); - rendered = array_len(geometry->indices); - } + indices_rendered = array_len(geometry->indices); + /* intersection = bv_intersect_frustum_box(frustum, &geometry->bounding_box, entity); */ + /* if(intersection == IT_INTERSECT || intersection == IT_INSIDE) */ + /* { */ + /* geom_render(index, draw_mode); */ + /* rendered = array_len(geometry->indices); */ + /* } */ } - return rendered; + return indices_rendered; } struct Bounding_Sphere* geom_bounding_sphere_get(int index) diff --git a/src/geometry.h b/src/geometry.h index e88d345..c966b68 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -4,7 +4,7 @@ #include "num_types.h" #include "linmath.h" -struct Transform; +struct Entity; enum Geometry_Draw_Mode { @@ -22,9 +22,9 @@ void geom_cleanup(void); void geom_render(int index, enum Geometry_Draw_Mode); void geom_bounding_volume_generate(int index); void geom_bounding_volume_generate_all(void); -int geom_render_in_frustum(int index, +int geom_render_in_frustum(int index, vec4* frustum, - struct Transform* transform, + struct Entity* transform, enum Geometry_Draw_Mode draw_mode); int geom_create(const char* name, vec3* vertices, diff --git a/src/model.c b/src/model.c index c2aead1..c892455 100644 --- a/src/model.c +++ b/src/model.c @@ -219,7 +219,7 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) } /* Render the geometry */ - int indices = geom_render_in_frustum(model->geometry_index, &camera_entity->camera.frustum[0], transform, draw_mode); + int indices = geom_render_in_frustum(model->geometry_index, &camera_entity->camera.frustum[0], entity, draw_mode); if(indices > 0) { num_rendered++;