solstice-solver

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

commit 1f552a8ec7190d4f106d5fcb55ad0807f2a213a4
parent 62652888f7187ac95d5a4eb523fe5422bf70f691
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 15 Mar 2017 11:44:29 +0100

Refactor the ssol_punched_surface_setup

Split the setup of the quadric private data in several functions.

Diffstat:
Msrc/ssol_shape.c | 107+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 69 insertions(+), 38 deletions(-)

diff --git a/src/ssol_shape.c b/src/ssol_shape.c @@ -929,6 +929,64 @@ shape_release(ref_T* ref) SSOL(device_ref_put(dev)); } +/* Return the parabol discretisation parameter */ +static INLINE size_t +priv_data_parabol_setup + (struct priv_parabol_data* data, + struct ssol_quadric_parabol* parabol, + const double lower[3], + const double upper[3]) +{ + double max_z; + ASSERT(data && parabol && lower && upper); + + data->focal = parabol->focal; + data->_1_4f = 1 / (4.0 * parabol->focal); + max_z = MMAX(parabol_z(lower, data), parabol_z(upper, data)); + return MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); +} + +static INLINE size_t +priv_data_hyperbol_setup + (struct priv_hyperbol_data* data, + struct ssol_quadric_hyperbol* hyperbol, + const double lower[3], + const double upper[3]) +{ + double g, f, a2; + double max_z; + ASSERT(data && hyperbol && lower && upper); + + /* Re-dimensionalize */ + g = hyperbol->real_focal + hyperbol->img_focal; + f = hyperbol->real_focal / g; + a2 = g * g * (f - f * f); + + data->g_2 = g * 0.5; + data->abs_b = g * fabs(f - 0.5); + data->_a2_b2 = a2 / (data->abs_b * data->abs_b); + data->_1_a2 = 1 / a2; + max_z = MMAX(hyperbol_z(lower, data), hyperbol_z(upper, data)); + return MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); +} + +static INLINE size_t +priv_data_parabolic_cylinder_setup + (struct priv_pcylinder_data* data, + struct ssol_quadric_parabolic_cylinder* parabolic_cylinder, + const double lower[3], + const double upper[3]) +{ + double max_z; + ASSERT(data && parabolic_cylinder && lower && upper); + + data->focal = parabolic_cylinder->focal; + data->_1_4f = 1 / (4.0 * parabolic_cylinder->focal); + max_z = MMAX + (parabolic_cylinder_z(lower, data), parabolic_cylinder_z(upper, data)); + return MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); +} + /******************************************************************************* * Local functions ******************************************************************************/ @@ -1168,51 +1226,24 @@ ssol_punched_surface_setup goto error; } - /* Define the #slices of the discretized quadric */ + /* Define the #slices of the discretized quadric & setup internal data */ switch (psurf->quadric->type) { case SSOL_QUADRIC_PLANE: nslices = 1; break; - case SSOL_QUADRIC_PARABOL: { - const struct ssol_quadric_parabol* parabol - = &psurf->quadric->data.parabol; - struct priv_parabol_data* data = &shape->priv_quadric.data.parabol; - double max_z; - data->focal = parabol->focal; - data->_1_4f = 1 / (4.0 * parabol->focal); - max_z = MMAX(parabol_z(lower, data), parabol_z(upper, data)); - nslices = MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); + case SSOL_QUADRIC_PARABOL: + nslices = priv_data_parabol_setup(&shape->priv_quadric.data.parabol, + &psurf->quadric->data.parabol, lower, upper); break; - } - case SSOL_QUADRIC_HYPERBOL: { - const struct ssol_quadric_hyperbol* hyperbol = - &psurf->quadric->data.hyperbol; - struct priv_hyperbol_data* data = &shape->priv_quadric.data.hyperbol; - /* re-dimensionalize */ - const double g = hyperbol->real_focal + hyperbol->img_focal; - const double f = hyperbol->real_focal / g; - const double a2 = g * g * (f - f * f); - double max_z; - data->g_2 = g * 0.5; - data->abs_b = g * fabs(f - 0.5); - data->_a2_b2 = a2 / (data->abs_b * data->abs_b); - data->_1_a2 = 1 / a2; - max_z = MMAX(hyperbol_z(lower, data), hyperbol_z(upper, data)); - nslices = MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); + case SSOL_QUADRIC_HYPERBOL: + nslices = priv_data_hyperbol_setup(&shape->priv_quadric.data.hyperbol, + &psurf->quadric->data.hyperbol, lower, upper); break; - } - case SSOL_QUADRIC_PARABOLIC_CYLINDER: { - const struct ssol_quadric_parabolic_cylinder* parabolic_cylinder - = &psurf->quadric->data.parabolic_cylinder; - struct priv_pcylinder_data* data = &shape->priv_quadric.data.pcylinder; - double max_z; - data->focal = psurf->quadric->data.parabolic_cylinder.focal; - data->_1_4f = 1 / (4.0 * parabolic_cylinder->focal); - max_z = MMAX(parabolic_cylinder_z(lower, data), - parabolic_cylinder_z(upper, data)); - nslices = MMIN(50, (size_t) (3 + sqrt(max_z) * 6)); + case SSOL_QUADRIC_PARABOLIC_CYLINDER: + nslices = priv_data_parabolic_cylinder_setup + (&shape->priv_quadric.data.pcylinder, + &psurf->quadric->data.parabolic_cylinder,lower, upper); break; - } default: FATAL("Unreachable code\n"); break; }