Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class CVector3D
- {
- public:
- float X, Y, Z;
- public:
- CVector3D() : X(0.0f), Y(0.0f), Z(0.0f) {}
- CVector3D(float x, float y, float z) : X(x), Y(y), Z(z) {}
- int operator!() const;
- float& operator[](int index) { return *((&X)+index); }
- const float& operator[](int index) const { return *((&X)+index); }
- // vector equality (testing float equality, so please be careful if necessary)
- bool operator==(const CVector3D &vector) const
- {
- return (X == vector.X && Y == vector.Y && Z == vector.Z);
- }
- bool operator!=(const CVector3D& vector) const
- {
- return !operator==(vector);
- }
- CVector3D operator+(const CVector3D& vector) const
- {
- return CVector3D(X + vector.X, Y + vector.Y, Z + vector.Z);
- }
- CVector3D& operator+=(const CVector3D& vector)
- {
- X += vector.X;
- Y += vector.Y;
- Z += vector.Z;
- return *this;
- }
- CVector3D operator-(const CVector3D& vector) const
- {
- return CVector3D(X - vector.X, Y - vector.Y, Z - vector.Z);
- }
- CVector3D& operator-=(const CVector3D& vector)
- {
- X -= vector.X;
- Y -= vector.Y;
- Z -= vector.Z;
- return *this;
- }
- CVector3D operator*(float value) const
- {
- return CVector3D(X * value, Y * value, Z * value);
- }
- CVector3D& operator*=(float value)
- {
- X *= value;
- Y *= value;
- Z *= value;
- return *this;
- }
- CVector3D operator-() const
- {
- return CVector3D(-X, -Y, -Z);
- }
- public:
- float Dot (const CVector3D &vector) const
- {
- return ( X * vector.X +
- Y * vector.Y +
- Z * vector.Z );
- }
- CVector3D Cross (const CVector3D &vector) const
- {
- CVector3D Temp;
- Temp.X = (Y * vector.Z) - (Z * vector.Y);
- Temp.Y = (Z * vector.X) - (X * vector.Z);
- Temp.Z = (X * vector.Y) - (Y * vector.X);
- return Temp;
- }
- float Length () const;
- float LengthSquared () const;
- void Normalize ();
- CVector3D Normalized () const;
- // Returns 3 element array of floats, e.g. for glVertex3fv
- const float* GetFloatArray() const { return &X; }
- };
- #include <stdint.h>
- #include <algorithm>
- using RGBColor = CVector3D;
- using u8 = uint8_t;
- template <typename T>
- inline T clamp(T value, T min, T max)
- {
- if (value <= min) return min;
- else if (value >= max) return max;
- else return value;
- }
- // SColor4ub: structure for packed RGBA colors
- struct SColor4ub
- {
- u8 R;
- u8 G;
- u8 B;
- u8 A;
- SColor4ub() { }
- SColor4ub(u8 _r, u8 _g, u8 _b, u8 _a) : R(_r), G(_g), B(_b), A(_a) { }
- };
- SColor4ub fallback_ConvertRGBColorTo4ub(const RGBColor& src)
- {
- SColor4ub result;
- result.R = clamp(static_cast<int>(src.X * 255), 0, 255);
- result.G = clamp(static_cast<int>(src.Y * 255), 0, 255);
- result.B = clamp(static_cast<int>(src.Z * 255), 0, 255);
- result.A = 255;
- return result;
- }
- #include <emmintrin.h>
- SColor4ub sse_ConvertRGBColorTo4ub(const RGBColor& src)
- {
- const __m128 zero = _mm_setzero_ps();
- const __m128 _255 = _mm_set_ss(255.0f);
- __m128 r = _mm_load_ss(&src.X);
- __m128 g = _mm_load_ss(&src.Y);
- __m128 b = _mm_load_ss(&src.Z);
- // C = min(255, 255*max(C, 0)) ( == clamp(255*C, 0, 255) )
- r = _mm_max_ss(r, zero);
- g = _mm_max_ss(g, zero);
- b = _mm_max_ss(b, zero);
- r = _mm_mul_ss(r, _255);
- g = _mm_mul_ss(g, _255);
- b = _mm_mul_ss(b, _255);
- r = _mm_min_ss(r, _255);
- g = _mm_min_ss(g, _255);
- b = _mm_min_ss(b, _255);
- // convert to integer and combine channels using bit logic
- int ri = _mm_cvtss_si32(r);
- int gi = _mm_cvtss_si32(g);
- int bi = _mm_cvtss_si32(b);
- return SColor4ub(ri, gi, bi, 0xFF);
- }
- #include <iostream>
- int main()
- {
- SColor4ub a;
- SColor4ub b;
- for (int i = 0; i < 500000000; ++i)
- {
- RGBColor col(0.4f, 0.5f, i / 50.0f);
- a = sse_ConvertRGBColorTo4ub(col);
- b.B += a.B;
- }
- if (b.B > 50)
- return 0;
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement