solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 3d21cacdfd8f31136192afeab00381921c62fc4b
parent 77d243c5f1a8927e4541376f4213c4d43b2994a6
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 23 Sep 2016 17:28:20 +0200

BugFix: fixed test solver #2b

Was about reusing local coordinates, but local to another instance!?
Now constructs the local data when needed.

Diffstat:
Msrc/ssol_scene.c | 17++++++-----------
Msrc/ssol_solver.c | 18++++++------------
Msrc/ssol_solver_c.h | 2--
3 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -368,29 +368,24 @@ hit_filter_function switch (shape->type) { case SHAPE_PUNCHED: { /* hits on quadrics must be recomputed more accurately */ - double org_local[3], dir_local[3]; + double org_local[3], hit_pos_local[3], dir_local[3]; const double* transform = inst->transform; double tr[9]; d33_inverse(tr, transform); /* get org in local coordinate */ - if (prev && prev->on_punched) { - d3_set(org_local, prev->hit_pos_local); - } - else { - d3_set(org_local, seg->org); - d3_sub(org_local, org_local, transform + 9); - d33_muld3(org_local, tr, org_local); - } + d3_set(org_local, seg->org); + d3_sub(org_local, org_local, transform + 9); + d33_muld3(org_local, tr, org_local); /* get dir in local */ d33_muld3(dir_local, tr, seg->dir); /* recompute hit */ int valid = punched_shape_intersect_local(shape, org_local, dir_local, - hit->distance, seg->hit_pos_local, seg->hit_normal, &seg->hit_distance); + hit->distance, hit_pos_local, seg->hit_normal, &seg->hit_distance); if (!valid) return 1; /* transform point to world */ - d33_muld3(seg->hit_pos, transform, seg->hit_pos_local); + d33_muld3(seg->hit_pos, transform, hit_pos_local); d3_add(seg->hit_pos, transform + 9, seg->hit_pos); /* transform normal to world */ d33_invtrans(tr, transform); diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -202,7 +202,6 @@ check_fst_segment(const struct segment* seg) ASSERT(seg->hit_material); ASSERT_NAN(seg->hit_normal, 3); ASSERT_NAN(seg->hit_pos, 3); - if (seg->on_punched) ASSERT_NAN(seg->hit_pos_local, 3); ASSERT(seg->on_punched != NON_BOOL); ASSERT_NAN(seg->org, 3); ASSERT_NAN(&seg->tmin, 1); @@ -278,7 +277,6 @@ reset_segment(struct segment* seg) seg->hit_material = NULL; d3_splat(seg->hit_normal, NAN); d3_splat(seg->hit_pos, NAN); - d3_splat(seg->hit_pos_local, NAN); seg->on_punched = NON_BOOL; d3_splat(seg->org, NAN); seg->self_instance = NULL; @@ -303,7 +301,6 @@ reset_starting_point(struct starting_point* start) d3_splat(start->sampl_normal, NAN); start->on_punched = NON_BOOL; d3_splat(start->pos, NAN); - d3_splat(start->pos_local, NAN); start->sampl_primitive = S3D_PRIMITIVE_NULL; d3_splat(start->sundir, NAN); start->uv[0] = start->uv[1] = NAN; @@ -324,7 +321,6 @@ check_starting_point(const struct starting_point* start) ASSERT_NAN(start->sampl_normal, 3); ASSERT(start->on_punched != NON_BOOL); ASSERT_NAN(start->pos, 3); - if(start->on_punched) ASSERT_NAN(start->pos_local, 3); ASSERT(!S3D_PRIMITIVE_EQ(&start->sampl_primitive, &S3D_PRIMITIVE_NULL)); ASSERT_NAN(start->sundir, 3); ASSERT_NAN(start->uv, 2); @@ -435,18 +431,17 @@ sample_point_on_primary_mirror(struct realisation* rs) } case SHAPE_PUNCHED: { const double* transform = start->instance->transform; - double tr[9]; + double tr[9], pos_local[3]; /* project the sampled point on the quadric */ d33_inverse(tr, transform); - d3_set(start->pos_local, start->pos); - d3_sub(start->pos_local, start->pos_local, transform + 9); - d33_muld3(start->pos_local, tr, start->pos_local); - punched_shape_set_z_local(shape, start->pos_local); + d3_sub(pos_local, start->pos, transform + 9); + d33_muld3(pos_local, tr, pos_local); + punched_shape_set_z_local(shape, pos_local); /* transform point to world */ - d33_muld3(start->pos, transform, start->pos_local); + d33_muld3(start->pos, transform, pos_local); d3_add(start->pos, transform + 9, start->pos); /* compute exact normal on the instance */ - punched_shape_set_normal_local(shape, start->pos_local, start->rt_normal); + punched_shape_set_normal_local(shape, pos_local, start->rt_normal); /* transform normal to world */ d33_invtrans(tr, transform); d33_muld3(start->rt_normal, tr, start->rt_normal); @@ -549,7 +544,6 @@ receive_sunlight(struct realisation* rs) seg->hit_material = start->material; d3_set(seg->hit_normal, start->rt_normal); d3_set(seg->hit_pos, start->pos); - d3_set(seg->hit_pos_local, start->pos_local); seg->on_punched = start->on_punched; seg->hit_instance = seg->self_instance; seg->self_instance = NULL; diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h @@ -65,7 +65,6 @@ struct segment { struct s3d_hit hit; double org[3], dir[4]; double hit_pos[3]; - double hit_pos_local[3]; /* in local coordinate, only set on punched shapes */ double hit_normal[3]; /* possibly reversed to face the incoming dir */ double hit_distance; float tmin; /* used to reject duplicate hits in raytracing */ @@ -81,7 +80,6 @@ struct starting_point { struct s3d_primitive sampl_primitive; double sundir[3]; double pos[3]; - double pos_local[3]; /* in local coordinate, only set on punched shapes */ double rt_normal[3]; /* relative to the actual geometry; towards the sun*/ double sampl_normal[3]; /* relative to the sampling plane; towards the sun*/ double cos_sun; /* relative to the sampling plane; > 0 */