Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "Tri.h"
00042 #include "BV.h"
00043
00044 class PQP_Model
00045 {
00046
00047 public:
00048
00049 int build_state;
00050
00051 Tri *tris;
00052 int num_tris;
00053 int num_tris_alloced;
00054
00055 BV *b;
00056 int num_bvs;
00057 int num_bvs_alloced;
00058
00059 Tri *last_tri;
00060
00061 BV *child(int n) { return &b[n]; }
00062
00063 PQP_Model();
00064 ~PQP_Model();
00065
00066 int BeginModel(int num_tris = 8);
00067
00068
00069 int AddTri(const PQP_REAL *p1, const PQP_REAL *p2, const PQP_REAL *p3,
00070
00071 const PQP_REAL *n1, const PQP_REAL *n2, const PQP_REAL *n3,
00072 int _vertex_id[3], int _neighbor_id[3],
00073
00074 int id);
00075 int EndModel();
00076 int MemUsage(int msg);
00077
00078 };
00079
00080 struct CollisionPair
00081 {
00082 int id1;
00083 int id2;
00084 PQP_REAL depth;
00085 PQP_REAL position1[3];
00086 int vertex_id1;
00087 PQP_REAL position2[3];
00088 int vertex_id2;
00089 PQP_REAL normal[3];
00090 };
00091
00092 struct PQP_CollideResult
00093 {
00094
00095
00096 int num_bv_tests;
00097 int num_tri_tests;
00098 double query_time_secs;
00099
00100
00101
00102 PQP_REAL RR[3][3];
00103 PQP_REAL T[3];
00104
00105 int num_pairs_alloced;
00106 int num_pairs;
00107 CollisionPair *pairs;
00108
00109 void SizeTo(int n);
00110 void Add(int i1, int i2, PQP_REAL _depth, PQP_REAL position1[3], int _vertex_id1, PQP_REAL position2[3], int _vertex_id2, PQP_REAL normal[3]);
00111 void Remove(int id);
00112
00113 int have_vertex1(int vertex_id) {
00114 if(vertex_id < 0) return -1;
00115 for(int i=0; i<num_pairs; i++)
00116 {
00117 if(pairs[i].vertex_id1 == vertex_id) return i;
00118 }
00119 return -1;
00120 }
00121 int have_vertex2(int vertex_id) {
00122 if(vertex_id < 0) return -1;
00123 for(int i=0; i<num_pairs; i++)
00124 {
00125 if(pairs[i].vertex_id2 == vertex_id) return i;
00126 }
00127 return -1;
00128 }
00129
00130
00131 PQP_CollideResult();
00132 ~PQP_CollideResult();
00133
00134
00135
00136 int NumBVTests() { return num_bv_tests; }
00137 int NumTriTests() { return num_tri_tests; }
00138 double QueryTimeSecs() { return query_time_secs; }
00139
00140
00141
00142
00143 void FreePairsList();
00144
00145
00146
00147 int Colliding() { return (num_pairs > 0); }
00148 int NumPairs() { return num_pairs; }
00149 int Id1(int k) { return pairs[k].id1; }
00150 int Id2(int k) { return pairs[k].id2; }
00151 PQP_REAL Depth(int k) {
00152 return pairs[k].depth;
00153 }
00154 void Position1(int k, PQP_REAL _pos[3]) {
00155 _pos[0] = pairs[k].position1[0];
00156 _pos[1] = pairs[k].position1[1];
00157 _pos[2] = pairs[k].position1[2];
00158 }
00159 void Position2(int k, PQP_REAL _pos[3]) {
00160 _pos[0] = pairs[k].position2[0];
00161 _pos[1] = pairs[k].position2[1];
00162 _pos[2] = pairs[k].position2[2];
00163 }
00164 void Normal(int k, PQP_REAL _norm[3]) {
00165 _norm[0] = pairs[k].normal[0];
00166 _norm[1] = pairs[k].normal[1];
00167 _norm[2] = pairs[k].normal[2];
00168 }
00169
00170 };
00171
00172 #if PQP_BV_TYPE & RSS_TYPE // distance/tolerance are only available with RSS
00173
00174 struct PQP_DistanceResult
00175 {
00176
00177
00178 int num_bv_tests;
00179 int num_tri_tests;
00180 double query_time_secs;
00181
00182
00183
00184 PQP_REAL RR[3][3];
00185 PQP_REAL T[3];
00186
00187 PQP_REAL rel_err;
00188 PQP_REAL abs_err;
00189
00190 PQP_REAL distance;
00191 PQP_REAL p1[3];
00192 PQP_REAL p2[3];
00193 int qsize;
00194 int id1;
00195 int id2;
00196
00197
00198
00199 int NumBVTests() { return num_bv_tests; }
00200 int NumTriTests() { return num_tri_tests; }
00201 double QueryTimeSecs() { return query_time_secs; }
00202
00203
00204
00205
00206
00207
00208 PQP_REAL Distance() { return distance; }
00209 const PQP_REAL *P1() { return p1; }
00210 const PQP_REAL *P2() { return p2; }
00211 int ID1() { return id1; }
00212 int ID2() { return id2; }
00213
00214 };
00215
00216 struct PQP_ToleranceResult
00217 {
00218
00219
00220 int num_bv_tests;
00221 int num_tri_tests;
00222 double query_time_secs;
00223
00224
00225
00226 PQP_REAL RR[3][3];
00227 PQP_REAL T[3];
00228
00229 int closer_than_tolerance;
00230 PQP_REAL tolerance;
00231
00232 PQP_REAL distance;
00233 PQP_REAL p1[3];
00234 PQP_REAL p2[3];
00235 int qsize;
00236
00237
00238
00239 int NumBVTests() { return num_bv_tests; }
00240 int NumTriTests() { return num_tri_tests; }
00241 double QueryTimeSecs() { return query_time_secs; }
00242
00243
00244
00245
00246
00247 PQP_REAL Distance() { return distance; }
00248 const PQP_REAL *P1() { return p1; }
00249 const PQP_REAL *P2() { return p2; }
00250
00251
00252
00253 int CloserThanTolerance() { return closer_than_tolerance; }
00254 };
00255
00256 #endif