Advertisement
Guest User

Untitled

a guest
Jan 7th, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. class CVector3D
  2. {
  3.     public:
  4.         float X, Y, Z;
  5.  
  6.     public:
  7.         CVector3D() : X(0.0f), Y(0.0f), Z(0.0f) {}
  8.         CVector3D(float x, float y, float z) : X(x), Y(y), Z(z) {}
  9.  
  10.         int operator!() const;
  11.  
  12.         float& operator[](int index) { return *((&X)+index); }
  13.         const float& operator[](int index) const { return *((&X)+index); }
  14.  
  15.         // vector equality (testing float equality, so please be careful if necessary)
  16.         bool operator==(const CVector3D &vector) const
  17.         {
  18.             return (X == vector.X && Y == vector.Y && Z == vector.Z);
  19.         }
  20.  
  21.         bool operator!=(const CVector3D& vector) const
  22.         {
  23.             return !operator==(vector);
  24.         }
  25.  
  26.         CVector3D operator+(const CVector3D& vector) const
  27.         {
  28.             return CVector3D(X + vector.X, Y + vector.Y, Z + vector.Z);
  29.         }
  30.  
  31.         CVector3D& operator+=(const CVector3D& vector)
  32.         {
  33.             X += vector.X;
  34.             Y += vector.Y;
  35.             Z += vector.Z;
  36.             return *this;
  37.         }
  38.  
  39.         CVector3D operator-(const CVector3D& vector) const
  40.         {
  41.             return CVector3D(X - vector.X, Y - vector.Y, Z - vector.Z);
  42.         }
  43.  
  44.         CVector3D& operator-=(const CVector3D& vector)
  45.         {
  46.             X -= vector.X;
  47.             Y -= vector.Y;
  48.             Z -= vector.Z;
  49.             return *this;
  50.         }
  51.  
  52.         CVector3D operator*(float value) const
  53.         {
  54.             return CVector3D(X * value, Y * value, Z * value);
  55.         }
  56.  
  57.         CVector3D& operator*=(float value)
  58.         {
  59.             X *= value;
  60.             Y *= value;
  61.             Z *= value;
  62.             return *this;
  63.         }
  64.  
  65.         CVector3D operator-() const
  66.         {
  67.             return CVector3D(-X, -Y, -Z);
  68.         }
  69.  
  70.     public:
  71.         float Dot (const CVector3D &vector) const
  72.         {
  73.             return ( X * vector.X +
  74.                      Y * vector.Y +
  75.                      Z * vector.Z );
  76.         }
  77.  
  78.         CVector3D Cross (const CVector3D &vector) const
  79.         {
  80.             CVector3D Temp;
  81.             Temp.X = (Y * vector.Z) - (Z * vector.Y);
  82.             Temp.Y = (Z * vector.X) - (X * vector.Z);
  83.             Temp.Z = (X * vector.Y) - (Y * vector.X);
  84.             return Temp;
  85.         }
  86.  
  87.         float Length () const;
  88.         float LengthSquared () const;
  89.         void Normalize ();
  90.         CVector3D Normalized () const;
  91.  
  92.         // Returns 3 element array of floats, e.g. for glVertex3fv
  93.         const float* GetFloatArray() const { return &X; }
  94. };
  95.  
  96. #include <stdint.h>
  97. #include <algorithm>
  98.  
  99. using RGBColor = CVector3D;
  100. using u8 = uint8_t;
  101.  
  102. template <typename T>
  103. inline T clamp(T value, T min, T max)
  104. {
  105.     if (value <= min) return min;
  106.     else if (value >= max) return max;
  107.     else return value;
  108. }
  109.  
  110. // SColor4ub: structure for packed RGBA colors
  111. struct SColor4ub
  112. {
  113.     u8 R;
  114.     u8 G;
  115.     u8 B;
  116.     u8 A;
  117.  
  118.     SColor4ub() { }
  119.     SColor4ub(u8 _r, u8 _g, u8 _b, u8 _a) : R(_r), G(_g), B(_b), A(_a) { }
  120. };
  121.  
  122. SColor4ub fallback_ConvertRGBColorTo4ub(const RGBColor& src)
  123. {
  124.     SColor4ub result;
  125.     result.R = clamp(static_cast<int>(src.X * 255), 0, 255);
  126.     result.G = clamp(static_cast<int>(src.Y * 255), 0, 255);
  127.     result.B = clamp(static_cast<int>(src.Z * 255), 0, 255);
  128.     result.A = 255;
  129.     return result;
  130. }
  131.  
  132. #include <emmintrin.h>
  133.  
  134. SColor4ub sse_ConvertRGBColorTo4ub(const RGBColor& src)
  135. {
  136.     const __m128 zero = _mm_setzero_ps();
  137.     const __m128 _255 = _mm_set_ss(255.0f);
  138.     __m128 r = _mm_load_ss(&src.X);
  139.     __m128 g = _mm_load_ss(&src.Y);
  140.     __m128 b = _mm_load_ss(&src.Z);
  141.  
  142.     // C = min(255, 255*max(C, 0)) ( == clamp(255*C, 0, 255) )
  143.     r = _mm_max_ss(r, zero);
  144.     g = _mm_max_ss(g, zero);
  145.     b = _mm_max_ss(b, zero);
  146.  
  147.     r = _mm_mul_ss(r, _255);
  148.     g = _mm_mul_ss(g, _255);
  149.     b = _mm_mul_ss(b, _255);
  150.  
  151.     r = _mm_min_ss(r, _255);
  152.     g = _mm_min_ss(g, _255);
  153.     b = _mm_min_ss(b, _255);
  154.  
  155.     // convert to integer and combine channels using bit logic
  156.     int ri = _mm_cvtss_si32(r);
  157.     int gi = _mm_cvtss_si32(g);
  158.     int bi = _mm_cvtss_si32(b);
  159.  
  160.     return SColor4ub(ri, gi, bi, 0xFF);
  161. }
  162.  
  163. #include <iostream>
  164.  
  165. int main()
  166. {
  167.     SColor4ub a;
  168.     SColor4ub b;
  169.  
  170.     for (int i = 0; i < 500000000; ++i)
  171.     {
  172.         RGBColor col(0.4f, 0.5f, i / 50.0f);
  173.         a = sse_ConvertRGBColorTo4ub(col);
  174.         b.B += a.B;
  175.     }
  176.  
  177.     if (b.B > 50)
  178.         return 0;
  179.     return 1;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement