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