Tiberian Technologies Scripts Reference Revision: 9000
Loading...
Searching...
No Matches
obboxclass.h
1/* Renegade Scripts.dll
2 Copyright 2013 Tiberian Technologies
3
4 This file is part of the Renegade scripts.dll
5 The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version. See the file COPYING for more details.
9 In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
10 Only the source code to the module(s) containing the licenced code has to be released.
11*/
12#ifndef TT_INCLUDE_OBBOXCLASS_H
13#define TT_INCLUDE_OBBOXCLASS_H
14#include "Matrix3.h"
15#include "Vector3.h"
16#include "Matrix3D.h"
17class OBBoxClass
18{
19public:
20 OBBoxClass(void)
21 {
22 }
23 OBBoxClass(const OBBoxClass & that) : Basis(that.Basis),Center(that.Center),Extent(that.Extent)
24 {
25 }
26 OBBoxClass(const Vector3 & center,const Vector3 & extent) : Basis(1),Center(center),Extent(extent)
27 {
28 }
29 OBBoxClass(const Vector3 & center,const Vector3 & extent,const Matrix3 & basis) : Basis(basis),Center(center),Extent(extent)
30 {
31 }
32
33 OBBoxClass(const Vector3& aabb_center,const Vector3& aabb_extent, const Matrix3D& transform):
34 Center(transform * aabb_center),
35 Extent(aabb_extent),
36 Basis(transform)
37 {
38 }
39
40 OBBoxClass(const Vector3 * points, int num_points);
41 bool operator== (const OBBoxClass &src)
42 {
43 return (Center == src.Center) && (Extent == src.Extent) && (Basis == src.Basis);
44 }
45 bool operator!= (const OBBoxClass &src)
46 {
47 return (Center != src.Center) || (Extent != src.Extent) && (Basis == src.Basis);
48 }
49 void Init_From_Box_Points(Vector3 * points,int num_points);
50 void Init_Random(float min_extent = 0.5f,float max_extent = 1.0f);
51 float Project_To_Axis(const Vector3 & axis) const
52 {
53 float x = Extent[0] * Vector3::Dot_Product(axis,Vector3(Basis[0][0],Basis[1][0],Basis[2][0]));
54 float y = Extent[1] * Vector3::Dot_Product(axis,Vector3(Basis[0][1],Basis[1][1],Basis[2][1]));
55 float z = Extent[2] * Vector3::Dot_Product(axis,Vector3(Basis[0][2],Basis[1][2],Basis[2][2]));
56 return (WWMath::Fabs(x) + WWMath::Fabs(y) + WWMath::Fabs(z));
57 }
58 float Volume(void) const
59 {
60 return 2.0f*Extent.X * 2.0f*Extent.Y * 2.0f*Extent.Z;
61 }
62 void Compute_Point(float params[3],Vector3 * set_point) const
63 {
64 Vector3 point = Extent;
65 point.X *= params[0];
66 point.Y *= params[1];
67 point.Z *= params[2];
68 Matrix3::Rotate_Vector(Basis,point,set_point);
69 Vector3::Add(Center,*set_point,set_point);
70 }
71 void Compute_Axis_Aligned_Extent(Vector3 * set_extent) const
72 {
73 set_extent->X = WWMath::Fabs(Extent[0] * Basis[0][0]) + WWMath::Fabs(Extent[1] * Basis[0][1]) + WWMath::Fabs(Extent[2] * Basis[0][2]);
74 set_extent->Y = WWMath::Fabs(Extent[0] * Basis[1][0]) + WWMath::Fabs(Extent[1] * Basis[1][1]) + WWMath::Fabs(Extent[2] * Basis[1][2]);
75 set_extent->Z = WWMath::Fabs(Extent[0] * Basis[2][0]) + WWMath::Fabs(Extent[1] * Basis[2][1]) + WWMath::Fabs(Extent[2] * Basis[2][2]);
76 }
77 Matrix3 Basis; // 0000: rotation matrix
78 Vector3 Center; // 0024: centerpoint
79 Vector3 Extent; // 0030: size (i.e. how far from the centerpoint in each direction does the box go)
80 static void Transform(const Matrix3D & tm,const OBBoxClass & in,OBBoxClass * out)
81 {
82 out->Extent = in.Extent;
83 Matrix3D::Transform_Vector(tm,in.Center,&(out->Center));
84 Matrix3::Multiply(tm,in.Basis,&(out->Basis));
85 }
86
87 float ComputeSquaredDistanceFromPoint(const Vector3& point)
88 {
89 Vector3 v = point - Center;
90 float sq_dist = 0.0f;
91
92 for (int i = 0; i < 3; ++i)
93 {
94 float d = Vector3::Dot_Product(v, Basis[i]);
95
96 float excess;
97 if (d < -Extent[i]) excess = d + Extent[i];
98 else if (d > Extent[i]) excess = d - Extent[i];
99 else excess = 0;
100
101 sq_dist += excess * excess;
102 }
103
104 return sq_dist;
105 }
106
107}; // 003C
108
109#endif