bullet3/LinearMath/Geometry.h
2006-05-25 19:18:29 +00:00

196 lines
5.7 KiB
C++

// Bullet Continuous Collision Detection and Physics Library
// Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
//
// Geometry.h
//
// Copyright (c) 2006 Simon Hobbs
//
// This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
#ifndef BULLET_MATH_GEOMETRY_H
#define BULLET_MATH_GEOMETRY_H
#ifdef WIN32
#include "Vector.h"
#include "Matrix.h"
class Matrix44;
class Transform;
////////////////////////////////////////////////////////////////////////////////
// Line
class Line
{
public:
Point3 m_start;
Point3 m_end;
Line();
Line(const Point3& start, const Point3& end);
// returns false if the lines are parallel
friend bool Intersect(const Line& la, const Line& lb, float& ta, float& tb);
friend bool IntersectSegments(const Line& la, const Line& lb, float& ta, float& tb);
// get projection vector between a point and a line
// (i.e. if you add the vector to the point, then the new point will lie on the line)
friend Vector3 GetProjectionVector(const Line& ln, const Point3& pt);
// get distance from point to line (and time along line)
friend float Distance(const Line& ln, const Point3& pt, float& t);
};
////////////////////////////////////////////////////////////////////////////////
// Ray
class Ray
{
public:
Point3 m_start;
Vector3 m_dir;
Ray();
Ray(const Point3& start, const Vector3& dir);
explicit Ray(const Line& line);
// returns false if the rays are parallel
friend bool Intersect(const Ray& ra, const Ray& rb, float& ta, float& tb);
};
////////////////////////////////////////////////////////////////////////////////
// Plane
class Plane : public Vector4Base
{
public:
// constructors
Plane();
Plane(const Plane& p);
Plane(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w);
Plane(const Vector3& xyz, const Scalar& w);
Plane(const Point3& a, const Point3& b, const Point3& c);
Plane(const Vector3& normal, const Point3& pt);
// construction to constant
Plane(const Maths::ZeroTag&);
Plane(const Maths::UnitXTag&);
Plane(const Maths::UnitYTag&);
Plane(const Maths::UnitZTag&);
Plane(const Maths::UnitNegXTag&);
Plane(const Maths::UnitNegYTag&);
Plane(const Maths::UnitNegZTag&);
// explicit constructors
explicit Plane(const __m128 b);
explicit Plane(const Vector3& v);
explicit Plane(const Vector4& v);
explicit Plane(const float* p);
// assignment
const Plane& operator=(const Plane& v);
const Plane& operator=(const Maths::ZeroTag&);
const Plane& operator=(const Maths::UnitXTag&);
const Plane& operator=(const Maths::UnitYTag&);
const Plane& operator=(const Maths::UnitZTag&);
const Plane& operator=(const Maths::UnitNegXTag&);
const Plane& operator=(const Maths::UnitNegYTag&);
const Plane& operator=(const Maths::UnitNegZTag&);
// element access
const Vector3 GetNormal() const;
const Scalar GetDistance() const;
// transformations
friend const Plane operator-(const Plane& p);
friend const Plane operator*(const Plane& p, const Transform& m);
// operations
friend const Scalar Dot(const Plane& p, const Point3& v);
friend const Scalar Dot(const Point3& v, const Plane& p);
friend const Scalar Dot(const Plane& p, const Vector3& v);
friend const Scalar Dot(const Vector3& v, const Plane& p);
friend const Scalar Dot(const Plane& p, const Vector4& v);
friend const Scalar Dot(const Vector4& v, const Plane& p);
friend const Scalar Intersect(const Plane& p, const Ray& ray);
friend const Scalar Intersect(const Plane& p, const Line& line);
// validation
bool IsFinite() const;
};
////////////////////////////////////////////////////////////////////////////////
// Bounds3 - axis aligned bounding box
class Bounds3
{
public:
Point3 m_min, m_max;
static const enum OriginTag { } Origin;
static const enum EmptyTag { } Empty;
// constructors
Bounds3();
Bounds3(const Bounds3& aabb);
Bounds3(const Point3& min, const Point3& max);
// construction to constant
Bounds3(const OriginTag&);
Bounds3(const EmptyTag&);
// explicit constructors
explicit Bounds3(const Point3& minMax);
// assignment
const Bounds3& operator=(const Bounds3& aabb);
const Bounds3& operator=(const Point3& pt);
const Bounds3& operator=(const OriginTag&);
const Bounds3& operator=(const EmptyTag&);
// in place operations
void operator+=(const Point3& pt);
void operator+=(const Bounds3& aabb);
// operations
friend Bounds3 operator+(const Bounds3& aabb, const Point3& pt);
friend Bounds3 operator+(const Point3& pt, const Bounds3& aabb);
friend Bounds3 operator+(const Bounds3& aabb, const Bounds3& aabb2);
bool Contains(const Point3& pt) const;
bool Contains(const Bounds3& aabb) const;
bool Touches(const Bounds3& aabb) const;
bool Intersect(const Ray& ray, float& tnear, float& tfar) const;
bool Intersect(const Line& line, float& tnear, float& tfar) const;
Point3 GetCenter() const;
Vector3 GetExtent() const;
Vector3 GetSize() const;
// validation
bool IsFinite() const;
bool HasVolume() const;
};
#include "Geometry.inl"
#endif //WIN32
#endif //BULLET_MATH_GEOMETRY_H