From a7724d723c4d70dd8223a604a60e705027ee4ad2 Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Fri, 23 Feb 2024 09:29:11 -0500 Subject: [PATCH 1/8] added odf actor implementation --- .../SH-ODF experimental/odf_example.py | 31 + fury/actor.py | 48 ++ fury/actors/odf.py | 428 +++++++++++++ .../rt_odfs/descoteaux/eval_sh_10.frag | 175 ++++++ .../rt_odfs/descoteaux/eval_sh_12.frag | 238 +++++++ .../shaders/rt_odfs/descoteaux/eval_sh_2.frag | 23 + .../shaders/rt_odfs/descoteaux/eval_sh_4.frag | 46 ++ .../shaders/rt_odfs/descoteaux/eval_sh_6.frag | 79 +++ .../shaders/rt_odfs/descoteaux/eval_sh_8.frag | 122 ++++ fury/shaders/rt_odfs/eval_sh.frag | 16 + fury/shaders/rt_odfs/eval_sh_grad.frag | 16 + fury/shaders/rt_odfs/eval_sh_grad_10.frag | 430 +++++++++++++ fury/shaders/rt_odfs/eval_sh_grad_12.frag | 591 ++++++++++++++++++ fury/shaders/rt_odfs/eval_sh_grad_2.frag | 46 ++ fury/shaders/rt_odfs/eval_sh_grad_4.frag | 103 +++ fury/shaders/rt_odfs/eval_sh_grad_6.frag | 186 ++++++ fury/shaders/rt_odfs/eval_sh_grad_8.frag | 295 +++++++++ fury/shaders/rt_odfs/find_roots.frag | 82 +++ fury/shaders/rt_odfs/get_inv_vandermonde.frag | 58 ++ fury/shaders/rt_odfs/get_sh_glyph_normal.frag | 16 + .../shaders/rt_odfs/gltf_dielectric_brdf.frag | 41 ++ fury/shaders/rt_odfs/linear_rgb_to_srgb.frag | 4 + fury/shaders/rt_odfs/linear_to_srgb.frag | 4 + fury/shaders/rt_odfs/newton_bisection.frag | 47 ++ .../rt_odfs/ray_sh_glyph_intersections.frag | 81 +++ fury/shaders/rt_odfs/srgb_to_linear.frag | 4 + fury/shaders/rt_odfs/srgb_to_linear_rgb.frag | 4 + fury/shaders/rt_odfs/tonemap.frag | 5 + fury/shaders/rt_odfs/tournier/eval_sh_10.frag | 175 ++++++ fury/shaders/rt_odfs/tournier/eval_sh_12.frag | 238 +++++++ fury/shaders/rt_odfs/tournier/eval_sh_2.frag | 23 + fury/shaders/rt_odfs/tournier/eval_sh_4.frag | 46 ++ fury/shaders/rt_odfs/tournier/eval_sh_6.frag | 79 +++ fury/shaders/rt_odfs/tournier/eval_sh_8.frag | 122 ++++ fury/shaders/utils/minmax_norm.glsl | 4 + 35 files changed, 3906 insertions(+) create mode 100644 docs/experimental/SH-ODF experimental/odf_example.py create mode 100644 fury/actors/odf.py create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_10.frag create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_12.frag create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_2.frag create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_4.frag create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_6.frag create mode 100644 fury/shaders/rt_odfs/descoteaux/eval_sh_8.frag create mode 100644 fury/shaders/rt_odfs/eval_sh.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_10.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_12.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_2.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_4.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_6.frag create mode 100644 fury/shaders/rt_odfs/eval_sh_grad_8.frag create mode 100644 fury/shaders/rt_odfs/find_roots.frag create mode 100644 fury/shaders/rt_odfs/get_inv_vandermonde.frag create mode 100644 fury/shaders/rt_odfs/get_sh_glyph_normal.frag create mode 100644 fury/shaders/rt_odfs/gltf_dielectric_brdf.frag create mode 100644 fury/shaders/rt_odfs/linear_rgb_to_srgb.frag create mode 100644 fury/shaders/rt_odfs/linear_to_srgb.frag create mode 100644 fury/shaders/rt_odfs/newton_bisection.frag create mode 100644 fury/shaders/rt_odfs/ray_sh_glyph_intersections.frag create mode 100644 fury/shaders/rt_odfs/srgb_to_linear.frag create mode 100644 fury/shaders/rt_odfs/srgb_to_linear_rgb.frag create mode 100644 fury/shaders/rt_odfs/tonemap.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_10.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_12.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_2.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_4.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_6.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_8.frag create mode 100644 fury/shaders/utils/minmax_norm.glsl diff --git a/docs/experimental/SH-ODF experimental/odf_example.py b/docs/experimental/SH-ODF experimental/odf_example.py new file mode 100644 index 000000000..3b6c60469 --- /dev/null +++ b/docs/experimental/SH-ODF experimental/odf_example.py @@ -0,0 +1,31 @@ +import os + +import numpy as np +from dipy.data.fetcher import dipy_home +from dipy.io.image import load_nifti + +from fury import actor, window + +if __name__ == "__main__": + show_man = window.ShowManager(size=(1280, 720)) + + dataset_dir = os.path.join(dipy_home, "stanford_hardi") + + coeffs, affine = load_nifti("docs\experimental\SH-ODF experimental\coefs_odf.nii") + + valid_mask = np.abs(coeffs).max(axis=(-1)) > 0 + indices = np.nonzero(valid_mask) + + centers = np.asarray(indices).T + + x, y, z, s = coeffs.shape + coeffs = coeffs[:, :, :].reshape((x * y * z, s)) + n_glyphs = coeffs.shape[0] + + max_val = coeffs.min(axis=1) + total = np.sum(abs(coeffs), axis=1) + coeffs = np.dot(np.diag(1 / total), coeffs) * 1.7 + + odf_actor = actor.odf(centers=centers, coeffs=coeffs) + show_man.scene.add(odf_actor) + show_man.start() \ No newline at end of file diff --git a/fury/actor.py b/fury/actor.py index b8a4b440b..ae71bb95e 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -11,6 +11,7 @@ from fury.actors.odf_slicer import OdfSlicerActor from fury.actors.peak import PeakActor from fury.actors.tensor import tensor_ellipsoid +from fury.actors.odf import sh_odf from fury.colormap import colormap_lookup_table from fury.deprecator import deprecate_with_version, deprecated_params from fury.io import load_image @@ -3868,3 +3869,50 @@ def ellipsoid( return tensor_ellipsoid(centers, axes, lengths, colors, scales, opacity) + +def odf( + centers, + coeffs, + basis_type='descoteaux', + scales=1.0, + opacity=1.0 +): + """ + VTK actor for visualizing ODFs given an array of spherical harmonics (SH) + coefficients. + + Parameters + ---------- + centers : ndarray(N, 3) + ODFs positions. + coeffs : ndarray + 2D ODFs array in SH coefficients. + basis_type: str, optional + Type of basis (descoteaux, tournier) + 'descoteaux' for the default ``descoteaux07`` DYPY basis. + 'tournier' for the default ``tournier07` DYPY basis. + scales : float or ndarray (N, ) + ODFs size. + opacity : float + Takes values from 0 (fully transparent) to 1 (opaque). + + Returns + ------- + odf: Actor + + """ + + if not isinstance(centers, np.ndarray): + centers = np.array(centers) + if centers.ndim == 1: + centers = np.array([centers]) + + if not isinstance(scales, np.ndarray): + scales = np.array(scales) + if scales.size == 1: + scales = np.repeat(scales, centers.shape[0]) + elif scales.size != centers.shape[0]: + scales = np.concatenate( + (scales, np.ones(centers.shape[0] - scales.shape[0])), axis=None) + + return sh_odf(centers, coeffs, basis_type, scales, opacity) \ No newline at end of file diff --git a/fury/actors/odf.py b/fury/actors/odf.py new file mode 100644 index 000000000..a6d991033 --- /dev/null +++ b/fury/actors/odf.py @@ -0,0 +1,428 @@ +import os + +import numpy as np + +from fury import actor +from fury.lib import FloatArray, Texture +from fury.shaders import ( + attribute_to_actor, + compose_shader, + import_fury_shader, + shader_to_actor, +) +from fury.utils import numpy_to_vtk_image_data, set_polydata_tcoords + +def uv_calculations(n): + uvs = [] + for i in range(0, n): + a = (n - (i + 1)) / n + b = (n - i) / n + uvs.extend( + [ + [0.001, a + 0.001], + [0.001, b - 0.001], + [0.999, b - 0.001], + [0.999, a + 0.001], + [0.001, a + 0.001], + [0.001, b - 0.001], + [0.999, b - 0.001], + [0.999, a + 0.001], + ] + ) + return uvs + +def minmax_norm(data): + + min = data.min(axis=1) + max = data.max(axis=1) + return np.array([(data[i] - min[i]) / (max[i] - min[i]) + for i in range(data.shape[0])]) + + +def sh_odf(centers, coeffs, basis_type, scales, opacity): + """ + Visualize one or many ODFs with different features. + + Parameters + ---------- + centers : ndarray(N, 3) + ODFs positions. + coeffs : ndarray + 2D ODFs array in SH coefficients. + basis_type: str, optional + Type of basis (descoteaux, tournier) + 'descoteaux' for the default ``descoteaux07`` DYPY basis. + 'tournier' for the default ``tournier07` DYPY basis. + scales : float or ndarray (N, ) + ODFs size. + opacity : float + Takes values from 0 (fully transparent) to 1 (opaque). + + Returns + ------- + box_actor: Actor + + """ + odf_actor = actor.box(centers=centers, scales=scales) + odf_actor.GetMapper().SetVBOShiftScaleMethod(False) + odf_actor.GetProperty().SetOpacity(opacity) + + big_centers = np.repeat(centers, 8, axis=0) + attribute_to_actor(odf_actor, big_centers, "center") + + minmax = np.array([coeffs.min(axis=1), coeffs.max(axis=1)]).T + big_minmax = np.repeat(minmax, 8, axis=0) + attribute_to_actor(odf_actor, big_minmax, "minmax") + + # The coefficient data is stored in a texture to be passed to the shaders. + + # Data is normalized to a range of 0 to 1. + arr = minmax_norm(coeffs) + # Data is turned into values within the RGB color range, and then coverted + # into a vtk image data. + arr *= 255 + grid = numpy_to_vtk_image_data(arr.astype(np.uint8)) + + # Vtk image data is associated to a texture. + texture = Texture() + texture.SetInputDataObject(grid) + texture.Update() + + # Texture is associated with the actor + odf_actor.GetProperty().SetTexture("texture0", texture) + + + odf_actor_pd = odf_actor.GetMapper().GetInput() + + n_glyphs = coeffs.shape[0] + # Coordinates to locate the data of each glyph in the texture. + uv_vals = np.array(uv_calculations(n_glyphs)) + num_pnts = uv_vals.shape[0] + + t_coords = FloatArray() + t_coords.SetNumberOfComponents(2) + t_coords.SetNumberOfTuples(num_pnts) + [t_coords.SetTuple(i, uv_vals[i]) for i in range(num_pnts)] + + set_polydata_tcoords(odf_actor_pd, t_coords) + + # The number of coefficients is associated to the order of the SH + odf_actor.GetShaderProperty().GetFragmentCustomUniforms().SetUniformf( + "numCoeffs", 15 + ) + + # Start of shader implementation + + vs_dec = \ + """ + in vec3 center; + in vec2 minmax; + + out vec4 vertexMCVSOutput; + out vec3 centerMCVSOutput; + out vec2 minmaxVSOutput; + out vec3 camPosMCVSOutput; + out vec3 camRightMCVSOutput; + out vec3 camUpMCVSOutput; + """ + + vs_impl = \ + """ + vertexMCVSOutput = vertexMC; + centerMCVSOutput = center; + minmaxVSOutput = minmax; + camPosMCVSOutput = -MCVCMatrix[3].xyz * mat3(MCVCMatrix); + camRightMCVSOutput = vec3( + MCVCMatrix[0][0], MCVCMatrix[1][0], MCVCMatrix[2][0]); + camUpMCVSOutput = vec3( + MCVCMatrix[0][1], MCVCMatrix[1][1], MCVCMatrix[2][1]); + """ + + shader_to_actor(odf_actor, "vertex", decl_code=vs_dec, impl_code=vs_impl) + + # The index of the highest used band of the spherical harmonics basis. Must + # be even, at least 2 and at most 12. + def_sh_degree = "#define SH_DEGREE 4" + + # The number of spherical harmonics basis functions + def_sh_count = "#define SH_COUNT (((SH_DEGREE + 1) * (SH_DEGREE + 2)) / 2)" + + # Degree of polynomials for which we have to find roots + def_max_degree = "#define MAX_DEGREE (2 * SH_DEGREE + 2)" + + # If GL_EXT_control_flow_attributes is available, these defines should be + # defined as [[unroll]] and [[loop]] to give reasonable hints to the + # compiler. That avoids register spilling, which makes execution + # considerably faster. + def_gl_ext_control_flow_attributes = \ + """ + #ifndef _unroll_ + #define _unroll_ + #endif + #ifndef _loop_ + #define _loop_ + #endif + """ + + # When there are fewer intersections/roots than theoretically possible, + # some array entries are set to this value + def_no_intersection = "#define NO_INTERSECTION 3.4e38" + + # pi and its reciprocal + def_pis = \ + """ + #define M_PI 3.141592653589793238462643 + #define M_INV_PI 0.318309886183790671537767526745 + """ + + fs_vs_vars = \ + """ + in vec4 vertexMCVSOutput; + in vec3 centerMCVSOutput; + in vec2 minmaxVSOutput; + in vec3 camPosMCVSOutput; + in vec3 camRightMCVSOutput; + in vec3 camUpMCVSOutput; + """ + + coeffs_norm = import_fury_shader(os.path.join("utils", "minmax_norm.glsl")) + + eval_sh_2 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_2.frag")) + + eval_sh_4 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_4.frag")) + + eval_sh_6 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_6.frag")) + + eval_sh_8 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_8.frag")) + + eval_sh_10 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_10.frag")) + + eval_sh_12 = import_fury_shader( + os.path.join("rt_odfs", basis_type, "eval_sh_12.frag")) + + eval_sh_grad_2 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_2.frag") + ) + + eval_sh_grad_4 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_4.frag") + ) + + eval_sh_grad_6 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_6.frag") + ) + + eval_sh_grad_8 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_8.frag") + ) + + eval_sh_grad_10 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_10.frag") + ) + + eval_sh_grad_12 = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad_12.frag") + ) + + # Searches a single root of a polynomial within a given interval. + # param out_root The location of the found root. + # param out_end_value The value of the given polynomial at end. + # param poly Coefficients of the polynomial for which a root should be + # found. + # Coefficient poly[i] is multiplied by x^i. + # param begin The beginning of an interval where the polynomial is + # monotonic. + # param end The end of said interval. + # param begin_value The value of the given polynomial at begin. + # param error_tolerance The error tolerance for the returned root + # location. + # Typically the error will be much lower but in theory it can be + # bigger. + # + # return true if a root was found, false if no root exists. + newton_bisection = import_fury_shader( + os.path.join("rt_odfs", "newton_bisection.frag") + ) + + # Finds all roots of the given polynomial in the interval [begin, end] and + # writes them to out_roots. Some entries will be NO_INTERSECTION but other + # than that the array is sorted. The last entry is always NO_INTERSECTION. + find_roots = import_fury_shader(os.path.join("rt_odfs", "find_roots.frag")) + + # Evaluates the spherical harmonics basis in bands 0, 2, ..., SH_DEGREE. + # Conventions are as in the following paper. + # M. Descoteaux, E. Angelino, S. Fitzgibbons, and R. Deriche. Regularized, + # fast, and robust analytical q-ball imaging. Magnetic Resonance in + # Medicine, 58(3), 2007. https://doi.org/10.1002/mrm.21277 + # param out_shs Values of SH basis functions in bands 0, 2, ..., + # SH_DEGREE in this order. + # param point The point on the unit sphere where the basis should be + # evaluated. + eval_sh = import_fury_shader(os.path.join("rt_odfs", "eval_sh.frag")) + + # Evaluates the gradient of each basis function given by eval_sh() and the + # basis itself + eval_sh_grad = import_fury_shader( + os.path.join("rt_odfs", "eval_sh_grad.frag") + ) + + # Outputs a matrix that turns equidistant samples on the unit circle of a + # homogeneous polynomial into coefficients of that polynomial. + get_inv_vandermonde = import_fury_shader( + os.path.join("rt_odfs", "get_inv_vandermonde.frag") + ) + + # Determines all intersections between a ray and a spherical harmonics + # glyph. + # param out_ray_params The ray parameters at intersection points. The + # points themselves are at ray_origin + out_ray_params[i] * ray_dir. + # Some entries may be NO_INTERSECTION but other than that the array + # is sorted. + # param sh_coeffs SH_COUNT spherical harmonic coefficients defining the + # glyph. Their exact meaning is defined by eval_sh(). + # param ray_origin The origin of the ray, relative to the glyph center. + # param ray_dir The normalized direction vector of the ray. + ray_sh_glyph_intersections = import_fury_shader( + os.path.join("rt_odfs", "ray_sh_glyph_intersections.frag") + ) + + # Provides a normalized normal vector for a spherical harmonics glyph. + # param sh_coeffs SH_COUNT spherical harmonic coefficients defining the + # glyph. Their exact meaning is defined by eval_sh(). + # param point A point on the surface of the glyph, relative to its + # center. + # + # return A normalized surface normal pointing away from the origin. + get_sh_glyph_normal = import_fury_shader( + os.path.join("rt_odfs", "get_sh_glyph_normal.frag") + ) + + # Applies the non-linearity that maps linear RGB to sRGB + linear_to_srgb = import_fury_shader( + os.path.join("rt_odfs", "linear_to_srgb.frag") + ) + + # Inverse of linear_to_srgb() + srgb_to_linear = import_fury_shader( + os.path.join("rt_odfs", "srgb_to_linear.frag") + ) + + # Turns a linear RGB color (i.e. rec. 709) into sRGB + linear_rgb_to_srgb = import_fury_shader( + os.path.join("rt_odfs", "linear_rgb_to_srgb.frag") + ) + + # Inverse of linear_rgb_to_srgb() + srgb_to_linear_rgb = import_fury_shader( + os.path.join("rt_odfs", "srgb_to_linear_rgb.frag") + ) + + # Logarithmic tonemapping operator. Input and output are linear RGB. + tonemap = import_fury_shader(os.path.join("rt_odfs", "tonemap.frag")) + + # Blinn-Phong illumination model + blinn_phong_model = import_fury_shader( + os.path.join("lighting", "blinn_phong_model.frag") + ) + + # fmt: off + fs_dec = compose_shader([ + def_sh_degree, def_sh_count, def_max_degree, + def_gl_ext_control_flow_attributes, def_no_intersection, def_pis, + fs_vs_vars, coeffs_norm, eval_sh_2, eval_sh_4, eval_sh_6, eval_sh_8, + eval_sh_10, eval_sh_12, eval_sh_grad_2, eval_sh_grad_4, eval_sh_grad_6, + eval_sh_grad_8, eval_sh_grad_10, eval_sh_grad_12, newton_bisection, + find_roots, eval_sh, eval_sh_grad, get_inv_vandermonde, + ray_sh_glyph_intersections, get_sh_glyph_normal, blinn_phong_model, + linear_to_srgb, srgb_to_linear, linear_rgb_to_srgb, srgb_to_linear_rgb, + tonemap + ]) + # fmt: on + + shader_to_actor(odf_actor, "fragment", decl_code=fs_dec) + + point_from_vs = "vec3 pnt = vertexMCVSOutput.xyz;" + + # Ray origin is the camera position in world space + ray_origin = "vec3 ro = camPosMCVSOutput;" + + # TODO: Check aspect for automatic scaling + # Ray direction is the normalized difference between the fragment and the + # camera position/ray origin + ray_direction = "vec3 rd = normalize(pnt - ro);" + + # Light direction in a retroreflective model is the normalized difference + # between the camera position/ray origin and the fragment + light_direction = "vec3 ld = normalize(ro - pnt);" + + # Define SH coefficients (measured up to band 8, noise beyond that) + sh_coeffs = \ + """ + float i = 1 / (numCoeffs * 2); + float sh_coeffs[SH_COUNT]; + for(int j=0; j 0.0) { + first_ray_param = ray_params[i]; + break; + } + } + """ + + # Evaluate shading for a directional light + directional_light = \ + """ + vec3 color = vec3(1.); + if (first_ray_param != NO_INTERSECTION) { + vec3 intersection = ro - centerMCVSOutput + first_ray_param * rd; + vec3 normal = get_sh_glyph_normal(sh_coeffs, intersection); + vec3 colorDir = srgb_to_linear_rgb(abs(normalize(intersection))); + float attenuation = dot(ld, normal); + color = blinnPhongIllumModel( + //attenuation, lightColor0, diffuseColor, specularPower, + attenuation, lightColor0, colorDir, specularPower, + specularColor, ambientColor); + } else { + discard; + } + """ + + frag_output = \ + """ + vec3 out_color = linear_rgb_to_srgb(tonemap(color)); + fragOutput0 = vec4(out_color, opacity); + """ + + fs_impl = compose_shader([ + point_from_vs, ray_origin, ray_direction, light_direction, sh_coeffs, + intersection_test, first_intersection, directional_light, frag_output + ]) + + shader_to_actor(odf_actor, "fragment", impl_code=fs_impl, block="picking") + + return odf_actor \ No newline at end of file diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_10.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_10.frag new file mode 100644 index 000000000..178033cae --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_10.frag @@ -0,0 +1,175 @@ +void eval_sh_10(out float out_shs[66], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[54] = -c1 * d; + out_shs[56] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[53] = c0 * d; + out_shs[57] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[52] = -c1 * d; + out_shs[58] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[51] = c0 * d; + out_shs[59] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[50] = -c1 * d; + out_shs[60] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[49] = c0 * d; + out_shs[61] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[48] = -c1 * d; + out_shs[62] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[47] = c0 * d; + out_shs[63] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[46] = -c1 * d; + out_shs[64] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[45] = c0 * d; + out_shs[65] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_12.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_12.frag new file mode 100644 index 000000000..f1a6d85e9 --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_12.frag @@ -0,0 +1,238 @@ +void eval_sh_12(out float out_shs[91], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + b = z2 * a - 0.250626566 * b; + a = b - 0.250517598 * a; + d = 931.186918633 * a; + out_shs[78] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[54] = -c1 * d; + out_shs[56] = s1 * d; + a = z2 * b - 0.248120301 * a; + b = a - 0.248447205 * b; + d = -1265.233874957 * b; + out_shs[77] = -c1 * d; + out_shs[79] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[53] = c0 * d; + out_shs[57] = s0 * d; + b = z2 * a - 0.240601504 * b; + a = b - 0.242236025 * a; + d = 1121.509962433 * a; + out_shs[76] = c0 * d; + out_shs[80] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[52] = -c1 * d; + out_shs[58] = s1 * d; + a = z2 * b - 0.228070175 * a; + b = a - 0.231884058 * b; + d = -915.709049803 * b; + out_shs[75] = -c1 * d; + out_shs[81] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[51] = c0 * d; + out_shs[59] = s0 * d; + b = z2 * a - 0.210526316 * b; + a = b - 0.217391304 * a; + d = 686.781787352 * a; + out_shs[74] = c0 * d; + out_shs[82] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[50] = -c1 * d; + out_shs[60] = s1 * d; + a = z2 * b - 0.187969925 * a; + b = a - 0.198757764 * b; + d = -471.12841933 * b; + out_shs[73] = -c1 * d; + out_shs[83] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[49] = c0 * d; + out_shs[61] = s0 * d; + b = z2 * a - 0.160401003 * b; + a = b - 0.175983437 * a; + d = 293.800188384 * a; + out_shs[72] = c0 * d; + out_shs[84] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[48] = -c1 * d; + out_shs[62] = s1 * d; + a = z2 * b - 0.127819549 * a; + b = a - 0.149068323 * b; + d = -165.101452729 * b; + out_shs[71] = -c1 * d; + out_shs[85] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[47] = c0 * d; + out_shs[63] = s0 * d; + b = z2 * (a - 9.02255639e-02); + a = b - 0.118012422 * a; + d = 82.550726364 * a; + out_shs[70] = c0 * d; + out_shs[86] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[46] = -c1 * d; + out_shs[64] = s1 * d; + a = (z2 - 4.76190476e-02) * z; + b = a - 8.2815735e-02 * z; + d = -36.028090689 * b; + out_shs[69] = -c1 * d; + out_shs[87] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[45] = c0 * d; + out_shs[65] = s0 * d; + a = z2 - 4.34782609e-02; + d = 13.3042542 * a; + out_shs[68] = c0 * d; + out_shs[88] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.923210529 * z; + out_shs[67] = -c1 * d; + out_shs[89] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.800821996; + out_shs[66] = c0 * d; + out_shs[90] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_2.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_2.frag new file mode 100644 index 000000000..c15510b74 --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_2.frag @@ -0,0 +1,23 @@ +void eval_sh_2(out float out_shs[6], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_4.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_4.frag new file mode 100644 index 000000000..975fac054 --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_4.frag @@ -0,0 +1,46 @@ +void eval_sh_4(out float out_shs[15], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_6.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_6.frag new file mode 100644 index 000000000..6cbd1bcf1 --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_6.frag @@ -0,0 +1,79 @@ +void eval_sh_6(out float out_shs[28], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/descoteaux/eval_sh_8.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_8.frag new file mode 100644 index 000000000..6e79b2b16 --- /dev/null +++ b/fury/shaders/rt_odfs/descoteaux/eval_sh_8.frag @@ -0,0 +1,122 @@ +void eval_sh_8(out float out_shs[45], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/eval_sh.frag b/fury/shaders/rt_odfs/eval_sh.frag new file mode 100644 index 000000000..e3810af25 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh.frag @@ -0,0 +1,16 @@ +void eval_sh(out float out_shs[SH_COUNT], vec3 point) +{ + #if SH_DEGREE == 2 + eval_sh_2(out_shs, point); + #elif SH_DEGREE == 4 + eval_sh_4(out_shs, point); + #elif SH_DEGREE == 6 + eval_sh_6(out_shs, point); + #elif SH_DEGREE == 8 + eval_sh_8(out_shs, point); + #elif SH_DEGREE == 10 + eval_sh_10(out_shs, point); + #elif SH_DEGREE == 12 + eval_sh_12(out_shs, point); + #endif +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad.frag b/fury/shaders/rt_odfs/eval_sh_grad.frag new file mode 100644 index 000000000..c318dbd6c --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad.frag @@ -0,0 +1,16 @@ +void eval_sh_grad(out float out_shs[SH_COUNT], out vec3 out_grads[SH_COUNT], vec3 point) +{ + #if SH_DEGREE == 2 + eval_sh_grad_2(out_shs, out_grads, point); + #elif SH_DEGREE == 4 + eval_sh_grad_4(out_shs, out_grads, point); + #elif SH_DEGREE == 6 + eval_sh_grad_6(out_shs, out_grads, point); + #elif SH_DEGREE == 8 + eval_sh_grad_8(out_shs, out_grads, point); + #elif SH_DEGREE == 10 + eval_sh_grad_10(out_shs, out_grads, point); + #elif SH_DEGREE == 12 + eval_sh_grad_12(out_shs, out_grads, point); + #endif +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_10.frag b/fury/shaders/rt_odfs/eval_sh_grad_10.frag new file mode 100644 index 000000000..9d5feea39 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_10.frag @@ -0,0 +1,430 @@ +void eval_sh_grad_10(out float out_shs[66], out vec3 out_grads[66], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + out_grads[9][0] = -c0 * d; + out_grads[11][0] = s0 * d; + out_grads[9][1] = s0 * d; + out_grads[11][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + out_grads[20][0] = -c0 * d; + out_grads[22][0] = s0 * d; + out_grads[20][1] = s0 * d; + out_grads[22][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + out_grads[35][0] = -c0 * d; + out_grads[37][0] = s0 * d; + out_grads[35][1] = s0 * d; + out_grads[37][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[54] = -c1 * d; + out_shs[56] = s1 * d; + out_grads[54][0] = -c0 * d; + out_grads[56][0] = s0 * d; + out_grads[54][1] = s0 * d; + out_grads[56][1] = c0 * d; + d = 2332.401488133 * b; + out_grads[55][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + d = 6.62322287 * a; + out_grads[8][0] = c1 * d; + out_grads[12][0] = s1 * d; + out_grads[8][1] = -s1 * d; + out_grads[12][1] = c1 * d; + d = -14.049977415 * a; + out_grads[9][2] = -c1 * d; + out_grads[11][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + d = 30.399773564 * a; + out_grads[19][0] = c1 * d; + out_grads[23][0] = s1 * d; + out_grads[19][1] = -s1 * d; + out_grads[23][1] = c1 * d; + d = -96.132524816 * a; + out_grads[20][2] = -c1 * d; + out_grads[22][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + d = 130.459545912 * a; + out_grads[34][0] = c1 * d; + out_grads[38][0] = s1 * d; + out_grads[34][1] = -s1 * d; + out_grads[38][1] = c1 * d; + d = -545.751435723 * a; + out_grads[35][2] = -c1 * d; + out_grads[37][2] = s1 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[53] = c0 * d; + out_shs[57] = s0 * d; + d = 544.731628762 * a; + out_grads[53][0] = c1 * d; + out_grads[57][0] = s1 * d; + out_grads[53][1] = -s1 * d; + out_grads[57][1] = c1 * d; + d = -2830.508572514 * a; + out_grads[54][2] = -c1 * d; + out_grads[56][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + d = -5.310392309 * z; + out_grads[7][0] = -c0 * d; + out_grads[13][0] = s0 * d; + out_grads[7][1] = s0 * d; + out_grads[13][1] = c0 * d; + d = 6.62322287 * z; + out_grads[8][2] = c0 * d; + out_grads[12][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + d = -30.399773564 * b; + out_grads[18][0] = -c0 * d; + out_grads[24][0] = s0 * d; + out_grads[18][1] = s0 * d; + out_grads[24][1] = c0 * d; + d = 60.799547128 * b; + out_grads[19][2] = c0 * d; + out_grads[23][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + d = -144.52614017 * b; + out_grads[33][0] = -c0 * d; + out_grads[39][0] = s0 * d; + out_grads[33][1] = s0 * d; + out_grads[39][1] = c0 * d; + d = 391.378637737 * b; + out_grads[34][2] = c0 * d; + out_grads[38][2] = s0 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[52] = -c1 * d; + out_shs[58] = s1 * d; + d = -640.983970322 * b; + out_grads[52][0] = -c0 * d; + out_grads[58][0] = s0 * d; + out_grads[52][1] = s0 * d; + out_grads[58][1] = c0 * d; + d = 2178.926515046 * b; + out_grads[53][2] = c0 * d; + out_grads[57][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + d = 2.503342942; + out_grads[6][0] = c1 * d; + out_grads[14][0] = s1 * d; + out_grads[6][1] = -s1 * d; + out_grads[14][1] = c1 * d; + d = -1.77013077; + out_grads[7][2] = -c1 * d; + out_grads[13][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + d = 22.200855632 * a; + out_grads[17][0] = c1 * d; + out_grads[25][0] = s1 * d; + out_grads[17][1] = -s1 * d; + out_grads[25][1] = c1 * d; + d = -30.399773564 * a; + out_grads[18][2] = -c1 * d; + out_grads[24][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + d = 124.388296437 * a; + out_grads[32][0] = c1 * d; + out_grads[40][0] = s1 * d; + out_grads[32][1] = -s1 * d; + out_grads[40][1] = c1 * d; + d = -240.876900283 * a; + out_grads[33][2] = -c1 * d; + out_grads[39][2] = s1 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[51] = c0 * d; + out_shs[59] = s0 * d; + d = 604.325482728 * a; + out_grads[51][0] = c1 * d; + out_grads[59][0] = s1 * d; + out_grads[51][1] = -s1 * d; + out_grads[59][1] = c1 * d; + d = -1495.629264084 * a; + out_grads[52][2] = -c1 * d; + out_grads[58][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + d = -11.833095811 * z; + out_grads[16][0] = -c0 * d; + out_grads[26][0] = s0 * d; + out_grads[16][1] = s0 * d; + out_grads[26][1] = c0 * d; + d = 11.100427816 * z; + out_grads[17][2] = c0 * d; + out_grads[25][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + d = -86.247765552 * b; + out_grads[31][0] = -c0 * d; + out_grads[41][0] = s0 * d; + out_grads[31][1] = s0 * d; + out_grads[41][1] = c0 * d; + d = 124.388296437 * b; + out_grads[32][2] = c0 * d; + out_grads[40][2] = s0 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[50] = -c1 * d; + out_shs[60] = s1 * d; + d = -477.761243376 * b; + out_grads[50][0] = -c0 * d; + out_grads[60][0] = s0 * d; + out_grads[50][1] = s0 * d; + out_grads[60][1] = c0 * d; + d = 906.488224092 * b; + out_grads[51][2] = c0 * d; + out_grads[59][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + d = 4.099104631; + out_grads[15][0] = c1 * d; + out_grads[27][0] = s1 * d; + out_grads[15][1] = -s1 * d; + out_grads[27][1] = c1 * d; + d = -2.366619162; + out_grads[16][2] = -c1 * d; + out_grads[26][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + d = 47.909948945 * a; + out_grads[30][0] = c1 * d; + out_grads[42][0] = s1 * d; + out_grads[30][1] = -s1 * d; + out_grads[42][1] = c1 * d; + d = -51.748659331 * a; + out_grads[31][2] = -c1 * d; + out_grads[41][2] = s1 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[49] = c0 * d; + out_shs[61] = s0 * d; + d = 320.491985161 * a; + out_grads[49][0] = c1 * d; + out_grads[61][0] = s1 * d; + out_grads[49][1] = -s1 * d; + out_grads[61][1] = c1 * d; + d = -477.761243376 * a; + out_grads[50][2] = -c1 * d; + out_grads[60][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + d = -20.409946485 * z; + out_grads[29][0] = -c0 * d; + out_grads[43][0] = s0 * d; + out_grads[29][1] = s0 * d; + out_grads[43][1] = c0 * d; + d = 15.969982982 * z; + out_grads[30][2] = c0 * d; + out_grads[42][2] = s0 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[48] = -c1 * d; + out_shs[62] = s1 * d; + d = -181.371689194 * b; + out_grads[48][0] = -c0 * d; + out_grads[62][0] = s0 * d; + out_grads[48][1] = s0 * d; + out_grads[62][1] = c0 * d; + d = 213.661323441 * b; + out_grads[49][2] = c0 * d; + out_grads[61][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; + d = 5.831413281; + out_grads[28][0] = c1 * d; + out_grads[44][0] = s1 * d; + out_grads[28][1] = -s1 * d; + out_grads[44][1] = c1 * d; + d = -2.915706641; + out_grads[29][2] = -c1 * d; + out_grads[43][2] = s1 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[47] = c0 * d; + out_shs[63] = s0 * d; + d = 84.622493774 * a; + out_grads[47][0] = c1 * d; + out_grads[63][0] = s1 * d; + out_grads[47][1] = -s1 * d; + out_grads[63][1] = c1 * d; + d = -77.73072394 * a; + out_grads[48][2] = -c1 * d; + out_grads[62][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[46] = -c1 * d; + out_shs[64] = s1 * d; + d = -30.887057699 * z; + out_grads[46][0] = -c0 * d; + out_grads[64][0] = s0 * d; + out_grads[46][1] = s0 * d; + out_grads[64][1] = c0 * d; + d = 21.155623443 * z; + out_grads[47][2] = c0 * d; + out_grads[63][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[45] = c0 * d; + out_shs[65] = s0 * d; + d = 7.673951182; + out_grads[45][0] = c1 * d; + out_grads[65][0] = s1 * d; + out_grads[45][1] = -s1 * d; + out_grads[65][1] = c1 * d; + d = -3.4318953; + out_grads[46][2] = -c1 * d; + out_grads[64][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; + out_grads[28][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[44][2] = 0.0; + out_grads[45][2] = 0.0; + out_grads[55][0] = 0.0; + out_grads[55][1] = 0.0; + out_grads[65][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_12.frag b/fury/shaders/rt_odfs/eval_sh_grad_12.frag new file mode 100644 index 000000000..f7ff069bc --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_12.frag @@ -0,0 +1,591 @@ +void eval_sh_grad_12(out float out_shs[91], out vec3 out_grads[91], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + b = z2 * a - 0.250626566 * b; + a = b - 0.250517598 * a; + d = 931.186918633 * a; + out_shs[78] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + out_grads[9][0] = -c0 * d; + out_grads[11][0] = s0 * d; + out_grads[9][1] = s0 * d; + out_grads[11][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + out_grads[20][0] = -c0 * d; + out_grads[22][0] = s0 * d; + out_grads[20][1] = s0 * d; + out_grads[22][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + out_grads[35][0] = -c0 * d; + out_grads[37][0] = s0 * d; + out_grads[35][1] = s0 * d; + out_grads[37][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[54] = -c1 * d; + out_shs[56] = s1 * d; + out_grads[54][0] = -c0 * d; + out_grads[56][0] = s0 * d; + out_grads[54][1] = s0 * d; + out_grads[56][1] = c0 * d; + d = 2332.401488133 * b; + out_grads[55][2] = d; + a = z2 * b - 0.248120301 * a; + b = a - 0.248447205 * b; + d = -1265.233874957 * b; + out_shs[77] = -c1 * d; + out_shs[79] = s1 * d; + out_grads[77][0] = -c0 * d; + out_grads[79][0] = s0 * d; + out_grads[77][1] = s0 * d; + out_grads[79][1] = c0 * d; + d = 11174.243023595 * b; + out_grads[78][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + d = 6.62322287 * a; + out_grads[8][0] = c1 * d; + out_grads[12][0] = s1 * d; + out_grads[8][1] = -s1 * d; + out_grads[12][1] = c1 * d; + d = -14.049977415 * a; + out_grads[9][2] = -c1 * d; + out_grads[11][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + d = 30.399773564 * a; + out_grads[19][0] = c1 * d; + out_grads[23][0] = s1 * d; + out_grads[19][1] = -s1 * d; + out_grads[23][1] = c1 * d; + d = -96.132524816 * a; + out_grads[20][2] = -c1 * d; + out_grads[22][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + d = 130.459545912 * a; + out_grads[34][0] = c1 * d; + out_grads[38][0] = s1 * d; + out_grads[34][1] = -s1 * d; + out_grads[38][1] = c1 * d; + d = -545.751435723 * a; + out_grads[35][2] = -c1 * d; + out_grads[37][2] = s1 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[53] = c0 * d; + out_shs[57] = s0 * d; + d = 544.731628762 * a; + out_grads[53][0] = c1 * d; + out_grads[57][0] = s1 * d; + out_grads[53][1] = -s1 * d; + out_grads[57][1] = c1 * d; + d = -2830.508572514 * a; + out_grads[54][2] = -c1 * d; + out_grads[56][2] = s1 * d; + b = z2 * a - 0.240601504 * b; + a = b - 0.242236025 * a; + d = 1121.509962433 * a; + out_shs[76] = c0 * d; + out_shs[80] = s0 * d; + d = 2243.019924866 * a; + out_grads[76][0] = c1 * d; + out_grads[80][0] = s1 * d; + out_grads[76][1] = -s1 * d; + out_grads[80][1] = c1 * d; + d = -13917.572624524 * a; + out_grads[77][2] = -c1 * d; + out_grads[79][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + d = -5.310392309 * z; + out_grads[7][0] = -c0 * d; + out_grads[13][0] = s0 * d; + out_grads[7][1] = s0 * d; + out_grads[13][1] = c0 * d; + d = 6.62322287 * z; + out_grads[8][2] = c0 * d; + out_grads[12][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + d = -30.399773564 * b; + out_grads[18][0] = -c0 * d; + out_grads[24][0] = s0 * d; + out_grads[18][1] = s0 * d; + out_grads[24][1] = c0 * d; + d = 60.799547128 * b; + out_grads[19][2] = c0 * d; + out_grads[23][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + d = -144.52614017 * b; + out_grads[33][0] = -c0 * d; + out_grads[39][0] = s0 * d; + out_grads[33][1] = s0 * d; + out_grads[39][1] = c0 * d; + d = 391.378637737 * b; + out_grads[34][2] = c0 * d; + out_grads[38][2] = s0 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[52] = -c1 * d; + out_shs[58] = s1 * d; + d = -640.983970322 * b; + out_grads[52][0] = -c0 * d; + out_grads[58][0] = s0 * d; + out_grads[52][1] = s0 * d; + out_grads[58][1] = c0 * d; + d = 2178.926515046 * b; + out_grads[53][2] = c0 * d; + out_grads[57][2] = s0 * d; + a = z2 * b - 0.228070175 * a; + b = a - 0.231884058 * b; + d = -915.709049803 * b; + out_shs[75] = -c1 * d; + out_shs[81] = s1 * d; + d = -2747.127149409 * b; + out_grads[75][0] = -c0 * d; + out_grads[81][0] = s0 * d; + out_grads[75][1] = s0 * d; + out_grads[81][1] = c0 * d; + d = 11215.099624332 * b; + out_grads[76][2] = c0 * d; + out_grads[80][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + d = 2.503342942; + out_grads[6][0] = c1 * d; + out_grads[14][0] = s1 * d; + out_grads[6][1] = -s1 * d; + out_grads[14][1] = c1 * d; + d = -1.77013077; + out_grads[7][2] = -c1 * d; + out_grads[13][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + d = 22.200855632 * a; + out_grads[17][0] = c1 * d; + out_grads[25][0] = s1 * d; + out_grads[17][1] = -s1 * d; + out_grads[25][1] = c1 * d; + d = -30.399773564 * a; + out_grads[18][2] = -c1 * d; + out_grads[24][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + d = 124.388296437 * a; + out_grads[32][0] = c1 * d; + out_grads[40][0] = s1 * d; + out_grads[32][1] = -s1 * d; + out_grads[40][1] = c1 * d; + d = -240.876900283 * a; + out_grads[33][2] = -c1 * d; + out_grads[39][2] = s1 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[51] = c0 * d; + out_shs[59] = s0 * d; + d = 604.325482728 * a; + out_grads[51][0] = c1 * d; + out_grads[59][0] = s1 * d; + out_grads[51][1] = -s1 * d; + out_grads[59][1] = c1 * d; + d = -1495.629264084 * a; + out_grads[52][2] = -c1 * d; + out_grads[58][2] = s1 * d; + b = z2 * a - 0.210526316 * b; + a = b - 0.217391304 * a; + d = 686.781787352 * a; + out_shs[74] = c0 * d; + out_shs[82] = s0 * d; + d = 2747.127149409 * a; + out_grads[74][0] = c1 * d; + out_grads[82][0] = s1 * d; + out_grads[74][1] = -s1 * d; + out_grads[82][1] = c1 * d; + d = -8241.381448228 * a; + out_grads[75][2] = -c1 * d; + out_grads[81][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + d = -11.833095811 * z; + out_grads[16][0] = -c0 * d; + out_grads[26][0] = s0 * d; + out_grads[16][1] = s0 * d; + out_grads[26][1] = c0 * d; + d = 11.100427816 * z; + out_grads[17][2] = c0 * d; + out_grads[25][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + d = -86.247765552 * b; + out_grads[31][0] = -c0 * d; + out_grads[41][0] = s0 * d; + out_grads[31][1] = s0 * d; + out_grads[41][1] = c0 * d; + d = 124.388296437 * b; + out_grads[32][2] = c0 * d; + out_grads[40][2] = s0 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[50] = -c1 * d; + out_shs[60] = s1 * d; + d = -477.761243376 * b; + out_grads[50][0] = -c0 * d; + out_grads[60][0] = s0 * d; + out_grads[50][1] = s0 * d; + out_grads[60][1] = c0 * d; + d = 906.488224092 * b; + out_grads[51][2] = c0 * d; + out_grads[59][2] = s0 * d; + a = z2 * b - 0.187969925 * a; + b = a - 0.198757764 * b; + d = -471.12841933 * b; + out_shs[73] = -c1 * d; + out_shs[83] = s1 * d; + d = -2355.642096651 * b; + out_grads[73][0] = -c0 * d; + out_grads[83][0] = s0 * d; + out_grads[73][1] = s0 * d; + out_grads[83][1] = c0 * d; + d = 5494.254298819 * b; + out_grads[74][2] = c0 * d; + out_grads[82][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + d = 4.099104631; + out_grads[15][0] = c1 * d; + out_grads[27][0] = s1 * d; + out_grads[15][1] = -s1 * d; + out_grads[27][1] = c1 * d; + d = -2.366619162; + out_grads[16][2] = -c1 * d; + out_grads[26][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + d = 47.909948945 * a; + out_grads[30][0] = c1 * d; + out_grads[42][0] = s1 * d; + out_grads[30][1] = -s1 * d; + out_grads[42][1] = c1 * d; + d = -51.748659331 * a; + out_grads[31][2] = -c1 * d; + out_grads[41][2] = s1 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[49] = c0 * d; + out_shs[61] = s0 * d; + d = 320.491985161 * a; + out_grads[49][0] = c1 * d; + out_grads[61][0] = s1 * d; + out_grads[49][1] = -s1 * d; + out_grads[61][1] = c1 * d; + d = -477.761243376 * a; + out_grads[50][2] = -c1 * d; + out_grads[60][2] = s1 * d; + b = z2 * a - 0.160401003 * b; + a = b - 0.175983437 * a; + d = 293.800188384 * a; + out_shs[72] = c0 * d; + out_shs[84] = s0 * d; + d = 1762.801130306 * a; + out_grads[72][0] = c1 * d; + out_grads[84][0] = s1 * d; + out_grads[72][1] = -s1 * d; + out_grads[84][1] = c1 * d; + d = -3297.898935312 * a; + out_grads[73][2] = -c1 * d; + out_grads[83][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + d = -20.409946485 * z; + out_grads[29][0] = -c0 * d; + out_grads[43][0] = s0 * d; + out_grads[29][1] = s0 * d; + out_grads[43][1] = c0 * d; + d = 15.969982982 * z; + out_grads[30][2] = c0 * d; + out_grads[42][2] = s0 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[48] = -c1 * d; + out_shs[62] = s1 * d; + d = -181.371689194 * b; + out_grads[48][0] = -c0 * d; + out_grads[62][0] = s0 * d; + out_grads[48][1] = s0 * d; + out_grads[62][1] = c0 * d; + d = 213.661323441 * b; + out_grads[49][2] = c0 * d; + out_grads[61][2] = s0 * d; + a = z2 * b - 0.127819549 * a; + b = a - 0.149068323 * b; + d = -165.101452729 * b; + out_shs[71] = -c1 * d; + out_shs[85] = s1 * d; + d = -1155.7101691 * b; + out_grads[71][0] = -c0 * d; + out_grads[85][0] = s0 * d; + out_grads[71][1] = s0 * d; + out_grads[85][1] = c0 * d; + d = 1762.801130306 * b; + out_grads[72][2] = c0 * d; + out_grads[84][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; + d = 5.831413281; + out_grads[28][0] = c1 * d; + out_grads[44][0] = s1 * d; + out_grads[28][1] = -s1 * d; + out_grads[44][1] = c1 * d; + d = -2.915706641; + out_grads[29][2] = -c1 * d; + out_grads[43][2] = s1 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[47] = c0 * d; + out_shs[63] = s0 * d; + d = 84.622493774 * a; + out_grads[47][0] = c1 * d; + out_grads[63][0] = s1 * d; + out_grads[47][1] = -s1 * d; + out_grads[63][1] = c1 * d; + d = -77.73072394 * a; + out_grads[48][2] = -c1 * d; + out_grads[62][2] = s1 * d; + b = z2 * (a - 9.02255639e-02); + a = b - 0.118012422 * a; + d = 82.550726364 * a; + out_shs[70] = c0 * d; + out_shs[86] = s0 * d; + d = 660.405810914 * a; + out_grads[70][0] = c1 * d; + out_grads[86][0] = s1 * d; + out_grads[70][1] = -s1 * d; + out_grads[86][1] = c1 * d; + d = -825.507263643 * a; + out_grads[71][2] = -c1 * d; + out_grads[85][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[46] = -c1 * d; + out_shs[64] = s1 * d; + d = -30.887057699 * z; + out_grads[46][0] = -c0 * d; + out_grads[64][0] = s0 * d; + out_grads[46][1] = s0 * d; + out_grads[64][1] = c0 * d; + d = 21.155623443 * z; + out_grads[47][2] = c0 * d; + out_grads[63][2] = s0 * d; + a = (z2 - 4.76190476e-02) * z; + b = a - 8.2815735e-02 * z; + d = -36.028090689 * b; + out_shs[69] = -c1 * d; + out_shs[87] = s1 * d; + d = -324.252816204 * b; + out_grads[69][0] = -c0 * d; + out_grads[87][0] = s0 * d; + out_grads[69][1] = s0 * d; + out_grads[87][1] = c0 * d; + d = 330.202905457 * b; + out_grads[70][2] = c0 * d; + out_grads[86][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[45] = c0 * d; + out_shs[65] = s0 * d; + d = 7.673951182; + out_grads[45][0] = c1 * d; + out_grads[65][0] = s1 * d; + out_grads[45][1] = -s1 * d; + out_grads[65][1] = c1 * d; + d = -3.4318953; + out_grads[46][2] = -c1 * d; + out_grads[64][2] = s1 * d; + a = z2 - 4.34782609e-02; + d = 13.3042542 * a; + out_shs[68] = c0 * d; + out_shs[88] = s0 * d; + d = 133.042542003 * a; + out_grads[68][0] = c1 * d; + out_grads[88][0] = s1 * d; + out_grads[68][1] = -s1 * d; + out_grads[88][1] = c1 * d; + d = -108.084272068 * a; + out_grads[69][2] = -c1 * d; + out_grads[87][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.923210529 * z; + out_shs[67] = -c1 * d; + out_shs[89] = s1 * d; + d = -43.155315818 * z; + out_grads[67][0] = -c0 * d; + out_grads[89][0] = s0 * d; + out_grads[67][1] = s0 * d; + out_grads[89][1] = c0 * d; + d = 26.608508401 * z; + out_grads[68][2] = c0 * d; + out_grads[88][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.800821996; + out_shs[66] = c0 * d; + out_shs[90] = s0 * d; + d = 9.609863949; + out_grads[66][0] = c1 * d; + out_grads[90][0] = s1 * d; + out_grads[66][1] = -s1 * d; + out_grads[90][1] = c1 * d; + d = -3.923210529; + out_grads[67][2] = -c1 * d; + out_grads[89][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; + out_grads[28][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[44][2] = 0.0; + out_grads[45][2] = 0.0; + out_grads[55][0] = 0.0; + out_grads[55][1] = 0.0; + out_grads[65][2] = 0.0; + out_grads[66][2] = 0.0; + out_grads[78][0] = 0.0; + out_grads[78][1] = 0.0; + out_grads[90][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_2.frag b/fury/shaders/rt_odfs/eval_sh_grad_2.frag new file mode 100644 index 000000000..7004bd528 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_2.frag @@ -0,0 +1,46 @@ +void eval_sh_grad_2(out float out_shs[6], out vec3 out_grads[6], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_4.frag b/fury/shaders/rt_odfs/eval_sh_grad_4.frag new file mode 100644 index 000000000..715302f39 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_4.frag @@ -0,0 +1,103 @@ +void eval_sh_grad_4(out float out_shs[15], out vec3 out_grads[15], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + out_grads[9][0] = -c0 * d; + out_grads[11][0] = s0 * d; + out_grads[9][1] = s0 * d; + out_grads[11][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + d = 6.62322287 * a; + out_grads[8][0] = c1 * d; + out_grads[12][0] = s1 * d; + out_grads[8][1] = -s1 * d; + out_grads[12][1] = c1 * d; + d = -14.049977415 * a; + out_grads[9][2] = -c1 * d; + out_grads[11][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + d = -5.310392309 * z; + out_grads[7][0] = -c0 * d; + out_grads[13][0] = s0 * d; + out_grads[7][1] = s0 * d; + out_grads[13][1] = c0 * d; + d = 6.62322287 * z; + out_grads[8][2] = c0 * d; + out_grads[12][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + d = 2.503342942; + out_grads[6][0] = c1 * d; + out_grads[14][0] = s1 * d; + out_grads[6][1] = -s1 * d; + out_grads[14][1] = c1 * d; + d = -1.77013077; + out_grads[7][2] = -c1 * d; + out_grads[13][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_6.frag b/fury/shaders/rt_odfs/eval_sh_grad_6.frag new file mode 100644 index 000000000..fa240c3a5 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_6.frag @@ -0,0 +1,186 @@ +void eval_sh_grad_6(out float out_shs[28], out vec3 out_grads[28], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + out_grads[9][0] = -c0 * d; + out_grads[11][0] = s0 * d; + out_grads[9][1] = s0 * d; + out_grads[11][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + out_grads[20][0] = -c0 * d; + out_grads[22][0] = s0 * d; + out_grads[20][1] = s0 * d; + out_grads[22][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + d = 6.62322287 * a; + out_grads[8][0] = c1 * d; + out_grads[12][0] = s1 * d; + out_grads[8][1] = -s1 * d; + out_grads[12][1] = c1 * d; + d = -14.049977415 * a; + out_grads[9][2] = -c1 * d; + out_grads[11][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + d = 30.399773564 * a; + out_grads[19][0] = c1 * d; + out_grads[23][0] = s1 * d; + out_grads[19][1] = -s1 * d; + out_grads[23][1] = c1 * d; + d = -96.132524816 * a; + out_grads[20][2] = -c1 * d; + out_grads[22][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + d = -5.310392309 * z; + out_grads[7][0] = -c0 * d; + out_grads[13][0] = s0 * d; + out_grads[7][1] = s0 * d; + out_grads[13][1] = c0 * d; + d = 6.62322287 * z; + out_grads[8][2] = c0 * d; + out_grads[12][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + d = -30.399773564 * b; + out_grads[18][0] = -c0 * d; + out_grads[24][0] = s0 * d; + out_grads[18][1] = s0 * d; + out_grads[24][1] = c0 * d; + d = 60.799547128 * b; + out_grads[19][2] = c0 * d; + out_grads[23][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + d = 2.503342942; + out_grads[6][0] = c1 * d; + out_grads[14][0] = s1 * d; + out_grads[6][1] = -s1 * d; + out_grads[14][1] = c1 * d; + d = -1.77013077; + out_grads[7][2] = -c1 * d; + out_grads[13][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + d = 22.200855632 * a; + out_grads[17][0] = c1 * d; + out_grads[25][0] = s1 * d; + out_grads[17][1] = -s1 * d; + out_grads[25][1] = c1 * d; + d = -30.399773564 * a; + out_grads[18][2] = -c1 * d; + out_grads[24][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + d = -11.833095811 * z; + out_grads[16][0] = -c0 * d; + out_grads[26][0] = s0 * d; + out_grads[16][1] = s0 * d; + out_grads[26][1] = c0 * d; + d = 11.100427816 * z; + out_grads[17][2] = c0 * d; + out_grads[25][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + d = 4.099104631; + out_grads[15][0] = c1 * d; + out_grads[27][0] = s1 * d; + out_grads[15][1] = -s1 * d; + out_grads[27][1] = c1 * d; + d = -2.366619162; + out_grads[16][2] = -c1 * d; + out_grads[26][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/eval_sh_grad_8.frag b/fury/shaders/rt_odfs/eval_sh_grad_8.frag new file mode 100644 index 000000000..b0a40d0a7 --- /dev/null +++ b/fury/shaders/rt_odfs/eval_sh_grad_8.frag @@ -0,0 +1,295 @@ +void eval_sh_grad_8(out float out_shs[45], out vec3 out_grads[45], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[2] = -c1 * d; + out_shs[4] = s1 * d; + out_grads[2][0] = -c0 * d; + out_grads[4][0] = s0 * d; + out_grads[2][1] = s0 * d; + out_grads[4][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[9] = -c1 * d; + out_shs[11] = s1 * d; + out_grads[9][0] = -c0 * d; + out_grads[11][0] = s0 * d; + out_grads[9][1] = s0 * d; + out_grads[11][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[20] = -c1 * d; + out_shs[22] = s1 * d; + out_grads[20][0] = -c0 * d; + out_grads[22][0] = s0 * d; + out_grads[20][1] = s0 * d; + out_grads[22][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[35] = -c1 * d; + out_shs[37] = s1 * d; + out_grads[35][0] = -c0 * d; + out_grads[37][0] = s0 * d; + out_grads[35][1] = s0 * d; + out_grads[37][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[1] = c0 * d; + out_shs[5] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[1][1] = -s1 * d; + out_grads[5][1] = c1 * d; + d = -1.092548431; + out_grads[2][2] = -c1 * d; + out_grads[4][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[8] = c0 * d; + out_shs[12] = s0 * d; + d = 6.62322287 * a; + out_grads[8][0] = c1 * d; + out_grads[12][0] = s1 * d; + out_grads[8][1] = -s1 * d; + out_grads[12][1] = c1 * d; + d = -14.049977415 * a; + out_grads[9][2] = -c1 * d; + out_grads[11][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[19] = c0 * d; + out_shs[23] = s0 * d; + d = 30.399773564 * a; + out_grads[19][0] = c1 * d; + out_grads[23][0] = s1 * d; + out_grads[19][1] = -s1 * d; + out_grads[23][1] = c1 * d; + d = -96.132524816 * a; + out_grads[20][2] = -c1 * d; + out_grads[22][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[34] = c0 * d; + out_shs[38] = s0 * d; + d = 130.459545912 * a; + out_grads[34][0] = c1 * d; + out_grads[38][0] = s1 * d; + out_grads[34][1] = -s1 * d; + out_grads[38][1] = c1 * d; + d = -545.751435723 * a; + out_grads[35][2] = -c1 * d; + out_grads[37][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[7] = -c1 * d; + out_shs[13] = s1 * d; + d = -5.310392309 * z; + out_grads[7][0] = -c0 * d; + out_grads[13][0] = s0 * d; + out_grads[7][1] = s0 * d; + out_grads[13][1] = c0 * d; + d = 6.62322287 * z; + out_grads[8][2] = c0 * d; + out_grads[12][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[18] = -c1 * d; + out_shs[24] = s1 * d; + d = -30.399773564 * b; + out_grads[18][0] = -c0 * d; + out_grads[24][0] = s0 * d; + out_grads[18][1] = s0 * d; + out_grads[24][1] = c0 * d; + d = 60.799547128 * b; + out_grads[19][2] = c0 * d; + out_grads[23][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[33] = -c1 * d; + out_shs[39] = s1 * d; + d = -144.52614017 * b; + out_grads[33][0] = -c0 * d; + out_grads[39][0] = s0 * d; + out_grads[33][1] = s0 * d; + out_grads[39][1] = c0 * d; + d = 391.378637737 * b; + out_grads[34][2] = c0 * d; + out_grads[38][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[6] = c0 * d; + out_shs[14] = s0 * d; + d = 2.503342942; + out_grads[6][0] = c1 * d; + out_grads[14][0] = s1 * d; + out_grads[6][1] = -s1 * d; + out_grads[14][1] = c1 * d; + d = -1.77013077; + out_grads[7][2] = -c1 * d; + out_grads[13][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[17] = c0 * d; + out_shs[25] = s0 * d; + d = 22.200855632 * a; + out_grads[17][0] = c1 * d; + out_grads[25][0] = s1 * d; + out_grads[17][1] = -s1 * d; + out_grads[25][1] = c1 * d; + d = -30.399773564 * a; + out_grads[18][2] = -c1 * d; + out_grads[24][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[32] = c0 * d; + out_shs[40] = s0 * d; + d = 124.388296437 * a; + out_grads[32][0] = c1 * d; + out_grads[40][0] = s1 * d; + out_grads[32][1] = -s1 * d; + out_grads[40][1] = c1 * d; + d = -240.876900283 * a; + out_grads[33][2] = -c1 * d; + out_grads[39][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[16] = -c1 * d; + out_shs[26] = s1 * d; + d = -11.833095811 * z; + out_grads[16][0] = -c0 * d; + out_grads[26][0] = s0 * d; + out_grads[16][1] = s0 * d; + out_grads[26][1] = c0 * d; + d = 11.100427816 * z; + out_grads[17][2] = c0 * d; + out_grads[25][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[31] = -c1 * d; + out_shs[41] = s1 * d; + d = -86.247765552 * b; + out_grads[31][0] = -c0 * d; + out_grads[41][0] = s0 * d; + out_grads[31][1] = s0 * d; + out_grads[41][1] = c0 * d; + d = 124.388296437 * b; + out_grads[32][2] = c0 * d; + out_grads[40][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[15] = c0 * d; + out_shs[27] = s0 * d; + d = 4.099104631; + out_grads[15][0] = c1 * d; + out_grads[27][0] = s1 * d; + out_grads[15][1] = -s1 * d; + out_grads[27][1] = c1 * d; + d = -2.366619162; + out_grads[16][2] = -c1 * d; + out_grads[26][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[30] = c0 * d; + out_shs[42] = s0 * d; + d = 47.909948945 * a; + out_grads[30][0] = c1 * d; + out_grads[42][0] = s1 * d; + out_grads[30][1] = -s1 * d; + out_grads[42][1] = c1 * d; + d = -51.748659331 * a; + out_grads[31][2] = -c1 * d; + out_grads[41][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[29] = -c1 * d; + out_shs[43] = s1 * d; + d = -20.409946485 * z; + out_grads[29][0] = -c0 * d; + out_grads[43][0] = s0 * d; + out_grads[29][1] = s0 * d; + out_grads[43][1] = c0 * d; + d = 15.969982982 * z; + out_grads[30][2] = c0 * d; + out_grads[42][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[28] = c0 * d; + out_shs[44] = s0 * d; + d = 5.831413281; + out_grads[28][0] = c1 * d; + out_grads[44][0] = s1 * d; + out_grads[28][1] = -s1 * d; + out_grads[44][1] = c1 * d; + d = -2.915706641; + out_grads[29][2] = -c1 * d; + out_grads[43][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; + out_grads[28][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[44][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/find_roots.frag b/fury/shaders/rt_odfs/find_roots.frag new file mode 100644 index 000000000..e5b80f7a4 --- /dev/null +++ b/fury/shaders/rt_odfs/find_roots.frag @@ -0,0 +1,82 @@ +void find_roots(out float out_roots[MAX_DEGREE + 1], float poly[MAX_DEGREE + 1], float begin, float end) { + float tolerance = (end - begin) * 1.0e-4; + // Construct the quadratic derivative of the polynomial. We divide each + // derivative by the factorial of its order, such that the constant + // coefficient can be copied directly from poly. That is a safeguard + // against overflow and makes it easier to avoid spilling below. The + // factors happen to be binomial coefficients then. + float derivative[MAX_DEGREE + 1]; + derivative[0] = poly[MAX_DEGREE - 2]; + derivative[1] = float(MAX_DEGREE - 1) * poly[MAX_DEGREE - 1]; + derivative[2] = (0.5 * float((MAX_DEGREE - 1) * MAX_DEGREE)) * poly[MAX_DEGREE - 0]; + _unroll_ + for (int i = 3; i != MAX_DEGREE + 1; ++i) + derivative[i] = 0.0; + // Compute its two roots using the quadratic formula + float discriminant = derivative[1] * derivative[1] - 4.0 * derivative[0] * derivative[2]; + if (discriminant >= 0.0) { + float sqrt_discriminant = sqrt(discriminant); + float scaled_root = derivative[1] + ((derivative[1] > 0.0) ? sqrt_discriminant : (-sqrt_discriminant)); + float root_0 = clamp(-2.0 * derivative[0] / scaled_root, begin, end); + float root_1 = clamp(-0.5 * scaled_root / derivative[2], begin, end); + out_roots[MAX_DEGREE - 2] = min(root_0, root_1); + out_roots[MAX_DEGREE - 1] = max(root_0, root_1); + } + else { + // Indicate that the cubic derivative has a single root + out_roots[MAX_DEGREE - 2] = begin; + out_roots[MAX_DEGREE - 1] = begin; + } + // The last entry in the root array is set to end to make it easier to + // iterate over relevant intervals, all untouched roots are set to begin + out_roots[MAX_DEGREE] = end; + _unroll_ + for (int i = 0; i != MAX_DEGREE - 2; ++i) + out_roots[i] = begin; + // Work your way up to derivatives of higher degree until you reach the + // polynomial itself. This implementation may seem peculiar: It always + // treats the derivative as though it had degree MAX_DEGREE and it + // constructs the derivatives in a contrived way. Changing that would + // reduce the number of arithmetic instructions roughly by a factor of two. + // However, it would also cause register spilling, which has a far more + // negative impact on the overall run time. Profiling indicates that the + // current implementation has no spilling whatsoever. + _loop_ + for (int degree = 3; degree != MAX_DEGREE + 1; ++degree) { + // Take the integral of the previous derivative (scaled such that the + // constant coefficient can still be copied directly from poly) + float prev_derivative_order = float(MAX_DEGREE + 1 - degree); + _unroll_ + for (int i = MAX_DEGREE; i != 0; --i) + derivative[i] = derivative[i - 1] * (prev_derivative_order * (1.0 / float(i))); + // Copy the constant coefficient without causing spilling. This part + // would be harder if the derivative were not scaled the way it is. + _unroll_ + for (int i = 0; i != MAX_DEGREE - 2; ++i) + derivative[0] = (degree == MAX_DEGREE - i) ? poly[i] : derivative[0]; + // Determine the value of this derivative at begin + float begin_value = derivative[MAX_DEGREE]; + _unroll_ + for (int i = MAX_DEGREE - 1; i != -1; --i) + begin_value = begin_value * begin + derivative[i]; + // Iterate over the intervals where roots may be found + _unroll_ + for (int i = 0; i != MAX_DEGREE; ++i) { + if (i < MAX_DEGREE - degree) + continue; + float current_begin = out_roots[i]; + float current_end = out_roots[i + 1]; + // Try to find a root + float root; + if (newton_bisection(root, begin_value, derivative, current_begin, current_end, begin_value, tolerance)) + out_roots[i] = root; + else if (degree < MAX_DEGREE) + // Create an empty interval for the next iteration + out_roots[i] = out_roots[i - 1]; + else + out_roots[i] = NO_INTERSECTION; + } + } + // We no longer need this array entry + out_roots[MAX_DEGREE] = NO_INTERSECTION; +} diff --git a/fury/shaders/rt_odfs/get_inv_vandermonde.frag b/fury/shaders/rt_odfs/get_inv_vandermonde.frag new file mode 100644 index 000000000..4c7f521c0 --- /dev/null +++ b/fury/shaders/rt_odfs/get_inv_vandermonde.frag @@ -0,0 +1,58 @@ +void get_inv_vandermonde(out float v[(SH_DEGREE + 1) * (SH_DEGREE + 1)]) +{ + #if SH_DEGREE == 2 + v[0*3 + 0] = -0.3333333333; v[0*3 + 1] = 0.6666666667; v[0*3 + 2] = 0.6666666667; + v[1*3 + 0] = -0.0; v[1*3 + 1] = 1.1547005384; v[1*3 + 2] = -1.1547005384; + v[2*3 + 0] = 1.0; v[2*3 + 1] = 0.0; v[2*3 + 2] = 0.0; + #elif SH_DEGREE == 4 + v[0*5 + 0] = 0.2; v[0*5 + 1] = -0.2472135955; v[0*5 + 2] = 0.6472135955; v[0*5 + 3] = 0.6472135955; v[0*5 + 4] = -0.2472135955; + v[1*5 + 0] = 0.0; v[1*5 + 1] = -0.1796111906; v[1*5 + 2] = 1.9919186279; v[1*5 + 3] = -1.9919186279; v[1*5 + 4] = 0.1796111906; + v[2*5 + 0] = -2.0; v[2*5 + 1] = 2.3416407865; v[2*5 + 2] = -0.3416407865; v[2*5 + 3] = -0.3416407865; v[2*5 + 4] = 2.3416407865; + v[3*5 + 0] = -0.0; v[3*5 + 1] = 1.7013016167; v[3*5 + 2] = -1.0514622242; v[3*5 + 3] = 1.0514622242; v[3*5 + 4] = -1.7013016167; + v[4*5 + 0] = 1.0; v[4*5 + 1] = 0.0; v[4*5 + 2] = 0.0; v[4*5 + 3] = 0.0; v[4*5 + 4] = 0.0; + #elif SH_DEGREE == 6 + v[0*7 + 0] = -0.1428571429; v[0*7 + 1] = 0.1585594663; v[0*7 + 2] = -0.2291250674; v[0*7 + 3] = 0.6419941725; v[0*7 + 4] = 0.6419941725; v[0*7 + 5] = -0.2291250674; v[0*7 + 6] = 0.1585594663; + v[1*7 + 0] = -0.0; v[1*7 + 1] = 0.0763582145; v[1*7 + 2] = -0.2873137468; v[1*7 + 3] = 2.8127602518; v[1*7 + 4] = -2.8127602518; v[1*7 + 5] = 0.2873137468; v[1*7 + 6] = -0.0763582145; + v[2*7 + 0] = 3.0; v[2*7 + 1] = -3.2929766145; v[2*7 + 2] = 4.4513463718; v[2*7 + 3] = -1.1583697574; v[2*7 + 4] = -1.1583697574; v[2*7 + 5] = 4.4513463718; v[2*7 + 6] = -3.2929766145; + v[3*7 + 0] = 0.0; v[3*7 + 1] = -1.5858139579; v[3*7 + 2] = 5.5818117995; v[3*7 + 3] = -5.0751495106; v[3*7 + 4] = 5.0751495106; v[3*7 + 5] = -5.5818117995; v[3*7 + 6] = 1.5858139579; + v[4*7 + 0] = -5.0; v[4*7 + 1] = 4.7858935686; v[4*7 + 2] = -1.0200067492; v[4*7 + 3] = 0.2341131806; v[4*7 + 4] = 0.2341131806; v[4*7 + 5] = -1.0200067492; v[4*7 + 6] = 4.7858935686; + v[5*7 + 0] = -0.0; v[5*7 + 1] = 2.3047648710; v[5*7 + 2] = -1.2790480077; v[5*7 + 3] = 1.0257168633; v[5*7 + 4] = -1.0257168633; v[5*7 + 5] = 1.2790480077; v[5*7 + 6] = -2.3047648710; + v[6*7 + 0] = 1.0; v[6*7 + 1] = 0.0; v[6*7 + 2] = 0.0; v[6*7 + 3] = 0.0; v[6*7 + 4] = 0.0; v[6*7 + 5] = 0.0; v[6*7 + 6] = 0.0; + #elif SH_DEGREE == 8 + v[0*9 + 0] = 0.1111111111; v[0*9 + 1] = -0.1182419747; v[0*9 + 2] = 0.1450452544; v[0*9 + 3] = -0.2222222222; v[0*9 + 4] = 0.6398633870; v[0*9 + 5] = 0.6398633870; v[0*9 + 6] = -0.2222222222; v[0*9 + 7] = 0.1450452544; v[0*9 + 8] = -0.1182419747; + v[1*9 + 0] = 0.0; v[1*9 + 1] = -0.0430365592; v[1*9 + 2] = 0.1217074194; v[1*9 + 3] = -0.3849001795; v[1*9 + 4] = 3.6288455938; v[1*9 + 5] = -3.6288455938; v[1*9 + 6] = 0.3849001795; v[1*9 + 7] = -0.1217074194; v[1*9 + 8] = 0.0430365592; + v[2*9 + 0] = -4.0; v[2*9 + 1] = 4.2410470634; v[2*9 + 2] = -5.1195045066; v[2*9 + 3] = 7.3333333333; v[2*9 + 4] = -2.4548758901; v[2*9 + 5] = -2.4548758901; v[2*9 + 6] = 7.3333333333; v[2*9 + 7] = -5.1195045066; v[2*9 + 8] = 4.2410470634; + v[3*9 + 0] = -0.0; v[3*9 + 1] = 1.5436148932; v[3*9 + 2] = -4.2957743433; v[3*9 + 3] = 12.7017059222; v[3*9 + 4] = -13.9222930051; v[3*9 + 5] = 13.9222930051; v[3*9 + 6] = -12.7017059222; v[3*9 + 7] = 4.2957743433; v[3*9 + 8] = -1.5436148932; + v[4*9 + 0] = 14.0; v[4*9 + 1] = -14.3366589404; v[4*9 + 2] = 14.6711193836; v[4*9 + 3] = -6.0; v[4*9 + 4] = 1.6655395568; v[4*9 + 5] = 1.6655395568; v[4*9 + 6] = -6.0; v[4*9 + 7] = 14.6711193836; v[4*9 + 8] = -14.3366589404; + v[5*9 + 0] = 0.0; v[5*9 + 1] = -5.2181171131; v[5*9 + 2] = 12.3105308637; v[5*9 + 3] = -10.3923048454; v[5*9 + 4] = 9.4457442082; v[5*9 + 5] = -9.4457442082; v[5*9 + 6] = 10.3923048454; v[5*9 + 7] = -12.3105308637; v[5*9 + 8] = 5.2181171131; + v[6*9 + 0] = -9.3333333333; v[6*9 + 1] = 8.0330865684; v[6*9 + 2] = -1.8540394597; v[6*9 + 3] = 0.6666666667; v[6*9 + 4] = -0.1790471086; v[6*9 + 5] = -0.1790471086; v[6*9 + 6] = 0.6666666667; v[6*9 + 7] = -1.8540394597; v[6*9 + 8] = 8.0330865684; + v[7*9 + 0] = -0.0; v[7*9 + 1] = 2.9238044002; v[7*9 + 2] = -1.5557238269; v[7*9 + 3] = 1.1547005384; v[7*9 + 4] = -1.0154266119; v[7*9 + 5] = 1.0154266119; v[7*9 + 6] = -1.1547005384; v[7*9 + 7] = 1.5557238269; v[7*9 + 8] = -2.9238044002; + v[8*9 + 0] = 1.0; v[8*9 + 1] = 0.0; v[8*9 + 2] = 0.0; v[8*9 + 3] = 0.0; v[8*9 + 4] = 0.0; v[8*9 + 5] = 0.0; v[8*9 + 6] = 0.0; v[8*9 + 7] = 0.0; v[8*9 + 8] = 0.0; + #elif SH_DEGREE == 10 + v[0*11 + 0] = -0.0909090909; v[0*11 + 1] = 0.0947470106; v[0*11 + 2] = -0.1080638444; v[0*11 + 3] = 0.1388220215; v[0*11 + 4] = -0.2188392043; v[0*11 + 5] = 0.6387885621; v[0*11 + 6] = 0.6387885621; v[0*11 + 7] = -0.2188392043; v[0*11 + 8] = 0.1388220215; v[0*11 + 9] = -0.1080638444; v[0*11 + 10] = 0.0947470106; + v[1*11 + 0] = -0.0; v[1*11 + 1] = 0.0278202324; v[1*11 + 2] = -0.0694484159; v[1*11 + 3] = 0.1602091533; v[1*11 + 4] = -0.4791910159; v[1*11 + 5] = 4.4428720384; v[1*11 + 6] = -4.4428720384; v[1*11 + 7] = 0.4791910159; v[1*11 + 8] = -0.1602091533; v[1*11 + 9] = 0.0694484159; v[1*11 + 10] = -0.0278202324; + v[2*11 + 0] = 5.0; v[2*11 + 1] = -5.2029168239; v[2*11 + 2] = 5.8988796576; v[2*11 + 3] = -7.4503199653; v[2*11 + 4] = 10.9868742757; v[2*11 + 5] = -4.2325171441; v[2*11 + 6] = -4.2325171441; v[2*11 + 7] = 10.9868742757; v[2*11 + 8] = -7.4503199653; v[2*11 + 9] = 5.8988796576; v[2*11 + 10] = -5.2029168239; + v[3*11 + 0] = 0.0; v[3*11 + 1] = -1.5277142200; v[3*11 + 2] = 3.7909797649; v[3*11 + 3] = -8.5981275876; v[3*11 + 4] = 24.0578988657; v[3*11 + 5] = -29.4378033460; v[3*11 + 6] = 29.4378033460; v[3*11 + 7] = -24.0578988657; v[3*11 + 8] = 8.5981275876; v[3*11 + 9] = -3.7909797649; v[3*11 + 10] = 1.5277142200; + v[4*11 + 0] = -30.0; v[4*11 + 1] = 30.8179361182; v[4*11 + 2] = -33.2247539061; v[4*11 + 3] = 35.8884989085; v[4*11 + 4] = -19.5374870834; v[4*11 + 5] = 6.0558059629; v[4*11 + 6] = 6.0558059629; v[4*11 + 7] = -19.5374870834; v[4*11 + 8] = 35.8884989085; v[4*11 + 9] = -33.2247539061; v[4*11 + 10] = 30.8179361182; + v[5*11 + 0] = -0.0; v[5*11 + 1] = 9.0489625020; v[5*11 + 2] = -21.3522528115; v[5*11 + 3] = 41.4175356200; v[5*11 + 4] = -42.7811292411; v[5*11 + 5] = 42.1190556280; v[5*11 + 6] = -42.1190556280; v[5*11 + 7] = 42.7811292411; v[5*11 + 8] = -41.4175356200; v[5*11 + 9] = 21.3522528115; v[5*11 + 10] = -9.0489625020; + v[6*11 + 0] = 42.0; v[6*11 + 1] = -41.1161037573; v[6*11 + 2] = 36.2032364762; v[6*11 + 3] = -16.3373898141; v[6*11 + 4] = 7.4261062994; v[6*11 + 5] = -2.1758492042; v[6*11 + 6] = -2.1758492042; v[6*11 + 7] = 7.4261062994; v[6*11 + 8] = -16.3373898141; v[6*11 + 9] = 36.2032364762; v[6*11 + 10] = -41.1161037573; + v[7*11 + 0] = 0.0; v[7*11 + 1] = -12.0727773496; v[7*11 + 2] = 23.2664073304; v[7*11 + 3] = -18.8543529304; v[7*11 + 4] = 16.2609045881; v[7*11 + 5] = -15.1333636234; v[7*11 + 6] = 15.1333636234; v[7*11 + 7] = -16.2609045881; v[7*11 + 8] = 18.8543529304; v[7*11 + 9] = -23.2664073304; v[7*11 + 10] = 12.0727773496; + v[8*11 + 0] = -15.0; v[8*11 + 1] = 12.0883694702; v[8*11 + 2] = -2.8781222629; v[8*11 + 3] = 1.1465503415; v[8*11 + 4] = -0.5020543475; v[8*11 + 5] = 0.1452567988; v[8*11 + 6] = 0.1452567988; v[8*11 + 7] = -0.5020543475; v[8*11 + 8] = 1.1465503415; v[8*11 + 9] = -2.8781222629; v[8*11 + 10] = 12.0883694702; + v[9*11 + 0] = -0.0; v[9*11 + 1] = 3.5494655329; v[9*11 + 2] = -1.8496568659; v[9*11 + 3] = 1.3231896304; v[9*11 + 4] = -1.0993456751; v[9*11 + 5] = 1.0102832265; v[9*11 + 6] = -1.0102832265; v[9*11 + 7] = 1.0993456751; v[9*11 + 8] = -1.3231896304; v[9*11 + 9] = 1.8496568659; v[9*11 + 10] = -3.5494655329; + v[10*11 + 0] = 1.0; v[10*11 + 1] = 0.0; v[10*11 + 2] = 0.0; v[10*11 + 3] = 0.0; v[10*11 + 4] = 0.0; v[10*11 + 5] = 0.0; v[10*11 + 6] = 0.0; v[10*11 + 7] = 0.0; v[10*11 + 8] = 0.0; v[10*11 + 9] = 0.0; v[10*11 + 10] = 0.0; + #elif SH_DEGREE == 12 + v[0*13 + 0] = 0.0769230769; v[0*13 + 1] = -0.0792252178; v[0*13 + 2] = 0.0868739663; v[0*13 + 3] = -0.1027681661; v[0*13 + 4] = 0.1354125166; v[0*13 + 5] = -0.2169261613; v[0*13 + 6] = 0.6381715239; v[0*13 + 7] = 0.6381715239; v[0*13 + 8] = -0.2169261613; v[0*13 + 9] = 0.1354125166; v[0*13 + 10] = -0.1027681661; v[0*13 + 11] = 0.0868739663; v[0*13 + 12] = -0.0792252178; + v[1*13 + 0] = -0.0; v[1*13 + 1] = -0.0195272624; v[1*13 + 2] = 0.0455949748; v[1*13 + 3] = -0.0910446506; v[1*13 + 4] = 0.1961788986; v[1*13 + 5] = -0.5719872785; v[1*13 + 6] = 5.2558153553; v[1*13 + 7] = -5.2558153553; v[1*13 + 8] = 0.5719872785; v[1*13 + 9] = -0.1961788986; v[1*13 + 10] = 0.0910446506; v[1*13 + 11] = -0.0455949748; v[1*13 + 12] = 0.0195272624; + v[2*13 + 0] = -6.0; v[2*13 + 1] = 6.1747539478; v[2*13 + 2] = -6.7522392818; v[2*13 + 3] = 7.9352584366; v[2*13 + 4] = -10.2779620900; v[2*13 + 5] = 15.4120340799; v[2*13 + 6] = -6.4918450925; v[2*13 + 7] = -6.4918450925; v[2*13 + 8] = 15.4120340799; v[2*13 + 9] = -10.2779620900; v[2*13 + 10] = 7.9352584366; v[2*13 + 11] = -6.7522392818; v[2*13 + 12] = 6.1747539478; + v[3*13 + 0] = -0.0; v[3*13 + 1] = 1.5219401578; v[3*13 + 2] = -3.5438485554; v[3*13 + 3] = 7.0300255289; v[3*13 + 4] = -14.8901987371; v[3*13 + 5] = 40.6381940129; v[3*13 + 6] = -53.4651544987; v[3*13 + 7] = 53.4651544987; v[3*13 + 8] = -40.6381940129; v[3*13 + 9] = 14.8901987371; v[3*13 + 10] = -7.0300255289; v[3*13 + 11] = 3.5438485554; v[3*13 + 12] = -1.5219401578; + v[4*13 + 0] = 55.0; v[4*13 + 1] = -56.2709061445; v[4*13 + 2] = 60.2549306937; v[4*13 + 3] = -67.2511796347; v[4*13 + 4] = 75.2477722397; v[4*13 + 5] = -47.9480941911; v[4*13 + 6] = 15.9674770369; v[4*13 + 7] = 15.9674770369; v[4*13 + 8] = -47.9480941911; v[4*13 + 9] = 75.2477722397; v[4*13 + 10] = -67.2511796347; v[4*13 + 11] = 60.2549306937; v[4*13 + 12] = -56.2709061445; + v[5*13 + 0] = 0.0; v[5*13 + 1] = -13.8695326974; v[5*13 + 2] = 31.6242271914; v[5*13 + 3] = -59.5793462127; v[5*13 + 4] = 109.0152185187; v[5*13 + 5] = -126.4287338180; v[5*13 + 6] = 131.5040045727; v[5*13 + 7] = -131.5040045727; v[5*13 + 8] = 126.4287338180; v[5*13 + 9] = -109.0152185187; v[5*13 + 10] = 59.5793462127; v[5*13 + 11] = -31.6242271914; v[5*13 + 12] = 13.8695326974; + v[6*13 + 0] = -132.0; v[6*13 + 1] = 132.5319409049; v[6*13 + 2] = -132.4780513404; v[6*13 + 3] = 123.5674782081; v[6*13 + 4] = -74.4320682907; v[6*13 + 5] = 38.8801193717; v[6*13 + 6] = -12.0694188537; v[6*13 + 7] = -12.0694188537; v[6*13 + 8] = 38.8801193717; v[6*13 + 9] = -74.4320682907; v[6*13 + 10] = 123.5674782081; v[6*13 + 11] = -132.4780513404; v[6*13 + 12] = 132.5319409049; + v[7*13 + 0] = -0.0; v[7*13 + 1] = 32.6661895777; v[7*13 + 2] = -69.5298450306; v[7*13 + 3] = 109.4712331409; v[7*13 + 4] = -107.8334673306; v[7*13 + 5] = 102.5184492897; v[7*13 + 6] = -99.4006071501; v[7*13 + 7] = 99.4006071501; v[7*13 + 8] = -102.5184492897; v[7*13 + 9] = 107.8334673306; v[7*13 + 10] = -109.4712331409; v[7*13 + 11] = 69.5298450306; v[7*13 + 12] = -32.6661895777; + v[8*13 + 0] = 99.0; v[8*13 + 1] = -93.9113626635; v[8*13 + 2] = 75.3147168618; v[8*13 + 3] = -35.2795800772; v[8*13 + 4] = 18.0521608541; v[8*13 + 5] = -8.8650350126; v[8*13 + 6] = 2.6891000373; v[8*13 + 7] = 2.6891000373; v[8*13 + 8] = -8.8650350126; v[8*13 + 9] = 18.0521608541; v[8*13 + 10] = -35.2795800772; v[8*13 + 11] = 75.3147168618; v[8*13 + 12] = -93.9113626635; + v[9*13 + 0] = 0.0; v[9*13 + 1] = -23.1470719837; v[9*13 + 2] = 39.5282127035; v[9*13 + 3] = -31.2549806126; v[9*13 + 4] = 26.1530700733; v[9*13 + 5] = -23.3751762359; v[9*13 + 6] = 22.1467313083; v[9*13 + 7] = -22.1467313083; v[9*13 + 8] = 23.3751762359; v[9*13 + 9] = -26.1530700733; v[9*13 + 10] = 31.2549806126; v[9*13 + 11] = -39.5282127035; v[9*13 + 12] = 23.1470719837; + v[10*13 + 0] = -22.0; v[10*13 + 1] = 16.9531714429; v[10*13 + 2] = -4.0999479387; v[10*13 + 3] = 1.7021989010; v[10*13 + 4] = -0.8387165175; v[10*13 + 5] = 0.4056079008; v[10*13 + 6] = -0.1223137885; v[10*13 + 7] = -0.1223137885; v[10*13 + 8] = 0.4056079008; v[10*13 + 9] = -0.8387165175; v[10*13 + 10] = 1.7021989010; v[10*13 + 11] = -4.0999479387; v[10*13 + 12] = 16.9531714429; + v[11*13 + 0] = -0.0; v[11*13 + 1] = 4.1785814689; v[11*13 + 2] = -2.1518186743; v[11*13 + 3] = 1.5080166355; v[11*13 + 4] = -1.2150906493; v[11*13 + 5] = 1.0695001374; v[11*13 + 6] = -1.0073446769; v[11*13 + 7] = 1.0073446769; v[11*13 + 8] = -1.0695001374; v[11*13 + 9] = 1.2150906493; v[11*13 + 10] = -1.5080166355; v[11*13 + 11] = 2.1518186743; v[11*13 + 12] = -4.1785814689; + v[12*13 + 0] = 1.0; v[12*13 + 1] = 0.0; v[12*13 + 2] = 0.0; v[12*13 + 3] = 0.0; v[12*13 + 4] = 0.0; v[12*13 + 5] = 0.0; v[12*13 + 6] = 0.0; v[12*13 + 7] = 0.0; v[12*13 + 8] = 0.0; v[12*13 + 9] = 0.0; v[12*13 + 10] = 0.0; v[12*13 + 11] = 0.0; v[12*13 + 12] = 0.0; + #endif +} diff --git a/fury/shaders/rt_odfs/get_sh_glyph_normal.frag b/fury/shaders/rt_odfs/get_sh_glyph_normal.frag new file mode 100644 index 000000000..4831fb8b4 --- /dev/null +++ b/fury/shaders/rt_odfs/get_sh_glyph_normal.frag @@ -0,0 +1,16 @@ +vec3 get_sh_glyph_normal(float sh_coeffs[SH_COUNT], vec3 point) +{ + float shs[SH_COUNT]; + vec3 grads[SH_COUNT]; + float length_inv = inversesqrt(dot(point, point)); + vec3 normalized = point * length_inv; + eval_sh_grad(shs, grads, normalized); + float value = 0.0; + vec3 grad = vec3(0.0); + _unroll_ + for (int i = 0; i != SH_COUNT; ++i) { + value += sh_coeffs[i] * shs[i]; + grad += sh_coeffs[i] * grads[i]; + } + return normalize(point - (value * length_inv) * (grad - dot(grad, normalized) * normalized)); +} diff --git a/fury/shaders/rt_odfs/gltf_dielectric_brdf.frag b/fury/shaders/rt_odfs/gltf_dielectric_brdf.frag new file mode 100644 index 000000000..465ab2266 --- /dev/null +++ b/fury/shaders/rt_odfs/gltf_dielectric_brdf.frag @@ -0,0 +1,41 @@ +vec3 gltf_dielectric_brdf(vec3 incoming, vec3 outgoing, vec3 normal, float roughness, vec3 base_color) +{ + float ni = dot(normal, incoming); + float no = dot(normal, outgoing); + // Early out if incoming or outgoing direction are below the horizon + if (ni <= 0.0 || no <= 0.0) + return vec3(0.0); + // Save some work by not actually computing the half-vector. If the half- + // vector were h, ih = dot(incoming, h) and + // sqrt(nh_ih_2 / ih_2) = dot(normal, h). + float ih_2 = dot(incoming, outgoing) * 0.5 + 0.5; + float sum = ni + no; + float nh_ih_2 = 0.25 * sum * sum; + float ih = sqrt(ih_2); + + // Evaluate the GGX normal distribution function + float roughness_2 = roughness * roughness; + float roughness_4 = roughness_2 * roughness_2; + float roughness_flip = 1.0 - roughness_4; + float denominator = ih_2 - nh_ih_2 * roughness_flip; + float ggx = (roughness_4 * M_INV_PI * ih_2) / (denominator * denominator); + // Evaluate the "visibility" (i.e. masking-shadowing times geometry terms) + float vi = ni + sqrt(roughness_4 + roughness_flip * ni * ni); + float vo = no + sqrt(roughness_4 + roughness_flip * no * no); + float v = 1.0 / (vi * vo); + // That completes the specular BRDF + float specular = v * ggx; + + // The diffuse BRDF is Lambertian + vec3 diffuse = M_INV_PI * base_color; + + // Evaluate the Fresnel term using the Fresnel-Schlick approximation + const float ior = 1.5; + const float f0 = ((1.0 - ior) / (1.0 + ior)) * ((1.0 - ior) / (1.0 + ior)); + float ih_flip = 1.0 - ih; + float ih_flip_2 = ih_flip * ih_flip; + float fresnel = f0 + (1.0 - f0) * ih_flip * ih_flip_2 * ih_flip_2; + + // Mix the two components + return mix(diffuse, vec3(specular), fresnel); +} diff --git a/fury/shaders/rt_odfs/linear_rgb_to_srgb.frag b/fury/shaders/rt_odfs/linear_rgb_to_srgb.frag new file mode 100644 index 000000000..d1c72c83b --- /dev/null +++ b/fury/shaders/rt_odfs/linear_rgb_to_srgb.frag @@ -0,0 +1,4 @@ +vec3 linear_rgb_to_srgb(vec3 linear) +{ + return vec3(linear_to_srgb(linear.r), linear_to_srgb(linear.g), linear_to_srgb(linear.b)); +} diff --git a/fury/shaders/rt_odfs/linear_to_srgb.frag b/fury/shaders/rt_odfs/linear_to_srgb.frag new file mode 100644 index 000000000..ac686853c --- /dev/null +++ b/fury/shaders/rt_odfs/linear_to_srgb.frag @@ -0,0 +1,4 @@ +float linear_to_srgb(float linear) +{ + return (linear <= 0.0031308) ? (12.92 * linear) : (1.055 * pow(linear, 1.0 / 2.4) - 0.055); +} diff --git a/fury/shaders/rt_odfs/newton_bisection.frag b/fury/shaders/rt_odfs/newton_bisection.frag new file mode 100644 index 000000000..3f4b7f81f --- /dev/null +++ b/fury/shaders/rt_odfs/newton_bisection.frag @@ -0,0 +1,47 @@ +bool newton_bisection(out float out_root, out float out_end_value, + float poly[MAX_DEGREE + 1], float begin, float end, + float begin_value, float error_tolerance) +{ + if (begin == end) { + out_end_value = begin_value; + return false; + } + // Evaluate the polynomial at the end of the interval + out_end_value = poly[MAX_DEGREE]; + _unroll_ + for (int i = MAX_DEGREE - 1; i != -1; --i) + out_end_value = out_end_value * end + poly[i]; + // If the values at both ends have the same non-zero sign, there is no root + if (begin_value * out_end_value > 0.0) + return false; + // Otherwise, we find the root iteratively using Newton bisection (with + // bounded iteration count) + float current = 0.5 * (begin + end); + _loop_ + for (int i = 0; i != 90; ++i) { + // Evaluate the polynomial and its derivative + float value = poly[MAX_DEGREE] * current + poly[MAX_DEGREE - 1]; + float derivative = poly[MAX_DEGREE]; + _unroll_ + for (int j = MAX_DEGREE - 2; j != -1; --j) { + derivative = derivative * current + value; + value = value * current + poly[j]; + } + // Shorten the interval + bool right = begin_value * value > 0.0; + begin = right ? current : begin; + end = right ? end : current; + // Apply Newton's method + float guess = current - value / derivative; + // Pick a guess + float middle = 0.5 * (begin + end); + float next = (guess >= begin && guess <= end) ? guess : middle; + // Move along or terminate + bool done = abs(next - current) < error_tolerance; + current = next; + if (done) + break; + } + out_root = current; + return true; +} diff --git a/fury/shaders/rt_odfs/ray_sh_glyph_intersections.frag b/fury/shaders/rt_odfs/ray_sh_glyph_intersections.frag new file mode 100644 index 000000000..a47dbbfc4 --- /dev/null +++ b/fury/shaders/rt_odfs/ray_sh_glyph_intersections.frag @@ -0,0 +1,81 @@ +void ray_sh_glyph_intersections(out float out_ray_params[MAX_DEGREE], float sh_coeffs[SH_COUNT], vec3 ray_origin, vec3 ray_dir) +{ + // Determine the direction from the glyph center to the closest point on + // the ray + float dir_dot_origin = dot(ray_dir, ray_origin); + vec3 closest_dir = normalize(ray_origin - dir_dot_origin * ray_dir); + // Evaluate the SH polynomial at SH_DEGREE + 1 points. That is enough to + // know its value everywhere along the ray. + float sh_values[SH_DEGREE + 1]; + _unroll_ + for (int i = 0; i != SH_DEGREE + 1; ++i) { + vec3 point = cos(float(i) * (M_PI / float(SH_DEGREE + 1))) * ray_dir + + sin(float(i) * (M_PI / float(SH_DEGREE + 1))) * closest_dir; + float shs[SH_COUNT]; + eval_sh(shs, point); + sh_values[i] = 0.0; + _unroll_ + for (int j = 0; j != SH_COUNT; ++j) + sh_values[i] += sh_coeffs[j] * shs[j]; + } + // Compute coefficients of the SH polynomial along the ray in the + // coordinate frame given by ray_dir and closest_dir + float radius_poly[SH_DEGREE + 1]; + float inv_vander[(SH_DEGREE + 1) * (SH_DEGREE + 1)]; + get_inv_vandermonde(inv_vander); + _unroll_ + for (int i = 0; i != SH_DEGREE + 1; ++i) { + radius_poly[i] = 0.0; + _unroll_ + for (int j = 0; j != SH_DEGREE + 1; ++j) + radius_poly[i] += inv_vander[i * (SH_DEGREE + 1) + j] * sh_values[j]; + } + // Compute a bounding circle around the glyph in the relevant plane + float radius_max = 0.0; + _unroll_ + for (int i = 0; i != SH_DEGREE + 1; ++i) { + float bound = sqrt(pow(float(i), float(i)) * pow(float(SH_DEGREE - i), float(SH_DEGREE - i)) / pow(float(SH_DEGREE), float(SH_DEGREE))); + // Workaround for buggy compilers where 0^0 is 0 + bound = (i == 0 || i == SH_DEGREE) ? 1.0 : bound; + radius_max += bound * abs(radius_poly[i]); + } + // Figure out the interval, where (if at all) the ray intersects the circle + float closest_dot_origin = dot(closest_dir, ray_origin); + if (radius_max < abs(closest_dot_origin)) { + _unroll_ + for (int i = 0; i != MAX_DEGREE; ++i) + out_ray_params[i] = NO_INTERSECTION; + return; + } + float radius_over_dot = radius_max / closest_dot_origin; + float u_max = sqrt(radius_over_dot * radius_over_dot - 1.0); + // Take the square of radius_poly + float poly[MAX_DEGREE + 1]; + _unroll_ + for (int i = 0; i != MAX_DEGREE + 1; ++i) + poly[i] = 0.0; + _unroll_ + for (int i = 0; i != SH_DEGREE + 1; ++i) + _unroll_ + for (int j = 0; j != SH_DEGREE + 1; ++j) + poly[i + j] += radius_poly[i] * radius_poly[j]; + // Subtract the scaled (2 * SH_DEGREE + 2)-th power of the distance to the + // glyph center + float dot_sq = closest_dot_origin * closest_dot_origin; + float binomial = 1.0; + _unroll_ + for (int i = 0; i != SH_DEGREE + 2; ++i) { + poly[2 * i] -= binomial * dot_sq; + // Update the binomial coefficient using a recurrence relation + binomial *= float(SH_DEGREE + 1 - i) / float(i + 1); + } + // Find roots of the polynomial within the relevant bounds + float roots[MAX_DEGREE + 1]; + find_roots(roots, poly, -u_max, u_max); + // Convert them back to the original coordinate frame (i.e. ray parameters) + _unroll_ + for (int i = 0; i != MAX_DEGREE; ++i) + out_ray_params[i] = (roots[i] != NO_INTERSECTION) + ? (roots[i] * closest_dot_origin - dir_dot_origin) + : NO_INTERSECTION; +} diff --git a/fury/shaders/rt_odfs/srgb_to_linear.frag b/fury/shaders/rt_odfs/srgb_to_linear.frag new file mode 100644 index 000000000..78c765c20 --- /dev/null +++ b/fury/shaders/rt_odfs/srgb_to_linear.frag @@ -0,0 +1,4 @@ +float srgb_to_linear(float non_linear) +{ + return (non_linear <= 0.04045) ? ((1.0 / 12.92) * non_linear) : pow(non_linear * (1.0 / 1.055) + 0.055 / 1.055, 2.4); +} diff --git a/fury/shaders/rt_odfs/srgb_to_linear_rgb.frag b/fury/shaders/rt_odfs/srgb_to_linear_rgb.frag new file mode 100644 index 000000000..e4c2ef22a --- /dev/null +++ b/fury/shaders/rt_odfs/srgb_to_linear_rgb.frag @@ -0,0 +1,4 @@ +vec3 srgb_to_linear_rgb(vec3 srgb) +{ + return vec3(srgb_to_linear(srgb.r), srgb_to_linear(srgb.g), srgb_to_linear(srgb.b)); +} diff --git a/fury/shaders/rt_odfs/tonemap.frag b/fury/shaders/rt_odfs/tonemap.frag new file mode 100644 index 000000000..dd6cdcacb --- /dev/null +++ b/fury/shaders/rt_odfs/tonemap.frag @@ -0,0 +1,5 @@ +vec3 tonemap(vec3 linear) +{ + float max_channel = max(max(1.0, linear.r), max(linear.g, linear.b)); + return linear * ((1.0 - 0.02 * log2(max_channel)) / max_channel); +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_10.frag b/fury/shaders/rt_odfs/tournier/eval_sh_10.frag new file mode 100644 index 000000000..bac867d98 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_10.frag @@ -0,0 +1,175 @@ +void eval_sh_10(out float out_shs[66], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[56] = c1 * d; + out_shs[54] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[57] = c0 * d; + out_shs[53] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[58] = c1 * d; + out_shs[52] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[59] = c0 * d; + out_shs[51] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[60] = c1 * d; + out_shs[50] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[61] = c0 * d; + out_shs[49] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[62] = c1 * d; + out_shs[48] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[63] = c0 * d; + out_shs[47] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[64] = c1 * d; + out_shs[46] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[65] = c0 * d; + out_shs[45] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_12.frag b/fury/shaders/rt_odfs/tournier/eval_sh_12.frag new file mode 100644 index 000000000..3bad86fd4 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_12.frag @@ -0,0 +1,238 @@ +void eval_sh_12(out float out_shs[91], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + b = z2 * a - 0.250626566 * b; + a = b - 0.250517598 * a; + d = 931.186918633 * a; + out_shs[78] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[56] = c1 * d; + out_shs[54] = s1 * d; + a = z2 * b - 0.248120301 * a; + b = a - 0.248447205 * b; + d = -1265.233874957 * b; + out_shs[79] = c1 * d; + out_shs[77] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[57] = c0 * d; + out_shs[53] = s0 * d; + b = z2 * a - 0.240601504 * b; + a = b - 0.242236025 * a; + d = 1121.509962433 * a; + out_shs[80] = c0 * d; + out_shs[76] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[58] = c1 * d; + out_shs[52] = s1 * d; + a = z2 * b - 0.228070175 * a; + b = a - 0.231884058 * b; + d = -915.709049803 * b; + out_shs[81] = c1 * d; + out_shs[75] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[59] = c0 * d; + out_shs[51] = s0 * d; + b = z2 * a - 0.210526316 * b; + a = b - 0.217391304 * a; + d = 686.781787352 * a; + out_shs[82] = c0 * d; + out_shs[74] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[60] = c1 * d; + out_shs[50] = s1 * d; + a = z2 * b - 0.187969925 * a; + b = a - 0.198757764 * b; + d = -471.12841933 * b; + out_shs[83] = c1 * d; + out_shs[73] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[61] = c0 * d; + out_shs[49] = s0 * d; + b = z2 * a - 0.160401003 * b; + a = b - 0.175983437 * a; + d = 293.800188384 * a; + out_shs[84] = c0 * d; + out_shs[72] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[62] = c1 * d; + out_shs[48] = s1 * d; + a = z2 * b - 0.127819549 * a; + b = a - 0.149068323 * b; + d = -165.101452729 * b; + out_shs[85] = c1 * d; + out_shs[71] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[63] = c0 * d; + out_shs[47] = s0 * d; + b = z2 * (a - 9.02255639e-02); + a = b - 0.118012422 * a; + d = 82.550726364 * a; + out_shs[86] = c0 * d; + out_shs[70] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[64] = c1 * d; + out_shs[46] = s1 * d; + a = (z2 - 4.76190476e-02) * z; + b = a - 8.2815735e-02 * z; + d = -36.028090689 * b; + out_shs[87] = c1 * d; + out_shs[69] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[65] = c0 * d; + out_shs[45] = s0 * d; + a = z2 - 4.34782609e-02; + d = 13.3042542 * a; + out_shs[88] = c0 * d; + out_shs[68] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.923210529 * z; + out_shs[89] = c1 * d; + out_shs[67] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.800821996; + out_shs[90] = c0 * d; + out_shs[66] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_2.frag b/fury/shaders/rt_odfs/tournier/eval_sh_2.frag new file mode 100644 index 000000000..a70493a22 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_2.frag @@ -0,0 +1,23 @@ +void eval_sh_2(out float out_shs[6], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_4.frag b/fury/shaders/rt_odfs/tournier/eval_sh_4.frag new file mode 100644 index 000000000..15335ccad --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_4.frag @@ -0,0 +1,46 @@ +void eval_sh_4(out float out_shs[15], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_6.frag b/fury/shaders/rt_odfs/tournier/eval_sh_6.frag new file mode 100644 index 000000000..1051361dd --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_6.frag @@ -0,0 +1,79 @@ +void eval_sh_6(out float out_shs[28], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_8.frag b/fury/shaders/rt_odfs/tournier/eval_sh_8.frag new file mode 100644 index 000000000..93c32e613 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_8.frag @@ -0,0 +1,122 @@ +void eval_sh_8(out float out_shs[45], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; +} diff --git a/fury/shaders/utils/minmax_norm.glsl b/fury/shaders/utils/minmax_norm.glsl new file mode 100644 index 000000000..7992b53c7 --- /dev/null +++ b/fury/shaders/utils/minmax_norm.glsl @@ -0,0 +1,4 @@ +float coeffsNorm(float coef, float min, float max, float a, float b) +{ + return (coef - min) * ((b - a) / (max - min)) + a; +} \ No newline at end of file From fbe7ed5542e4e362415777d68e43a3862ed4a379 Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Fri, 23 Feb 2024 11:19:51 -0500 Subject: [PATCH 2/8] adjusted scaling --- docs/experimental/SH-ODF experimental/odf_example.py | 6 +----- fury/actor.py | 3 +++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/experimental/SH-ODF experimental/odf_example.py b/docs/experimental/SH-ODF experimental/odf_example.py index 3b6c60469..e16858211 100644 --- a/docs/experimental/SH-ODF experimental/odf_example.py +++ b/docs/experimental/SH-ODF experimental/odf_example.py @@ -22,10 +22,6 @@ coeffs = coeffs[:, :, :].reshape((x * y * z, s)) n_glyphs = coeffs.shape[0] - max_val = coeffs.min(axis=1) - total = np.sum(abs(coeffs), axis=1) - coeffs = np.dot(np.diag(1 / total), coeffs) * 1.7 - - odf_actor = actor.odf(centers=centers, coeffs=coeffs) + odf_actor = actor.odf(centers=centers, coeffs=coeffs, scales=1.0) show_man.scene.add(odf_actor) show_man.start() \ No newline at end of file diff --git a/fury/actor.py b/fury/actor.py index ae71bb95e..cb630a365 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3914,5 +3914,8 @@ def odf( elif scales.size != centers.shape[0]: scales = np.concatenate( (scales, np.ones(centers.shape[0] - scales.shape[0])), axis=None) + + total = np.sum(abs(coeffs), axis=1) + coeffs = np.dot(np.diag(1 / total * scales), coeffs) * 1.7 return sh_odf(centers, coeffs, basis_type, scales, opacity) \ No newline at end of file From 97f1d9300b896fef634d2b86b0ce1ac67cffd6e7 Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Tue, 27 Feb 2024 13:01:14 -0500 Subject: [PATCH 3/8] reorganized files --- fury/actors/odf.py | 24 +- .../linear_rgb_to_srgb.frag | 0 .../{rt_odfs => lighting}/linear_to_srgb.frag | 0 .../{rt_odfs => lighting}/srgb_to_linear.frag | 0 .../srgb_to_linear_rgb.frag | 0 .../{ => descoteaux}/eval_sh_grad_10.frag | 0 .../{ => descoteaux}/eval_sh_grad_12.frag | 0 .../{ => descoteaux}/eval_sh_grad_2.frag | 0 .../{ => descoteaux}/eval_sh_grad_4.frag | 0 .../{ => descoteaux}/eval_sh_grad_6.frag | 0 .../{ => descoteaux}/eval_sh_grad_8.frag | 0 .../tournier/eval_sh_grad_10 copy.frag | 430 +++++++++++++ .../tournier/eval_sh_grad_12 copy.frag | 591 ++++++++++++++++++ .../rt_odfs/tournier/eval_sh_grad_2 copy.frag | 46 ++ .../rt_odfs/tournier/eval_sh_grad_4 copy.frag | 103 +++ .../rt_odfs/tournier/eval_sh_grad_6 copy.frag | 186 ++++++ .../rt_odfs/tournier/eval_sh_grad_8 copy.frag | 295 +++++++++ .../{rt_odfs => utils}/find_roots.frag | 0 .../{rt_odfs => utils}/newton_bisection.frag | 0 19 files changed, 1663 insertions(+), 12 deletions(-) rename fury/shaders/{rt_odfs => lighting}/linear_rgb_to_srgb.frag (100%) rename fury/shaders/{rt_odfs => lighting}/linear_to_srgb.frag (100%) rename fury/shaders/{rt_odfs => lighting}/srgb_to_linear.frag (100%) rename fury/shaders/{rt_odfs => lighting}/srgb_to_linear_rgb.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_10.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_12.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_2.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_4.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_6.frag (100%) rename fury/shaders/rt_odfs/{ => descoteaux}/eval_sh_grad_8.frag (100%) create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag create mode 100644 fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag rename fury/shaders/{rt_odfs => utils}/find_roots.frag (100%) rename fury/shaders/{rt_odfs => utils}/newton_bisection.frag (100%) diff --git a/fury/actors/odf.py b/fury/actors/odf.py index a6d991033..e8a762c55 100644 --- a/fury/actors/odf.py +++ b/fury/actors/odf.py @@ -206,27 +206,27 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): os.path.join("rt_odfs", basis_type, "eval_sh_12.frag")) eval_sh_grad_2 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_2.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_2.frag") ) eval_sh_grad_4 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_4.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_4.frag") ) eval_sh_grad_6 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_6.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_6.frag") ) eval_sh_grad_8 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_8.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_8.frag") ) eval_sh_grad_10 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_10.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_10.frag") ) eval_sh_grad_12 = import_fury_shader( - os.path.join("rt_odfs", "eval_sh_grad_12.frag") + os.path.join("rt_odfs/descoteaux", "eval_sh_grad_12.frag") ) # Searches a single root of a polynomial within a given interval. @@ -246,13 +246,13 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): # # return true if a root was found, false if no root exists. newton_bisection = import_fury_shader( - os.path.join("rt_odfs", "newton_bisection.frag") + os.path.join("utils", "newton_bisection.frag") ) # Finds all roots of the given polynomial in the interval [begin, end] and # writes them to out_roots. Some entries will be NO_INTERSECTION but other # than that the array is sorted. The last entry is always NO_INTERSECTION. - find_roots = import_fury_shader(os.path.join("rt_odfs", "find_roots.frag")) + find_roots = import_fury_shader(os.path.join("utils", "find_roots.frag")) # Evaluates the spherical harmonics basis in bands 0, 2, ..., SH_DEGREE. # Conventions are as in the following paper. @@ -304,22 +304,22 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): # Applies the non-linearity that maps linear RGB to sRGB linear_to_srgb = import_fury_shader( - os.path.join("rt_odfs", "linear_to_srgb.frag") + os.path.join("lighting", "linear_to_srgb.frag") ) # Inverse of linear_to_srgb() srgb_to_linear = import_fury_shader( - os.path.join("rt_odfs", "srgb_to_linear.frag") + os.path.join("lighting", "srgb_to_linear.frag") ) # Turns a linear RGB color (i.e. rec. 709) into sRGB linear_rgb_to_srgb = import_fury_shader( - os.path.join("rt_odfs", "linear_rgb_to_srgb.frag") + os.path.join("lighting", "linear_rgb_to_srgb.frag") ) # Inverse of linear_rgb_to_srgb() srgb_to_linear_rgb = import_fury_shader( - os.path.join("rt_odfs", "srgb_to_linear_rgb.frag") + os.path.join("lighting", "srgb_to_linear_rgb.frag") ) # Logarithmic tonemapping operator. Input and output are linear RGB. diff --git a/fury/shaders/rt_odfs/linear_rgb_to_srgb.frag b/fury/shaders/lighting/linear_rgb_to_srgb.frag similarity index 100% rename from fury/shaders/rt_odfs/linear_rgb_to_srgb.frag rename to fury/shaders/lighting/linear_rgb_to_srgb.frag diff --git a/fury/shaders/rt_odfs/linear_to_srgb.frag b/fury/shaders/lighting/linear_to_srgb.frag similarity index 100% rename from fury/shaders/rt_odfs/linear_to_srgb.frag rename to fury/shaders/lighting/linear_to_srgb.frag diff --git a/fury/shaders/rt_odfs/srgb_to_linear.frag b/fury/shaders/lighting/srgb_to_linear.frag similarity index 100% rename from fury/shaders/rt_odfs/srgb_to_linear.frag rename to fury/shaders/lighting/srgb_to_linear.frag diff --git a/fury/shaders/rt_odfs/srgb_to_linear_rgb.frag b/fury/shaders/lighting/srgb_to_linear_rgb.frag similarity index 100% rename from fury/shaders/rt_odfs/srgb_to_linear_rgb.frag rename to fury/shaders/lighting/srgb_to_linear_rgb.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_10.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_10.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_10.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_10.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_12.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_12.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_12.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_12.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_2.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_2.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_2.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_2.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_4.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_4.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_4.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_4.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_6.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_6.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_6.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_6.frag diff --git a/fury/shaders/rt_odfs/eval_sh_grad_8.frag b/fury/shaders/rt_odfs/descoteaux/eval_sh_grad_8.frag similarity index 100% rename from fury/shaders/rt_odfs/eval_sh_grad_8.frag rename to fury/shaders/rt_odfs/descoteaux/eval_sh_grad_8.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag new file mode 100644 index 000000000..c9e6b0d8d --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag @@ -0,0 +1,430 @@ +void eval_sh_grad_10(out float out_shs[66], out vec3 out_grads[66], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + out_grads[11][0] = c0 * d; + out_grads[9][0] = s0 * d; + out_grads[11][1] = s0 * d; + out_grads[9][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + out_grads[22][0] = c0 * d; + out_grads[20][0] = s0 * d; + out_grads[22][1] = s0 * d; + out_grads[20][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + out_grads[37][0] = c0 * d; + out_grads[35][0] = s0 * d; + out_grads[37][1] = s0 * d; + out_grads[35][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[56] = c1 * d; + out_shs[54] = s1 * d; + out_grads[56][0] = c0 * d; + out_grads[54][0] = s0 * d; + out_grads[56][1] = s0 * d; + out_grads[54][1] = c0 * d; + d = 2332.401488133 * b; + out_grads[55][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[5][0] = c1 * d; + out_grads[1][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + d = 6.62322287 * a; + out_grads[12][0] = c1 * d; + out_grads[8][0] = s1 * d; + out_grads[12][1] = -s1 * d; + out_grads[8][1] = c1 * d; + d = -14.049977415 * a; + out_grads[11][2] = c1 * d; + out_grads[9][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + d = 30.399773564 * a; + out_grads[23][0] = c1 * d; + out_grads[19][0] = s1 * d; + out_grads[23][1] = -s1 * d; + out_grads[19][1] = c1 * d; + d = -96.132524816 * a; + out_grads[22][2] = c1 * d; + out_grads[20][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + d = 130.459545912 * a; + out_grads[38][0] = c1 * d; + out_grads[34][0] = s1 * d; + out_grads[38][1] = -s1 * d; + out_grads[34][1] = c1 * d; + d = -545.751435723 * a; + out_grads[37][2] = c1 * d; + out_grads[35][2] = s1 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[57] = c0 * d; + out_shs[53] = s0 * d; + d = 544.731628762 * a; + out_grads[57][0] = c1 * d; + out_grads[53][0] = s1 * d; + out_grads[57][1] = -s1 * d; + out_grads[53][1] = c1 * d; + d = -2830.508572514 * a; + out_grads[56][2] = c1 * d; + out_grads[54][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + d = -5.310392309 * z; + out_grads[13][0] = c0 * d; + out_grads[7][0] = s0 * d; + out_grads[13][1] = s0 * d; + out_grads[7][1] = c0 * d; + d = 6.62322287 * z; + out_grads[12][2] = c0 * d; + out_grads[8][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + d = -30.399773564 * b; + out_grads[24][0] = c0 * d; + out_grads[18][0] = s0 * d; + out_grads[24][1] = s0 * d; + out_grads[18][1] = c0 * d; + d = 60.799547128 * b; + out_grads[23][2] = c0 * d; + out_grads[19][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + d = -144.52614017 * b; + out_grads[39][0] = c0 * d; + out_grads[33][0] = s0 * d; + out_grads[39][1] = s0 * d; + out_grads[33][1] = c0 * d; + d = 391.378637737 * b; + out_grads[38][2] = c0 * d; + out_grads[34][2] = s0 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[58] = c1 * d; + out_shs[52] = s1 * d; + d = -640.983970322 * b; + out_grads[58][0] = c0 * d; + out_grads[52][0] = s0 * d; + out_grads[58][1] = s0 * d; + out_grads[52][1] = c0 * d; + d = 2178.926515046 * b; + out_grads[57][2] = c0 * d; + out_grads[53][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + d = 2.503342942; + out_grads[14][0] = c1 * d; + out_grads[6][0] = s1 * d; + out_grads[14][1] = -s1 * d; + out_grads[6][1] = c1 * d; + d = -1.77013077; + out_grads[13][2] = c1 * d; + out_grads[7][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + d = 22.200855632 * a; + out_grads[25][0] = c1 * d; + out_grads[17][0] = s1 * d; + out_grads[25][1] = -s1 * d; + out_grads[17][1] = c1 * d; + d = -30.399773564 * a; + out_grads[24][2] = c1 * d; + out_grads[18][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + d = 124.388296437 * a; + out_grads[40][0] = c1 * d; + out_grads[32][0] = s1 * d; + out_grads[40][1] = -s1 * d; + out_grads[32][1] = c1 * d; + d = -240.876900283 * a; + out_grads[39][2] = c1 * d; + out_grads[33][2] = s1 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[59] = c0 * d; + out_shs[51] = s0 * d; + d = 604.325482728 * a; + out_grads[59][0] = c1 * d; + out_grads[51][0] = s1 * d; + out_grads[59][1] = -s1 * d; + out_grads[51][1] = c1 * d; + d = -1495.629264084 * a; + out_grads[58][2] = c1 * d; + out_grads[52][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + d = -11.833095811 * z; + out_grads[26][0] = c0 * d; + out_grads[16][0] = s0 * d; + out_grads[26][1] = s0 * d; + out_grads[16][1] = c0 * d; + d = 11.100427816 * z; + out_grads[25][2] = c0 * d; + out_grads[17][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + d = -86.247765552 * b; + out_grads[41][0] = c0 * d; + out_grads[31][0] = s0 * d; + out_grads[41][1] = s0 * d; + out_grads[31][1] = c0 * d; + d = 124.388296437 * b; + out_grads[40][2] = c0 * d; + out_grads[32][2] = s0 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[60] = c1 * d; + out_shs[50] = s1 * d; + d = -477.761243376 * b; + out_grads[60][0] = c0 * d; + out_grads[50][0] = s0 * d; + out_grads[60][1] = s0 * d; + out_grads[50][1] = c0 * d; + d = 906.488224092 * b; + out_grads[59][2] = c0 * d; + out_grads[51][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + d = 4.099104631; + out_grads[27][0] = c1 * d; + out_grads[15][0] = s1 * d; + out_grads[27][1] = -s1 * d; + out_grads[15][1] = c1 * d; + d = -2.366619162; + out_grads[26][2] = c1 * d; + out_grads[16][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + d = 47.909948945 * a; + out_grads[42][0] = c1 * d; + out_grads[30][0] = s1 * d; + out_grads[42][1] = -s1 * d; + out_grads[30][1] = c1 * d; + d = -51.748659331 * a; + out_grads[41][2] = c1 * d; + out_grads[31][2] = s1 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[61] = c0 * d; + out_shs[49] = s0 * d; + d = 320.491985161 * a; + out_grads[61][0] = c1 * d; + out_grads[49][0] = s1 * d; + out_grads[61][1] = -s1 * d; + out_grads[49][1] = c1 * d; + d = -477.761243376 * a; + out_grads[60][2] = c1 * d; + out_grads[50][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + d = -20.409946485 * z; + out_grads[43][0] = c0 * d; + out_grads[29][0] = s0 * d; + out_grads[43][1] = s0 * d; + out_grads[29][1] = c0 * d; + d = 15.969982982 * z; + out_grads[42][2] = c0 * d; + out_grads[30][2] = s0 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[62] = c1 * d; + out_shs[48] = s1 * d; + d = -181.371689194 * b; + out_grads[62][0] = c0 * d; + out_grads[48][0] = s0 * d; + out_grads[62][1] = s0 * d; + out_grads[48][1] = c0 * d; + d = 213.661323441 * b; + out_grads[61][2] = c0 * d; + out_grads[49][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; + d = 5.831413281; + out_grads[44][0] = c1 * d; + out_grads[28][0] = s1 * d; + out_grads[44][1] = -s1 * d; + out_grads[28][1] = c1 * d; + d = -2.915706641; + out_grads[43][2] = c1 * d; + out_grads[29][2] = s1 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[63] = c0 * d; + out_shs[47] = s0 * d; + d = 84.622493774 * a; + out_grads[63][0] = c1 * d; + out_grads[47][0] = s1 * d; + out_grads[63][1] = -s1 * d; + out_grads[47][1] = c1 * d; + d = -77.73072394 * a; + out_grads[62][2] = c1 * d; + out_grads[48][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[64] = c1 * d; + out_shs[46] = s1 * d; + d = -30.887057699 * z; + out_grads[64][0] = c0 * d; + out_grads[46][0] = s0 * d; + out_grads[64][1] = s0 * d; + out_grads[46][1] = c0 * d; + d = 21.155623443 * z; + out_grads[63][2] = c0 * d; + out_grads[47][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[65] = c0 * d; + out_shs[45] = s0 * d; + d = 7.673951182; + out_grads[65][0] = c1 * d; + out_grads[45][0] = s1 * d; + out_grads[65][1] = -s1 * d; + out_grads[45][1] = c1 * d; + d = -3.4318953; + out_grads[64][2] = c1 * d; + out_grads[46][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; + out_grads[28][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[44][2] = 0.0; + out_grads[45][2] = 0.0; + out_grads[55][0] = 0.0; + out_grads[55][1] = 0.0; + out_grads[65][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag new file mode 100644 index 000000000..35c2a3617 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag @@ -0,0 +1,591 @@ +void eval_sh_grad_12(out float out_shs[91], out vec3 out_grads[91], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + b = z2 * a - 0.250980392 * b; + a = b - 0.250773994 * a; + d = 233.240148813 * a; + out_shs[55] = d; + b = z2 * a - 0.250626566 * b; + a = b - 0.250517598 * a; + d = 931.186918633 * a; + out_shs[78] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + out_grads[11][0] = c0 * d; + out_grads[9][0] = s0 * d; + out_grads[11][1] = s0 * d; + out_grads[9][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + out_grads[22][0] = c0 * d; + out_grads[20][0] = s0 * d; + out_grads[22][1] = s0 * d; + out_grads[20][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + out_grads[37][0] = c0 * d; + out_grads[35][0] = s0 * d; + out_grads[37][1] = s0 * d; + out_grads[35][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + a = z2 * b - 0.247058824 * a; + b = a - 0.247678019 * b; + d = -314.500952502 * b; + out_shs[56] = c1 * d; + out_shs[54] = s1 * d; + out_grads[56][0] = c0 * d; + out_grads[54][0] = s0 * d; + out_grads[56][1] = s0 * d; + out_grads[54][1] = c0 * d; + d = 2332.401488133 * b; + out_grads[55][2] = d; + a = z2 * b - 0.248120301 * a; + b = a - 0.248447205 * b; + d = -1265.233874957 * b; + out_shs[79] = c1 * d; + out_shs[77] = s1 * d; + out_grads[79][0] = c0 * d; + out_grads[77][0] = s0 * d; + out_grads[79][1] = s0 * d; + out_grads[77][1] = c0 * d; + d = 11174.243023595 * b; + out_grads[78][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[5][0] = c1 * d; + out_grads[1][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + d = 6.62322287 * a; + out_grads[12][0] = c1 * d; + out_grads[8][0] = s1 * d; + out_grads[12][1] = -s1 * d; + out_grads[8][1] = c1 * d; + d = -14.049977415 * a; + out_grads[11][2] = c1 * d; + out_grads[9][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + d = 30.399773564 * a; + out_grads[23][0] = c1 * d; + out_grads[19][0] = s1 * d; + out_grads[23][1] = -s1 * d; + out_grads[19][1] = c1 * d; + d = -96.132524816 * a; + out_grads[22][2] = c1 * d; + out_grads[20][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + d = 130.459545912 * a; + out_grads[38][0] = c1 * d; + out_grads[34][0] = s1 * d; + out_grads[38][1] = -s1 * d; + out_grads[34][1] = c1 * d; + d = -545.751435723 * a; + out_grads[37][2] = c1 * d; + out_grads[35][2] = s1 * d; + b = z2 * a - 0.235294118 * b; + a = b - 0.238390093 * a; + d = 272.365814381 * a; + out_shs[57] = c0 * d; + out_shs[53] = s0 * d; + d = 544.731628762 * a; + out_grads[57][0] = c1 * d; + out_grads[53][0] = s1 * d; + out_grads[57][1] = -s1 * d; + out_grads[53][1] = c1 * d; + d = -2830.508572514 * a; + out_grads[56][2] = c1 * d; + out_grads[54][2] = s1 * d; + b = z2 * a - 0.240601504 * b; + a = b - 0.242236025 * a; + d = 1121.509962433 * a; + out_shs[80] = c0 * d; + out_shs[76] = s0 * d; + d = 2243.019924866 * a; + out_grads[80][0] = c1 * d; + out_grads[76][0] = s1 * d; + out_grads[80][1] = -s1 * d; + out_grads[76][1] = c1 * d; + d = -13917.572624524 * a; + out_grads[79][2] = c1 * d; + out_grads[77][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + d = -5.310392309 * z; + out_grads[13][0] = c0 * d; + out_grads[7][0] = s0 * d; + out_grads[13][1] = s0 * d; + out_grads[7][1] = c0 * d; + d = 6.62322287 * z; + out_grads[12][2] = c0 * d; + out_grads[8][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + d = -30.399773564 * b; + out_grads[24][0] = c0 * d; + out_grads[18][0] = s0 * d; + out_grads[24][1] = s0 * d; + out_grads[18][1] = c0 * d; + d = 60.799547128 * b; + out_grads[23][2] = c0 * d; + out_grads[19][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + d = -144.52614017 * b; + out_grads[39][0] = c0 * d; + out_grads[33][0] = s0 * d; + out_grads[39][1] = s0 * d; + out_grads[33][1] = c0 * d; + d = 391.378637737 * b; + out_grads[38][2] = c0 * d; + out_grads[34][2] = s0 * d; + a = z2 * b - 0.215686275 * a; + b = a - 0.222910217 * b; + d = -213.661323441 * b; + out_shs[58] = c1 * d; + out_shs[52] = s1 * d; + d = -640.983970322 * b; + out_grads[58][0] = c0 * d; + out_grads[52][0] = s0 * d; + out_grads[58][1] = s0 * d; + out_grads[52][1] = c0 * d; + d = 2178.926515046 * b; + out_grads[57][2] = c0 * d; + out_grads[53][2] = s0 * d; + a = z2 * b - 0.228070175 * a; + b = a - 0.231884058 * b; + d = -915.709049803 * b; + out_shs[81] = c1 * d; + out_shs[75] = s1 * d; + d = -2747.127149409 * b; + out_grads[81][0] = c0 * d; + out_grads[75][0] = s0 * d; + out_grads[81][1] = s0 * d; + out_grads[75][1] = c0 * d; + d = 11215.099624332 * b; + out_grads[80][2] = c0 * d; + out_grads[76][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + d = 2.503342942; + out_grads[14][0] = c1 * d; + out_grads[6][0] = s1 * d; + out_grads[14][1] = -s1 * d; + out_grads[6][1] = c1 * d; + d = -1.77013077; + out_grads[13][2] = c1 * d; + out_grads[7][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + d = 22.200855632 * a; + out_grads[25][0] = c1 * d; + out_grads[17][0] = s1 * d; + out_grads[25][1] = -s1 * d; + out_grads[17][1] = c1 * d; + d = -30.399773564 * a; + out_grads[24][2] = c1 * d; + out_grads[18][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + d = 124.388296437 * a; + out_grads[40][0] = c1 * d; + out_grads[32][0] = s1 * d; + out_grads[40][1] = -s1 * d; + out_grads[32][1] = c1 * d; + d = -240.876900283 * a; + out_grads[39][2] = c1 * d; + out_grads[33][2] = s1 * d; + b = z2 * a - 0.188235294 * b; + a = b - 0.20123839 * a; + d = 151.081370682 * a; + out_shs[59] = c0 * d; + out_shs[51] = s0 * d; + d = 604.325482728 * a; + out_grads[59][0] = c1 * d; + out_grads[51][0] = s1 * d; + out_grads[59][1] = -s1 * d; + out_grads[51][1] = c1 * d; + d = -1495.629264084 * a; + out_grads[58][2] = c1 * d; + out_grads[52][2] = s1 * d; + b = z2 * a - 0.210526316 * b; + a = b - 0.217391304 * a; + d = 686.781787352 * a; + out_shs[82] = c0 * d; + out_shs[74] = s0 * d; + d = 2747.127149409 * a; + out_grads[82][0] = c1 * d; + out_grads[74][0] = s1 * d; + out_grads[82][1] = -s1 * d; + out_grads[74][1] = c1 * d; + d = -8241.381448228 * a; + out_grads[81][2] = -c1 * d; + out_grads[75][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + d = -11.833095811 * z; + out_grads[26][0] = c0 * d; + out_grads[16][0] = s0 * d; + out_grads[26][1] = s0 * d; + out_grads[16][1] = c0 * d; + d = 11.100427816 * z; + out_grads[25][2] = c0 * d; + out_grads[17][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + d = -86.247765552 * b; + out_grads[41][0] = c0 * d; + out_grads[31][0] = s0 * d; + out_grads[41][1] = s0 * d; + out_grads[31][1] = c0 * d; + d = 124.388296437 * b; + out_grads[40][2] = c0 * d; + out_grads[32][2] = s0 * d; + a = z2 * b - 0.152941176 * a; + b = a - 0.173374613 * b; + d = -95.552248675 * b; + out_shs[60] = c1 * d; + out_shs[50] = s1 * d; + d = -477.761243376 * b; + out_grads[60][0] = c0 * d; + out_grads[50][0] = s0 * d; + out_grads[60][1] = s0 * d; + out_grads[50][1] = c0 * d; + d = 906.488224092 * b; + out_grads[59][2] = c0 * d; + out_grads[51][2] = s0 * d; + a = z2 * b - 0.187969925 * a; + b = a - 0.198757764 * b; + d = -471.12841933 * b; + out_shs[83] = c1 * d; + out_shs[73] = s1 * d; + d = -2355.642096651 * b; + out_grads[83][0] = c0 * d; + out_grads[73][0] = s0 * d; + out_grads[83][1] = s0 * d; + out_grads[73][1] = c0 * d; + d = 5494.254298819 * b; + out_grads[82][2] = c0 * d; + out_grads[74][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + d = 4.099104631; + out_grads[27][0] = c1 * d; + out_grads[15][0] = s1 * d; + out_grads[27][1] = -s1 * d; + out_grads[15][1] = c1 * d; + d = -2.366619162; + out_grads[26][2] = c1 * d; + out_grads[16][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + d = 47.909948945 * a; + out_grads[42][0] = c1 * d; + out_grads[30][0] = s1 * d; + out_grads[42][1] = -s1 * d; + out_grads[30][1] = c1 * d; + d = -51.748659331 * a; + out_grads[41][2] = c1 * d; + out_grads[31][2] = s1 * d; + b = z2 * (a - 0.109803922); + a = b - 0.139318885 * a; + d = 53.41533086 * a; + out_shs[61] = c0 * d; + out_shs[49] = s0 * d; + d = 320.491985161 * a; + out_grads[61][0] = c1 * d; + out_grads[49][0] = s1 * d; + out_grads[61][1] = -s1 * d; + out_grads[49][1] = c1 * d; + d = -477.761243376 * a; + out_grads[60][2] = c1 * d; + out_grads[50][2] = s1 * d; + b = z2 * a - 0.160401003 * b; + a = b - 0.175983437 * a; + d = 293.800188384 * a; + out_shs[84] = c0 * d; + out_shs[72] = s0 * d; + d = 1762.801130306 * a; + out_grads[84][0] = c1 * d; + out_grads[72][0] = s1 * d; + out_grads[84][1] = -s1 * d; + out_grads[72][1] = c1 * d; + d = -3297.898935312 * a; + out_grads[83][2] = c1 * d; + out_grads[73][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + d = -20.409946485 * z; + out_grads[43][0] = c0 * d; + out_grads[29][0] = s0 * d; + out_grads[43][1] = s0 * d; + out_grads[29][1] = c0 * d; + d = 15.969982982 * z; + out_grads[42][2] = c0 * d; + out_grads[30][2] = s0 * d; + a = (z2 - 5.88235294e-02) * z; + b = a - 9.90712074e-02 * z; + d = -25.910241313 * b; + out_shs[62] = c1 * d; + out_shs[48] = s1 * d; + d = -181.371689194 * b; + out_grads[62][0] = c0 * d; + out_grads[48][0] = s0 * d; + out_grads[62][1] = s0 * d; + out_grads[48][1] = c0 * d; + d = 213.661323441 * b; + out_grads[61][2] = c0 * d; + out_grads[49][2] = s0 * d; + a = z2 * b - 0.127819549 * a; + b = a - 0.149068323 * b; + d = -165.101452729 * b; + out_shs[85] = c1 * d; + out_shs[71] = s1 * d; + d = -1155.7101691 * b; + out_grads[85][0] = c0 * d; + out_grads[71][0] = s0 * d; + out_grads[85][1] = s0 * d; + out_grads[71][1] = c0 * d; + d = 1762.801130306 * b; + out_grads[84][2] = c0 * d; + out_grads[72][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; + d = 5.831413281; + out_grads[44][0] = c1 * d; + out_grads[28][0] = s1 * d; + out_grads[44][1] = -s1 * d; + out_grads[28][1] = c1 * d; + d = -2.915706641; + out_grads[43][2] = c1 * d; + out_grads[29][2] = s1 * d; + a = z2 - 5.26315789e-02; + d = 10.577811722 * a; + out_shs[63] = c0 * d; + out_shs[47] = s0 * d; + d = 84.622493774 * a; + out_grads[63][0] = c1 * d; + out_grads[47][0] = s1 * d; + out_grads[63][1] = -s1 * d; + out_grads[47][1] = c1 * d; + d = -77.73072394 * a; + out_grads[62][2] = c1 * d; + out_grads[48][2] = s1 * d; + b = z2 * (a - 9.02255639e-02); + a = b - 0.118012422 * a; + d = 82.550726364 * a; + out_shs[86] = c0 * d; + out_shs[70] = s0 * d; + d = 660.405810914 * a; + out_grads[86][0] = c1 * d; + out_grads[70][0] = s1 * d; + out_grads[86][1] = -s1 * d; + out_grads[70][1] = c1 * d; + d = -825.507263643 * a; + out_grads[85][2] = c1 * d; + out_grads[71][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.4318953 * z; + out_shs[64] = c1 * d; + out_shs[46] = s1 * d; + d = -30.887057699 * z; + out_grads[64][0] = c0 * d; + out_grads[46][0] = s0 * d; + out_grads[64][1] = s0 * d; + out_grads[46][1] = c0 * d; + d = 21.155623443 * z; + out_grads[63][2] = c0 * d; + out_grads[47][2] = s0 * d; + a = (z2 - 4.76190476e-02) * z; + b = a - 8.2815735e-02 * z; + d = -36.028090689 * b; + out_shs[87] = c1 * d; + out_shs[69] = s1 * d; + d = -324.252816204 * b; + out_grads[87][0] = c0 * d; + out_grads[69][0] = s0 * d; + out_grads[87][1] = s0 * d; + out_grads[69][1] = c0 * d; + d = 330.202905457 * b; + out_grads[86][2] = c0 * d; + out_grads[70][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.767395118; + out_shs[65] = c0 * d; + out_shs[45] = s0 * d; + d = 7.673951182; + out_grads[65][0] = c1 * d; + out_grads[45][0] = s1 * d; + out_grads[65][1] = -s1 * d; + out_grads[45][1] = c1 * d; + d = -3.4318953; + out_grads[64][2] = c1 * d; + out_grads[46][2] = s1 * d; + a = z2 - 4.34782609e-02; + d = 13.3042542 * a; + out_shs[88] = c0 * d; + out_shs[68] = s0 * d; + d = 133.042542003 * a; + out_grads[88][0] = c1 * d; + out_grads[68][0] = s1 * d; + out_grads[88][1] = -s1 * d; + out_grads[68][1] = c1 * d; + d = -108.084272068 * a; + out_grads[87][2] = c1 * d; + out_grads[69][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -3.923210529 * z; + out_shs[89] = c1 * d; + out_shs[67] = s1 * d; + d = -43.155315818 * z; + out_grads[89][0] = c0 * d; + out_grads[67][0] = s0 * d; + out_grads[89][1] = s0 * d; + out_grads[67][1] = c0 * d; + d = 26.608508401 * z; + out_grads[88][2] = c0 * d; + out_grads[68][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.800821996; + out_shs[90] = c0 * d; + out_shs[66] = s0 * d; + d = 9.609863949; + out_grads[90][0] = c1 * d; + out_grads[66][0] = s1 * d; + out_grads[90][1] = -s1 * d; + out_grads[66][1] = c1 * d; + d = -3.923210529; + out_grads[89][2] = c1 * d; + out_grads[67][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[1][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[5][2] = 0.0; + out_grads[6][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[14][2] = 0.0; + out_grads[15][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[27][2] = 0.0; + out_grads[28][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[44][2] = 0.0; + out_grads[45][2] = 0.0; + out_grads[55][0] = 0.0; + out_grads[55][1] = 0.0; + out_grads[65][2] = 0.0; + out_grads[66][2] = 0.0; + out_grads[78][0] = 0.0; + out_grads[78][1] = 0.0; + out_grads[90][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag new file mode 100644 index 000000000..277a0e07a --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag @@ -0,0 +1,46 @@ +void eval_sh_grad_2(out float out_shs[6], out vec3 out_grads[6], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[1][0] = c1 * d; + out_grads[5][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[5][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[1][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag new file mode 100644 index 000000000..c85847a5b --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag @@ -0,0 +1,103 @@ +void eval_sh_grad_4(out float out_shs[15], out vec3 out_grads[15], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + out_grads[11][0] = c0 * d; + out_grads[9][0] = s0 * d; + out_grads[11][1] = s0 * d; + out_grads[9][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[5][0] = c1 * d; + out_grads[1][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + d = 6.62322287 * a; + out_grads[12][0] = c1 * d; + out_grads[8][0] = s1 * d; + out_grads[12][1] = -s1 * d; + out_grads[8][1] = c1 * d; + d = -14.049977415 * a; + out_grads[11][2] = c1 * d; + out_grads[9][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + d = -5.310392309 * z; + out_grads[13][0] = c0 * d; + out_grads[7][0] = s0 * d; + out_grads[13][1] = s0 * d; + out_grads[7][1] = c0 * d; + d = 6.62322287 * z; + out_grads[12][2] = c0 * d; + out_grads[8][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + d = 2.503342942; + out_grads[14][0] = c1 * d; + out_grads[6][0] = s1 * d; + out_grads[14][1] = -s1 * d; + out_grads[6][1] = c1 * d; + d = -1.77013077; + out_grads[13][2] = c1 * d; + out_grads[7][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[5][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[1][2] = 0.0; + out_grads[14][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[6][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag new file mode 100644 index 000000000..617413bc9 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag @@ -0,0 +1,186 @@ +void eval_sh_grad_6(out float out_shs[28], out vec3 out_grads[28], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + out_grads[11][0] = c0 * d; + out_grads[9][0] = s0 * d; + out_grads[11][1] = s0 * d; + out_grads[9][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + out_grads[22][0] = c0 * d; + out_grads[20][0] = s0 * d; + out_grads[22][1] = s0 * d; + out_grads[20][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[5][0] = c1 * d; + out_grads[1][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + d = 6.62322287 * a; + out_grads[12][0] = c1 * d; + out_grads[8][0] = s1 * d; + out_grads[12][1] = -s1 * d; + out_grads[8][1] = c1 * d; + d = -14.049977415 * a; + out_grads[11][2] = c1 * d; + out_grads[9][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + d = 30.399773564 * a; + out_grads[23][0] = c1 * d; + out_grads[19][0] = s1 * d; + out_grads[23][1] = -s1 * d; + out_grads[19][1] = c1 * d; + d = -96.132524816 * a; + out_grads[22][2] = c1 * d; + out_grads[20][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + d = -5.310392309 * z; + out_grads[13][0] = c0 * d; + out_grads[7][0] = s0 * d; + out_grads[13][1] = s0 * d; + out_grads[7][1] = c0 * d; + d = 6.62322287 * z; + out_grads[12][2] = c0 * d; + out_grads[8][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + d = -30.399773564 * b; + out_grads[24][0] = c0 * d; + out_grads[18][0] = s0 * d; + out_grads[24][1] = s0 * d; + out_grads[18][1] = c0 * d; + d = 60.799547128 * b; + out_grads[23][2] = c0 * d; + out_grads[19][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + d = 2.503342942; + out_grads[14][0] = c1 * d; + out_grads[6][0] = s1 * d; + out_grads[14][1] = -s1 * d; + out_grads[6][1] = c1 * d; + d = -1.77013077; + out_grads[13][2] = c1 * d; + out_grads[7][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + d = 22.200855632 * a; + out_grads[25][0] = c1 * d; + out_grads[17][0] = s1 * d; + out_grads[25][1] = -s1 * d; + out_grads[17][1] = c1 * d; + d = -30.399773564 * a; + out_grads[24][2] = c1 * d; + out_grads[18][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + d = -11.833095811 * z; + out_grads[26][0] = c0 * d; + out_grads[16][0] = s0 * d; + out_grads[26][1] = s0 * d; + out_grads[16][1] = c0 * d; + d = 11.100427816 * z; + out_grads[25][2] = c0 * d; + out_grads[17][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + d = 4.099104631; + out_grads[27][0] = c1 * d; + out_grads[15][0] = s1 * d; + out_grads[27][1] = -s1 * d; + out_grads[15][1] = c1 * d; + d = -2.366619162; + out_grads[26][2] = c1 * d; + out_grads[16][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[5][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[1][2] = 0.0; + out_grads[14][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[6][2] = 0.0; + out_grads[27][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[15][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag new file mode 100644 index 000000000..712b2dc29 --- /dev/null +++ b/fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag @@ -0,0 +1,295 @@ +void eval_sh_grad_8(out float out_shs[45], out vec3 out_grads[45], vec3 point) +{ + float x, y, z, z2, c0, s0, c1, s1, d, a, b; + x = point[0]; + y = point[1]; + z = point[2]; + z2 = z * z; + c0 = 1.0; + s0 = 0.0; + d = 0.282094792; + out_shs[0] = d; + a = z2 - 0.333333333; + d = 0.946174696 * a; + out_shs[3] = d; + b = z2 * (a - 0.266666667); + a = b - 0.257142857 * a; + d = 3.702494142 * a; + out_shs[10] = d; + b = z2 * a - 0.253968254 * b; + a = b - 0.252525253 * a; + d = 14.684485724 * a; + out_shs[21] = d; + b = z2 * a - 0.251748252 * b; + a = b - 0.251282051 * a; + d = 58.473368113 * a; + out_shs[36] = d; + c1 = x; + s1 = y; + d = -1.092548431 * z; + out_shs[4] = c1 * d; + out_shs[2] = s1 * d; + out_grads[4][0] = c0 * d; + out_grads[2][0] = s0 * d; + out_grads[4][1] = s0 * d; + out_grads[2][1] = c0 * d; + d = 1.892349392 * z; + out_grads[3][2] = d; + a = (z2 - 0.2) * z; + b = a - 0.228571429 * z; + d = -4.683325805 * b; + out_shs[11] = c1 * d; + out_shs[9] = s1 * d; + out_grads[11][0] = c0 * d; + out_grads[9][0] = s0 * d; + out_grads[11][1] = s0 * d; + out_grads[9][1] = c0 * d; + d = 14.809976568 * b; + out_grads[10][2] = d; + a = z2 * b - 0.238095238 * a; + b = a - 0.242424242 * b; + d = -19.226504963 * b; + out_shs[22] = c1 * d; + out_shs[20] = s1 * d; + out_grads[22][0] = c0 * d; + out_grads[20][0] = s0 * d; + out_grads[22][1] = s0 * d; + out_grads[20][1] = c0 * d; + d = 88.106914343 * b; + out_grads[21][2] = d; + a = z2 * b - 0.244755245 * a; + b = a - 0.246153846 * b; + d = -77.964490818 * b; + out_shs[37] = c1 * d; + out_shs[35] = s1 * d; + out_grads[37][0] = c0 * d; + out_grads[35][0] = s0 * d; + out_grads[37][1] = s0 * d; + out_grads[35][1] = c0 * d; + d = 467.786944906 * b; + out_grads[36][2] = d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.546274215; + out_shs[5] = c0 * d; + out_shs[1] = s0 * d; + d = 1.092548431; + out_grads[5][0] = c1 * d; + out_grads[1][0] = s1 * d; + out_grads[5][1] = -s1 * d; + out_grads[1][1] = c1 * d; + d = -1.092548431; + out_grads[4][2] = c1 * d; + out_grads[2][2] = s1 * d; + a = z2 - 0.142857143; + d = 3.311611435 * a; + out_shs[12] = c0 * d; + out_shs[8] = s0 * d; + d = 6.62322287 * a; + out_grads[12][0] = c1 * d; + out_grads[8][0] = s1 * d; + out_grads[12][1] = -s1 * d; + out_grads[8][1] = c1 * d; + d = -14.049977415 * a; + out_grads[11][2] = c1 * d; + out_grads[9][2] = s1 * d; + b = z2 * (a - 0.19047619); + a = b - 0.212121212 * a; + d = 15.199886782 * a; + out_shs[23] = c0 * d; + out_shs[19] = s0 * d; + d = 30.399773564 * a; + out_grads[23][0] = c1 * d; + out_grads[19][0] = s1 * d; + out_grads[23][1] = -s1 * d; + out_grads[19][1] = c1 * d; + d = -96.132524816 * a; + out_grads[22][2] = c1 * d; + out_grads[20][2] = s1 * d; + b = z2 * a - 0.223776224 * b; + a = b - 0.230769231 * a; + d = 65.229772956 * a; + out_shs[38] = c0 * d; + out_shs[34] = s0 * d; + d = 130.459545912 * a; + out_grads[38][0] = c1 * d; + out_grads[34][0] = s1 * d; + out_grads[38][1] = -s1 * d; + out_grads[34][1] = c1 * d; + d = -545.751435723 * a; + out_grads[37][2] = c1 * d; + out_grads[35][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -1.77013077 * z; + out_shs[13] = c1 * d; + out_shs[7] = s1 * d; + d = -5.310392309 * z; + out_grads[13][0] = c0 * d; + out_grads[7][0] = s0 * d; + out_grads[13][1] = s0 * d; + out_grads[7][1] = c0 * d; + d = 6.62322287 * z; + out_grads[12][2] = c0 * d; + out_grads[8][2] = s0 * d; + a = (z2 - 0.111111111) * z; + b = a - 0.161616162 * z; + d = -10.133257855 * b; + out_shs[24] = c1 * d; + out_shs[18] = s1 * d; + d = -30.399773564 * b; + out_grads[24][0] = c0 * d; + out_grads[18][0] = s0 * d; + out_grads[24][1] = s0 * d; + out_grads[18][1] = c0 * d; + d = 60.799547128 * b; + out_grads[23][2] = c0 * d; + out_grads[19][2] = s0 * d; + a = z2 * b - 0.188811189 * a; + b = a - 0.205128205 * b; + d = -48.175380057 * b; + out_shs[39] = c1 * d; + out_shs[33] = s1 * d; + d = -144.52614017 * b; + out_grads[39][0] = c0 * d; + out_grads[33][0] = s0 * d; + out_grads[39][1] = s0 * d; + out_grads[33][1] = c0 * d; + d = 391.378637737 * b; + out_grads[38][2] = c0 * d; + out_grads[34][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.625835735; + out_shs[14] = c0 * d; + out_shs[6] = s0 * d; + d = 2.503342942; + out_grads[14][0] = c1 * d; + out_grads[6][0] = s1 * d; + out_grads[14][1] = -s1 * d; + out_grads[6][1] = c1 * d; + d = -1.77013077; + out_grads[13][2] = c1 * d; + out_grads[7][2] = s1 * d; + a = z2 - 9.09090909e-02; + d = 5.550213908 * a; + out_shs[25] = c0 * d; + out_shs[17] = s0 * d; + d = 22.200855632 * a; + out_grads[25][0] = c1 * d; + out_grads[17][0] = s1 * d; + out_grads[25][1] = -s1 * d; + out_grads[17][1] = c1 * d; + d = -30.399773564 * a; + out_grads[24][2] = c1 * d; + out_grads[18][2] = s1 * d; + b = z2 * (a - 0.13986014); + a = b - 0.169230769 * a; + d = 31.097074109 * a; + out_shs[40] = c0 * d; + out_shs[32] = s0 * d; + d = 124.388296437 * a; + out_grads[40][0] = c1 * d; + out_grads[32][0] = s1 * d; + out_grads[40][1] = -s1 * d; + out_grads[32][1] = c1 * d; + d = -240.876900283 * a; + out_grads[39][2] = c1 * d; + out_grads[33][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.366619162 * z; + out_shs[26] = c1 * d; + out_shs[16] = s1 * d; + d = -11.833095811 * z; + out_grads[26][0] = c0 * d; + out_grads[16][0] = s0 * d; + out_grads[26][1] = s0 * d; + out_grads[16][1] = c0 * d; + d = 11.100427816 * z; + out_grads[25][2] = c0 * d; + out_grads[17][2] = s0 * d; + a = (z2 - 7.69230769e-02) * z; + b = a - 0.123076923 * z; + d = -17.24955311 * b; + out_shs[41] = c1 * d; + out_shs[31] = s1 * d; + d = -86.247765552 * b; + out_grads[41][0] = c0 * d; + out_grads[31][0] = s0 * d; + out_grads[41][1] = s0 * d; + out_grads[31][1] = c0 * d; + d = 124.388296437 * b; + out_grads[40][2] = c0 * d; + out_grads[32][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.683184105; + out_shs[27] = c0 * d; + out_shs[15] = s0 * d; + d = 4.099104631; + out_grads[27][0] = c1 * d; + out_grads[15][0] = s1 * d; + out_grads[27][1] = -s1 * d; + out_grads[15][1] = c1 * d; + d = -2.366619162; + out_grads[26][2] = c1 * d; + out_grads[16][2] = s1 * d; + a = z2 - 6.66666667e-02; + d = 7.984991491 * a; + out_shs[42] = c0 * d; + out_shs[30] = s0 * d; + d = 47.909948945 * a; + out_grads[42][0] = c1 * d; + out_grads[30][0] = s1 * d; + out_grads[42][1] = -s1 * d; + out_grads[30][1] = c1 * d; + d = -51.748659331 * a; + out_grads[41][2] = c1 * d; + out_grads[31][2] = s1 * d; + c1 = x * c0 - y * s0; + s1 = y * c0 + x * s0; + d = -2.915706641 * z; + out_shs[43] = c1 * d; + out_shs[29] = s1 * d; + d = -20.409946485 * z; + out_grads[43][0] = c0 * d; + out_grads[29][0] = s0 * d; + out_grads[43][1] = s0 * d; + out_grads[29][1] = c0 * d; + d = 15.969982982 * z; + out_grads[42][2] = c0 * d; + out_grads[30][2] = s0 * d; + c0 = x * c1 - y * s1; + s0 = y * c1 + x * s1; + d = 0.72892666; + out_shs[44] = c0 * d; + out_shs[28] = s0 * d; + d = 5.831413281; + out_grads[44][0] = c1 * d; + out_grads[28][0] = s1 * d; + out_grads[44][1] = -s1 * d; + out_grads[28][1] = c1 * d; + d = -2.915706641; + out_grads[43][2] = c1 * d; + out_grads[29][2] = s1 * d; + out_grads[0][0] = 0.0; + out_grads[0][1] = 0.0; + out_grads[0][2] = 0.0; + out_grads[5][2] = 0.0; + out_grads[3][0] = 0.0; + out_grads[3][1] = 0.0; + out_grads[1][2] = 0.0; + out_grads[14][2] = 0.0; + out_grads[10][0] = 0.0; + out_grads[10][1] = 0.0; + out_grads[6][2] = 0.0; + out_grads[27][2] = 0.0; + out_grads[21][0] = 0.0; + out_grads[21][1] = 0.0; + out_grads[15][2] = 0.0; + out_grads[44][2] = 0.0; + out_grads[36][0] = 0.0; + out_grads[36][1] = 0.0; + out_grads[28][2] = 0.0; +} diff --git a/fury/shaders/rt_odfs/find_roots.frag b/fury/shaders/utils/find_roots.frag similarity index 100% rename from fury/shaders/rt_odfs/find_roots.frag rename to fury/shaders/utils/find_roots.frag diff --git a/fury/shaders/rt_odfs/newton_bisection.frag b/fury/shaders/utils/newton_bisection.frag similarity index 100% rename from fury/shaders/rt_odfs/newton_bisection.frag rename to fury/shaders/utils/newton_bisection.frag From 66dda5d94d1f1e904d0bc74303c8d37026b2ec0f Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Fri, 1 Mar 2024 11:39:22 -0500 Subject: [PATCH 4/8] added degree param --- .../SH-ODF experimental/odf_example.py | 37 +++++++++- fury/actor.py | 20 ++++- fury/actors/odf.py | 74 +++++-------------- ...grad_10 copy.frag => eval_sh_grad_10.frag} | 0 ...grad_12 copy.frag => eval_sh_grad_12.frag} | 0 ...h_grad_2 copy.frag => eval_sh_grad_2.frag} | 0 ...h_grad_4 copy.frag => eval_sh_grad_4.frag} | 0 ...h_grad_6 copy.frag => eval_sh_grad_6.frag} | 0 ...h_grad_8 copy.frag => eval_sh_grad_8.frag} | 0 9 files changed, 72 insertions(+), 59 deletions(-) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_10 copy.frag => eval_sh_grad_10.frag} (100%) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_12 copy.frag => eval_sh_grad_12.frag} (100%) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_2 copy.frag => eval_sh_grad_2.frag} (100%) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_4 copy.frag => eval_sh_grad_4.frag} (100%) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_6 copy.frag => eval_sh_grad_6.frag} (100%) rename fury/shaders/rt_odfs/tournier/{eval_sh_grad_8 copy.frag => eval_sh_grad_8.frag} (100%) diff --git a/docs/experimental/SH-ODF experimental/odf_example.py b/docs/experimental/SH-ODF experimental/odf_example.py index e16858211..50978942d 100644 --- a/docs/experimental/SH-ODF experimental/odf_example.py +++ b/docs/experimental/SH-ODF experimental/odf_example.py @@ -20,8 +20,39 @@ x, y, z, s = coeffs.shape coeffs = coeffs[:, :, :].reshape((x * y * z, s)) - n_glyphs = coeffs.shape[0] - - odf_actor = actor.odf(centers=centers, coeffs=coeffs, scales=1.0) + + #''' + coeffs = np.array([ + [ + -0.2739740312099, 0.2526670396328, 1.8922271728516, 0.2878578901291, + -0.5339795947075, -0.2620058953762, 0.1580424904823, 0.0329004973173, + -0.1322413831949, -0.1332057565451, 1.0894461870193, -0.6319401264191, + -0.0416776277125, -1.0772529840469, 0.1423762738705, 0.7941166162491, + 0.7490307092667, -0.3428381681442, 0.1024847552180, -0.0219132602215, + 0.0499043911695, 0.2162453681231, 0.0921059995890, -0.2611238956451, + 0.2549301385880, -0.4534865319729, 0.1922748684883, -0.6200597286224, + -0.0532187558711, -0.3569841980934, 0.0293972902000, -0.1977960765362, + -0.1058669015765, 0.2372217923403, -0.1856198310852, -0.3373193442822, + -0.0750469490886, 0.2146576642990, -0.0490148440003, 0.1288588196039, + 0.3173974752426, 0.1990085393190, -0.1736343950033, -0.0482443645597, + 0.1749017387629, -0.0151847425660, 0.0418366046081, 0.0863263587216, + -0.0649211244490, 0.0126096132283, 0.0545089217982, -0.0275142164626, + 0.0399986574832, -0.0468244261610, -0.1292105653111, -0.0786858322658, + -0.0663828464882, 0.0382439706831, -0.0041550330365, -0.0502800566338, + -0.0732471630735, 0.0181751900972, -0.0090119333757, -0.0604443282359, + -0.1469985252752, -0.0534046899715, -0.0896672753415, -0.0130841364808, + -0.0112942893801, 0.0272257498541, 0.0626717616331, -0.0222197983050, + -0.0018541504308, -0.1653251944056, 0.0409697402846, 0.0749921454327, + -0.0282830872616, 0.0006909458525, 0.0625599842287, 0.0812529816082, + 0.0914693020772, -0.1197222726745, 0.0376277453183, -0.0832617004142, + -0.0482175038043, -0.0839003635737, -0.0349423908400, 0.1204519568256, + 0.0783745984003, 0.0297401205976, -0.0505947662525 + ] + ]) + centers= np.array([0, 0, 0]) + #''' + + odf_actor = actor.odf(centers=centers, coeffs=coeffs, scales=1.0, + basis_type='descoteaux', degree=6) show_man.scene.add(odf_actor) show_man.start() \ No newline at end of file diff --git a/fury/actor.py b/fury/actor.py index cb630a365..085c9aa79 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3873,6 +3873,7 @@ def ellipsoid( def odf( centers, coeffs, + degree=4, basis_type='descoteaux', scales=1.0, opacity=1.0 @@ -3887,6 +3888,9 @@ def odf( ODFs positions. coeffs : ndarray 2D ODFs array in SH coefficients. + degree: int, optional + Index of the highest used band of the spherical harmonics basis. Must + be even, at least 2 and at most 12. basis_type: str, optional Type of basis (descoteaux, tournier) 'descoteaux' for the default ``descoteaux07`` DYPY basis. @@ -3906,6 +3910,20 @@ def odf( centers = np.array(centers) if centers.ndim == 1: centers = np.array([centers]) + + if not isinstance(coeffs, np.ndarray): + coeffs = np.array(coeffs) + + coeffs_given = coeffs.shape[1] + coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) + if degree % 2 != 0: + raise ValueError('degree must be even') + if coeffs_given < coeffs_needed: + raise ValueError( + 'Not enough number of coefficient for SH of degree {0}. ' + 'Expected at least {1}'.format(degree, coeffs_needed)) + else: + coeffs = coeffs[:, :coeffs_needed] if not isinstance(scales, np.ndarray): scales = np.array(scales) @@ -3918,4 +3936,4 @@ def odf( total = np.sum(abs(coeffs), axis=1) coeffs = np.dot(np.diag(1 / total * scales), coeffs) * 1.7 - return sh_odf(centers, coeffs, basis_type, scales, opacity) \ No newline at end of file + return sh_odf(centers, coeffs, degree, basis_type, scales, opacity) \ No newline at end of file diff --git a/fury/actors/odf.py b/fury/actors/odf.py index e8a762c55..139567a56 100644 --- a/fury/actors/odf.py +++ b/fury/actors/odf.py @@ -32,14 +32,13 @@ def uv_calculations(n): return uvs def minmax_norm(data): - min = data.min(axis=1) max = data.max(axis=1) return np.array([(data[i] - min[i]) / (max[i] - min[i]) for i in range(data.shape[0])]) -def sh_odf(centers, coeffs, basis_type, scales, opacity): +def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): """ Visualize one or many ODFs with different features. @@ -53,6 +52,9 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): Type of basis (descoteaux, tournier) 'descoteaux' for the default ``descoteaux07`` DYPY basis. 'tournier' for the default ``tournier07` DYPY basis. + degree: int, optional + Index of the highest used band of the spherical harmonics basis. Must + be even, at least 2 and at most 12. scales : float or ndarray (N, ) ODFs size. opacity : float @@ -108,7 +110,7 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): # The number of coefficients is associated to the order of the SH odf_actor.GetShaderProperty().GetFragmentCustomUniforms().SetUniformf( - "numCoeffs", 15 + "numCoeffs", ((degree + 1) * (degree + 2)) / 2 ) # Start of shader implementation @@ -142,7 +144,7 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): # The index of the highest used band of the spherical harmonics basis. Must # be even, at least 2 and at most 12. - def_sh_degree = "#define SH_DEGREE 4" + def_sh_degree = "#define SH_DEGREE " + str(degree) # The number of spherical harmonics basis functions def_sh_count = "#define SH_COUNT (((SH_DEGREE + 1) * (SH_DEGREE + 2)) / 2)" @@ -187,47 +189,14 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): coeffs_norm = import_fury_shader(os.path.join("utils", "minmax_norm.glsl")) - eval_sh_2 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_2.frag")) - - eval_sh_4 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_4.frag")) - - eval_sh_6 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_6.frag")) - - eval_sh_8 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_8.frag")) - - eval_sh_10 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_10.frag")) - - eval_sh_12 = import_fury_shader( - os.path.join("rt_odfs", basis_type, "eval_sh_12.frag")) - - eval_sh_grad_2 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_2.frag") - ) - - eval_sh_grad_4 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_4.frag") - ) - - eval_sh_grad_6 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_6.frag") - ) - - eval_sh_grad_8 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_8.frag") - ) - - eval_sh_grad_10 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_10.frag") - ) - - eval_sh_grad_12 = import_fury_shader( - os.path.join("rt_odfs/descoteaux", "eval_sh_grad_12.frag") - ) + eval_sh_list = '' + for i in range (2, degree+1, 2): + eval_sh = import_fury_shader( + os.path.join("rt_odfs", basis_type, 'eval_sh_' + str(i) + '.frag')) + eval_sh_grad = import_fury_shader( + os.path.join("rt_odfs", basis_type, + 'eval_sh_grad_' + str(i) + '.frag')) + eval_sh_list = eval_sh_list + '\n\n' + eval_sh + '\n\n' + eval_sh_grad # Searches a single root of a polynomial within a given interval. # param out_root The location of the found root. @@ -334,13 +303,10 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): fs_dec = compose_shader([ def_sh_degree, def_sh_count, def_max_degree, def_gl_ext_control_flow_attributes, def_no_intersection, def_pis, - fs_vs_vars, coeffs_norm, eval_sh_2, eval_sh_4, eval_sh_6, eval_sh_8, - eval_sh_10, eval_sh_12, eval_sh_grad_2, eval_sh_grad_4, eval_sh_grad_6, - eval_sh_grad_8, eval_sh_grad_10, eval_sh_grad_12, newton_bisection, - find_roots, eval_sh, eval_sh_grad, get_inv_vandermonde, - ray_sh_glyph_intersections, get_sh_glyph_normal, blinn_phong_model, - linear_to_srgb, srgb_to_linear, linear_rgb_to_srgb, srgb_to_linear_rgb, - tonemap + fs_vs_vars, coeffs_norm, eval_sh_list, newton_bisection, find_roots, + eval_sh, eval_sh_grad, get_inv_vandermonde, ray_sh_glyph_intersections, + get_sh_glyph_normal, blinn_phong_model, linear_to_srgb, srgb_to_linear, + linear_rgb_to_srgb, srgb_to_linear_rgb, tonemap ]) # fmt: on @@ -351,7 +317,6 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): # Ray origin is the camera position in world space ray_origin = "vec3 ro = camPosMCVSOutput;" - # TODO: Check aspect for automatic scaling # Ray direction is the normalized difference between the fragment and the # camera position/ray origin ray_direction = "vec3 rd = normalize(pnt - ro);" @@ -392,7 +357,7 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): break; } } - """ + """ # Evaluate shading for a directional light directional_light = \ @@ -404,7 +369,6 @@ def sh_odf(centers, coeffs, basis_type, scales, opacity): vec3 colorDir = srgb_to_linear_rgb(abs(normalize(intersection))); float attenuation = dot(ld, normal); color = blinnPhongIllumModel( - //attenuation, lightColor0, diffuseColor, specularPower, attenuation, lightColor0, colorDir, specularPower, specularColor, ambientColor); } else { diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_10.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_10 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_10.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_12.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_12 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_12.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_2.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_2 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_2.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_4.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_4 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_4.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_6.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_6 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_6.frag diff --git a/fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag b/fury/shaders/rt_odfs/tournier/eval_sh_grad_8.frag similarity index 100% rename from fury/shaders/rt_odfs/tournier/eval_sh_grad_8 copy.frag rename to fury/shaders/rt_odfs/tournier/eval_sh_grad_8.frag From badb5a9782a1e587ba3ed65fd2f77394ec952c3d Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Wed, 6 Mar 2024 18:05:58 -0500 Subject: [PATCH 5/8] adjusted the degree setting --- .../SH-ODF experimental/odf_example.py | 13 +------- fury/actor.py | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/experimental/SH-ODF experimental/odf_example.py b/docs/experimental/SH-ODF experimental/odf_example.py index 50978942d..c31dac722 100644 --- a/docs/experimental/SH-ODF experimental/odf_example.py +++ b/docs/experimental/SH-ODF experimental/odf_example.py @@ -35,18 +35,7 @@ -0.1058669015765, 0.2372217923403, -0.1856198310852, -0.3373193442822, -0.0750469490886, 0.2146576642990, -0.0490148440003, 0.1288588196039, 0.3173974752426, 0.1990085393190, -0.1736343950033, -0.0482443645597, - 0.1749017387629, -0.0151847425660, 0.0418366046081, 0.0863263587216, - -0.0649211244490, 0.0126096132283, 0.0545089217982, -0.0275142164626, - 0.0399986574832, -0.0468244261610, -0.1292105653111, -0.0786858322658, - -0.0663828464882, 0.0382439706831, -0.0041550330365, -0.0502800566338, - -0.0732471630735, 0.0181751900972, -0.0090119333757, -0.0604443282359, - -0.1469985252752, -0.0534046899715, -0.0896672753415, -0.0130841364808, - -0.0112942893801, 0.0272257498541, 0.0626717616331, -0.0222197983050, - -0.0018541504308, -0.1653251944056, 0.0409697402846, 0.0749921454327, - -0.0282830872616, 0.0006909458525, 0.0625599842287, 0.0812529816082, - 0.0914693020772, -0.1197222726745, 0.0376277453183, -0.0832617004142, - -0.0482175038043, -0.0839003635737, -0.0349423908400, 0.1204519568256, - 0.0783745984003, 0.0297401205976, -0.0505947662525 + 0.1749017387629 ] ]) centers= np.array([0, 0, 0]) diff --git a/fury/actor.py b/fury/actor.py index 085c9aa79..6d150ceb1 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3873,7 +3873,7 @@ def ellipsoid( def odf( centers, coeffs, - degree=4, + degree=None, basis_type='descoteaux', scales=1.0, opacity=1.0 @@ -3890,7 +3890,8 @@ def odf( 2D ODFs array in SH coefficients. degree: int, optional Index of the highest used band of the spherical harmonics basis. Must - be even, at least 2 and at most 12. + be even, at least 2 and at most 12. If None the degree is set based on + the number of SH coefficients given. basis_type: str, optional Type of basis (descoteaux, tournier) 'descoteaux' for the default ``descoteaux07`` DYPY basis. @@ -3913,17 +3914,25 @@ def odf( if not isinstance(coeffs, np.ndarray): coeffs = np.array(coeffs) - - coeffs_given = coeffs.shape[1] - coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) - if degree % 2 != 0: + if coeffs.ndim == 1: + coeffs = np.array([coeffs]) + if coeffs.shape[0] != centers.shape[0]: + raise ValueError('number of odf glyphs defined does not match with ' + 'number of centers') + + coeffs_given = coeffs.shape[-1] + if degree == None: + degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) + elif degree % 2 != 0: raise ValueError('degree must be even') + coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) if coeffs_given < coeffs_needed: - raise ValueError( - 'Not enough number of coefficient for SH of degree {0}. ' - 'Expected at least {1}'.format(degree, coeffs_needed)) - else: - coeffs = coeffs[:, :coeffs_needed] + print('Not enough number of coefficient for SH of degree {0}. ' + 'Expected at least {1}'.format(degree, coeffs_needed)) + degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) + if (degree % 2 != 0): degree -= 1 + coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) + coeffs = coeffs[:, :coeffs_needed] if not isinstance(scales, np.ndarray): scales = np.array(scales) From dc4168497eb74f33a4e8b466fc1c631990f6ea50 Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Mon, 18 Mar 2024 13:07:16 -0500 Subject: [PATCH 6/8] added tests --- .../SH-ODF experimental/odf_example.py | 47 ------------ fury/actor.py | 11 +-- fury/actors/odf.py | 54 +++++--------- fury/tests/test_actors.py | 73 +++++++++++++++++++ fury/tests/test_utils.py | 21 ++++++ fury/texture/utils.py | 18 +++++ fury/utils.py | 33 +++++++++ 7 files changed, 168 insertions(+), 89 deletions(-) delete mode 100644 docs/experimental/SH-ODF experimental/odf_example.py create mode 100644 fury/texture/utils.py diff --git a/docs/experimental/SH-ODF experimental/odf_example.py b/docs/experimental/SH-ODF experimental/odf_example.py deleted file mode 100644 index c31dac722..000000000 --- a/docs/experimental/SH-ODF experimental/odf_example.py +++ /dev/null @@ -1,47 +0,0 @@ -import os - -import numpy as np -from dipy.data.fetcher import dipy_home -from dipy.io.image import load_nifti - -from fury import actor, window - -if __name__ == "__main__": - show_man = window.ShowManager(size=(1280, 720)) - - dataset_dir = os.path.join(dipy_home, "stanford_hardi") - - coeffs, affine = load_nifti("docs\experimental\SH-ODF experimental\coefs_odf.nii") - - valid_mask = np.abs(coeffs).max(axis=(-1)) > 0 - indices = np.nonzero(valid_mask) - - centers = np.asarray(indices).T - - x, y, z, s = coeffs.shape - coeffs = coeffs[:, :, :].reshape((x * y * z, s)) - - #''' - coeffs = np.array([ - [ - -0.2739740312099, 0.2526670396328, 1.8922271728516, 0.2878578901291, - -0.5339795947075, -0.2620058953762, 0.1580424904823, 0.0329004973173, - -0.1322413831949, -0.1332057565451, 1.0894461870193, -0.6319401264191, - -0.0416776277125, -1.0772529840469, 0.1423762738705, 0.7941166162491, - 0.7490307092667, -0.3428381681442, 0.1024847552180, -0.0219132602215, - 0.0499043911695, 0.2162453681231, 0.0921059995890, -0.2611238956451, - 0.2549301385880, -0.4534865319729, 0.1922748684883, -0.6200597286224, - -0.0532187558711, -0.3569841980934, 0.0293972902000, -0.1977960765362, - -0.1058669015765, 0.2372217923403, -0.1856198310852, -0.3373193442822, - -0.0750469490886, 0.2146576642990, -0.0490148440003, 0.1288588196039, - 0.3173974752426, 0.1990085393190, -0.1736343950033, -0.0482443645597, - 0.1749017387629 - ] - ]) - centers= np.array([0, 0, 0]) - #''' - - odf_actor = actor.odf(centers=centers, coeffs=coeffs, scales=1.0, - basis_type='descoteaux', degree=6) - show_man.scene.add(odf_actor) - show_man.start() \ No newline at end of file diff --git a/fury/actor.py b/fury/actor.py index e2811ba82..b1bad30f3 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3987,7 +3987,7 @@ def odf( ODFs size. opacity : float Takes values from 0 (fully transparent) to 1 (opaque). - + Returns ------- odf: Actor @@ -3998,7 +3998,7 @@ def odf( centers = np.array(centers) if centers.ndim == 1: centers = np.array([centers]) - + if not isinstance(coeffs, np.ndarray): coeffs = np.array(coeffs) if coeffs.ndim == 1: @@ -4008,7 +4008,7 @@ def odf( 'number of centers') coeffs_given = coeffs.shape[-1] - if degree == None: + if degree is None: degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) elif degree % 2 != 0: raise ValueError('degree must be even') @@ -4017,7 +4017,8 @@ def odf( print('Not enough number of coefficient for SH of degree {0}. ' 'Expected at least {1}'.format(degree, coeffs_needed)) degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) - if (degree % 2 != 0): degree -= 1 + if (degree % 2 != 0): + degree -= 1 coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) coeffs = coeffs[:, :coeffs_needed] @@ -4028,7 +4029,7 @@ def odf( elif scales.size != centers.shape[0]: scales = np.concatenate( (scales, np.ones(centers.shape[0] - scales.shape[0])), axis=None) - + total = np.sum(abs(coeffs), axis=1) coeffs = np.dot(np.diag(1 / total * scales), coeffs) * 1.7 diff --git a/fury/actors/odf.py b/fury/actors/odf.py index 139567a56..938cae791 100644 --- a/fury/actors/odf.py +++ b/fury/actors/odf.py @@ -10,33 +10,13 @@ import_fury_shader, shader_to_actor, ) -from fury.utils import numpy_to_vtk_image_data, set_polydata_tcoords - -def uv_calculations(n): - uvs = [] - for i in range(0, n): - a = (n - (i + 1)) / n - b = (n - i) / n - uvs.extend( - [ - [0.001, a + 0.001], - [0.001, b - 0.001], - [0.999, b - 0.001], - [0.999, a + 0.001], - [0.001, a + 0.001], - [0.001, b - 0.001], - [0.999, b - 0.001], - [0.999, a + 0.001], - ] - ) - return uvs - -def minmax_norm(data): - min = data.min(axis=1) - max = data.max(axis=1) - return np.array([(data[i] - min[i]) / (max[i] - min[i]) - for i in range(data.shape[0])]) - +from fury.utils import ( + numpy_to_vtk_image_data, + set_polydata_tcoords, + minmax_norm +) +from fury.texture.utils import uv_calculations + def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): """ @@ -75,9 +55,9 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): minmax = np.array([coeffs.min(axis=1), coeffs.max(axis=1)]).T big_minmax = np.repeat(minmax, 8, axis=0) attribute_to_actor(odf_actor, big_minmax, "minmax") - + # The coefficient data is stored in a texture to be passed to the shaders. - + # Data is normalized to a range of 0 to 1. arr = minmax_norm(coeffs) # Data is turned into values within the RGB color range, and then coverted @@ -92,8 +72,7 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): # Texture is associated with the actor odf_actor.GetProperty().SetTexture("texture0", texture) - - + odf_actor_pd = odf_actor.GetMapper().GetInput() n_glyphs = coeffs.shape[0] @@ -101,6 +80,7 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): uv_vals = np.array(uv_calculations(n_glyphs)) num_pnts = uv_vals.shape[0] + # Definition of texture coordinates to be associated with the actor. t_coords = FloatArray() t_coords.SetNumberOfComponents(2) t_coords.SetNumberOfTuples(num_pnts) @@ -112,9 +92,9 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): odf_actor.GetShaderProperty().GetFragmentCustomUniforms().SetUniformf( "numCoeffs", ((degree + 1) * (degree + 2)) / 2 ) - + # Start of shader implementation - + vs_dec = \ """ in vec3 center; @@ -188,13 +168,13 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): """ coeffs_norm = import_fury_shader(os.path.join("utils", "minmax_norm.glsl")) - + eval_sh_list = '' - for i in range (2, degree+1, 2): + for i in range(2, degree+1, 2): eval_sh = import_fury_shader( os.path.join("rt_odfs", basis_type, 'eval_sh_' + str(i) + '.frag')) eval_sh_grad = import_fury_shader( - os.path.join("rt_odfs", basis_type, + os.path.join("rt_odfs", basis_type, 'eval_sh_grad_' + str(i) + '.frag')) eval_sh_list = eval_sh_list + '\n\n' + eval_sh + '\n\n' + eval_sh_grad @@ -388,5 +368,5 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): ]) shader_to_actor(odf_actor, "fragment", impl_code=fs_impl, block="picking") - + return odf_actor \ No newline at end of file diff --git a/fury/tests/test_actors.py b/fury/tests/test_actors.py index c09862b98..49ad49970 100644 --- a/fury/tests/test_actors.py +++ b/fury/tests/test_actors.py @@ -1881,3 +1881,76 @@ def test_actors_primitives_count(): primitives_count = test_case[2] act = act_func(**args) npt.assert_equal(primitives_count_from_actor(act), primitives_count) + + +def test_odf_actor(interactive=False): + # number of odf glyphs does not match with number of centers + centers = np.array([[0, -1, 0]]) + coeffs = np.array([[0.282, 0.152, -0.040, -0.112, -0.045, 0.149], + [0.285, 0.097, -0.115, 0.125, -0.001, 0.003]]) + npt.assert_raises(ValueError, actor.odf, centers, coeffs) + + scene = window.Scene() + centers = np.array([[0, -1, 0], [1, -1, 0], [2, -1, 0]]) + coeffs = np.array([ + [0.2820735, 0.15236554, -0.04038717, -0.11270988, -0.04532376, + 0.14921817, 0.00257928, 0.0040734, -0.05313807, 0.03486542, + 0.04083064, 0.02105767, -0.04389586, -0.04302812, 0.1048641], + [0.28549338, 0.0978267, -0.11544838, 0.12525354, -0.00126003, + 0.00320594, 0.04744155, -0.07141446, 0.03211689, 0.04711322, + 0.08064896, 0.00154299, 0.00086506, 0.00162543, -0.00444893], + [0.28208936, -0.13133252, -0.04701012, -0.06303016, -0.0468775, + 0.02348355, 0.03991898, 0.02587433, 0.02645416, 0.00668765, + 0.00890633, 0.02189304, 0.00387415, 0.01665629, -0.01427194] + ]) + odf_actor = actor.odf(centers=centers, coeffs=coeffs) + scene.add(odf_actor) + + if interactive: + window.show(scene) + + report = window.analyze_scene(scene) + npt.assert_equal(report.actors, 1) + scene.clear() + + # given degree is not even + npt.assert_raises(ValueError, actor.odf, centers, coeffs, degree=3) + + centers= np.array([0, 0, 0]) + coeffs = np.array([ + [-0.2739740312099, 0.2526670396328, 1.8922271728516, 0.2878578901291, + -0.5339795947075, -0.2620058953762, 0.1580424904823, 0.0329004973173, + -0.1322413831949, -0.1332057565451, 1.0894461870193, -0.6319401264191, + -0.0416776277125, -1.0772529840469, 0.1423762738705, 0.7941166162491, + 0.7490307092667, -0.3428381681442, 0.1024847552180, -0.0219132602215, + 0.0499043911695, 0.2162453681231, 0.0921059995890, -0.2611238956451, + 0.2549301385880,-0.4534865319729, 0.1922748684883, -0.6200597286224] + ]) + odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=6) + scene.add(odf_actor) + + if interactive: + window.show(scene) + + report = window.analyze_scene(scene) + npt.assert_equal(report.actors, 1) + scene.clear() + + odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=4) + scene.add(odf_actor) + + if interactive: + window.show(scene) + + report = window.analyze_scene(scene) + npt.assert_equal(report.actors, 1) + scene.clear() + + odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=8) + scene.add(odf_actor) + + if interactive: + window.show(scene) + + npt.assert_equal(report.actors, 1) + scene.clear() diff --git a/fury/tests/test_utils.py b/fury/tests/test_utils.py index 821fa386c..6e95a8c19 100644 --- a/fury/tests/test_utils.py +++ b/fury/tests/test_utils.py @@ -53,6 +53,7 @@ update_surface_actor_colors, vertices_from_actor, vtk_matrix_to_numpy, + minmax_norm, ) dipy, have_dipy, _ = optional_package('dipy') @@ -959,3 +960,23 @@ def test_set_actor_origin(): utils.set_actor_origin(cube) centered_cube_vertices = np.copy(vertices_from_actor(cube)) npt.assert_array_equal(orig_vert, centered_cube_vertices) + + +def test_minmax_normalization(): + data = np.array([[1, 2, -1, 3], [4, -1, 3, 5], [-1, 9, 8, 0]]) + + actual = minmax_norm(data, axis=0) + expected = np.array([[0.4, 0.3, 0, 0.6], [1, 0, 0.444, 1], [0, 1, 1, 0]]) + npt.assert_array_almost_equal(actual, expected, decimal=3) + actual = minmax_norm(data, axis=1) + expected = np.array([[0.5, 0.75, 0, 1], [0.833, 0, 0.666, 1], + [0, 1, 0.9, 0.1]]) + npt.assert_array_almost_equal(actual, expected, decimal=3) + + data2 = np.array([1, 3, 9, 6]) + actual2 = minmax_norm(data2, axis=0) + expected2 = np.array([[1, 3, 9, 6]]) + npt.assert_array_equal(actual2, expected2) + actual2 = minmax_norm(data2, axis=1) + expected2 = np.array([[0, 0.25 , 1, 0.625]]) + npt.assert_array_almost_equal(actual2, expected2, decimal=3) diff --git a/fury/texture/utils.py b/fury/texture/utils.py new file mode 100644 index 000000000..b75bebde5 --- /dev/null +++ b/fury/texture/utils.py @@ -0,0 +1,18 @@ +def uv_calculations(n): + uvs = [] + for i in range(0, n): + a = (n - (i + 1)) / n + b = (n - i) / n + uvs.extend( + [ + [0.001, a + 0.001], + [0.001, b - 0.001], + [0.999, b - 0.001], + [0.999, a + 0.001], + [0.001, a + 0.001], + [0.001, b - 0.001], + [0.999, b - 0.001], + [0.999, a + 0.001], + ] + ) + return uvs \ No newline at end of file diff --git a/fury/utils.py b/fury/utils.py index 92abd4e4a..47c9f5c0e 100644 --- a/fury/utils.py +++ b/fury/utils.py @@ -1596,3 +1596,36 @@ def set_actor_origin(actor, center=None): center = np.mean(vertices) vertices[:] -= center update_actor(actor) + + +def minmax_norm(data, axis=1): + """Returns the min-max normalization of data + + Parameters + ---------- + data: ndarray + 2D array + axis: int + axis for the function to be applied on + + Returns + ------- + output : ndarray + + """ + + if not isinstance(data, np.ndarray): + data = np.array(data) + if data.ndim == 1: + data = np.array([data]) + elif data.ndim > 2: + raise ValueError('the dimension of the array must be 2.') + + min = data.min(axis=axis) + max = data.max(axis=axis) + if np.array_equal(min, max): + return data + if (axis == 0): + return (data - min)/(max - min) + if (axis == 1): + return (data - min[:, None])/(max - min)[:, None] From f4824f60a4e9bd6a8a819c4400e8e1fabca4550d Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Fri, 29 Mar 2024 10:15:18 -0500 Subject: [PATCH 7/8] adjustments on tests and parameter validation --- fury/actor.py | 49 +++++++++++++++++++------------- fury/actors/odf.py | 2 +- fury/tests/test_actors.py | 22 +++++++------- fury/tests/test_utils.py | 14 +++++++-- fury/texture/tests/__init__.py | 0 fury/texture/tests/test_utils.py | 41 ++++++++++++++++++++++++++ fury/texture/utils.py | 15 +++++++++- fury/utils.py | 12 ++++---- 8 files changed, 115 insertions(+), 40 deletions(-) create mode 100644 fury/texture/tests/__init__.py create mode 100644 fury/texture/tests/test_utils.py diff --git a/fury/actor.py b/fury/actor.py index b1bad30f3..ae3d7423f 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3966,15 +3966,16 @@ def odf( opacity=1.0 ): """ - VTK actor for visualizing ODFs given an array of spherical harmonics (SH) - coefficients. + FURY actor for visualizing Orientation Distribution Functions (ODFs) given + an array of Spherical Harmonics (SH) coefficients. Parameters ---------- centers : ndarray(N, 3) ODFs positions. - coeffs : ndarray - 2D ODFs array in SH coefficients. + coeffs : (N, M) or (N, 6) or (N, 15) or (N, 28) or (N, 45) or (N, 66) or + (N, 91) ndarray. + Corresponding SH coefficients for the ODFs. degree: int, optional Index of the highest used band of the spherical harmonics basis. Must be even, at least 2 and at most 12. If None the degree is set based on @@ -3998,29 +3999,39 @@ def odf( centers = np.array(centers) if centers.ndim == 1: centers = np.array([centers]) - + if not isinstance(coeffs, np.ndarray): coeffs = np.array(coeffs) - if coeffs.ndim == 1: - coeffs = np.array([coeffs]) + if coeffs.ndim != 2: + if coeffs.ndim == 1: + coeffs = np.array([coeffs]) + else: + raise ValueError('coeffs should be a 2D array.') if coeffs.shape[0] != centers.shape[0]: raise ValueError('number of odf glyphs defined does not match with ' 'number of centers') coeffs_given = coeffs.shape[-1] + max_degree = int((np.sqrt(8 * coeffs_given + 1) - 3) / 2) if degree is None: - degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) - elif degree % 2 != 0: - raise ValueError('degree must be even') - coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) - if coeffs_given < coeffs_needed: - print('Not enough number of coefficient for SH of degree {0}. ' - 'Expected at least {1}'.format(degree, coeffs_needed)) - degree = int((np.sqrt(8 * coeffs_given + 1) - 3)/2) - if (degree % 2 != 0): - degree -= 1 - coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) - coeffs = coeffs[:, :coeffs_needed] + degree = max_degree + else: + if degree % 2 != 0: + warnings.warn('Invalid degree value. Degree must be a positive ' + 'even number lower or equal to 12. Ignoring passed ' + 'value and using maximum degree supported by the ' + 'number of SH coefficients.') + degree = max_degree + else: + coeffs_needed = int(((degree + 1) * (degree + 2)) / 2) + if coeffs_given < coeffs_needed: + warnings.warn('Not enough number of coefficient for SH of ' + 'degree {0}, expected at least {1}. Ignoring ' + 'passed value and using maximum degree supported ' + 'by the number of SH coefficients.' + .format(degree, coeffs_needed)) + degree = max_degree + coeffs = coeffs[:, :int(((degree + 1) * (degree + 2)) / 2)] if not isinstance(scales, np.ndarray): scales = np.array(scales) diff --git a/fury/actors/odf.py b/fury/actors/odf.py index 938cae791..5e8fbe4d4 100644 --- a/fury/actors/odf.py +++ b/fury/actors/odf.py @@ -369,4 +369,4 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): shader_to_actor(odf_actor, "fragment", impl_code=fs_impl, block="picking") - return odf_actor \ No newline at end of file + return odf_actor diff --git a/fury/tests/test_actors.py b/fury/tests/test_actors.py index 49ad49970..8e69c5afa 100644 --- a/fury/tests/test_actors.py +++ b/fury/tests/test_actors.py @@ -1889,7 +1889,7 @@ def test_odf_actor(interactive=False): coeffs = np.array([[0.282, 0.152, -0.040, -0.112, -0.045, 0.149], [0.285, 0.097, -0.115, 0.125, -0.001, 0.003]]) npt.assert_raises(ValueError, actor.odf, centers, coeffs) - + scene = window.Scene() centers = np.array([[0, -1, 0], [1, -1, 0], [2, -1, 0]]) coeffs = np.array([ @@ -1912,11 +1912,11 @@ def test_odf_actor(interactive=False): report = window.analyze_scene(scene) npt.assert_equal(report.actors, 1) scene.clear() - + # given degree is not even - npt.assert_raises(ValueError, actor.odf, centers, coeffs, degree=3) + npt.assert_warns(UserWarning, actor.odf, centers, coeffs, 3) - centers= np.array([0, 0, 0]) + centers = np.array([0, 0, 0]) coeffs = np.array([ [-0.2739740312099, 0.2526670396328, 1.8922271728516, 0.2878578901291, -0.5339795947075, -0.2620058953762, 0.1580424904823, 0.0329004973173, @@ -1924,7 +1924,7 @@ def test_odf_actor(interactive=False): -0.0416776277125, -1.0772529840469, 0.1423762738705, 0.7941166162491, 0.7490307092667, -0.3428381681442, 0.1024847552180, -0.0219132602215, 0.0499043911695, 0.2162453681231, 0.0921059995890, -0.2611238956451, - 0.2549301385880,-0.4534865319729, 0.1922748684883, -0.6200597286224] + 0.2549301385880, -0.4534865319729, 0.1922748684883, -0.6200597286224] ]) odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=6) scene.add(odf_actor) @@ -1938,19 +1938,21 @@ def test_odf_actor(interactive=False): odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=4) scene.add(odf_actor) - + if interactive: window.show(scene) - + report = window.analyze_scene(scene) npt.assert_equal(report.actors, 1) scene.clear() - + odf_actor = actor.odf(centers=centers, coeffs=coeffs, degree=8) + # not enough coefficients for given degree + npt.assert_warns(UserWarning, actor.odf, centers, coeffs, 8) scene.add(odf_actor) - + if interactive: window.show(scene) - + npt.assert_equal(report.actors, 1) scene.clear() diff --git a/fury/tests/test_utils.py b/fury/tests/test_utils.py index 6e95a8c19..6a99179c8 100644 --- a/fury/tests/test_utils.py +++ b/fury/tests/test_utils.py @@ -963,13 +963,21 @@ def test_set_actor_origin(): def test_minmax_normalization(): - data = np.array([[1, 2, -1, 3], [4, -1, 3, 5], [-1, 9, 8, 0]]) + data1d = np.array([2, -2, 5, -1, 8]) + actual_data1d = minmax_norm(data1d) + expected_data1d = np.array([[0.4, 0. , 0.7, 0.1, 1. ]]) + npt.assert_array_almost_equal(actual_data1d, expected_data1d, decimal=1) + + data3d = np.array([[[2, 7, 7, 9], [2, -1, -3, 5]], + [[-4, 5, 6, 0], [1, 1, -9, 3]]]) + npt.assert_raises(ValueError, utils.minmax_norm, data3d) + data = np.array([[1, 2, -1, 3], [4, -1, 3, 5], [-1, 9, 8, 0]]) actual = minmax_norm(data, axis=0) expected = np.array([[0.4, 0.3, 0, 0.6], [1, 0, 0.444, 1], [0, 1, 1, 0]]) npt.assert_array_almost_equal(actual, expected, decimal=3) actual = minmax_norm(data, axis=1) - expected = np.array([[0.5, 0.75, 0, 1], [0.833, 0, 0.666, 1], + expected = np.array([[0.5, 0.75, 0, 1], [0.833, 0, 0.666, 1], [0, 1, 0.9, 0.1]]) npt.assert_array_almost_equal(actual, expected, decimal=3) @@ -978,5 +986,5 @@ def test_minmax_normalization(): expected2 = np.array([[1, 3, 9, 6]]) npt.assert_array_equal(actual2, expected2) actual2 = minmax_norm(data2, axis=1) - expected2 = np.array([[0, 0.25 , 1, 0.625]]) + expected2 = np.array([[0, 0.25, 1, 0.625]]) npt.assert_array_almost_equal(actual2, expected2, decimal=3) diff --git a/fury/texture/tests/__init__.py b/fury/texture/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/fury/texture/tests/test_utils.py b/fury/texture/tests/test_utils.py new file mode 100644 index 000000000..71f108596 --- /dev/null +++ b/fury/texture/tests/test_utils.py @@ -0,0 +1,41 @@ +import numpy as np +import numpy.testing as npt +from fury.texture.utils import uv_calculations + +def test_uv_calculations(): + uv_coords = uv_calculations(1) + expected_uv1 = np.array([ + [0.001, 0.001], [0.001, 0.999], [0.999, 0.999], [0.999, 0.001], + [0.001, 0.001], [0.001, 0.999], [0.999, 0.999], [0.999, 0.001] + ]) + npt.assert_array_almost_equal(uv_coords, expected_uv1, decimal=3) + + uv_coords = uv_calculations(3) + expected_uv3 = np.array([ + [0.001, 0.667], [0.001, 0.999], [0.999, 0.999], [0.999, 0.667], + [0.001, 0.667], [0.001, 0.999], [0.999, 0.999], [0.999, 0.667], + [0.001, 0.334], [0.001, 0.665], [0.999, 0.665], [0.999, 0.334], + [0.001, 0.334], [0.001, 0.665], [0.999, 0.665], [0.999, 0.334], + [0.001, 0.001], [0.001, 0.332], [0.999, 0.332], [0.999, 0.001], + [0.001, 0.001], [0.001, 0.332], [0.999, 0.332], [0.999, 0.001] + ]) + npt.assert_array_almost_equal(uv_coords, expected_uv3, decimal=3) + + uv_coords = uv_calculations(7) + expected_uv7 = np.array([ + [0.001, 0.858], [0.001, 0.999], [0.999, 0.999], [0.999, 0.858], + [0.001, 0.858], [0.001, 0.999], [0.999, 0.999], [0.999, 0.858], + [0.001, 0.715], [0.001, 0.856], [0.999, 0.856], [0.999, 0.715], + [0.001, 0.715], [0.001, 0.856], [0.999, 0.856], [0.999, 0.715], + [0.001, 0.572], [0.001, 0.713], [0.999, 0.713], [0.999, 0.572], + [0.001, 0.572], [0.001, 0.713], [0.999, 0.713], [0.999, 0.572], + [0.001, 0.429], [0.001, 0.570], [0.999, 0.570], [0.999, 0.429], + [0.001, 0.429], [0.001, 0.570], [0.999, 0.570], [0.999, 0.429], + [0.001, 0.286], [0.001, 0.427], [0.999, 0.427], [0.999, 0.286], + [0.001, 0.286], [0.001, 0.427], [0.999, 0.427], [0.999, 0.286], + [0.001, 0.143], [0.001, 0.284], [0.999, 0.284], [0.999, 0.143], + [0.001, 0.143], [0.001, 0.284], [0.999, 0.284], [0.999, 0.143], + [0.001, 0.001], [0.001, 0.141], [0.999, 0.141], [0.999, 0.001], + [0.001, 0.001], [0.001, 0.141], [0.999, 0.141], [0.999, 0.001] + ]) + npt.assert_array_almost_equal(uv_coords, expected_uv7, decimal=3) diff --git a/fury/texture/utils.py b/fury/texture/utils.py index b75bebde5..25da3a714 100644 --- a/fury/texture/utils.py +++ b/fury/texture/utils.py @@ -1,4 +1,17 @@ def uv_calculations(n): + """Return UV coordinates based on the number of elements. + + Parameters + ---------- + n : int + number of elements. + + Returns + ------- + uvs : ndrray + UV coordinates for each element. + + """ uvs = [] for i in range(0, n): a = (n - (i + 1)) / n @@ -15,4 +28,4 @@ def uv_calculations(n): [0.999, a + 0.001], ] ) - return uvs \ No newline at end of file + return uvs diff --git a/fury/utils.py b/fury/utils.py index 47c9f5c0e..b806b2d99 100644 --- a/fury/utils.py +++ b/fury/utils.py @@ -1599,7 +1599,7 @@ def set_actor_origin(actor, center=None): def minmax_norm(data, axis=1): - """Returns the min-max normalization of data + """Returns the min-max normalization of data along an axis. Parameters ---------- @@ -1621,11 +1621,11 @@ def minmax_norm(data, axis=1): elif data.ndim > 2: raise ValueError('the dimension of the array must be 2.') - min = data.min(axis=axis) - max = data.max(axis=axis) - if np.array_equal(min, max): + minimum = data.min(axis=axis) + maximum = data.max(axis=axis) + if np.array_equal(minimum, maximum): return data if (axis == 0): - return (data - min)/(max - min) + return (data - minimum)/(maximum - minimum) if (axis == 1): - return (data - min[:, None])/(max - min)[:, None] + return (data - minimum[:, None])/(maximum - minimum)[:, None] From a5803559e7f7c293df5068890ba93ef877498c5c Mon Sep 17 00:00:00 2001 From: tvcastillod Date: Tue, 16 Apr 2024 09:49:44 -0500 Subject: [PATCH 8/8] reorganized and refactored odf actor --- fury/actor.py | 6 +-- fury/actors/odf.py | 62 +++++++++++++++-------------- fury/shaders/utils/minmax_norm.glsl | 6 +-- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/fury/actor.py b/fury/actor.py index ae3d7423f..91a0e244a 100644 --- a/fury/actor.py +++ b/fury/actor.py @@ -3961,7 +3961,7 @@ def odf( centers, coeffs, degree=None, - basis_type='descoteaux', + sh_basis='descoteaux', scales=1.0, opacity=1.0 ): @@ -3980,7 +3980,7 @@ def odf( Index of the highest used band of the spherical harmonics basis. Must be even, at least 2 and at most 12. If None the degree is set based on the number of SH coefficients given. - basis_type: str, optional + sh_basis: str, optional Type of basis (descoteaux, tournier) 'descoteaux' for the default ``descoteaux07`` DYPY basis. 'tournier' for the default ``tournier07` DYPY basis. @@ -4044,4 +4044,4 @@ def odf( total = np.sum(abs(coeffs), axis=1) coeffs = np.dot(np.diag(1 / total * scales), coeffs) * 1.7 - return sh_odf(centers, coeffs, degree, basis_type, scales, opacity) + return sh_odf(centers, coeffs, degree, sh_basis, scales, opacity) diff --git a/fury/actors/odf.py b/fury/actors/odf.py index 5e8fbe4d4..2f2b07f39 100644 --- a/fury/actors/odf.py +++ b/fury/actors/odf.py @@ -18,7 +18,7 @@ from fury.texture.utils import uv_calculations -def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): +def sh_odf(centers, coeffs, degree, sh_basis, scales, opacity): """ Visualize one or many ODFs with different features. @@ -28,7 +28,7 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): ODFs positions. coeffs : ndarray 2D ODFs array in SH coefficients. - basis_type: str, optional + sh_basis: str, optional Type of basis (descoteaux, tournier) 'descoteaux' for the default ``descoteaux07`` DYPY basis. 'tournier' for the default ``tournier07` DYPY basis. @@ -56,11 +56,26 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): big_minmax = np.repeat(minmax, 8, axis=0) attribute_to_actor(odf_actor, big_minmax, "minmax") + odf_actor_pd = odf_actor.GetMapper().GetInput() + + n_glyphs = coeffs.shape[0] + # Coordinates to locate the data of each glyph in the texture. + uv_vals = np.array(uv_calculations(n_glyphs)) + num_pnts = uv_vals.shape[0] + + # Definition of texture coordinates to be associated with the actor. + t_coords = FloatArray() + t_coords.SetNumberOfComponents(2) + t_coords.SetNumberOfTuples(num_pnts) + [t_coords.SetTuple(i, uv_vals[i]) for i in range(num_pnts)] + + set_polydata_tcoords(odf_actor_pd, t_coords) + # The coefficient data is stored in a texture to be passed to the shaders. # Data is normalized to a range of 0 to 1. arr = minmax_norm(coeffs) - # Data is turned into values within the RGB color range, and then coverted + # Data is turned into values within the RGB color range, and then converted # into a vtk image data. arr *= 255 grid = numpy_to_vtk_image_data(arr.astype(np.uint8)) @@ -73,21 +88,6 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): # Texture is associated with the actor odf_actor.GetProperty().SetTexture("texture0", texture) - odf_actor_pd = odf_actor.GetMapper().GetInput() - - n_glyphs = coeffs.shape[0] - # Coordinates to locate the data of each glyph in the texture. - uv_vals = np.array(uv_calculations(n_glyphs)) - num_pnts = uv_vals.shape[0] - - # Definition of texture coordinates to be associated with the actor. - t_coords = FloatArray() - t_coords.SetNumberOfComponents(2) - t_coords.SetNumberOfTuples(num_pnts) - [t_coords.SetTuple(i, uv_vals[i]) for i in range(num_pnts)] - - set_polydata_tcoords(odf_actor_pd, t_coords) - # The number of coefficients is associated to the order of the SH odf_actor.GetShaderProperty().GetFragmentCustomUniforms().SetUniformf( "numCoeffs", ((degree + 1) * (degree + 2)) / 2 @@ -169,14 +169,19 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): coeffs_norm = import_fury_shader(os.path.join("utils", "minmax_norm.glsl")) - eval_sh_list = '' - for i in range(2, degree+1, 2): + eval_sh_composed = "" + for i in range(2, degree + 1, 2): #PUT sh_degree eval_sh = import_fury_shader( - os.path.join("rt_odfs", basis_type, 'eval_sh_' + str(i) + '.frag')) + os.path.join("rt_odfs", sh_basis, "eval_sh_" + str(i) + ".frag") + ) eval_sh_grad = import_fury_shader( - os.path.join("rt_odfs", basis_type, - 'eval_sh_grad_' + str(i) + '.frag')) - eval_sh_list = eval_sh_list + '\n\n' + eval_sh + '\n\n' + eval_sh_grad + os.path.join( + "rt_odfs", sh_basis, "eval_sh_grad_" + str(i) + ".frag" + ) + ) + eval_sh_composed = compose_shader( + [eval_sh_composed, eval_sh, eval_sh_grad] + ) # Searches a single root of a polynomial within a given interval. # param out_root The location of the found root. @@ -283,7 +288,7 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): fs_dec = compose_shader([ def_sh_degree, def_sh_count, def_max_degree, def_gl_ext_control_flow_attributes, def_no_intersection, def_pis, - fs_vs_vars, coeffs_norm, eval_sh_list, newton_bisection, find_roots, + fs_vs_vars, coeffs_norm, eval_sh_composed, newton_bisection, find_roots, eval_sh, eval_sh_grad, get_inv_vandermonde, ray_sh_glyph_intersections, get_sh_glyph_normal, blinn_phong_model, linear_to_srgb, srgb_to_linear, linear_rgb_to_srgb, srgb_to_linear_rgb, tonemap @@ -311,10 +316,9 @@ def sh_odf(centers, coeffs, degree, basis_type, scales, opacity): float i = 1 / (numCoeffs * 2); float sh_coeffs[SH_COUNT]; for(int j=0; j