149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang//
249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang// Use of this source code is governed by a BSD-style license that can be
449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang// found in the LICENSE file.
549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang//
649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang#include "Vector.h"
849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang#include <math.h>
1049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
118dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff LangVector2::Vector2()
128dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    : x(0.0),
138dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang      y(0.0)
148dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{
158dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang}
168dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang
178dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff LangVector2::Vector2(float x, float y)
188dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    : x(x),
198dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang      y(y)
208dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{
218dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang}
228dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang
238dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Langfloat Vector2::length(const Vector2 &vec)
248dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{
258dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    float lenSquared = lengthSquared(vec);
268dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    return (lenSquared != 0.0f) ? sqrt(lenSquared) : 0.0f;
278dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang}
288dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang
298dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Langfloat Vector2::lengthSquared(const Vector2 &vec)
308dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{
318dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    return vec.x * vec.x +
328dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang           vec.y * vec.y;
338dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang}
348dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang
358dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff LangVector2 Vector2::normalize(const Vector2 &vec)
368dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{
378dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    Vector2 ret(0.0f, 0.0f);
388dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    float len = length(vec);
398dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    if (len != 0.0f)
408dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    {
418dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang        float invLen = 1.0f / len;
428dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang        ret.x = vec.x * invLen;
438dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang        ret.y = vec.y * invLen;
448dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    }
458dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang    return ret;
468dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang}
478dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang
4849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3::Vector3()
4949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    : x(0.0),
5049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      y(0.0),
5149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      z(0.0)
5249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
5349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
5449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
5549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3::Vector3(float x, float y, float z)
5649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    : x(x),
5749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      y(y),
5849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      z(z)
5949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
6049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
6149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
6249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector3::length(const Vector3 &vec)
6349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
6449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    float lenSquared = lengthSquared(vec);
6549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return (lenSquared != 0.0f) ? sqrt(lenSquared) : 0.0f;
6649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
6749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
6849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector3::lengthSquared(const Vector3 &vec)
6949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
7049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return vec.x * vec.x +
7149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           vec.y * vec.y +
7249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           vec.z * vec.z;
7349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
7449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
7549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 Vector3::normalize(const Vector3 &vec)
7649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
7749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    Vector3 ret(0.0f, 0.0f, 0.0f);
7849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    float len = length(vec);
7949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    if (len != 0.0f)
8049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    {
8149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        float invLen = 1.0f / len;
8249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.x = vec.x * invLen;
8349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.y = vec.y * invLen;
8449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.z = vec.z * invLen;
8549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    }
8649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return ret;
8749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
8849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
8949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector3::dot(const Vector3 &a, const Vector3 &b)
9049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
9149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return a.x * b.x +
9249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           a.y * b.y +
9349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           a.z * b.z;
9449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
9549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
9649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 Vector3::cross(const Vector3 &a, const Vector3 &b)
9749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
9849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.y * b.z - a.z * b.y,
9949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z * b.x - a.x * b.z,
10049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.x * b.y - a.y * b.x);
10149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
10249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
10349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator*(const Vector3 &a, const Vector3 &b)
10449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
10549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x * b.x,
10649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y * b.y,
10749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z * b.z);
10849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
10949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
11049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator*(const Vector3 &a, const float& b)
11149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
11249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x * b,
11349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y * b,
11449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z * b);
11549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
11649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
11749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator/(const Vector3 &a, const Vector3 &b)
11849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
11949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x / b.x,
12049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y / b.y,
12149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z / b.z);
12249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
12349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
12449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator/(const Vector3 &a, const float& b)
12549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
12649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x / b,
12749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y / b,
12849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z / b);
12949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
13049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
13149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator+(const Vector3 &a, const Vector3 &b)
13249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
13349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x + b.x,
13449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y + b.y,
13549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z + b.z);
13649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
13749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
13849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector3 operator-(const Vector3 &a, const Vector3 &b)
13949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
14049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return Vector3(a.x - b.x,
14149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.y - b.y,
14249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang                   a.z - b.z);
14349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
14449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
14549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector4::Vector4()
14649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    : x(0.0f),
14749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      y(0.0f),
14849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      z(0.0f),
14949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      w(0.0f)
15049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
15149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
15249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
15349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector4::Vector4(float x, float y, float z, float w)
15449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    : x(x),
15549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      y(y),
15649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      z(z),
15749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang      w(w)
15849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
15949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
16049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
16149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector4::length(const Vector4 &vec)
16249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
16349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    float lenSquared = lengthSquared(vec);
16449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return (lenSquared != 0.0f) ? sqrt(lenSquared) : 0.0f;
16549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
16649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
16749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector4::lengthSquared(const Vector4 &vec)
16849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
16949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return vec.x * vec.x +
17049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           vec.y * vec.y +
17149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           vec.z * vec.z +
17249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           vec.w * vec.w;
17349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
17449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
17549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff LangVector4 Vector4::normalize(const Vector4 &vec)
17649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
17749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    Vector4 ret(0.0f, 0.0f, 0.0f, 1.0f);
17849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    if (vec.w != 0.0f)
17949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    {
18049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        float invLen = 1.0f / vec.w;
18149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.x = vec.x * invLen;
18249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.y = vec.y * invLen;
18349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang        ret.z = vec.z * invLen;
18449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    }
18549be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return ret;
18649be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
18749be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang
18849be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Langfloat Vector4::dot(const Vector4 &a, const Vector4 &b)
18949be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang{
19049be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang    return a.x * b.x +
19149be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           a.y * b.y +
19249be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           a.z * b.z +
19349be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang           a.w * b.w;
19449be2ad9f863f5b238997e740aa35adc40ba66e3Geoff Lang}
195