commit b91e596b241bcdf91cc4b8bcb9bbbc8146a19043
parent e3c0df09d923326dd728cdb3a87164bf2db0ac3e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 15 Feb 2018 14:35:12 +0100
Fix a warning in Release
Also improve code for self-hit filtering.
Diffstat:
1 file changed, 15 insertions(+), 23 deletions(-)
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -467,11 +467,6 @@ get_scn_position(const unsigned ivert, float pos[3], void* ctx) {
f3_set_d3(pos, pt->vec);
}
-struct ray_ctx {
- component_id_t origin_component;
- const struct darray_triangle_comp* triangles_comp;
-};
-
static int
self_hit_filter
(const struct s3d_hit* hit,
@@ -480,32 +475,30 @@ self_hit_filter
void* ray_data,
void* filter_data)
{
- const struct senc_descriptor* desc = filter_data;
- const struct ray_ctx* ctx = ray_data;
+ const struct darray_triangle_comp* triangles_comp = filter_data;
+ const component_id_t* origin_component = ray_data;
const struct triangle_comp* hit_trg_comp;
enum side_id hit_side;
component_id_t hit_component;
(void)ray_org; (void)ray_dir;
- ASSERT(hit && ray_org && ctx && ray_data && desc);
- ASSERT(hit->prim.prim_id < darray_triangle_comp_size_get(ctx->triangles_comp));
- hit_trg_comp
- = darray_triangle_comp_cdata_get(ctx->triangles_comp) + hit->prim.prim_id;
+ ASSERT(hit && triangles_comp && origin_component);
+ ASSERT(hit->prim.prim_id < darray_triangle_comp_size_get(triangles_comp));
+ hit_trg_comp = darray_triangle_comp_cdata_get(triangles_comp)
+ + hit->prim.prim_id;
hit_side = (hit->normal[2] > 0) ? SIDE_FRONT : SIDE_BACK;
hit_component = hit_trg_comp->component[hit_side];
- if(hit_component == ctx->origin_component) {
- /* self hit */
- ASSERT(hit->distance < 1e-6);
- }
- return (hit_component == ctx->origin_component);
+ /* Not self hit or distance should be small */
+ ASSERT(hit_component != *origin_component || hit->distance < 1e-6);
+ return (hit_component == *origin_component);
}
static res_T
group_connex_components
(struct senc_descriptor* desc,
struct trgside* trgsides,
- const struct darray_triangle_comp* triangles_comp,
+ struct darray_triangle_comp* triangles_comp,
struct darray_cc_descriptor* connex_components)
{
res_T res = RES_OK;
@@ -516,7 +509,6 @@ group_connex_components
struct s3d_shape* s3d_shp = NULL;
struct s3d_scene_view* s3d_view = NULL;
struct s3d_vertex_data attribs;
- struct ray_ctx ray_context;
size_t tmp;
component_id_t cc_count, c;
medium_id_t infinite_medium = MEDIUM_NULL__;
@@ -546,8 +538,7 @@ group_connex_components
ASSERT(desc->scene->nuverts < UINT_MAX);
OK(s3d_mesh_setup_indexed_vertices(s3d_shp, (unsigned)desc->scene->nutris,
get_scn_indices, (unsigned)desc->scene->nuverts, &attribs, 1, desc->scene));
- s3d_mesh_set_hit_filter_function(s3d_shp, self_hit_filter, desc);
- ray_context.triangles_comp = triangles_comp;
+ s3d_mesh_set_hit_filter_function(s3d_shp, self_hit_filter, triangles_comp);
OK(s3d_scene_attach_shape(s3d_scn, s3d_shp));
OK(s3d_scene_view_create(s3d_scn, S3D_TRACE, &s3d_view));
@@ -560,6 +551,8 @@ group_connex_components
struct cc_descriptor* const cc = descriptors + c;
const struct triangle_comp* origin_trg =
darray_triangle_comp_cdata_get(triangles_comp) + cc->max_z_vrtx_id;
+ component_id_t self_hit_component
+ = origin_trg->component[1 - TRGSIDE_2_SIDE(cc->max_z_side_id)];
ASSERT(cc->cc_group_root == CC_GROUP_ID_NONE);
@@ -583,9 +576,8 @@ group_connex_components
== TRGSIDE_OPPOSITE(cc->max_z_side_id))));
f3_set_d3(origin, cc->max_vrtx);
/* Self-hit data: self hit if hit this component "on the other side" */
- ray_context.origin_component
- = origin_trg->component[1- TRGSIDE_2_SIDE(cc->max_z_side_id)];
- OK(s3d_scene_view_trace_ray(s3d_view, origin, dir, range, &ray_context, &hit));
+ OK(s3d_scene_view_trace_ray(s3d_view, origin, dir, range,
+ &self_hit_component, &hit));
/* If no hit, the component is facing an infinite medium */
if(S3D_HIT_NONE(&hit)) {
cc->cc_group_root = CC_GROUP_ROOT_INFINITE;