1
/************************************************************************************
3
AstroMenace (Hardcore 3D space shooter with spaceship upgrade possibilities)
4
Copyright © 2006-2012 Michael Kurinnoy, Viewizard
7
AstroMenace is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
12
AstroMenace is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with AstroMenace. If not, see <http://www.gnu.org/licenses/>.
21
Web Site: http://www.viewizard.com/
22
Project: http://sourceforge.net/projects/openastromenace/
23
E-mail: viewizard@viewizard.com
25
*************************************************************************************/
28
/// подключаем нужные файлы
36
//-----------------------------------------------------------------------------
37
// Проверка столкновений Sphere-Mesh
38
//-----------------------------------------------------------------------------
39
bool CheckMeshSphereCollisionDetection(CObject3D *Object1, CObject3D *Object2, VECTOR3D *NewLoc, int *Object1PieceNum)
41
if (Object1->DrawObjectList == 0) return false;
44
for (int j=0; j<Object1->DrawObjectQuantity; j++)
45
if (Object1->DrawObjectList[j].VertexCount != 0)
48
if (Object1->HitBB != 0)
50
float Distance2 = (Object1->Location.x + Object1->HitBBLocation[j].x - Object2->Location.x)*(Object1->Location.x + Object1->HitBBLocation[j].x - Object2->Location.x) +
51
(Object1->Location.y + Object1->HitBBLocation[j].y - Object2->Location.y)*(Object1->Location.y + Object1->HitBBLocation[j].y - Object2->Location.y) +
52
(Object1->Location.z + Object1->HitBBLocation[j].z - Object2->Location.z)*(Object1->Location.z + Object1->HitBBLocation[j].z - Object2->Location.z);
54
// если очень далеко - берем следующий HitBB
55
// но сначала делаем еще одну проверку
56
if (Distance2 > Object1->HitBBRadius2[j] + Object2->Radius*Object2->Radius)
58
// средняя точка линии
59
VECTOR3D mid = (Object2->Location + Object2->PrevLocation) / 2.0f;
61
VECTOR3D dir = Object2->Location - Object2->PrevLocation;
63
float hl = dir.Length()/2.0f;
66
VECTOR3D T = Object1->Location + Object1->HitBBLocation[j] - mid;
69
// проверяем, является ли одна из осей X,Y,Z разделяющей
70
if ( (fabs(T.x) > Object1->HitBB[j][0].x + hl*fabs(dir.x)) ||
71
(fabs(T.y) > Object1->HitBB[j][0].y + hl*fabs(dir.y)) ||
72
(fabs(T.z) > Object1->HitBB[j][0].z + hl*fabs(dir.z)) )
77
r = Object1->HitBB[j][0].y*fabs(dir.z) + Object1->HitBB[j][0].z*fabs(dir.y);
78
if ( fabs(T.y*dir.z - T.z*dir.y) > r )
82
r = Object1->HitBB[j][0].x*fabs(dir.z) + Object1->HitBB[j][0].z*fabs(dir.x);
83
if ( fabs(T.z*dir.x - T.x*dir.z) > r )
87
r = Object1->HitBB[j][0].x*fabs(dir.y) + Object1->HitBB[j][0].y*fabs(dir.x);
88
if ( fabs(T.x*dir.y - T.y*dir.x) > r )
95
// дальше работаем с геометрией
97
if(vw_SphereMeshCollision(Object1->Location, &(Object1->DrawObjectList[j]), Object1->CurrentRotationMat,
98
Object2->Radius, Object2->Location, Object2->PrevLocation,
101
*Object1PieceNum = j;
117
//-----------------------------------------------------------------------------
118
// Проверка столкновений HitBB-HitBB
119
//-----------------------------------------------------------------------------
120
bool CheckHitBBHitBBCollisionDetection(CObject3D *Object1, CObject3D *Object2, int *Object1PieceNum, int *Object2PieceNum)
122
// проверяем HitBB, находим номера пересекающихся
123
for (int i=0; i<Object1->DrawObjectQuantity; i++)
124
if (Object1->DrawObjectList[i].VertexCount != 0)
127
for (int j=0; j<Object2->DrawObjectQuantity; j++)
128
if (Object2->DrawObjectList[j].VertexCount != 0)
131
// находим расстояние между HitBB-ми
132
float Distance2 = (Object1->Location.x + Object1->HitBBLocation[i].x - Object2->Location.x - Object2->HitBBLocation[j].x)*
133
(Object1->Location.x + Object1->HitBBLocation[i].x - Object2->Location.x - Object2->HitBBLocation[j].x) +
134
(Object1->Location.y + Object1->HitBBLocation[i].y - Object2->Location.y - Object2->HitBBLocation[j].y)*
135
(Object1->Location.y + Object1->HitBBLocation[i].y - Object2->Location.y - Object2->HitBBLocation[j].y) +
136
(Object1->Location.z + Object1->HitBBLocation[i].z - Object2->Location.z - Object2->HitBBLocation[j].z)*
137
(Object1->Location.z + Object1->HitBBLocation[i].z - Object2->Location.z - Object2->HitBBLocation[j].z);
140
// если очень далеко - берем следующий HitBB
141
if (Distance2 > Object2->HitBBRadius2[j] + Object1->HitBBRadius2[i]) continue;
143
// если достаточно близко - проверяем как OBB
146
// строим матрицу, чтобы развернуть точки
147
float TMPOldInvRotationMat[9];
148
memcpy(TMPOldInvRotationMat, Object1->CurrentRotationMat, 9*sizeof(float));
149
Matrix33InverseRotate(TMPOldInvRotationMat);
152
memcpy(matB, Object2->CurrentRotationMat, 9*sizeof(float));
153
Matrix33Mult(matB, TMPOldInvRotationMat);
157
VECTOR3D vPosB = (Object2->Location + Object2->HitBBLocation[j])
158
- (Object1->Location + Object1->HitBBLocation[i]);
159
Matrix33CalcPoint(&vPosB, TMPOldInvRotationMat);
162
VECTOR3D XAxis(matB[0],matB[3],matB[6]);
163
VECTOR3D YAxis(matB[1],matB[4],matB[7]);
164
VECTOR3D ZAxis(matB[2],matB[5],matB[8]);
167
VECTOR3D Obj1_data(Object1->HitBBSize[i].x/2.0f, Object1->HitBBSize[i].y/2.0f, Object1->HitBBSize[i].z/2.0f);
168
VECTOR3D Obj2_data(Object2->HitBBSize[j].x/2.0f, Object2->HitBBSize[j].y/2.0f, Object2->HitBBSize[j].z/2.0f);
172
//делаем 15 проверок, т.к. у нас 15 разделяющих осей
175
if(fabsf(vPosB.x) > Obj1_data.x + Obj2_data.x * fabsf(XAxis.x) + Obj2_data.y * fabsf(XAxis.y) + Obj2_data.z * fabsf(XAxis.z))
179
if(fabsf(vPosB.y) > Obj1_data.y + Obj2_data.x * fabsf(YAxis.x) + Obj2_data.y * fabsf(YAxis.y) + Obj2_data.z * fabsf(YAxis.z))
183
if(fabsf(vPosB.z) > Obj1_data.z + Obj2_data.x * fabsf(ZAxis.x) + Obj2_data.y * fabsf(ZAxis.y) + Obj2_data.z * fabsf(ZAxis.z))
188
if(fabsf(vPosB.x*XAxis.x+vPosB.y*YAxis.x+vPosB.z*ZAxis.x) >
189
(Obj2_data.x+Obj1_data.x*fabsf(XAxis.x) + Obj1_data.y * fabsf(YAxis.x) + Obj1_data.z*fabsf(ZAxis.x)))
193
if(fabsf(vPosB.x*XAxis.y+vPosB.y*YAxis.y+vPosB.z*ZAxis.y) >
194
(Obj2_data.y+Obj1_data.x*fabsf(XAxis.y) + Obj1_data.y * fabsf(YAxis.y) + Obj1_data.z*fabsf(ZAxis.y)))
198
if(fabsf(vPosB.x*XAxis.z+vPosB.y*YAxis.z+vPosB.z*ZAxis.z) >
199
(Obj2_data.z+Obj1_data.x*fabsf(XAxis.z) + Obj1_data.y * fabsf(YAxis.z) + Obj1_data.z*fabsf(ZAxis.z)))
203
if(fabsf(vPosB.z*YAxis.x-vPosB.y*ZAxis.x) > Obj1_data.y*fabsf(ZAxis.x) +
204
Obj1_data.z*fabsf(YAxis.x) + Obj2_data.y*fabsf(XAxis.z) + Obj2_data.z*fabsf(XAxis.y))
208
if(fabsf(vPosB.z*YAxis.y-vPosB.y*ZAxis.y) > Obj1_data.y*fabsf(ZAxis.y) +
209
Obj1_data.z*fabsf(YAxis.y) + Obj2_data.x*fabsf(XAxis.z) + Obj2_data.z*fabsf(XAxis.x))
213
if(fabsf(vPosB.z*YAxis.z-vPosB.y*ZAxis.z) > Obj1_data.y*fabsf(ZAxis.z) +
214
Obj1_data.z*fabsf(YAxis.z) + Obj2_data.x*fabsf(XAxis.y) + Obj2_data.y*fabsf(XAxis.x))
218
if(fabsf(vPosB.x*ZAxis.x-vPosB.z*XAxis.x) > Obj1_data.x*fabsf(ZAxis.x) +
219
Obj1_data.z*fabsf(XAxis.x) + Obj2_data.y*fabsf(YAxis.z) + Obj2_data.z*fabsf(YAxis.y))
223
if(fabsf(vPosB.x*ZAxis.y-vPosB.z*XAxis.y) > Obj1_data.x*fabsf(ZAxis.y) +
224
Obj1_data.z*fabsf(XAxis.y) + Obj2_data.x*fabsf(YAxis.z) + Obj2_data.z*fabsf(YAxis.x))
228
if(fabsf(vPosB.x*ZAxis.z-vPosB.z*XAxis.z) > Obj1_data.x*fabsf(ZAxis.z) +
229
Obj1_data.z*fabsf(XAxis.z) + Obj2_data.x*fabsf(YAxis.y) + Obj2_data.y*fabsf(YAxis.x))
233
if(fabsf(vPosB.y*XAxis.x-vPosB.x*YAxis.x) > Obj1_data.x*fabsf(YAxis.x) +
234
Obj1_data.y*fabsf(XAxis.x) + Obj2_data.y*fabsf(ZAxis.z) + Obj2_data.z*fabsf(ZAxis.y))
238
if(fabsf(vPosB.y*XAxis.y-vPosB.x*YAxis.y) > Obj1_data.x*fabsf(YAxis.y) +
239
Obj1_data.y*fabsf(XAxis.y) + Obj2_data.x*fabsf(ZAxis.z) + Obj2_data.z*fabsf(ZAxis.x))
243
if(fabsf(vPosB.y*XAxis.z-vPosB.x*YAxis.z) > Obj1_data.x*fabsf(YAxis.z) +
244
Obj1_data.y*fabsf(XAxis.z) + Obj2_data.x*fabsf(ZAxis.y) + Obj2_data.y*fabsf(ZAxis.x))
248
// если тут, нашли пересекающиеся!
250
*Object1PieceNum = i;
251
*Object2PieceNum = j;
268
//-----------------------------------------------------------------------------
269
// Проверка столкновений HitBB-OBB
270
//-----------------------------------------------------------------------------
271
bool CheckHitBBOBBCollisionDetection(CObject3D *Object1, CObject3D *Object2, int *Object1PieceNum)
273
// проверяем HitBB, находим номера пересекающихся
274
for (int i=0; i<Object1->DrawObjectQuantity; i++)
275
if (Object1->DrawObjectList[i].VertexCount != 0)
278
// строим матрицу, чтобы развернуть точки
279
float TMPOldInvRotationMat[9];
280
memcpy(TMPOldInvRotationMat, Object2->CurrentRotationMat, 9*sizeof(float));
281
Matrix33InverseRotate(TMPOldInvRotationMat);
284
memcpy(matB, Object1->CurrentRotationMat, 9*sizeof(float));
285
Matrix33Mult(matB, TMPOldInvRotationMat);
288
VECTOR3D vPosB = (Object1->Location + Object1->HitBBLocation[i])-(Object2->Location + Object2->OBBLocation);
289
Matrix33CalcPoint(&vPosB, TMPOldInvRotationMat);
292
VECTOR3D XAxis(matB[0],matB[3],matB[6]);
293
VECTOR3D YAxis(matB[1],matB[4],matB[7]);
294
VECTOR3D ZAxis(matB[2],matB[5],matB[8]);
297
VECTOR3D Obj2_data(Object1->HitBBSize[i].x/2.0f, Object1->HitBBSize[i].y/2.0f, Object1->HitBBSize[i].z/2.0f);
298
VECTOR3D Obj1_data(Object2->Width/2.0f, Object2->Height/2.0f, Object2->Length/2.0f);
302
//делаем 15 проверок, т.к. у нас 15 разделяющих осей
305
if(fabsf(vPosB.x) > Obj1_data.x + Obj2_data.x * fabsf(XAxis.x) + Obj2_data.y * fabsf(XAxis.y) + Obj2_data.z * fabsf(XAxis.z))
309
if(fabsf(vPosB.y) > Obj1_data.y + Obj2_data.x * fabsf(YAxis.x) + Obj2_data.y * fabsf(YAxis.y) + Obj2_data.z * fabsf(YAxis.z))
313
if(fabsf(vPosB.z) > Obj1_data.z + Obj2_data.x * fabsf(ZAxis.x) + Obj2_data.y * fabsf(ZAxis.y) + Obj2_data.z * fabsf(ZAxis.z))
317
if(fabsf(vPosB.x*XAxis.x+vPosB.y*YAxis.x+vPosB.z*ZAxis.x) >
318
(Obj2_data.x+Obj1_data.x*fabsf(XAxis.x) + Obj1_data.y * fabsf(YAxis.x) + Obj1_data.z*fabsf(ZAxis.x)))
322
if(fabsf(vPosB.x*XAxis.y+vPosB.y*YAxis.y+vPosB.z*ZAxis.y) >
323
(Obj2_data.y+Obj1_data.x*fabsf(XAxis.y) + Obj1_data.y * fabsf(YAxis.y) + Obj1_data.z*fabsf(ZAxis.y)))
327
if(fabsf(vPosB.x*XAxis.z+vPosB.y*YAxis.z+vPosB.z*ZAxis.z) >
328
(Obj2_data.z+Obj1_data.x*fabsf(XAxis.z) + Obj1_data.y * fabsf(YAxis.z) + Obj1_data.z*fabsf(ZAxis.z)))
332
if(fabsf(vPosB.z*YAxis.x-vPosB.y*ZAxis.x) > Obj1_data.y*fabsf(ZAxis.x) +
333
Obj1_data.z*fabsf(YAxis.x) + Obj2_data.y*fabsf(XAxis.z) + Obj2_data.z*fabsf(XAxis.y))
337
if(fabsf(vPosB.z*YAxis.y-vPosB.y*ZAxis.y) > Obj1_data.y*fabsf(ZAxis.y) +
338
Obj1_data.z*fabsf(YAxis.y) + Obj2_data.x*fabsf(XAxis.z) + Obj2_data.z*fabsf(XAxis.x))
342
if(fabsf(vPosB.z*YAxis.z-vPosB.y*ZAxis.z) > Obj1_data.y*fabsf(ZAxis.z) +
343
Obj1_data.z*fabsf(YAxis.z) + Obj2_data.x*fabsf(XAxis.y) + Obj2_data.y*fabsf(XAxis.x))
347
if(fabsf(vPosB.x*ZAxis.x-vPosB.z*XAxis.x) > Obj1_data.x*fabsf(ZAxis.x) +
348
Obj1_data.z*fabsf(XAxis.x) + Obj2_data.y*fabsf(YAxis.z) + Obj2_data.z*fabsf(YAxis.y))
352
if(fabsf(vPosB.x*ZAxis.y-vPosB.z*XAxis.y) > Obj1_data.x*fabsf(ZAxis.y) +
353
Obj1_data.z*fabsf(XAxis.y) + Obj2_data.x*fabsf(YAxis.z) + Obj2_data.z*fabsf(YAxis.x))
357
if(fabsf(vPosB.x*ZAxis.z-vPosB.z*XAxis.z) > Obj1_data.x*fabsf(ZAxis.z) +
358
Obj1_data.z*fabsf(XAxis.z) + Obj2_data.x*fabsf(YAxis.y) + Obj2_data.y*fabsf(YAxis.x))
362
if(fabsf(vPosB.y*XAxis.x-vPosB.x*YAxis.x) > Obj1_data.x*fabsf(YAxis.x) +
363
Obj1_data.y*fabsf(XAxis.x) + Obj2_data.y*fabsf(ZAxis.z) + Obj2_data.z*fabsf(ZAxis.y))
367
if(fabsf(vPosB.y*XAxis.y-vPosB.x*YAxis.y) > Obj1_data.x*fabsf(YAxis.y) +
368
Obj1_data.y*fabsf(XAxis.y) + Obj2_data.x*fabsf(ZAxis.z) + Obj2_data.z*fabsf(ZAxis.x))
372
if(fabsf(vPosB.y*XAxis.z-vPosB.x*YAxis.z) > Obj1_data.x*fabsf(YAxis.z) +
373
Obj1_data.y*fabsf(XAxis.z) + Obj2_data.x*fabsf(ZAxis.y) + Obj2_data.y*fabsf(ZAxis.x))
376
// если тут, нашли пересекающиеся!
377
*Object1PieceNum = i;
400
//-----------------------------------------------------------------------------
401
// Проверка столкновений геометрия больших астероидов -HitBB
402
//-----------------------------------------------------------------------------
403
bool CheckHitBBMeshCollisionDetection(CObject3D *Object1, CObject3D *Object2, int *Object1PieceNum)
405
// делаем матрицу перемещения точки, для геометрии
407
TransMat[0] = Object2->CurrentRotationMat[0];
408
TransMat[1] = Object2->CurrentRotationMat[1];
409
TransMat[2] = Object2->CurrentRotationMat[2];
411
TransMat[4] = Object2->CurrentRotationMat[3];
412
TransMat[5] = Object2->CurrentRotationMat[4];
413
TransMat[6] = Object2->CurrentRotationMat[5];
415
TransMat[8] = Object2->CurrentRotationMat[6];
416
TransMat[9] = Object2->CurrentRotationMat[7];
417
TransMat[10] = Object2->CurrentRotationMat[8];
419
TransMat[12] = Object2->Location.x;
420
TransMat[13] = Object2->Location.y;
421
TransMat[14] = Object2->Location.z;
426
// проверяем HitBB, находим номера пересекающихся
427
for (int i=0; i<Object1->DrawObjectQuantity; i++)
428
if (Object1->DrawObjectList[i].VertexCount != 0)
432
VECTOR3D TMPMax = Object1->HitBB[i][0];
433
VECTOR3D TMPMin = Object1->HitBB[i][6];
435
// строим матрицу, чтобы развернуть точки
436
float TMPOldInvRotationMat[9];
437
memcpy(TMPOldInvRotationMat, Object1->CurrentRotationMat, 9*sizeof(float));
438
Matrix33InverseRotate(TMPOldInvRotationMat);
440
// перемещаем в общие координаты, теперь это как-бы крайние точки аабб
441
Matrix33CalcPoint(&TMPMax, TMPOldInvRotationMat);
442
Matrix33CalcPoint(&TMPMin, TMPOldInvRotationMat);
445
VECTOR3D Center = Object1->HitBBLocation[i] + Object1->Location;
446
Matrix33CalcPoint(&Center, TMPOldInvRotationMat);
456
// проверяем все треугольники объекта
457
for (int j=0; j<Object2->DrawObjectQuantity; j++)
458
if (Object2->DrawObjectList[j].VertexCount != 0)
461
// дальше работаем с геометрией
464
// находим точку локального положения объекта в моделе
465
VECTOR3D LocalLocation(Object2->DrawObjectList[j].Location);
466
Matrix33CalcPoint(&LocalLocation, Object2->CurrentRotationMat);
468
// делаем временную матрицу для объекта, т.к. портить основную нельзя
469
float ObjTransMat[16];
470
memcpy(ObjTransMat, TransMat, 16*sizeof(float));
472
// если нужно - создаем матрицу, иначе - копируем ее
473
if (Object2->DrawObjectList[j].Rotation.x != 0.0f ||
474
Object2->DrawObjectList[j].Rotation.y != 0.0f ||
475
Object2->DrawObjectList[j].Rotation.z != 0.0f)
477
float TransMatTMP[16];
478
Matrix44Identity(TransMatTMP);
480
Matrix44CreateRotate(TransMatTMP, Object2->DrawObjectList[j].Rotation);
482
Matrix44Translate(TransMatTMP, LocalLocation);
483
// и умножаем на основную матрицу, со сведениями по всему объекту
484
Matrix44Mult(ObjTransMat, TransMatTMP);
488
Matrix44Translate(ObjTransMat, LocalLocation);
496
for (int k=0; k<Object2->DrawObjectList[j].VertexCount; k+=3)
500
if (Object2->DrawObjectList[j].IndexBuffer != 0)
501
j2 = Object2->DrawObjectList[j].IndexBuffer[Object2->DrawObjectList[j].RangeStart+k]*Object2->DrawObjectList[j].VertexStride;
503
j2 = (Object2->DrawObjectList[j].RangeStart+k)*Object2->DrawObjectList[j].VertexStride;
505
// находим точки триугольника
507
Point1.x = Object2->DrawObjectList[j].VertexBuffer[j2];
508
Point1.y = Object2->DrawObjectList[j].VertexBuffer[j2+1];
509
Point1.z = Object2->DrawObjectList[j].VertexBuffer[j2+2];
510
Matrix44CalcPoint(&Point1, ObjTransMat);
512
if (Object2->DrawObjectList[j].IndexBuffer != 0)
513
j2 = Object2->DrawObjectList[j].IndexBuffer[Object2->DrawObjectList[j].RangeStart+k+1]*Object2->DrawObjectList[j].VertexStride;
515
j2 = (Object2->DrawObjectList[j].RangeStart+k+1)*Object2->DrawObjectList[j].VertexStride;
518
Point2.x = Object2->DrawObjectList[j].VertexBuffer[j2];
519
Point2.y = Object2->DrawObjectList[j].VertexBuffer[j2+1];
520
Point2.z = Object2->DrawObjectList[j].VertexBuffer[j2+2];
521
Matrix44CalcPoint(&Point2, ObjTransMat);
523
if (Object2->DrawObjectList[j].IndexBuffer != 0)
524
j2 = Object2->DrawObjectList[j].IndexBuffer[Object2->DrawObjectList[j].RangeStart+k+2]*Object2->DrawObjectList[j].VertexStride;
526
j2 = (Object2->DrawObjectList[j].RangeStart+k+2)*Object2->DrawObjectList[j].VertexStride;
529
Point3.x = Object2->DrawObjectList[j].VertexBuffer[j2];
530
Point3.y = Object2->DrawObjectList[j].VertexBuffer[j2+1];
531
Point3.z = Object2->DrawObjectList[j].VertexBuffer[j2+2];
532
Matrix44CalcPoint(&Point3, ObjTransMat);
536
// преобразуем все точки в систему первого объекта
538
Matrix33CalcPoint(&Point1, TMPOldInvRotationMat);
539
Matrix33CalcPoint(&Point2, TMPOldInvRotationMat);
540
Matrix33CalcPoint(&Point3, TMPOldInvRotationMat);
543
// сразу ставим номер
544
*Object1PieceNum = i;
547
// сначала проверка по точкам...
548
if (fabsf(Center.x - Point1.x) <= TMPMax.x)
549
if (fabsf(Center.y - Point1.y) <= TMPMax.y)
550
if (fabsf(Center.z - Point1.z) <= TMPMax.z)
552
if (fabsf(Center.x - Point2.x) <= TMPMax.x)
553
if (fabsf(Center.y - Point2.y) <= TMPMax.y)
554
if (fabsf(Center.z - Point2.z) <= TMPMax.z)
556
if (fabsf(Center.x - Point3.x) <= TMPMax.x)
557
if (fabsf(Center.y - Point3.y) <= TMPMax.y)
558
if (fabsf(Center.z - Point3.z) <= TMPMax.z)
564
// делаем боксы, и проверяем по ним
568
TMPMax2.x = Max3(Point1.x,Point2.x,Point3.x);
569
TMPMin2.x = Min3(Point1.x,Point2.x,Point3.x);
571
TMPMax2.y = Max3(Point1.y,Point2.y,Point3.y);
572
TMPMin2.y = Min3(Point1.y,Point2.y,Point3.y);
574
TMPMax2.z = Max3(Point1.z,Point2.z,Point3.z);
575
TMPMin2.z = Min3(Point1.z,Point2.z,Point3.z);
578
VECTOR3D Center2((TMPMax2.x+TMPMin2.x)/2.0f,(TMPMax2.y+TMPMin2.y)/2.0f,(TMPMax2.z+TMPMin2.z)/2.0f);
580
TMPMax2.x = TMPMax2.x - Center2.x;
581
TMPMax2.y = TMPMax2.y - Center2.y;
582
TMPMax2.z = TMPMax2.z - Center2.z;
586
if (fabsf(Center.x - Center2.x) > TMPMax.x + TMPMax2.x)
588
if (fabsf(Center.y - Center2.y) > TMPMax.y + TMPMax2.y)
590
if (fabsf(Center.z - Center2.z) > TMPMax.z + TMPMax2.z)