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:
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 */