Cleaned up some of the SIMD code in spectra_xyz.

This commit is contained in:
Nathan Vegdahl 2018-07-01 16:49:41 -07:00
parent 3f55df7225
commit b14b1b13b5

View File

@ -227,18 +227,11 @@ pub fn spectrum_xyz_to_p_4(lambdas: Float4, xyz: (f32, f32, f32)) -> Float4 {
sb.get_3() as i32, sb.get_3() as i32,
]; ];
assert!(sb0[0].max(sb0[1]).max(sb0[2].max(sb0[3])) < SPECTRUM_NUM_SAMPLES); assert!(sb0[0].max(sb0[1]).max(sb0[2].max(sb0[3])) < SPECTRUM_NUM_SAMPLES);
let plus_one_clamped = |n| {
if (n + 1.0) < SPECTRUM_NUM_SAMPLES as f32 {
n as i32 + 1
} else {
SPECTRUM_NUM_SAMPLES - 1
}
};
let sb1: [i32; 4] = [ let sb1: [i32; 4] = [
plus_one_clamped(sb.get_0()), (sb.get_0() as i32 + 1).min(SPECTRUM_NUM_SAMPLES - 1),
plus_one_clamped(sb.get_1()), (sb.get_1() as i32 + 1).min(SPECTRUM_NUM_SAMPLES - 1),
plus_one_clamped(sb.get_2()), (sb.get_2() as i32 + 1).min(SPECTRUM_NUM_SAMPLES - 1),
plus_one_clamped(sb.get_3()), (sb.get_3() as i32 + 1).min(SPECTRUM_NUM_SAMPLES - 1),
]; ];
let sbf = sb - Float4::new(sb0[0] as f32, sb0[1] as f32, sb0[2] as f32, sb0[3] as f32); let sbf = sb - Float4::new(sb0[0] as f32, sb0[1] as f32, sb0[2] as f32, sb0[3] as f32);
for i in 0..(num as usize) { for i in 0..(num as usize) {
@ -259,7 +252,7 @@ pub fn spectrum_xyz_to_p_4(lambdas: Float4, xyz: (f32, f32, f32)) -> Float4 {
p[i] = p0 * (Float4::splat(1.0) - sbf) + p1 * sbf; p[i] = p0 * (Float4::splat(1.0) - sbf) + p1 * sbf;
} }
// Linearly interpolated the spectral power of the cell vertices. // Linearly interpolate the spectral power of the cell vertices.
let mut interpolated_p = Float4::splat(0.0); let mut interpolated_p = Float4::splat(0.0);
if inside { if inside {
// Fast path for normal inner quads: // Fast path for normal inner quads:
@ -271,10 +264,10 @@ pub fn spectrum_xyz_to_p_4(lambdas: Float4, xyz: (f32, f32, f32)) -> Float4 {
// The layout of the vertices in the quad is: // The layout of the vertices in the quad is:
// 2 3 // 2 3
// 0 1 // 0 1
interpolated_p = p[0] * (1.0 - uv2.0) * (1.0 - uv2.1) interpolated_p = p[0] * ((1.0 - uv2.0) * (1.0 - uv2.1))
+ p[2] * (1.0 - uv2.0) * uv2.1 + p[2] * ((1.0 - uv2.0) * uv2.1)
+ p[3] * uv2.0 * uv2.1 + p[3] * (uv2.0 * uv2.1)
+ p[1] * uv2.0 * (1.0 - uv2.1); + p[1] * (uv2.0 * (1.0 - uv2.1));
} else { } else {
// Need to go through triangulation :( // Need to go through triangulation :(
// We get the indices in such an order that they form a triangle fan around idx[0]. // We get the indices in such an order that they form a triangle fan around idx[0].