00001 #include <windows.h>
00002 #include "polygon.h"
00003 #include "locmath.h"
00004 #include "collision.h"
00005 #include "general.h"
00006 #include "bsp.h"
00007 #include "mmgr.h"
00008
00009
00010 POLYGON::POLYGON()
00011 :
00012 numVertices(3)
00013 {
00014
00015 }
00016
00017 POLYGON::~POLYGON()
00018 {
00019 }
00020
00021 VECTOR POLYGON::GetNormal()
00022 {
00023 VECTOR temp;
00024 float ux;
00025 float uy;
00026 float uz;
00027 float vx;
00028 float vy;
00029 float vz;
00030 ux = Vertex[1].x - Vertex[0].x;
00031 uy = Vertex[1].y - Vertex[0].y;
00032 uz = Vertex[1].z - Vertex[0].z;
00033 vx = Vertex[2].x - Vertex[0].x;
00034 vy = Vertex[2].y - Vertex[0].y;
00035 vz = Vertex[2].z - Vertex[0].z;
00036 temp.x = (uy*vz)-(vy*uz);
00037 temp.y = (uz*vx)-(vz*ux);
00038 temp.z = (ux*vy)-(vx*uy);
00039 return temp;
00040 }
00041
00042 void POLYGON::SetNormal()
00043 {
00044 float ux;
00045 float uy;
00046 float uz;
00047 float vx;
00048 float vy;
00049 float vz;
00050 ux = Vertex[1].x - Vertex[0].x;
00051 uy = Vertex[1].y - Vertex[0].y;
00052 uz = Vertex[1].z - Vertex[0].z;
00053 vx = Vertex[2].x - Vertex[0].x;
00054 vy = Vertex[2].y - Vertex[0].y;
00055 vz = Vertex[2].z - Vertex[0].z;
00056 Vertex[0].nx = (uy*vz)-(vy*uz);
00057 Vertex[0].ny = (uz*vx)-(vz*ux);
00058 Vertex[0].nz = (ux*vy)-(vx*uy);
00059 Vertex[1].nx = Vertex[0].nx;
00060 Vertex[1].ny = Vertex[0].ny;
00061 Vertex[1].nz = Vertex[0].nz;
00062 Vertex[2].nx = Vertex[0].nx;
00063 Vertex[2].ny = Vertex[0].ny;
00064 Vertex[2].nz = Vertex[0].nz;
00065 }
00066
00067 VECTOR GetEdgeIntersection(VECTOR point0, VECTOR point1, POLYGON planePolygon)
00068 {
00069 VECTOR edge1, edge2, planeNormal, pointOnPlane, intersection, temp;
00070 float numerator, denominator, t;
00071
00072
00073 pointOnPlane.x = planePolygon.Vertex[0].x;
00074 pointOnPlane.y = planePolygon.Vertex[0].y;
00075 pointOnPlane.z = planePolygon.Vertex[0].z;
00076
00077
00078 edge1.x = planePolygon.Vertex[1].x - planePolygon.Vertex[0].x;
00079 edge1.y = planePolygon.Vertex[1].y - planePolygon.Vertex[0].y;
00080 edge1.z = planePolygon.Vertex[1].z - planePolygon.Vertex[0].z;
00081 edge2.x = planePolygon.Vertex[2].x - planePolygon.Vertex[0].x;
00082 edge2.y = planePolygon.Vertex[2].y - planePolygon.Vertex[0].y;
00083 edge2.z = planePolygon.Vertex[2].z - planePolygon.Vertex[0].z;
00084 planeNormal = CrossVector(edge1, edge2);
00085
00086
00087
00088
00089
00090
00091 temp.x = pointOnPlane.x - point0.x;
00092 temp.y = pointOnPlane.y - point0.y;
00093 temp.z = pointOnPlane.z - point0.z;
00094 numerator = DotProduct(planeNormal, temp);
00095
00096
00097 temp.x = point1.x - point0.x;
00098 temp.y = point1.y - point0.y;
00099 temp.z = point1.z - point0.z;
00100 denominator = DotProduct(planeNormal, temp);
00101
00102 if (denominator)
00103 t = numerator / denominator;
00104 else
00105 t = 0.0;
00106
00107 intersection.x = point0.x + temp.x * t;
00108 intersection.y = point0.y + temp.y * t;
00109 intersection.z = point0.z + temp.z * t;
00110
00111 return intersection;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 int SplitPolygon(POLYGON triangleToSplit, POLYGON planeTriangle, POLYGON* triangles)
00386 {
00387 VECTOR planeNormal, polysNormal, pointOnPlane, edge1, edge2, temp;
00388 VERTEX ptA, ptB, outpts[4], inpts[4], intersection;
00389 int count = 0, out_c = 0, in_c = 0, sideA, sideB, outputFlag;
00390 VERTEX texvert1, texvert2;
00391 VECTOR t1, t2;
00392 float scale;
00393
00394
00395 pointOnPlane.x = planeTriangle.Vertex[0].x;
00396 pointOnPlane.y = planeTriangle.Vertex[0].y;
00397 pointOnPlane.z = planeTriangle.Vertex[0].z;
00398
00399
00400 edge1.x = planeTriangle.Vertex[1].x - planeTriangle.Vertex[0].x;
00401 edge1.y = planeTriangle.Vertex[1].y - planeTriangle.Vertex[0].y;
00402 edge1.z = planeTriangle.Vertex[1].z - planeTriangle.Vertex[0].z;
00403 edge2.x = planeTriangle.Vertex[2].x - planeTriangle.Vertex[0].x;
00404 edge2.y = planeTriangle.Vertex[2].y - planeTriangle.Vertex[0].y;
00405 edge2.z = planeTriangle.Vertex[2].z - planeTriangle.Vertex[0].z;
00406 planeNormal = CrossVector(edge1, edge2);
00407
00408
00409 edge1.x = triangleToSplit.Vertex[1].x - triangleToSplit.Vertex[0].x;
00410 edge1.y = triangleToSplit.Vertex[1].y - triangleToSplit.Vertex[0].y;
00411 edge1.z = triangleToSplit.Vertex[1].z - triangleToSplit.Vertex[0].z;
00412 edge2.x = triangleToSplit.Vertex[2].x - triangleToSplit.Vertex[0].x;
00413 edge2.y = triangleToSplit.Vertex[2].y - triangleToSplit.Vertex[0].y;
00414 edge2.z = triangleToSplit.Vertex[2].z - triangleToSplit.Vertex[0].z;
00415 polysNormal = CrossVector(edge1, edge2);
00416
00417
00418 for (int loop = 0; loop < 3; loop++)
00419 {
00420 temp.x = triangleToSplit.Vertex[loop].x;
00421 temp.y = triangleToSplit.Vertex[loop].y;
00422 temp.z = triangleToSplit.Vertex[loop].z;
00423 if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 0)
00424 count++;
00425 else
00426 break;
00427 }
00428 if (count == 3)
00429 {
00430 if (ClassifyPoint(polysNormal, pointOnPlane, planeNormal) == 1)
00431 return Front;
00432 if (ClassifyPoint(polysNormal, pointOnPlane, planeNormal) == -1)
00433 return Back;
00434 }
00435
00436
00437 int frontcount = 0, backcount = 0;
00438 for (int loop = 0; loop < 3; loop++)
00439 {
00440 temp.x = triangleToSplit.Vertex[loop].x;
00441 temp.y = triangleToSplit.Vertex[loop].y;
00442 temp.z = triangleToSplit.Vertex[loop].z;
00443 if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 0)
00444 {
00445 frontcount++;
00446 backcount++;
00447 }
00448 else if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 1)
00449 frontcount++;
00450 else if (ClassifyPoint(temp, pointOnPlane, planeNormal) == -1)
00451 backcount++;
00452 }
00453 if (frontcount == 3)
00454 return Front;
00455 if (backcount == 3)
00456 return Back;
00457
00458
00459 ptA = triangleToSplit.Vertex[2];
00460 temp.x = ptA.x;
00461 temp.y = ptA.y;
00462 temp.z = ptA.z;
00463 sideA = ClassifyPoint(temp, pointOnPlane, planeNormal);
00464 for (int i = -1; ++i < 3;)
00465 {
00466 ptB = triangleToSplit.Vertex[i];
00467 temp.x = ptB.x;
00468 temp.y = ptB.y;
00469 temp.z = ptB.z;
00470 sideB = ClassifyPoint(temp, pointOnPlane, planeNormal);
00471 if (sideB > 0)
00472 {
00473 if (sideA < 0)
00474 {
00475
00476 edge1.x = ptA.x;
00477 edge1.y = ptA.y;
00478 edge1.z = ptA.z;
00479 edge2.x = ptB.x;
00480 edge2.y = ptB.y;
00481 edge2.z = ptB.z;
00482
00483 temp = GetEdgeIntersection(edge1, edge2, planeTriangle);
00484 intersection.x = temp.x;
00485 intersection.y = temp.y;
00486 intersection.z = temp.z;
00487
00488
00489 texvert1.x = ptB.x - ptA.x;
00490 texvert1.y = ptB.y - ptA.y;
00491 texvert1.z = ptB.z - ptA.z;
00492 texvert2.x = intersection.x - ptA.x;
00493 texvert2.y = intersection.y - ptA.y;
00494 texvert2.z = intersection.z - ptA.z;
00495 texvert1.u = ptA.u;
00496 texvert2.u = ptB.u;
00497 texvert1.v = ptA.v;
00498 texvert2.v = ptB.v;
00499 t1.x = texvert1.x;
00500 t1.y = texvert1.y;
00501 t1.z = texvert1.z;
00502 t2.x = texvert2.x;
00503 t2.y = texvert2.y;
00504 t2.z = texvert2.z;
00505 scale = sqrt(t2.x*t2.x+t2.y*t2.y+t2.z*t2.z)/sqrt(t1.x*t1.x+t1.y*t1.y+t1.z*t1.z);
00506 intersection.u = texvert1.u + (texvert2.u - texvert1.u) * scale;
00507 intersection.v = texvert1.v + (texvert2.v - texvert1.v) * scale;
00508
00509 outpts[out_c++] = inpts[in_c++] = intersection;
00510 }
00511 inpts[in_c++] = ptB;
00512 }
00513 else if (sideB < 0)
00514 {
00515 if (sideA > 0)
00516 {
00517
00518 edge1.x = ptA.x;
00519 edge1.y = ptA.y;
00520 edge1.z = ptA.z;
00521 edge2.x = ptB.x;
00522 edge2.y = ptB.y;
00523 edge2.z = ptB.z;
00524
00525 temp = GetEdgeIntersection(edge1, edge2, planeTriangle);
00526 intersection.x = temp.x;
00527 intersection.y = temp.y;
00528 intersection.z = temp.z;
00529
00530
00531 texvert1.x = ptB.x - ptA.x;
00532 texvert1.y = ptB.y - ptA.y;
00533 texvert1.z = ptB.z - ptA.z;
00534 texvert2.x = intersection.x - ptA.x;
00535 texvert2.y = intersection.y - ptA.y;
00536 texvert2.z = intersection.z - ptA.z;
00537 texvert1.u = ptA.u;
00538 texvert2.u = ptB.u;
00539 texvert1.v = ptA.v;
00540 texvert2.v = ptB.v;
00541 t1.x = texvert1.x;
00542 t1.y = texvert1.y;
00543 t1.z = texvert1.z;
00544 t2.x = texvert2.x;
00545 t2.y = texvert2.y;
00546 t2.z = texvert2.z;
00547 scale = sqrt(t2.x*t2.x+t2.y*t2.y+t2.z*t2.z)/sqrt(t1.x*t1.x+t1.y*t1.y+t1.z*t1.z);
00548 intersection.u = texvert1.u + (texvert2.u - texvert1.u) * scale;
00549 intersection.v = texvert1.v + (texvert2.v - texvert1.v) * scale;
00550
00551 outpts[out_c++] = inpts[in_c++] = intersection;
00552 }
00553 outpts[out_c++] = ptB;
00554 }
00555 else
00556 outpts[out_c++] = inpts[in_c++] = ptB;
00557 ptA = ptB;
00558 sideA = sideB;
00559 }
00560
00561 if (in_c == 4)
00562 {
00563 outputFlag = TwoFrontOneBack;
00564 if (triangles)
00565 {
00566 triangles[0].Vertex[0] = inpts[0];
00567 triangles[0].Vertex[1] = inpts[1];
00568 triangles[0].Vertex[2] = inpts[2];
00569 triangles[0].numVertices = 3;
00570 triangles[0].SetNormal();
00571 triangles[1].Vertex[0] = inpts[0];
00572 triangles[1].Vertex[1] = inpts[2];
00573 triangles[1].Vertex[2] = inpts[3];
00574 triangles[1].numVertices = 3;
00575 triangles[1].SetNormal();
00576 triangles[2].Vertex[0] = outpts[0];
00577 triangles[2].Vertex[1] = outpts[1];
00578 triangles[2].Vertex[2] = outpts[2];
00579 triangles[2].numVertices = 3;
00580 triangles[2].SetNormal();
00581 }
00582 }
00583 else if (out_c == 4)
00584 {
00585 outputFlag = OneFrontTwoBack;
00586 if (triangles)
00587 {
00588 triangles[0].Vertex[0] = inpts[0];
00589 triangles[0].Vertex[1] = inpts[1];
00590 triangles[0].Vertex[2] = inpts[2];
00591 triangles[0].numVertices = 3;
00592 triangles[0].SetNormal();
00593 triangles[1].Vertex[0] = outpts[0];
00594 triangles[1].Vertex[1] = outpts[1];
00595 triangles[1].Vertex[2] = outpts[2];
00596 triangles[1].numVertices = 3;
00597 triangles[1].SetNormal();
00598 triangles[2].Vertex[0] = outpts[0];
00599 triangles[2].Vertex[1] = outpts[2];
00600 triangles[2].Vertex[2] = outpts[3];
00601 triangles[2].numVertices = 3;
00602 triangles[2].SetNormal();
00603 }
00604 }
00605 else if (in_c == 3 && out_c == 3)
00606 {
00607 outputFlag = OneFrontOneBack;
00608 if (triangles)
00609 {
00610 triangles[0].Vertex[0] = inpts[0];
00611 triangles[0].Vertex[1] = inpts[1];
00612 triangles[0].Vertex[2] = inpts[2];
00613 triangles[0].numVertices = 3;
00614 triangles[0].SetNormal();
00615 triangles[1].Vertex[0] = outpts[0];
00616 triangles[1].Vertex[1] = outpts[1];
00617 triangles[1].Vertex[2] = outpts[2];
00618 triangles[1].numVertices = 3;
00619 triangles[1].SetNormal();
00620 }
00621 }
00622 else
00623 {
00624 int side;
00625
00626 for (int loop = 0; loop < 3; loop++)
00627 {
00628 temp.x = triangleToSplit.Vertex[loop].x;
00629 temp.y = triangleToSplit.Vertex[loop].y;
00630 temp.z = triangleToSplit.Vertex[loop].z;
00631 side = ClassifyPoint(temp, pointOnPlane, planeNormal);
00632 if (side == 1)
00633 {
00634 outputFlag = Front;
00635 break;
00636 }
00637 else if (side == -1)
00638 {
00639 outputFlag = Back;
00640 break;
00641 }
00642 }
00643 }
00644 return outputFlag;
00645 }
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712