#include <windows.h>#include "polygon.h"#include "locmath.h"#include "collision.h"#include "general.h"#include "bsp.h"#include "mmgr.h"Go to the source code of this file.
Functions | |
| VECTOR | GetEdgeIntersection (VECTOR point0, VECTOR point1, POLYGON planePolygon) |
| int | SplitPolygon (POLYGON triangleToSplit, POLYGON planeTriangle, POLYGON *triangles) |
|
||||||||||||||||
|
Definition at line 67 of file polygon.cpp. References CrossVector(), DotProduct(), POLYGON::Vertex, VECTOR::x, VERTEX::x, VECTOR::y, VERTEX::y, VECTOR::z, and VERTEX::z. Referenced by SplitPolygon(), and SplitPortal().
00068 {
00069 VECTOR edge1, edge2, planeNormal, pointOnPlane, intersection, temp;
00070 float numerator, denominator, t;
00071
00072 // get a point on the plane
00073 pointOnPlane.x = planePolygon.Vertex[0].x;
00074 pointOnPlane.y = planePolygon.Vertex[0].y;
00075 pointOnPlane.z = planePolygon.Vertex[0].z;
00076
00077 // get the splitting planes normal
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 // find edge intersection:
00087 // intersection = p0 + (p1 - p0) * t
00088 // where t = (planeNormal . (pointOnPlane - p0)) / (planeNormal . (p1 - p0))
00089
00090 //planeNormal . (pointOnPlane - point0)
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 //planeNormal . (point1 - point0)
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 }
|
|
||||||||||||||||
|
Definition at line 385 of file polygon.cpp. References Back, ClassifyPoint(), CrossVector(), Front, GetEdgeIntersection(), POLYGON::numVertices, OneFrontOneBack, OneFrontTwoBack, POLYGON::SetNormal(), TwoFrontOneBack, VERTEX::u, VERTEX::v, POLYGON::Vertex, VECTOR::x, VERTEX::x, VECTOR::y, VERTEX::y, VECTOR::z, and VERTEX::z. Referenced by BuildBSP(), and SelectPartitionfromList().
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; // texture calculation variables
00391 VECTOR t1, t2;
00392 float scale;
00393
00394 // get a point on the plane
00395 pointOnPlane.x = planeTriangle.Vertex[0].x;
00396 pointOnPlane.y = planeTriangle.Vertex[0].y;
00397 pointOnPlane.z = planeTriangle.Vertex[0].z;
00398
00399 // get the splitting planes normal
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 // get the normal of the triangle to split
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 // check if the triangle lies on the plane
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 // find if all of the points are infront of or behind the plane
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 // try to split the triangle
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 // find intersection
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 // find the new texture coordinates
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 // find intersection
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 // find the new texture coordinates
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) // two triangles are infront, one behind
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) // one triangle is infront, two behind
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) // plane bisects the triangle
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 // then triangle must be totally infront of or behind the plane
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 }
|
1.2.15