// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
|
//
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// Unless required by applicable law or agreed to in writing, software
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// See the License for the specific language governing permissions and
|
// limitations under the License.
|
|
#ifndef Vector_hpp
|
#define Vector_hpp
|
|
namespace sw
|
{
|
struct Point;
|
struct Matrix;
|
struct Plane;
|
|
struct Vector
|
{
|
Vector();
|
Vector(const int i);
|
Vector(const Vector &v);
|
Vector(const Point &p);
|
Vector(float v_x, float v_y, float v_z);
|
|
Vector &operator=(const Vector &v);
|
|
union
|
{
|
float v[3];
|
|
struct
|
{
|
float x;
|
float y;
|
float z;
|
};
|
};
|
|
float &operator[](int i);
|
float &operator()(int i);
|
|
const float &operator[](int i) const;
|
const float &operator()(int i) const;
|
|
Vector operator+() const;
|
Vector operator-() const;
|
|
Vector &operator+=(const Vector &v);
|
Vector &operator-=(const Vector &v);
|
Vector &operator*=(float s);
|
Vector &operator/=(float s);
|
|
friend bool operator==(const Vector &u, const Vector &v);
|
friend bool operator!=(const Vector &u, const Vector &v);
|
|
friend Vector operator+(const Vector &u, const Vector &v);
|
friend Vector operator-(const Vector &u, const Vector &v);
|
friend float operator*(const Vector &u, const Vector &v); // Dot product
|
friend Vector operator*(float s, const Vector &v);
|
friend Vector operator*(const Vector &v, float s);
|
friend Vector operator/(const Vector &v, float s);
|
friend float operator^(const Vector &u, const Vector &v); // Angle between vectors
|
friend Vector operator%(const Vector &u, const Vector &v); // Cross product
|
|
friend Vector operator*(const Matrix &M, const Vector& v);
|
friend Vector operator*(const Vector &v, const Matrix &M);
|
friend Vector &operator*=(Vector &v, const Matrix &M);
|
|
static float N(const Vector &v); // Norm
|
static float N2(const Vector &v); // Squared norm
|
|
static Vector mirror(const Vector &v, const Plane &p);
|
static Vector reflect(const Vector &v, const Plane &p);
|
static Vector lerp(const Vector &u, const Vector &v, float t);
|
};
|
}
|
|
#include "Point.hpp"
|
|
namespace sw
|
{
|
inline Vector::Vector()
|
{
|
}
|
|
inline Vector::Vector(const int i)
|
{
|
const float s = (float)i;
|
|
x = s;
|
y = s;
|
z = s;
|
}
|
|
inline Vector::Vector(const Vector &v)
|
{
|
x = v.x;
|
y = v.y;
|
z = v.z;
|
}
|
|
inline Vector::Vector(const Point &P)
|
{
|
x = P.x;
|
y = P.y;
|
z = P.z;
|
}
|
|
inline Vector::Vector(float v_x, float v_y, float v_z)
|
{
|
x = v_x;
|
y = v_y;
|
z = v_z;
|
}
|
|
inline Vector &Vector::operator=(const Vector &v)
|
{
|
x = v.x;
|
y = v.y;
|
z = v.z;
|
|
return *this;
|
}
|
|
inline float &Vector::operator()(int i)
|
{
|
return v[i];
|
}
|
|
inline float &Vector::operator[](int i)
|
{
|
return v[i];
|
}
|
|
inline const float &Vector::operator()(int i) const
|
{
|
return v[i];
|
}
|
|
inline const float &Vector::operator[](int i) const
|
{
|
return v[i];
|
}
|
}
|
|
#endif // Vector_hpp
|