@@ -102,17 +102,23 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_reflect(glm_vec4 I, glm_vec4 N)
102
102
103
103
GLM_FUNC_QUALIFIER __m128 glm_vec4_refract (glm_vec4 I , glm_vec4 N , glm_vec4 eta )
104
104
{
105
- glm_vec4 const dot0 = glm_vec4_dot (N , I );
106
- glm_vec4 const mul0 = _mm_mul_ps (eta , eta );
107
- glm_vec4 const mul1 = _mm_mul_ps (dot0 , dot0 );
108
- glm_vec4 const sub0 = _mm_sub_ps (_mm_set1_ps (1.0f ), mul0 );
109
- glm_vec4 const sub1 = _mm_sub_ps (_mm_set1_ps (1.0f ), mul1 );
110
- glm_vec4 const mul2 = _mm_mul_ps (sub0 , sub1 );
111
-
112
- if (_mm_movemask_ps (_mm_cmplt_ss (mul2 , _mm_set1_ps (0.0f ))) == 0 )
105
+ // k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
106
+ // if (k < 0.0)
107
+ // R = genType(0.0); // or genDType(0.0)
108
+ // else
109
+ // R = eta * I - (eta * dot(N, I) + sqrt(k)) * N;
110
+
111
+ glm_vec4 const dot0 = glm_vec4_dot (N , I ); // dot(N, I)
112
+ glm_vec4 const mul0 = _mm_mul_ps (eta , eta ); // eta * eta
113
+ glm_vec4 const mul1 = _mm_mul_ps (dot0 , dot0 ); // dot(N, I) * dot(N, I)
114
+ glm_vec4 const sub1 = _mm_sub_ps (_mm_set1_ps (1.0f ), mul1 ); // (1.0 - dot(N, I) * dot(N, I))
115
+ glm_vec4 const mul2 = _mm_mul_ps (mul0 , sub1 ); // eta * eta * (1.0 - dot(N, I) * dot(N, I))
116
+ glm_vec4 const sub0 = _mm_sub_ps (_mm_set1_ps (1.0f ), mul2 ); // 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))
117
+
118
+ if (_mm_movemask_ps (_mm_cmplt_ss (sub0 , _mm_set1_ps (0.0f ))) == 0 )
113
119
return _mm_set1_ps (0.0f );
114
120
115
- glm_vec4 const sqt0 = _mm_sqrt_ps (mul2 );
121
+ glm_vec4 const sqt0 = _mm_sqrt_ps (sub0 );
116
122
glm_vec4 const mad0 = glm_vec4_fma (eta , dot0 , sqt0 );
117
123
glm_vec4 const mul4 = _mm_mul_ps (mad0 , N );
118
124
glm_vec4 const mul5 = _mm_mul_ps (eta , I );
0 commit comments