//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef NVECTOR_H #define NVECTOR_H #ifdef _WIN32 #pragma once #endif #include #define NVectorN NVector #define NVector3 NVector<3> // N-dimensional vector. template class NVector { public: NVectorN() {} float &operator[](int i); float const &operator[](int i) const; float Dot(NVectorN const &b) const; NVectorN Cross(NVectorN const &b) const; NVectorN Normalize() const; float Length() const; NVectorN operator-() const; NVectorN operator+(NVectorN const &b) const; NVectorN const &operator+=(NVectorN const &b); NVectorN operator-(NVectorN const &b) const; NVectorN operator*(float val) const; // Static helpers. public: static NVectorN SetupNVectorNull(); // Returns a vector of all zeros. public: float v[N]; }; template inline float NDot(NVector const &a, NVector const &b) { float ret = 0; for (int i = 0; i < N; i++) ret += a.v[i] * b.v[i]; return ret; } template Vector &ToVec(NVector &vec) { assert(N >= 3); return *((Vector *)&vec); } template Vector const &ToVec(NVector const &vec) { assert(N >= 3); return *((Vector const *)&vec); } NVector<3> &ToNVec(Vector &vec) { return *((NVector<3> *)&vec); } NVector<3> const &ToNVec(Vector const &vec) { return *((NVector<3> const *)&vec); } // ------------------------------------------------------------------------------------ // // NVector inlines. // ------------------------------------------------------------------------------------ // // template NVectorN NVectorN::SetupNVectorNull() { NVector ret; memset(ret.v, 0, sizeof(float) * N); return ret; } template float &NVectorN::operator[](int i) { assert(i >= 0 && i < N); return v[i]; } template float const &NVectorN::operator[](int i) const { assert(i >= 0 && i < N); return v[i]; } template float NVectorN::Dot(NVectorN const &b) const { float ret = 0; for (int i = 0; i < N; i++) ret += v[i] * b.v[i]; return ret; } template NVectorN NVectorN::Cross(NVectorN const &b) const { NVector ret; NMatrix mat; for (int i = 0; i < N; i++) { for (y = 0; y < N; y++) for (x = 0; x < N; x++) mat.m[y][x] = ret.v[i] = v[i] * b.v[i]; } return ret; } template NVectorN NVectorN::Normalize() const { return *this * (1.0f / Length()); } template float NVectorN::Length() const { return (float)sqrt(Dot(*this)); } template NVectorN NVectorN::operator-() const { NVectorN ret; for (int i = 0; i < N; i++) ret.v[i] = -v[i]; return ret; } template NVectorN NVectorN::operator+(NVectorN const &b) const { NVectorN ret; for (int i = 0; i < N; i++) ret.v[i] = v[i] + b.v[i]; return ret; } template NVectorN const &NVectorN::operator+=(NVectorN const &b) { for (int i = 0; i < N; i++) v[i] += b.v[i]; return *this; } template NVectorN NVectorN::operator-(NVectorN const &b) const { NVectorN ret; for (int i = 0; i < N; i++) ret.v[i] = v[i] - b.v[i]; return ret; } template NVectorN NVectorN::operator*(float val) const { NVectorN ret; for (int i = 0; i < N; i++) ret.v[i] = v[i] * val; return ret; } #endif // NVECTOR_H