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.
141 lines
2.9 KiB
C++
141 lines
2.9 KiB
C++
//=======================================================================//
|
|
// File: sphere.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"
|
|
|
|
namespace Stuff {class Sphere;}
|
|
|
|
#if !defined(Spew)
|
|
void
|
|
Spew(
|
|
const char* group,
|
|
const Stuff::Sphere& sphere
|
|
);
|
|
#endif
|
|
|
|
namespace Stuff {
|
|
|
|
class Plane;
|
|
class OBB;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sphere ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
class Sphere
|
|
{
|
|
public:
|
|
Point3D
|
|
center;
|
|
Scalar
|
|
radius;
|
|
|
|
static Sphere
|
|
s_Identity;
|
|
|
|
Sphere()
|
|
{}
|
|
Sphere(
|
|
const Point3D &A_Point,
|
|
Scalar Radius
|
|
):
|
|
center(A_Point),
|
|
radius(Radius)
|
|
{}
|
|
Sphere(
|
|
Scalar X,
|
|
Scalar Y,
|
|
Scalar Z,
|
|
Scalar Radius
|
|
):
|
|
center(X,Y,Z),
|
|
radius(Radius)
|
|
{}
|
|
Sphere(const Sphere& sphere):
|
|
center(sphere.center),
|
|
radius(sphere.radius)
|
|
{}
|
|
explicit Sphere(const OBB& obb)
|
|
{*this = obb;}
|
|
|
|
Sphere&
|
|
operator =(const Sphere &sphere)
|
|
{
|
|
Check_Pointer(this); Check_Object(&sphere);
|
|
center = sphere.center;
|
|
radius = sphere.radius;
|
|
return *this;
|
|
}
|
|
Sphere&
|
|
operator =(const OBB &obb);
|
|
|
|
Scalar
|
|
GetVolume()
|
|
{Check_Object(this); return 4.0f/3.0f*Pi*radius*radius*radius;}
|
|
int
|
|
ComputeBounds(ReadOnlyArrayOf<Point3D> &points);
|
|
|
|
//
|
|
// Transforms
|
|
//
|
|
Sphere&
|
|
Multiply(
|
|
const Sphere &s,
|
|
const LinearMatrix4D &m
|
|
)
|
|
{center.Multiply(s.center,m); radius = s.radius; return *this;}
|
|
|
|
//
|
|
// Intersection functions
|
|
//
|
|
Sphere&
|
|
Union(
|
|
const Sphere& sphere1,
|
|
const Sphere& sphere2
|
|
);
|
|
Sphere&
|
|
Union(const Point3D& point);
|
|
|
|
bool
|
|
Contains(const Point3D &point) const
|
|
{
|
|
Check_Object(this); Check_Object(&point);
|
|
Vector3D diff;
|
|
diff.Subtract(center, point);
|
|
return radius*radius - diff.GetLengthSquared() > -SMALL;
|
|
}
|
|
bool
|
|
Intersects(const Sphere &sphere) const
|
|
{
|
|
Check_Object(this); Check_Object(&sphere);
|
|
Scalar r = radius + sphere.radius;
|
|
Vector3D temp;
|
|
temp.Subtract(center, sphere.center);
|
|
return r*r - temp.GetLengthSquared() >= -SMALL;
|
|
}
|
|
bool
|
|
Intersects(const Plane &plane) const;
|
|
|
|
#if !defined(Spew)
|
|
friend void
|
|
::Spew(
|
|
const char* group,
|
|
const Sphere& sphere
|
|
);
|
|
#endif
|
|
void
|
|
TestInstance() const
|
|
{}
|
|
static bool
|
|
TestClass();
|
|
};
|
|
|
|
}
|