Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
133 lines
2.8 KiB
C++
133 lines
2.8 KiB
C++
//=======================================================================//
|
|
// File: line.hpp //
|
|
// Project: Architecture //
|
|
// Author: J.M. Albertson //
|
|
//-----------------------------------------------------------------------//
|
|
// Copyright (C) 1994-1995, Virtual World Entertainments, //
|
|
// PROPRIETARY AND CONFIDENTIAL //
|
|
//=======================================================================//
|
|
|
|
#pragma once
|
|
|
|
#include "Stuff.hpp"
|
|
#include "Point3D.hpp"
|
|
#include "UnitVector.hpp"
|
|
|
|
namespace Stuff {
|
|
|
|
class Plane;
|
|
class Sphere;
|
|
class OBB;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Line3D3D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
class Line3D
|
|
#if defined(_ARMOR)
|
|
: public Stuff::Signature
|
|
#endif
|
|
{
|
|
public:
|
|
Point3D
|
|
m_origin;
|
|
UnitVector3D
|
|
m_direction;
|
|
Scalar
|
|
m_length;
|
|
|
|
Line3D()
|
|
{}
|
|
Line3D(
|
|
const Point3D &origin,
|
|
const UnitVector3D &direction,
|
|
Scalar length
|
|
)
|
|
{
|
|
m_origin = origin;
|
|
m_direction = direction;
|
|
m_length = length;
|
|
}
|
|
|
|
//
|
|
// projection functions
|
|
//
|
|
void
|
|
Project(
|
|
Scalar length,
|
|
Point3D *result
|
|
)
|
|
{
|
|
Check_Object(this); Check_Object(result);
|
|
Vector3D temp; temp.Multiply(m_direction,length);
|
|
result->Add(m_origin,temp);
|
|
}
|
|
Scalar
|
|
GetLengthToClosestPointTo(const Point3D &point)
|
|
{
|
|
Check_Object(this); Check_Object(&point);
|
|
Vector3D temp; temp.Subtract(point,m_origin);
|
|
Scalar len = temp*m_direction;
|
|
Clamp(len, 0.0f, m_length);
|
|
return len;
|
|
}
|
|
void
|
|
GetClosestPointTo(
|
|
const Point3D &point,
|
|
Point3D *result
|
|
)
|
|
{
|
|
Check_Object(this); Check_Object(result); Check_Object(&point);
|
|
Project(GetLengthToClosestPointTo(point),result);
|
|
}
|
|
|
|
//
|
|
// Assignment operators
|
|
//
|
|
Line3D&
|
|
SetDirection(const Vector3D &vector);
|
|
Line3D&
|
|
SetOrigin(const Point3D &point)
|
|
{Check_Pointer(this); m_origin = point; return *this;}
|
|
|
|
void
|
|
FindEnd(Point3D *result)
|
|
{Check_Object(this); Check_Pointer(result); Line3D::Project(m_length, result);}
|
|
|
|
//
|
|
// Intersection functions
|
|
//
|
|
Scalar
|
|
GetDistanceTo(
|
|
const Plane &plane,
|
|
Scalar *product
|
|
) const;
|
|
Scalar
|
|
GetDistanceTo(
|
|
const Sphere &sphere,
|
|
Scalar *penetration
|
|
) const;
|
|
Scalar
|
|
GetDistanceTo(const OBB& box);
|
|
Scalar
|
|
GetDistanceTo(
|
|
const OBB& box,
|
|
int *axis
|
|
);
|
|
|
|
//
|
|
// Test support
|
|
//
|
|
void
|
|
TestInstance() const
|
|
{}
|
|
};
|
|
|
|
Scalar
|
|
Find_Time_Till_Closest_Approach(
|
|
const Point3D& origin1,
|
|
const Vector3D& velocity1,
|
|
const Point3D& origin2,
|
|
const Vector3D& velocity2
|
|
);
|
|
|
|
}
|