00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_MATH3D_H__
00021 #define __CS_MATH3D_H__
00022
00023 #ifndef __CS_CSSYSDEFS_H__
00024 #error "cssysdef.h must be included in EVERY source file!"
00025 #endif
00026
00033 #include "csgeom/vector3.h"
00034 #include "csgeom/plane3.h"
00035 #include "csgeom/plane2.h"
00036 #include "csgeom/segment.h"
00037 #include "iutil/dbghelp.h"
00038
00039 class csDVector3;
00040 class csPoly3D;
00041 class csBox3;
00042
00043 inline float fSqr (float f)
00044 {
00045 return f * f;
00046 }
00047
00052 class csMath3
00053 {
00054 public:
00067 static int WhichSide3D (const csVector3& p,
00068 const csVector3& v1, const csVector3& v2)
00069 {
00070
00071 float s = p.x*(v1.y*v2.z-v1.z*v2.y) + p.y*(v1.z*v2.x-v1.x*v2.z) +
00072 p.z*(v1.x*v2.y-v1.y*v2.x);
00073 if (s < 0) return 1;
00074 else if (s > 0) return -1;
00075 else return 0;
00076 }
00077
00083 static bool Visible (const csVector3& p, const csVector3& t1,
00084 const csVector3& t2, const csVector3& t3);
00085
00091 static bool Visible (const csVector3& p, const csPlane3& pl)
00092 { return pl.Classify (p) <= 0; }
00093
00101 static bool FindIntersection(const csVector3 tri1[3],
00102 const csVector3 tri2[3],
00103 csVector3 line[2]);
00104
00114 static void Between (const csVector3& v1, const csVector3& v2, csVector3& v,
00115 float pct, float wid);
00116
00123 static void SetMinMax (const csVector3& v,
00124 csVector3& min, csVector3& max)
00125 {
00126 if (v.x > max.x) max.x = v.x; else if (v.x < min.x ) min.x = v.x;
00127 if (v.y > max.y) max.y = v.y; else if (v.y < min.y ) min.y = v.y;
00128 if (v.z > max.z) max.z = v.z; else if (v.z < min.z ) min.z = v.z;
00129 }
00130
00136 inline static float Area3 (const csVector3 &a, const csVector3 &b,
00137 const csVector3 &c)
00138 {
00139 csVector3 v1 = b - a;
00140 csVector3 v2 = c - a;
00141 return ((v1.y * v2.z + v1.z * v2.x + v1.x * v2.y) -
00142 (v1.y * v2.x + v1.x * v2.z + v1.z * v2.y));
00143 }
00144
00150 inline static void CalcNormal (csVector3& norm, const csVector3& v1,
00151 const csVector3& v2, const csVector3& v3)
00152 {
00153 norm = (v1-v2)%(v1-v3);
00154 }
00155
00161 static void CalcNormal (csVector3& norm,
00162 const csVector3& v, const csVector3& u)
00163 { norm = u%v; }
00164
00171 static void CalcPlane (const csVector3& v1, const csVector3& v2,
00172 const csVector3& v3, csVector3& normal, float& D)
00173 {
00174 CalcNormal (normal, v1, v2, v3);
00175 D = - (normal * v1);
00176 }
00177
00184 static bool PlanesEqual (const csPlane3& p1, const csPlane3& p2)
00185 {
00186 return ( ( p1.norm - p2.norm) < (float).001 ) &&
00187 ( ABS (p1.DD-p2.DD) < (float).001 );
00188 }
00189
00195 static bool PlanesClose (const csPlane3& p1, const csPlane3& p2);
00196
00204 static int OuterPlanes (const csBox3& box1, const csBox3& box2,
00205 csPlane3* planes);
00206
00214 static int FindObserverSides (const csBox3& box1, const csBox3& box2,
00215 int* sides);
00216
00222 static void SpherePosition (float angle_xz, float angle_vert,
00223 csVector3& pos);
00224 };
00225
00230 class csSquaredDist
00231 {
00232 public:
00234 static float PointPoint (const csVector3& p1, const csVector3& p2)
00235 { return fSqr (p1.x - p2.x) + fSqr (p1.y - p2.y) + fSqr (p1.z - p2.z); }
00236
00238 static float PointLine (const csVector3& p,
00239 const csVector3& l1, const csVector3& l2);
00240
00242 static float PointPlane (const csVector3& p, const csPlane3& plane)
00243 { float r = plane.Classify (p); return r * r; }
00244
00251 static float PointPoly (const csVector3& p, csVector3 *V, int n,
00252 const csPlane3& plane, float sqdist = -1);
00253 };
00254
00260 class csIntersect3
00261 {
00262 public:
00269 static bool IntersectPolygon (const csPlane3& plane, csPoly3D* poly,
00270 csSegment3& segment);
00271
00281 static int IntersectSegment (csPlane3* planes, int num_planes,
00282 csSegment3& seg);
00283
00289 static bool IntersectTriangle (const csVector3& tr1,
00290 const csVector3& tr2, const csVector3& tr3,
00291 const csSegment3& seg, csVector3& isect);
00292
00297 static bool Plane (
00298 const csVector3& u, const csVector3& v,
00299 const csVector3& normal, const csVector3& a,
00300 csVector3& isect, float& dist);
00301
00310 static bool Plane (
00311 const csVector3& u, const csVector3& v,
00312 const csPlane3& p,
00313 csVector3& isect,
00314 float& dist);
00315
00321 static bool Planes (const csPlane3& p1, const csPlane3& p2,
00322 const csPlane3& p3, csVector3& isect);
00323
00330 static bool PlaneXPlane (const csPlane3& p1, float x2, csPlane2& isect);
00331
00338 static bool PlaneYPlane (const csPlane3& p1, float y2, csPlane2& isect);
00339
00346 static bool PlaneZPlane (const csPlane3& p1, float z2, csPlane2& isect);
00347
00354 static bool PlaneAxisPlane (const csPlane3& p1, int nr, float pos,
00355 csPlane2& isect)
00356 {
00357 switch (nr)
00358 {
00359 case 0: return PlaneXPlane (p1, pos, isect);
00360 case 1: return PlaneYPlane (p1, pos, isect);
00361 case 2: return PlaneZPlane (p1, pos, isect);
00362 }
00363 return false;
00364 }
00365
00372 static float Z0Plane (
00373 const csVector3& v1, const csVector3& v2,
00374 csVector3& isect);
00375
00382 static float Z0Plane (
00383 const csSegment3& uv,
00384 csVector3& isect)
00385 {
00386 return Z0Plane (uv.Start (), uv.End (), isect);
00387 }
00388
00395 static float ZPlane (float zval,
00396 const csVector3& u, const csVector3& v,
00397 csVector3& isect);
00398
00405 static float ZPlane (float zval,
00406 const csSegment3& uv,
00407 csVector3& isect)
00408 {
00409 return ZPlane (zval, uv.Start (), uv.End (), isect);
00410 }
00411
00416 static float XFrustum (
00417 float A, const csVector3& u, const csVector3& v, csVector3& isect);
00418
00423 static float XFrustum (
00424 float A, const csSegment3& uv, csVector3& isect)
00425 {
00426 return XFrustum (A, uv.Start (), uv.End (), isect);
00427 }
00428
00433 static float YFrustum (
00434 float B, const csVector3& u, const csVector3& v, csVector3& isect);
00435
00440 static float YFrustum (
00441 float B, const csSegment3& uv, csVector3& isect)
00442 {
00443 return YFrustum (B, uv.Start (), uv.End (), isect);
00444 }
00445
00455 static int BoxSegment (const csBox3& box, const csSegment3& segment,
00456 csVector3& isect, float* pr = NULL);
00457
00467 static bool BoxFrustum (const csBox3& box, csPlane3* frustum,
00468 uint32 inClipMask, uint32& outClipMask);
00469
00474 static bool BoxSphere (const csBox3& box, const csVector3& center,
00475 float sqradius);
00476 };
00477
00482 class csGeomDebugHelper : public iDebugHelper
00483 {
00484 public:
00485 csGeomDebugHelper ();
00486 virtual ~csGeomDebugHelper () { }
00487
00488 SCF_DECLARE_IBASE;
00489 virtual int GetSupportedTests () const
00490 {
00491 return CS_DBGHELP_UNITTEST;
00492 }
00493 virtual csPtr<iString> UnitTest ();
00494 virtual csPtr<iString> StateTest ()
00495 {
00496 return 0;
00497 }
00498 virtual csTicks Benchmark (int )
00499 {
00500 return 0;
00501 }
00502 virtual csPtr<iString> Dump ()
00503 {
00504 return 0;
00505 }
00506 virtual void Dump (iGraphics3D* )
00507 {
00508 }
00509 virtual bool DebugCommand (const char*)
00510 {
00511 return false;
00512 }
00513 };
00514
00517 #endif // __CS_MATH3D_H__
00518