paysages3d/src/basics/Vector3.h
Michaël Lemaire 3fc8b1c98f Added automatic tessellation near camera frustum culling
This allows the camera nearer the ground
and fixes holes in lower quality renders
2015-10-08 19:20:44 +02:00

96 lines
2.1 KiB
C++

#ifndef VECTOR3_H
#define VECTOR3_H
#include "basics_global.h"
namespace paysages {
namespace basics {
/*
* Cartesian coordinates (X, Y, Z) - right handed :
*
* Y (up)
* |
* |
* +----X
* /
* /
* Z
*
* Spherical coordinates (R, PHI, THETA) :
*
* R is the distance to origin
* PHI is typical azimuth
* THETA is elevation angle (not polar angle!)
*
* X=1 Y=0 Z=0 => PHI=0
* X=0 Y=0 Z=-1 => PHI=PI/2
* X=-1 Y=0 Z=0 => PHI=PI
* X=0 Y=0 Z=1 => PHI=3*PI/2
*
* X=1 Y=0 Z=0 => THETA=0
* X=0 Y=1 Z=0 => THETA=PI/2
* X=0 Y=-1 Z=0 => THETA=-PI/2
*/
typedef struct
{
double r;
double theta;
double phi;
} VectorSpherical;
class BASICSSHARED_EXPORT Vector3
{
public:
Vector3() = default;
Vector3(double x, double y, double z);
Vector3(const VectorSpherical &v);
void save(PackStream *stream) const;
void load(PackStream *stream);
Vector3 inverse() const;
Vector3 scale(double scaling) const;
double getNorm() const;
Vector3 normalize() const;
Vector3 add(double x, double y, double z) const;
Vector3 add(const Vector3 &other) const;
Vector3 sub(const Vector3 &other) const;
double dotProduct(const Vector3 &other) const;
Vector3 crossProduct(const Vector3 &other) const;
/**
* Get the mid-point of the segment between *this* point and *other*.
*/
Vector3 midPointTo(const Vector3 &other) const;
VectorSpherical toSpherical() const;
public:
// TODO Make private
double x;
double y;
double z;
};
BASICSSHARED_EXPORT extern const Vector3 VECTOR_ZERO;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_DOWN;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_UP;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_NORTH;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_SOUTH;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_EAST;
BASICSSHARED_EXPORT extern const Vector3 VECTOR_WEST;
}
}
// Inlining
#if PAYSAGES_USE_INLINING
#ifndef VECTOR3_INLINE_CPP
#include "Vector3.inline.cpp"
#endif
#endif
#endif // VECTOR3_H