Al's Programming Resource Homepage  Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

polygon.cpp File Reference

#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)


Function Documentation

VECTOR GetEdgeIntersection VECTOR    point0,
VECTOR    point1,
POLYGON    planePolygon
 

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 }

int SplitPolygon POLYGON    triangleToSplit,
POLYGON    planeTriangle,
POLYGON   triangles
 

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 }


Generated on Fri Dec 23 05:21:41 2005 for Sound by doxygen1.2.15