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 POLYGON::POLYGON()
00010 :
00011 numVertices(3)
00012 {
00013
00014 }
00015
00016 POLYGON::~POLYGON()
00017 {
00018 }
00019
00020 VECTOR POLYGON::GetNormal()
00021 {
00022 VECTOR temp;
00023 float ux;
00024 float uy;
00025 float uz;
00026 float vx;
00027 float vy;
00028 float vz;
00029 ux = Vertex[1].x - Vertex[0].x;
00030 uy = Vertex[1].y - Vertex[0].y;
00031 uz = Vertex[1].z - Vertex[0].z;
00032 vx = Vertex[2].x - Vertex[0].x;
00033 vy = Vertex[2].y - Vertex[0].y;
00034 vz = Vertex[2].z - Vertex[0].z;
00035 temp.x = (uy*vz)-(vy*uz);
00036 temp.y = (uz*vx)-(vz*ux);
00037 temp.z = (ux*vy)-(vx*uy);
00038 return temp;
00039 }
00040
00041 void POLYGON::SetNormal()
00042 {
00043 float ux;
00044 float uy;
00045 float uz;
00046 float vx;
00047 float vy;
00048 float vz;
00049 ux = Vertex[1].x - Vertex[0].x;
00050 uy = Vertex[1].y - Vertex[0].y;
00051 uz = Vertex[1].z - Vertex[0].z;
00052 vx = Vertex[2].x - Vertex[0].x;
00053 vy = Vertex[2].y - Vertex[0].y;
00054 vz = Vertex[2].z - Vertex[0].z;
00055 Vertex[0].nx = (uy*vz)-(vy*uz);
00056 Vertex[0].ny = (uz*vx)-(vz*ux);
00057 Vertex[0].nz = (ux*vy)-(vx*uy);
00058 Vertex[1].nx = Vertex[0].nx;
00059 Vertex[1].ny = Vertex[0].ny;
00060 Vertex[1].nz = Vertex[0].nz;
00061 Vertex[2].nx = Vertex[0].nx;
00062 Vertex[2].ny = Vertex[0].ny;
00063 Vertex[2].nz = Vertex[0].nz;
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
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 int SplitPolygon(POLYGON triangleToSplit, POLYGON planeTriangle, POLYGON* triangles)
00338 {
00339 VECTOR planeNormal, polysNormal, pointOnPlane, edge1, edge2, temp;
00340 VERTEX ptA, ptB, outpts[4], inpts[4], intersection;
00341 int count = 0, out_c = 0, in_c = 0, sideA, sideB, outputFlag;
00342 VERTEX texvert1, texvert2;
00343 VECTOR t1, t2;
00344 float scale;
00345
00346
00347 pointOnPlane.x = planeTriangle.Vertex[0].x;
00348 pointOnPlane.y = planeTriangle.Vertex[0].y;
00349 pointOnPlane.z = planeTriangle.Vertex[0].z;
00350
00351
00352 edge1.x = planeTriangle.Vertex[1].x - planeTriangle.Vertex[0].x;
00353 edge1.y = planeTriangle.Vertex[1].y - planeTriangle.Vertex[0].y;
00354 edge1.z = planeTriangle.Vertex[1].z - planeTriangle.Vertex[0].z;
00355 edge2.x = planeTriangle.Vertex[2].x - planeTriangle.Vertex[0].x;
00356 edge2.y = planeTriangle.Vertex[2].y - planeTriangle.Vertex[0].y;
00357 edge2.z = planeTriangle.Vertex[2].z - planeTriangle.Vertex[0].z;
00358 planeNormal = CrossVector(edge1, edge2);
00359
00360
00361 edge1.x = triangleToSplit.Vertex[1].x - triangleToSplit.Vertex[0].x;
00362 edge1.y = triangleToSplit.Vertex[1].y - triangleToSplit.Vertex[0].y;
00363 edge1.z = triangleToSplit.Vertex[1].z - triangleToSplit.Vertex[0].z;
00364 edge2.x = triangleToSplit.Vertex[2].x - triangleToSplit.Vertex[0].x;
00365 edge2.y = triangleToSplit.Vertex[2].y - triangleToSplit.Vertex[0].y;
00366 edge2.z = triangleToSplit.Vertex[2].z - triangleToSplit.Vertex[0].z;
00367 polysNormal = CrossVector(edge1, edge2);
00368
00369
00370 for (int loop = 0; loop < 3; loop++)
00371 {
00372 temp.x = triangleToSplit.Vertex[loop].x;
00373 temp.y = triangleToSplit.Vertex[loop].y;
00374 temp.z = triangleToSplit.Vertex[loop].z;
00375 if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 0)
00376 count++;
00377 else
00378 break;
00379 }
00380 if (count == 3)
00381 {
00382 if (ClassifyPoint(polysNormal, pointOnPlane, planeNormal) == 1)
00383 return Front;
00384 if (ClassifyPoint(polysNormal, pointOnPlane, planeNormal) == -1)
00385 return Back;
00386 }
00387
00388
00389 int frontcount = 0, backcount = 0;
00390 for (int loop = 0; loop < 3; loop++)
00391 {
00392 temp.x = triangleToSplit.Vertex[loop].x;
00393 temp.y = triangleToSplit.Vertex[loop].y;
00394 temp.z = triangleToSplit.Vertex[loop].z;
00395 if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 0)
00396 {
00397 frontcount++;
00398 backcount++;
00399 }
00400 else if (ClassifyPoint(temp, pointOnPlane, planeNormal) == 1)
00401 frontcount++;
00402 else if (ClassifyPoint(temp, pointOnPlane, planeNormal) == -1)
00403 backcount++;
00404 }
00405 if (frontcount == 3)
00406 return Front;
00407 if (backcount == 3)
00408 return Back;
00409
00410
00411 ptA = triangleToSplit.Vertex[2];
00412 temp.x = ptA.x;
00413 temp.y = ptA.y;
00414 temp.z = ptA.z;
00415 sideA = ClassifyPoint(temp, pointOnPlane, planeNormal);
00416 for (int i = -1; ++i < 3;)
00417 {
00418 ptB = triangleToSplit.Vertex[i];
00419 temp.x = ptB.x;
00420 temp.y = ptB.y;
00421 temp.z = ptB.z;
00422 sideB = ClassifyPoint(temp, pointOnPlane, planeNormal);
00423 if (sideB > 0)
00424 {
00425 if (sideA < 0)
00426 {
00427
00428 edge1.x = ptA.x;
00429 edge1.y = ptA.y;
00430 edge1.z = ptA.z;
00431 edge2.x = ptB.x;
00432 edge2.y = ptB.y;
00433 edge2.z = ptB.z;
00434
00435 temp = GetEdgeIntersection(edge1, edge2, planeTriangle);
00436 intersection.x = temp.x;
00437 intersection.y = temp.y;
00438 intersection.z = temp.z;
00439
00440
00441 texvert1.x = ptB.x - ptA.x;
00442 texvert1.y = ptB.y - ptA.y;
00443 texvert1.z = ptB.z - ptA.z;
00444 texvert2.x = intersection.x - ptA.x;
00445 texvert2.y = intersection.y - ptA.y;
00446 texvert2.z = intersection.z - ptA.z;
00447 texvert1.u = ptA.u;
00448 texvert2.u = ptB.u;
00449 texvert1.v = ptA.v;
00450 texvert2.v = ptB.v;
00451 t1.x = texvert1.x;
00452 t1.y = texvert1.y;
00453 t1.z = texvert1.z;
00454 t2.x = texvert2.x;
00455 t2.y = texvert2.y;
00456 t2.z = texvert2.z;
00457 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);
00458 intersection.u = texvert1.u + (texvert2.u - texvert1.u) * scale;
00459 intersection.v = texvert1.v + (texvert2.v - texvert1.v) * scale;
00460
00461 outpts[out_c++] = inpts[in_c++] = intersection;
00462 }
00463 inpts[in_c++] = ptB;
00464 }
00465 else if (sideB < 0)
00466 {
00467 if (sideA > 0)
00468 {
00469
00470 edge1.x = ptA.x;
00471 edge1.y = ptA.y;
00472 edge1.z = ptA.z;
00473 edge2.x = ptB.x;
00474 edge2.y = ptB.y;
00475 edge2.z = ptB.z;
00476
00477 temp = GetEdgeIntersection(edge1, edge2, planeTriangle);
00478 intersection.x = temp.x;
00479 intersection.y = temp.y;
00480 intersection.z = temp.z;
00481
00482
00483 texvert1.x = ptB.x - ptA.x;
00484 texvert1.y = ptB.y - ptA.y;
00485 texvert1.z = ptB.z - ptA.z;
00486 texvert2.x = intersection.x - ptA.x;
00487 texvert2.y = intersection.y - ptA.y;
00488 texvert2.z = intersection.z - ptA.z;
00489 texvert1.u = ptA.u;
00490 texvert2.u = ptB.u;
00491 texvert1.v = ptA.v;
00492 texvert2.v = ptB.v;
00493 t1.x = texvert1.x;
00494 t1.y = texvert1.y;
00495 t1.z = texvert1.z;
00496 t2.x = texvert2.x;
00497 t2.y = texvert2.y;
00498 t2.z = texvert2.z;
00499 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);
00500 intersection.u = texvert1.u + (texvert2.u - texvert1.u) * scale;
00501 intersection.v = texvert1.v + (texvert2.v - texvert1.v) * scale;
00502
00503 outpts[out_c++] = inpts[in_c++] = intersection;
00504 }
00505 outpts[out_c++] = ptB;
00506 }
00507 else
00508 outpts[out_c++] = inpts[in_c++] = ptB;
00509 ptA = ptB;
00510 sideA = sideB;
00511 }
00512
00513 if (in_c == 4)
00514 {
00515 outputFlag = TwoFrontOneBack;
00516 if (triangles)
00517 {
00518 triangles[0].Vertex[0] = inpts[0];
00519 triangles[0].Vertex[1] = inpts[1];
00520 triangles[0].Vertex[2] = inpts[2];
00521 triangles[0].numVertices = 3;
00522 triangles[0].SetNormal();
00523 triangles[1].Vertex[0] = inpts[0];
00524 triangles[1].Vertex[1] = inpts[2];
00525 triangles[1].Vertex[2] = inpts[3];
00526 triangles[1].numVertices = 3;
00527 triangles[1].SetNormal();
00528 triangles[2].Vertex[0] = outpts[0];
00529 triangles[2].Vertex[1] = outpts[1];
00530 triangles[2].Vertex[2] = outpts[2];
00531 triangles[2].numVertices = 3;
00532 triangles[2].SetNormal();
00533 }
00534 }
00535 else if (out_c == 4)
00536 {
00537 outputFlag = OneFrontTwoBack;
00538 if (triangles)
00539 {
00540 triangles[0].Vertex[0] = inpts[0];
00541 triangles[0].Vertex[1] = inpts[1];
00542 triangles[0].Vertex[2] = inpts[2];
00543 triangles[0].numVertices = 3;
00544 triangles[0].SetNormal();
00545 triangles[1].Vertex[0] = outpts[0];
00546 triangles[1].Vertex[1] = outpts[1];
00547 triangles[1].Vertex[2] = outpts[2];
00548 triangles[1].numVertices = 3;
00549 triangles[1].SetNormal();
00550 triangles[2].Vertex[0] = outpts[0];
00551 triangles[2].Vertex[1] = outpts[2];
00552 triangles[2].Vertex[2] = outpts[3];
00553 triangles[2].numVertices = 3;
00554 triangles[2].SetNormal();
00555 }
00556 }
00557 else if (in_c == 3 && out_c == 3)
00558 {
00559 outputFlag = OneFrontOneBack;
00560 if (triangles)
00561 {
00562 triangles[0].Vertex[0] = inpts[0];
00563 triangles[0].Vertex[1] = inpts[1];
00564 triangles[0].Vertex[2] = inpts[2];
00565 triangles[0].numVertices = 3;
00566 triangles[0].SetNormal();
00567 triangles[1].Vertex[0] = outpts[0];
00568 triangles[1].Vertex[1] = outpts[1];
00569 triangles[1].Vertex[2] = outpts[2];
00570 triangles[1].numVertices = 3;
00571 triangles[1].SetNormal();
00572 }
00573 }
00574 else
00575 {
00576 int side;
00577
00578 for (int loop = 0; loop < 3; loop++)
00579 {
00580 temp.x = triangleToSplit.Vertex[loop].x;
00581 temp.y = triangleToSplit.Vertex[loop].y;
00582 temp.z = triangleToSplit.Vertex[loop].z;
00583 side = ClassifyPoint(temp, pointOnPlane, planeNormal);
00584 if (side == 1)
00585 {
00586 outputFlag = Front;
00587 break;
00588 }
00589 else if (side == -1)
00590 {
00591 outputFlag = Back;
00592 break;
00593 }
00594 }
00595 }
00596 return outputFlag;
00597 }
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664