nvidia-texture-tools/src/nvmath/Vector.h

141 lines
3.5 KiB
C
Raw Normal View History

2007-04-17 08:49:19 +00:00
// This code is in the public domain -- castanyo@yahoo.es
2010-05-27 23:19:24 +00:00
#pragma once
2007-04-17 08:49:19 +00:00
#ifndef NV_MATH_VECTOR_H
#define NV_MATH_VECTOR_H
2010-05-27 23:19:24 +00:00
#include "nvmath.h"
2007-04-17 08:49:19 +00:00
namespace nv
{
2010-05-27 23:19:24 +00:00
// I should probably use templates.
typedef float scalar;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
class NVMATH_CLASS Vector2
{
public:
typedef Vector2 const & Arg;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
Vector2();
explicit Vector2(scalar f);
Vector2(scalar x, scalar y);
Vector2(Vector2::Arg v);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
const Vector2 & operator=(Vector2::Arg v);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
const scalar * ptr() const;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
void set(scalar x, scalar y);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
Vector2 operator-() const;
void operator+=(Vector2::Arg v);
void operator-=(Vector2::Arg v);
void operator*=(scalar s);
void operator*=(Vector2::Arg v);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
friend bool operator==(Vector2::Arg a, Vector2::Arg b);
friend bool operator!=(Vector2::Arg a, Vector2::Arg b);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
union {
struct {
scalar x, y;
};
scalar component[2];
};
};
2007-04-17 08:49:19 +00:00
2011-04-06 02:41:15 +00:00
// Helpers to convert vector types. Assume T has x,y members and 2 argument constructor.
template <typename T> T to(Vector2::Arg v) { return T(v.x, v.y); }
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
class NVMATH_CLASS Vector3
{
public:
typedef Vector3 const & Arg;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
Vector3();
explicit Vector3(scalar x);
2010-05-27 23:19:24 +00:00
Vector3(scalar x, scalar y, scalar z);
Vector3(Vector2::Arg v, scalar z);
Vector3(Vector3::Arg v);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
const Vector3 & operator=(Vector3::Arg v);
2007-04-17 08:49:19 +00:00
Vector2 xy() const;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
const scalar * ptr() const;
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
void set(scalar x, scalar y, scalar z);
2007-04-17 08:49:19 +00:00
2010-05-27 23:19:24 +00:00
Vector3 operator-() const;
void operator+=(Vector3::Arg v);
void operator-=(Vector3::Arg v);
void operator*=(scalar s);
void operator/=(scalar s);
void operator*=(Vector3::Arg v);
friend bool operator==(Vector3::Arg a, Vector3::Arg b);
friend bool operator!=(Vector3::Arg a, Vector3::Arg b);
union {
struct {
scalar x, y, z;
};
scalar component[3];
};
};
2010-10-21 18:44:10 +00:00
// Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor.
template <typename T> T to(Vector3::Arg v) { return T(v.x, v.y, v.z); }
2010-05-27 23:19:24 +00:00
class NVMATH_CLASS Vector4
{
public:
typedef Vector4 const & Arg;
Vector4();
explicit Vector4(scalar x);
2010-05-27 23:19:24 +00:00
Vector4(scalar x, scalar y, scalar z, scalar w);
Vector4(Vector2::Arg v, scalar z, scalar w);
2011-09-27 17:48:46 +00:00
Vector4(Vector2::Arg v, Vector2::Arg u);
2010-05-27 23:19:24 +00:00
Vector4(Vector3::Arg v, scalar w);
Vector4(Vector4::Arg v);
// Vector4(const Quaternion & v);
const Vector4 & operator=(Vector4::Arg v);
Vector2 xy() const;
2011-09-27 17:48:46 +00:00
Vector2 zw() const;
Vector3 xyz() const;
2010-05-27 23:19:24 +00:00
const scalar * ptr() const;
void set(scalar x, scalar y, scalar z, scalar w);
Vector4 operator-() const;
void operator+=(Vector4::Arg v);
void operator-=(Vector4::Arg v);
void operator*=(scalar s);
void operator*=(Vector4::Arg v);
friend bool operator==(Vector4::Arg a, Vector4::Arg b);
friend bool operator!=(Vector4::Arg a, Vector4::Arg b);
union {
struct {
scalar x, y, z, w;
};
scalar component[4];
};
};
2011-04-06 02:41:15 +00:00
// Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor.
template <typename T> T to(Vector4::Arg v) { return T(v.x, v.y, v.z, v.w); }
2007-04-17 08:49:19 +00:00
} // nv namespace
#endif // NV_MATH_VECTOR_H