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:
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;