star-gs

Literate program for a geometric sensitivity calculation
git clone git://git.meso-star.fr/star-gs.git
Log | Files | Refs | README | LICENSE

commit 92fcd0a6a58d024d14d67c90229fda65d1508090
parent 9d17704a5783361973f04e99bb0d630d2c5d8ab3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 29 Jun 2022 15:40:55 +0200

Enable size variation of the box

Diffstat:
Msrc/sgs_compute_sensitivity_translation.c | 72+++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 49 insertions(+), 23 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.c b/src/sgs_compute_sensitivity_translation.c @@ -31,21 +31,22 @@ enum {X, Y, Z}; enum {WEIGHT, SENSIT, WEIGHTS_COUNT__}; /* FIXME this should be variables */ +#if 0 static const double RECV_MIN[2] = {0.5, 1.5}; static const double RECV_MAX[2] = {1.5, 2.5}; static const double EMIT_E_THRESHOLD = 2; static const double EMIT_E_SZ[3] = {0, 4, 2}; static const double EMIT_S_SZ[3] = {4, 4, 0}; - -static const double V[3] = {0, 0, 1}; - -#if 0 +#else static const double RECV_MIN[2] = {0.125, 0.375}; static const double RECV_MAX[2] = {0.375, 0.625}; -static const double EMIT_THRESHOLD = 0.5; -static const double V[3] = {0, 0, 1}; +static const double EMIT_E_THRESHOLD = 2.0/3.0; +static const double EMIT_E_SZ[3] = {0, 1, 2.0/3.0}; +static const double EMIT_S_SZ[3] = {1, 1, 0}; #endif +static const double V[3] = {0, 0, 1}; + /******************************************************************************* * Helper functions ******************************************************************************/ @@ -61,6 +62,16 @@ realisation struct sgs_hit hit = SGS_HIT_NULL; struct sgs_fragment frag = SGS_FRAGMENT_NULL; + double recv_min[2]; + double recv_max[2]; + double emit_e_threshold; + double emit_e_sz[3]; + double emit_s_sz[3]; + + double box_low[3]; + double box_upp[3]; + double box_sz[3]; + double normal_e[3]; double normal_s[3]; @@ -105,6 +116,21 @@ realisation range[0] = 0, range[1] = INF; + /* Retrieve the scene data */ + sgs_geometry_get_aabb(sgs->geom, box_low, box_upp); + d3_sub(box_sz, box_upp, box_low); + recv_min[X] = RECV_MIN[X]*box_sz[X] + box_low[X]; + recv_min[Y] = RECV_MIN[Y]*box_sz[Y] + box_low[Y]; + recv_max[X] = RECV_MAX[X]*box_sz[X] + box_low[X]; + recv_max[Y] = RECV_MAX[Y]*box_sz[Y] + box_low[Y]; + emit_e_threshold = EMIT_E_THRESHOLD*box_sz[Z] + box_low[Z]; + emit_e_sz[X] = EMIT_E_SZ[X]*box_sz[X] + box_low[X]; + emit_e_sz[Y] = EMIT_E_SZ[Y]*box_sz[Y] + box_low[Y]; + emit_e_sz[Z] = EMIT_E_SZ[Z]*box_sz[Z] + box_low[Z]; + emit_s_sz[X] = EMIT_S_SZ[X]*box_sz[X] + box_low[X]; + emit_s_sz[Y] = EMIT_S_SZ[Y]*box_sz[Y] + box_low[Y]; + emit_s_sz[Z] = EMIT_S_SZ[Z]*box_sz[Z] + box_low[Z]; + /* Sample the sensitivity emissive surface */ sgs_geometry_sample(sgs->geom, rng, &frag); pos_emit_s[X] = frag.position[X]; @@ -131,8 +157,8 @@ realisation /* The ray does not reach the receiver, the MC weight is NULL */ if(hit.surface != SGS_SURFACE_Z_NEG - || pos_recv[X] < RECV_MIN[X] || RECV_MAX[X] < pos_recv[X] - || pos_recv[Y] < RECV_MIN[Y] || RECV_MAX[Y] < pos_recv[Y]) { + || pos_recv[X] < recv_min[X] || recv_max[X] < pos_recv[X] + || pos_recv[Y] < recv_min[Y] || recv_max[Y] < pos_recv[Y]) { goto exit; } @@ -153,7 +179,7 @@ realisation surf_emit_e = hit.surface; /* The reflected position is not an the emitter, the MC weight is null */ - if(surf_emit_e != SGS_SURFACE_X_POS || pos_emit_e[Z] > EMIT_E_THRESHOLD) { + if(surf_emit_e != SGS_SURFACE_X_POS || pos_emit_e[Z] > emit_e_threshold) { goto exit; } @@ -184,34 +210,34 @@ realisation beta_spec_e = d3_normalize(u_spec_e, u_spec_e); rho = 0.25 - * (1 - cos(2*PI*pos_emit_s[X]/EMIT_S_SZ[X])) - * (1 - cos(2*PI*pos_emit_s[Y]/EMIT_S_SZ[Y])); + * (1 - cos(2*PI*pos_emit_s[X]/emit_s_sz[X])) + * (1 - cos(2*PI*pos_emit_s[Y]/emit_s_sz[Y])); grad_rho[X] = 0.25 - * (((2*PI)/EMIT_S_SZ[X])*sin(2*PI*pos_emit_s[X]/EMIT_S_SZ[X])) - * (1 - cos(2*PI*pos_emit_s[Y]/EMIT_S_SZ[Y])); + * (((2*PI)/emit_s_sz[X])*sin(2*PI*pos_emit_s[X]/emit_s_sz[X])) + * (1 - cos(2*PI*pos_emit_s[Y]/emit_s_sz[Y])); grad_rho[Y] = 0.25 - * (((2*PI)/EMIT_S_SZ[Y])*sin(2*PI*pos_emit_s[Y]/EMIT_S_SZ[Y])) - * (1 - cos(2*PI*pos_emit_s[X]/EMIT_S_SZ[X])); + * (((2*PI)/emit_s_sz[Y])*sin(2*PI*pos_emit_s[Y]/emit_s_sz[Y])) + * (1 - cos(2*PI*pos_emit_s[X]/emit_s_sz[X])); grad_rho[Z] = 0; I = - (1 - cos(2*PI*pos_emit_e[Y]/EMIT_E_SZ[Y])) - * (1 - cos(2*PI*pos_emit_e[Z]/EMIT_E_SZ[Z])); + (1 - cos(2*PI*pos_emit_e[Y]/emit_e_sz[Y])) + * (1 - cos(2*PI*pos_emit_e[Z]/emit_e_sz[Z])); grad_I[X] = 0; grad_I[Y] = - (((2*PI)/EMIT_E_SZ[Y])*sin(2*PI*pos_emit_e[Y]/EMIT_E_SZ[Y])) - * (1 - cos(2*PI*pos_emit_e[Z]/EMIT_E_SZ[Z])); + (((2*PI)/emit_e_sz[Y])*sin(2*PI*pos_emit_e[Y]/emit_e_sz[Y])) + * (1 - cos(2*PI*pos_emit_e[Z]/emit_e_sz[Z])); grad_I[Z] = - (((2*PI)/EMIT_E_SZ[Z])*sin(2*PI*pos_emit_e[Z]/EMIT_E_SZ[Z])) - * (1 - cos(2*PI*pos_emit_e[Y]/EMIT_E_SZ[Y])); + (((2*PI)/emit_e_sz[Z])*sin(2*PI*pos_emit_e[Z]/emit_e_sz[Z])) + * (1 - cos(2*PI*pos_emit_e[Y]/emit_e_sz[Y])); S = - beta_emit_s * d3_dot(grad_rho, u_emit_s) * I - rho * beta_emit_s * beta_emit_e * d3_dot(grad_I, u_emit_e) + rho * beta_spec_s * beta_spec_e * d3_dot(grad_I, u_spec_e); - w = I*EMIT_S_SZ[X]*EMIT_S_SZ[Y]*PI; /* Weight */ - s = S*EMIT_S_SZ[X]*EMIT_S_SZ[Y]*PI; /* Sensib */ + w = I*emit_s_sz[X]*emit_s_sz[Y]*PI; /* Weight */ + s = S*emit_s_sz[X]*emit_s_sz[Y]*PI; /* Sensib */ exit: SMC_DOUBLEN(weights)[WEIGHT] = w;