Advertisement
xakepp35

neural racing sse

Feb 25th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. _MM_ALIGN16 static const __m128 _mm_0_ss(_mm_set_ss(0));
  2. _MM_ALIGN16 static const __m128 _mm_1_ss(_mm_set_ss(1));
  3.  
  4. __m128 _mm_sqr_ss(const __m128& x) {
  5.     return _mm_mul_ss(x, x);
  6. }
  7.  
  8. // 2mul, 1add
  9. __m128 _mm_dot_ss(const __m128& a0, const __m128& a1, const __m128& b0, const __m128& b1) {
  10.     return _mm_add_ss(_mm_mul_ss(a0, b0), _mm_mul_ss(a1, b1));
  11. }
  12.  
  13. // 2mul, 1sub
  14. __m128 _mm_det_ss(const __m128& a0, const __m128& a1, const __m128& b0, const __m128& b1) {
  15.     return _mm_sub_ss(_mm_mul_ss(a0, b1), _mm_mul_ss(a1, b0));
  16. }
  17.  
  18. // collision detector:  3dot, 2mul, 1div, 2sub, 4set, 3comiss
  19. bool _mm_circle_segment_collides(const __m128& s0qp0, const __m128& s0qp1, const __m128& s0s10, const __m128& s0s11, const __m128& rSqr) {
  20.     auto a = _mm_dot_ss(s0s10, s0s11, s0s10, s0s11); //dot(s0s1, s0s1);
  21.     //if(_mm_comineq_ss( a, _mm_set_ss(0) ) ) //if( a != 0 ) // if you haven't zero-length segments omit this
  22.     {
  23.         auto b = _mm_dot_ss(s0s10, s0s11, s0qp0, s0qp1);// dot(s0s1, s0qp);
  24.         auto t = _mm_div_ss(b, a); //b / a; // length of projection of s0qp onto s0s1
  25.         auto tge0 = _mm_comige_ss(t, _mm_0_ss);
  26.         auto tle1 = _mm_comile_ss(t, _mm_1_ss);
  27.         if(tge0 && tle1)// ((t >= 0) && (t <= 1))
  28.         {
  29.             auto c = _mm_dot_ss(s0qp0, s0qp1, s0qp0, s0qp1); //dot(s0qp, s0qp);
  30.             auto r2 = _mm_sub_ss(c, _mm_mul_ss(a, _mm_sqr_ss(t))); //r^2 = c - a * t^2;
  31.             auto dist2 = _mm_sub_ss(r2, rSqr); // dist^2 = r2 - rSqr
  32.             return _mm_comile_ss(dist2, _mm_0_ss); // dist2 <= 0;
  33.         }
  34.     }
  35.     return false;
  36. }
  37.  
  38. __m128 _mm_pos_distance_inverse(const __m128& r) {
  39.     if (_mm_comige_ss(r, _mm_0_ss))
  40.         return _mm_div_ss(_mm_1_ss, _mm_add_ss(r, _mm_1_ss));
  41.     else
  42.         return _mm_0_ss;
  43. }
  44.  
  45. // neural network proximity sensor input: 3det, 3div, 1add, 6set, 4comiss
  46. __m128 _mm_ray_segment_distance_inverse(const __m128& s0qp0, const __m128& s0qp1, const __m128& s0s10, const __m128& s0s11, const __m128& d0, const __m128& d1) {
  47.  
  48.     auto dd = _mm_det_ss(d0, d1, s0s10, s0s11); //auto dd = d[0] * s0s1[1] - d[1] * s0s1[0];
  49.     //if (_mm_comineq_ss(dd, _mm_0_ss)) // lines are not parallel, would try to omit
  50.     {
  51.         auto s = _mm_div_ss(_mm_det_ss(d0, d1, s0qp0, s0qp1), dd ); //auto s = (s0qp[1] * d[0] - s0qp[0] * d[1]) / dd;
  52.         auto sge0 = _mm_comige_ss(s, _mm_0_ss);
  53.         auto sle1 = _mm_comile_ss(s, _mm_1_ss);
  54.         if (sge0 && sle1) { // segment intersects ray (s >= 0 && s <= 1)
  55.             auto r = _mm_div_ss( _mm_det_ss(s0s10, s0s11, s0qp0, s0qp1), dd ); // auto r = (s0qp[1] * s0s1[0] - s0qp[0] * s0s1[1]) / dd;
  56.             return _mm_pos_distance_inverse(r);
  57.         }
  58.     }
  59.     return _mm_0_ss; // infinitely far, parallel, not intersecting
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement