Ember

Vector

Nov 7th, 2013
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.31 KB | None | 0 0
  1. /*
  2. -----------------------------------------------------------------------------
  3. Filename: Vector.hpp
  4. -----------------------------------------------------------------------------
  5.  
  6. -----------------------------------------------------------------------------
  7. */
  8.  
  9. // Declare Once
  10. #pragma once
  11.  
  12. // Namespace ------------------------------------------------------------------------------
  13. namespace Engine
  14. {
  15.     // Data types -------------------------------------------------------------------------
  16.     // 2D Vector --------------------------------------------------------------------------
  17.     struct float2
  18.     {
  19.     public:
  20.         // Variables
  21.         float x, y;
  22.  
  23.         // Constructors
  24.         float2();
  25.         float2(float2&);
  26.         float2(float);
  27.         float2(float, float);
  28.  
  29.         // Casting (not used)
  30.         // Assignment operators
  31.         float2& operator = (float2&);
  32.         float2& operator += (float2&);
  33.         float2& operator -= (float2&);
  34.         float2& operator *= (float2&);
  35.         float2& operator /= (float2&);
  36.         float2& operator *= (float);
  37.         float2& operator /= (float);
  38.  
  39.         // Unary operators
  40.         float2 operator + ();
  41.         float2 operator - ();
  42.  
  43.         // Binary operators
  44.         float2 operator + (float2&);
  45.         float2 operator - (float2&);
  46.         float2 operator * (float2&);
  47.         float2 operator / (float2&);
  48.         float2 operator * (float);
  49.         float2 operator / (float);
  50.  
  51.         // Boolean operators
  52.         bool operator == (float2&);
  53.         bool operator != (float2&);
  54.     };
  55.  
  56.     // 3D Vector --------------------------------------------------------------------------
  57.     struct float3
  58.     {
  59.     public:
  60.         // Variables
  61.         float x, y, z;
  62.  
  63.         // Constructors
  64.         float3();
  65.         float3(float3&);
  66.         float3(float);
  67.         float3(float2&, float);
  68.         float3(float, float, float);
  69.  
  70.         // Casting (not used)
  71.         // Assignment operators
  72.         float3& operator = (float3&);
  73.         float3& operator += (float3&);
  74.         float3& operator -= (float3&);
  75.         float3& operator *= (float3&);
  76.         float3& operator /= (float3&);
  77.         float3& operator *= (float);
  78.         float3& operator /= (float);
  79.  
  80.         // Unary operators
  81.         float3 operator + ();
  82.         float3 operator - ();
  83.  
  84.         // Binary operators
  85.         float3 operator + (float3&);
  86.         float3 operator - (float3&);
  87.         float3 operator * (float3&);
  88.         float3 operator / (float3&);
  89.         float3 operator * (float);
  90.         float3 operator / (float);
  91.  
  92.         // Boolean operators
  93.         bool operator == (float3&);
  94.         bool operator != (float3&);
  95.     };
  96.  
  97.     // 4D Vector --------------------------------------------------------------------------
  98.     struct float4
  99.     {
  100.     public:
  101.         // Variables
  102.         float x, y, z, w;
  103.  
  104.         // Constructors
  105.         float4();
  106.         float4(float4&);
  107.         float4(float);
  108.         float4(float2&, float2&);
  109.         float4(float3&, float);
  110.         float4(float2&, float, float);
  111.         float4(float, float, float, float);
  112.  
  113.         // Casting (not used)
  114.         // Assignment operators
  115.         float4& operator = (float4&);
  116.         float4& operator += (float4&);
  117.         float4& operator -= (float4&);
  118.         float4& operator *= (float4&);
  119.         float4& operator /= (float4&);
  120.         float4& operator *= (float);
  121.         float4& operator /= (float);
  122.  
  123.         // Unary operators
  124.         float4 operator + ();
  125.         float4 operator - ();
  126.  
  127.         // Binary operators
  128.         float4 operator + (float4&);
  129.         float4 operator - (float4&);
  130.         float4 operator * (float4&);
  131.         float4 operator / (float4&);
  132.         float4 operator * (float);
  133.         float4 operator / (float);
  134.  
  135.         // Boolean operators
  136.         bool operator == (float4&);
  137.         bool operator != (float4&);
  138.     };
  139.  
  140.     // Class definition -------------------------------------------------------------------
  141.     class Vector
  142.     {
  143.     private:
  144.         // Hide constructors (Static class)
  145.         Vector();
  146.         Vector(const Vector&);
  147.         ~Vector();
  148.        
  149.     public:
  150.         // Length
  151.         static float Length(float2&);
  152.         static float Length(float3&);
  153.         static float Length(float4&);
  154.  
  155.         // Length Squared
  156.         static float LengthSquared(float2&);
  157.         static float LengthSquared(float3&);
  158.         static float LengthSquared(float4&);
  159.  
  160.         // Normalization (return vector)
  161.         static float2 Normalize(float2&);
  162.         static float3 Normalize(float3&);
  163.         static float4 Normalize(float4&);
  164.        
  165.         // Normilzation (return length)
  166.         static float NormalizeLength(float2&);
  167.         static float NormalizeLength(float3&);
  168.         static float NormalizeLength(float4&);
  169.  
  170.         // Dot Product
  171.         static float Dot(float2&, float2&);
  172.         static float Dot(float3&, float3&);
  173.         static float Dot(float4&, float4&);
  174.  
  175.         // Cross Product
  176.         static float3 Cross(float3&, float3&);
  177.  
  178.         // Linear interpolation
  179.         static float2 Lerp(float2&, float2&, float);
  180.         static float3 Lerp(float3&, float3&, float);
  181.         static float4 Lerp(float4&, float4&, float);
  182.     };
  183.  
  184.     // Default constructor ----------------------------------------------------------------
  185.     Vector::Vector()
  186.     {
  187.     }
  188.  
  189.     // Default copy constructor -----------------------------------------------------------
  190.     Vector::Vector(const Vector& other)
  191.     {
  192.     }
  193.  
  194.     // Default deconstructor --------------------------------------------------------------
  195.     Vector::~Vector()
  196.     {
  197.     }
  198.  
  199.     // Constructors -----------------------------------------------------------------------
  200.     // 2D Vector --------------------------------------------------------------------------
  201.     // Empty constructor  -----------------------------------------------------------------
  202.     float2::float2()
  203.     {
  204.         // Create an empty vector
  205.         x = 0;
  206.         y = 0;
  207.     }
  208.  
  209.     // Copy constructor -------------------------------------------------------------------
  210.     float2::float2(float2& v)
  211.     {
  212.         // Copy the contents
  213.         x = v.x;
  214.         y = v.y;
  215.     }
  216.  
  217.     // Uniform constructor ----------------------------------------------------------------
  218.     float2::float2(float s)
  219.     {
  220.         // Set all values to single value
  221.         x = s;
  222.         y = s;
  223.     }
  224.  
  225.     // Explicit constructor ---------------------------------------------------------------
  226.     float2::float2(float fx, float fy)
  227.     {
  228.         // Set each value explicitely
  229.         x = fx;
  230.         y = fy;
  231.     }
  232.  
  233.     // 3D Vector --------------------------------------------------------------------------
  234.     // Empty constructor  -----------------------------------------------------------------
  235.     float3::float3()
  236.     {
  237.         // Create an empty vector
  238.         x = 0;
  239.         y = 0;
  240.         z = 0;
  241.     }
  242.  
  243.     // Copy constructor -------------------------------------------------------------------
  244.     float3::float3(float3& v)
  245.     {
  246.         // Copy the contents
  247.         x = v.x;
  248.         y = v.y;
  249.         z = v.z;
  250.     }
  251.  
  252.     // Uniform constructor ----------------------------------------------------------------
  253.     float3::float3(float s)
  254.     {
  255.         // Set all values to single value
  256.         x = s;
  257.         y = s;
  258.         z = s;
  259.     }
  260.  
  261.     // float2 expansion ----------------------------------------------------------------
  262.     float3::float3(float2& v, float fz)
  263.     {
  264.         // Expand a float2 into a float3
  265.         x = v.x;
  266.         y = v.y;
  267.         z = fz;
  268.     }
  269.  
  270.     // Explicit constructor ---------------------------------------------------------------
  271.     float3::float3(float fx, float fy, float fz)
  272.     {
  273.         // Set each value explicitely
  274.         x = fx;
  275.         y = fy;
  276.         z = fz;
  277.     }
  278.  
  279.     // 4D Vector --------------------------------------------------------------------------
  280.     // Empty constructor  -----------------------------------------------------------------
  281.     float4::float4()
  282.     {
  283.         // Create an empty vector
  284.         x = 0.0f;
  285.         y = 0.0f;
  286.         z = 0.0f;
  287.         w = 0.0f;
  288.     }
  289.  
  290.     // Copy constructor -------------------------------------------------------------------
  291.     float4::float4(float4& v)
  292.     {
  293.         // Copy the contents
  294.         x = v.x;
  295.         y = v.y;
  296.         z = v.z;
  297.         w = v.w;
  298.     }
  299.  
  300.     // Uniform constructor ----------------------------------------------------------------
  301.     float4::float4(float s)
  302.     {
  303.         // Set all values to a single value
  304.         x = s;
  305.         y = s;
  306.         z = s;
  307.         w = s;
  308.     }
  309.  
  310.     // float2 expansion ----------------------------------------------------------------
  311.     float4::float4(float2& v, float fz, float fw)
  312.     {
  313.         // Expand a float2 into a float4
  314.         x = v.x;
  315.         y = v.y;
  316.         z = fz;
  317.         w = fw;
  318.     }
  319.  
  320.     // float2 combining ----------------------------------------------------------------
  321.     float4::float4(float2& v1, float2& v2)
  322.     {
  323.         // Combines two float2 vectors into a float4
  324.         x = v1.x;
  325.         y = v1.y;
  326.         z = v2.x;
  327.         w = v2.y;
  328.     }
  329.  
  330.     // float3 expansion ----------------------------------------------------------------
  331.     float4::float4(float3& v, float fw)
  332.     {
  333.         // Expand a float3 into a float4
  334.         x = v.x;
  335.         y = v.y;
  336.         z = v.z;
  337.         w = fw;
  338.     }
  339.  
  340.     // Explicit constructor ---------------------------------------------------------------
  341.     float4::float4(float fx, float fy, float fz, float fw)
  342.     {
  343.         // Set each value excplitely
  344.         x = fx;
  345.         y = fy;
  346.         z = fz;
  347.         w = fw;
  348.     }
  349.  
  350.     // Operator Functions -----------------------------------------------------------------
  351.     // Vector assignment ------------------------------------------------------------------
  352.     inline float2& float2::operator = (float2& v)
  353.     {
  354.         x = v.x;
  355.         y = v.y;
  356.  
  357.         return *this;
  358.     }
  359.     //--//
  360.     inline float3& float3::operator = (float3& v)
  361.     {
  362.         x = v.x;
  363.         y = v.y;
  364.         z = v.z;
  365.  
  366.         return *this;
  367.     }
  368.     //--//
  369.     inline float4& float4::operator = (float4& v)
  370.     {
  371.         x = v.x;
  372.         y = v.y;
  373.         z = v.z;
  374.         w = v.w;
  375.  
  376.         return *this;
  377.     }
  378.  
  379.     // Addition assignment ----------------------------------------------------------------
  380.     inline float2& float2::operator += (float2& v)
  381.     {
  382.         x = v.x;
  383.         y = v.y;
  384.  
  385.         return *this;
  386.     }
  387.     //--//
  388.     inline float3& float3::operator += (float3& v)
  389.     {
  390.         x += v.x;
  391.         y += v.y;
  392.         z += v.z;
  393.  
  394.         return *this;
  395.     }
  396.     //--//
  397.     inline float4& float4::operator += (float4& v)
  398.     {
  399.         x += v.x;
  400.         y += v.y;
  401.         z += v.z;
  402.         w += v.w;
  403.  
  404.         return *this;
  405.     }
  406.  
  407.     // Subtraction assignment -------------------------------------------------------------
  408.     inline float2& float2::operator -= (float2& v)
  409.     {
  410.         x -= v.x;
  411.         y -= v.y;
  412.  
  413.         return *this;
  414.     }
  415.     //--//
  416.     inline float3& float3::operator -= (float3& v)
  417.     {
  418.         x -= v.x;
  419.         y -= v.y;
  420.         z -= v.z;
  421.  
  422.         return *this;
  423.     }
  424.     //--//
  425.     inline float4& float4::operator -= (float4& v)
  426.     {
  427.         x -= v.x;
  428.         y -= v.y;
  429.         z -= v.z;
  430.         w -= v.w;
  431.  
  432.         return *this;
  433.     }
  434.  
  435.     // Multiplication assignment ----------------------------------------------------------
  436.     inline float2& float2::operator *= (float2& v)
  437.     {
  438.         x *= v.x;
  439.         y *= v.y;
  440.  
  441.         return *this;
  442.     }
  443.     //--//
  444.     inline float3& float3::operator *= (float3& v)
  445.     {
  446.         x *= v.x;
  447.         y *= v.y;
  448.         z *= v.z;
  449.  
  450.         return *this;
  451.     }
  452.     //--//
  453.     inline float4& float4::operator *= (float4& v)
  454.     {
  455.         x *= v.x;
  456.         y *= v.y;
  457.         z *= v.z;
  458.         w *= v.w;
  459.  
  460.         return *this;
  461.     }
  462.  
  463.     // Divison assignment -----------------------------------------------------------------
  464.     inline float2& float2::operator /= (float2& v)
  465.     {
  466.         x /= v.x;
  467.         y /= v.y;
  468.  
  469.         return *this;
  470.     }
  471.     //--//
  472.     inline float3& float3::operator /= (float3& v)
  473.     {
  474.         x /= v.x;
  475.         y /= v.y;
  476.         z /= v.z;
  477.  
  478.         return *this;
  479.     }
  480.     //--//
  481.     inline float4& float4::operator /= (float4& v)
  482.     {
  483.         x /= v.x;
  484.         y /= v.y;
  485.         z /= v.z;
  486.         w /= v.w;
  487.  
  488.         return *this;
  489.     }
  490.  
  491.     // Scalar multiplication assignment ---------------------------------------------------
  492.     inline float2& float2::operator *= (float s)
  493.     {
  494.         x *= s;
  495.         y *= s;
  496.  
  497.         return *this;
  498.     }
  499.     //--//
  500.     inline float3& float3::operator *= (float s)
  501.     {
  502.         x += s;
  503.         y += s;
  504.         z += s;
  505.  
  506.         return *this;
  507.     }
  508.     //--//
  509.     inline float4& float4::operator *= (float s)
  510.     {
  511.         x += s;
  512.         y += s;
  513.         z += s;
  514.         w += s;
  515.  
  516.         return *this;
  517.     }
  518.  
  519.     // Scalar division assignment ---------------------------------------------------------
  520.     inline float2& float2::operator /= (float s)
  521.     {
  522.         x /= s;
  523.         y /= s;
  524.  
  525.         return *this;
  526.     }
  527.     //--//
  528.     inline float3& float3::operator /= (float s)
  529.     {
  530.         x /= s;
  531.         y /= s;
  532.         z /= s;
  533.  
  534.         return *this;
  535.     }
  536.     //--//
  537.     inline float4& float4::operator /= (float s)
  538.     {
  539.         x /= s;
  540.         y /= s;
  541.         z /= s;
  542.         w /= s;
  543.  
  544.         return *this;
  545.     }
  546.  
  547.     // Positive ---------------------------------------------------------------------------
  548.     inline float2 float2::operator + ()
  549.     {
  550.         return *this;
  551.     }
  552.     //--//
  553.     inline float3 float3::operator + ()
  554.     {
  555.         return *this;
  556.     }
  557.     //--//
  558.     inline float4 float4::operator + ()
  559.     {
  560.         return *this;
  561.     }
  562.  
  563.     // Negative ---------------------------------------------------------------------------
  564.     inline float2 float2::operator - ()
  565.     {
  566.         return (-x, -y);
  567.     }
  568.     //--//
  569.     inline float3 float3::operator - ()
  570.     {
  571.         return (-x, -y, -z);
  572.     }
  573.     //--//
  574.     inline float4 float4::operator - ()
  575.     {
  576.         return (-x, -y, -z, -w);
  577.     }
  578.  
  579.     // Addition ---------------------------------------------------------------------------
  580.     inline float2 float2::operator + (float2& v)
  581.     {
  582.         return (x + v.x, y + v.y);
  583.     }
  584.     //--//
  585.     inline float3 float3::operator + (float3& v)
  586.     {
  587.         return (x + v.x, y + v.y, z + v.z);
  588.     }
  589.     //--//
  590.     inline float4 float4::operator + (float4& v)
  591.     {
  592.         return (x + v.x, y + v.y, z + v.z, w + v.w);
  593.     }
  594.  
  595.     // Subtraction ------------------------------------------------------------------------
  596.     inline float2 float2::operator - (float2& v)
  597.     {
  598.         return (x - v.x, y - v.y);
  599.     }
  600.     //--//
  601.     inline float3 float3::operator - (float3& v)
  602.     {
  603.         return (x - v.x, y - v.y, z - v.z);
  604.     }
  605.     //--//
  606.     inline float4 float4::operator - (float4& v)
  607.     {
  608.         return (x - v.x, y - v.y, z - v.z, w - v.z);
  609.     }
  610.  
  611.     // Multiplication ---------------------------------------------------------------------
  612.     inline float2 float2::operator * (float2& v)
  613.     {
  614.         return (x * v.x, y * v.y);
  615.     }
  616.     //--//
  617.     inline float3 float3::operator * (float3& v)
  618.     {
  619.         return (x * v.x, y * v.y, z * v.z);
  620.     }
  621.     //--//
  622.     inline float4 float4::operator * (float4& v)
  623.     {
  624.         return (x * v.x, y * v.y, z * v.z, w * v.w);
  625.     }
  626.  
  627.     // Division ---------------------------------------------------------------------------
  628.     inline float2 float2::operator / (float2& v)
  629.     {
  630.         return (x / v.x, y / v.y);
  631.     }
  632.     //--//
  633.     inline float3 float3::operator / (float3& v)
  634.     {
  635.         return (x / v.x, y / v.y, z / v.z);
  636.     }
  637.     //--//
  638.     inline float4 float4::operator / (float4& v)
  639.     {
  640.         return (x / v.x, y / v.y, z / v.z, w / v.z);
  641.     }
  642.  
  643.     // Scalar multiplication --------------------------------------------------------------
  644.     inline float2 float2::operator * (float s)
  645.     {
  646.         return (x * s, y * s);
  647.     }
  648.     //--//
  649.     inline float3 float3::operator * (float s)
  650.     {
  651.         return (x * s, y * s, z * s);
  652.     }
  653.     //--//
  654.     inline float4 float4::operator * (float s)
  655.     {
  656.         return (x * s, y * s, z * s, w * s);
  657.     }
  658.  
  659.     // Scalar division --------------------------------------------------------------------
  660.     inline float2 float2::operator / (float s)
  661.     {
  662.         return (x / s, y / s);
  663.     }
  664.     //--//
  665.     inline float3 float3::operator / (float s)
  666.     {
  667.         return (x / s, y / s, z / s);
  668.     }
  669.     //--//
  670.     inline float4 float4::operator / (float s)
  671.     {
  672.         return (x / s, y / s, z / s, w / s);
  673.     }
  674.  
  675.     // Equals comparison ------------------------------------------------------------------
  676.     inline bool float2::operator == (float2& v)
  677.     {
  678.         return x == v.x && y == v.y;
  679.     }
  680.     //--//
  681.     inline bool float3::operator == (float3& v)
  682.     {
  683.         return x == v.x && y == v.y && z == v.z;
  684.     }
  685.     //--//
  686.     inline bool float4::operator == (float4& v)
  687.     {
  688.         return x == v.x && y == v.y && z == v.z && w == v.w;
  689.     }
  690.  
  691.     // Not Equals comparison ---------------------------------------------------------------
  692.     inline bool float2::operator != (float2& v)
  693.     {
  694.         return x != v.x || y != v.y;
  695.     }
  696.     //--//
  697.     inline bool float3::operator != (float3& v)
  698.     {
  699.         return x != v.x || y != v.y || z != v.z;
  700.     }
  701.     //--//
  702.     inline bool float4::operator != (float4& v)
  703.     {
  704.         return x != v.x || y != v.y || z != v.z || w != v.w;
  705.     }
  706.  
  707.     // Vector Functions -------------------------------------------------------------------
  708.     // Length -----------------------------------------------------------------------------
  709.     inline float Vector::Length(float2& v)
  710.     {
  711.         return sqrtf(v.x * v.x + v.y * v.y);
  712.     }
  713.     //--//
  714.     inline float Vector::Length(float3& v)
  715.     {
  716.         return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
  717.     }
  718.     //--//
  719.     inline float Vector::Length(float4& v)
  720.     {
  721.         return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w);
  722.     }
  723.  
  724.     // Length squared ---------------------------------------------------------------------
  725.     inline float Vector::LengthSquared(float2& v)
  726.     {
  727.         return v.x * v.x + v.y * v.y;
  728.     }
  729.     //--//
  730.     inline float Vector::LengthSquared(float3& v)
  731.     {
  732.         return v.x * v.x + v.y * v.y + v.z * v.z;
  733.     }
  734.     //--//
  735.     inline float Vector::LengthSquared(float4& v)
  736.     {
  737.         return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
  738.     }
  739.  
  740.     // Normalize --------------------------------------------------------------------------
  741.     inline float2 Vector::Normalize(float2& v)
  742.     {
  743.         return (v / Length(v));
  744.     }
  745.     //--//
  746.     inline float3 Vector::Normalize(float3& v)
  747.     {
  748.         return (v / Length(v));
  749.     }
  750.     //--//
  751.     inline float4 Vector::Normalize(float4& v)
  752.     {
  753.         return (v / Length(v));
  754.     }
  755.  
  756.     // Normalize and length ---------------------------------------------------------------
  757.     inline float Vector::NormalizeLength(float2& v)
  758.     {
  759.         float length;
  760.         length = Length(v);
  761.         v /= length;
  762.  
  763.         return length;
  764.     }
  765.     //--//
  766.     inline float Vector::NormalizeLength(float3& v)
  767.     {
  768.         float length;
  769.         length = Length(v);
  770.         v /= length;
  771.  
  772.         return length;
  773.     }
  774.     //--//
  775.     inline float Vector::NormalizeLength(float4& v)
  776.     {
  777.         float length;
  778.         length = Length(v);
  779.         v /= length;
  780.  
  781.         return length;
  782.     }
  783.  
  784.     // Dot Product ------------------------------------------------------------------------
  785.     inline float Vector::Dot(float2& v1, float2& v2)
  786.     {
  787.         return v1.x * v2.x + v1.y * v2.y;
  788.     }
  789.     //--//
  790.     inline float Vector::Dot(float3& v1, float3& v2)
  791.     {
  792.         return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
  793.     }
  794.     //--//
  795.     inline float Vector::Dot(float4& v1, float4& v2)
  796.     {
  797.         return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w;
  798.     }
  799.  
  800.     // Cross Product ----------------------------------------------------------------------
  801.     inline float3 Vector::Cross(float3& v1, float3& v2)
  802.     {
  803.         return (v1.y * v2.z - v1.z * v2.y,
  804.                 v1.z * v2.x - v1.x * v2.z,
  805.                 v1.x * v2.y - v1.y * v2.x);
  806.  
  807.     }
  808.  
  809.     // Linear interpolation ---------------------------------------------------------------
  810.     inline float2 Vector::Lerp(float2& v1, float2& v2, float s)
  811.     {
  812.         return (v1.x + s * (v2.x - v1.x),
  813.                 v1.y + s * (v2.y - v1.y));
  814.     }
  815.     //--//
  816.     inline float3 Vector::Lerp(float3& v1, float3& v2, float s)
  817.     {
  818.         return (v1.x + s * (v2.x - v1.x),
  819.                 v1.y + s * (v2.y - v1.y),
  820.                 v1.z + s * (v2.z - v1.z));
  821.     }
  822.     //--//
  823.     inline float4 Vector::Lerp(float4& v1, float4& v2, float s)
  824.     {
  825.         return (v1.x + s * (v2.x - v1.x),
  826.                 v1.y + s * (v2.y - v1.y),
  827.                 v1.z + s * (v2.z - v1.z),
  828.                 v1.w + s * (v2.w - v1.w));
  829.     }
  830. }
Advertisement
Add Comment
Please, Sign In to add comment