Fixed frustum culling bug

dev
shariq 8 years ago
parent da302520b7
commit 01183bbe5d
  1. 3
      orgfile.org
  2. 15
      src/bounding_volumes.c
  3. 13
      src/bounding_volumes.h
  4. 24
      src/geometry.c
  5. 4
      src/geometry.h
  6. 2
      src/model.c

@ -233,7 +233,8 @@ x Font atlas proper cleanup
** TODO Ingame console and console commands etc ** 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 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 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 ** DONE Array-based Hashmaps
- State "DONE" from "TODO" [2017-05-07 Sun 18:42] - State "DONE" from "TODO" [2017-05-07 Sun 18:42]
** TODO Sprite sheet animations ** TODO Sprite sheet animations

@ -4,8 +4,9 @@
#include <math.h> #include <math.h>
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 min, max, size, center, half_ext, half_size;
vec3_fill(&min, 0.f, 0.f, 0.f); vec3_fill(&min, 0.f, 0.f, 0.f);
vec3_fill(&max, 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; 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; int intersect_type = IT_INSIDE;
vec3 center, abs_pos, abs_scale; 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_pos, 0.f, 0.f, 0.f);
vec3_fill(&abs_scale, 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_pos(entity, &abs_pos);
transform_get_absolute_scale(transform, &abs_scale); transform_get_absolute_scale(entity, &abs_scale);
float max_scale_dimension = fabsf(abs_scale.x); 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.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); 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; 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++) for(int i = 0; i < 6; i++)
{ {
if((frustum[i].x * point->x + if((frustum[i].x * point->x +
frustum[i].y * point->y + frustum[i].y * point->y +
frustum[i].z * point->z + frustum[i].z * point->z +
frustum[i].w) < 0 ) frustum[i].w) < 0 )
success = 0; success = false;
} }
return success; return success;
} }

@ -1,9 +1,10 @@
#ifndef bounding_volumes_H #ifndef BOUNDING_VOLUMES_H
#define bounding_volumes_H #define BOUNDING_VOLUMES_H
#include "linmath.h" #include "linmath.h"
#include "num_types.h"
struct Transform; struct Entity;
struct Bounding_Box struct Bounding_Box
{ {
@ -35,8 +36,8 @@ enum Frustum_Planes
FP_NUM_PLANES FP_NUM_PLANES
}; };
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);
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 bv_intersect_frustum_point(vec4* frustum, const vec3* point); bool bv_intersect_frustum_point(vec4* frustum, const vec3* point);
#endif #endif

@ -371,24 +371,24 @@ 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, vec4* frustum,
struct Transform* transform, struct Entity* entity,
enum Geometry_Draw_Mode draw_mode) enum Geometry_Draw_Mode draw_mode)
{ {
int rendered = 0;
struct Geometry* geometry = &geometry_list[index]; struct Geometry* geometry = &geometry_list[index];
int intersection = bv_intersect_frustum_sphere(frustum, &geometry->bounding_sphere, transform); int indices_rendered = 0;
int intersection = bv_intersect_frustum_sphere(frustum, &geometry->bounding_sphere, entity);
if(intersection == IT_INTERSECT || intersection == IT_INSIDE) if(intersection == IT_INTERSECT || intersection == IT_INSIDE)
{ {
geom_render(index, draw_mode); 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, transform); /* intersection = bv_intersect_frustum_box(frustum, &geometry->bounding_box, entity); */
if(intersection == IT_INTERSECT || intersection == IT_INSIDE) /* if(intersection == IT_INTERSECT || intersection == IT_INSIDE) */
{ /* { */
geom_render(index, draw_mode); /* geom_render(index, draw_mode); */
rendered = array_len(geometry->indices); /* rendered = array_len(geometry->indices); */
} /* } */
} }
return rendered; return indices_rendered;
} }
struct Bounding_Sphere* geom_bounding_sphere_get(int index) struct Bounding_Sphere* geom_bounding_sphere_get(int index)

@ -4,7 +4,7 @@
#include "num_types.h" #include "num_types.h"
#include "linmath.h" #include "linmath.h"
struct Transform; struct Entity;
enum Geometry_Draw_Mode enum Geometry_Draw_Mode
{ {
@ -24,7 +24,7 @@ void geom_bounding_volume_generate(int index);
void geom_bounding_volume_generate_all(void); void geom_bounding_volume_generate_all(void);
int geom_render_in_frustum(int index, int geom_render_in_frustum(int index,
vec4* frustum, vec4* frustum,
struct Transform* transform, struct Entity* transform,
enum Geometry_Draw_Mode draw_mode); enum Geometry_Draw_Mode draw_mode);
int geom_create(const char* name, int geom_create(const char* name,
vec3* vertices, vec3* vertices,

@ -219,7 +219,7 @@ void model_render_all(struct Entity* camera_entity, int draw_mode)
} }
/* Render the geometry */ /* 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) if(indices > 0)
{ {
num_rendered++; num_rendered++;

Loading…
Cancel
Save