#include "polygon.h"#include "lightmap.h"#include "portal.h"#include "tll.h"Go to the source code of this file.
Compounds | |
| struct | BSP_node |
Typedefs | |
| typedef BSP_node | BSP_node |
Enumerations | |
| enum | { Front, Back, TwoFrontOneBack, OneFrontTwoBack, OneFrontOneBack, PortalWasSplit, OnPartition } |
Functions | |
| int | FindCurrentLeaf (VECTOR Position, BSP_node *node) |
| int | SplitPolygon (POLYGON, POLYGON, POLYGON *) |
| int | SelectPartitionfromList (POLYGON *nodepolylist, int numpolys, int *bestfront, int *bestback) |
| void | BuildBSP (BSP_node *node) |
| int | RenderBSP (BSP_node *node) |
| void | DeleteBSP (BSP_node *node) |
| void | DrawIntersectionSphere (VECTOR coordinates) |
|
|
|
|
|
Definition at line 10 of file bsp.h.
00010 {Front, Back, TwoFrontOneBack, OneFrontTwoBack, OneFrontOneBack, PortalWasSplit, OnPartition};
|
|
|
Definition at line 112 of file bsp.cpp. References Back, BSP_node::backnode, Front, BSP_node::frontnode, BSP_node::leaf, BSP_node::nodeid, BSP_node::nodepolylist, numleaves, numpartitions, BSP_node::numpolys, BSP_node::numportals, OneFrontOneBack, OneFrontTwoBack, BSP_node::partition, SelectPartitionfromList(), SplitPolygon(), TwoFrontOneBack, and BSP_node::visible. Referenced by InitGL().
00113 {
00114 int result, front, back, polytoclassify, partplane;
00115 POLYGON output[3];
00116
00117 partplane = SelectPartitionfromList(node->nodepolylist, node->numpolys, &front, &back);
00118
00119 if (partplane == -1)
00120 {
00121 node->nodeid = ++numleaves;
00122 node->leaf = true;
00123 return;
00124 }
00125
00126 node->nodeid = ++numpartitions;
00127 node->partition = node->nodepolylist[partplane];
00128
00129 //Allocate memory for a front and back node
00130 node->frontnode = new BSP_node;
00131 node->frontnode->visible = 0;
00132 node->frontnode->leaf = 0;
00133 node->frontnode->numpolys = front;
00134 node->frontnode->nodepolylist = new POLYGON[front];
00135 node->frontnode->numportals = 0;
00136
00137 node->backnode = new BSP_node;
00138 node->backnode->visible = 0;
00139 node->backnode->leaf = 0;
00140 node->backnode->numpolys = back;
00141 node->backnode->nodepolylist = new POLYGON[back];
00142 node->backnode->numportals = 0;
00143 //Classify each polygon in the current node with respect to the partitioning plane.
00144 front = back = 0;
00145 for (polytoclassify = 0; polytoclassify < node->numpolys; polytoclassify++)
00146 {
00147 output[0] = node->nodepolylist[polytoclassify];
00148 output[1] = node->nodepolylist[polytoclassify];
00149 output[2] = node->nodepolylist[polytoclassify];
00150
00151 result = SplitPolygon(node->nodepolylist[polytoclassify], node->partition, output);
00152 switch (result)
00153 {
00154 case Front:
00155 node->frontnode->nodepolylist[front] = node->nodepolylist[polytoclassify];
00156 front++;
00157 break;
00158
00159 case Back:
00160 node->backnode->nodepolylist[back] = node->nodepolylist[polytoclassify];
00161 back++;
00162 break;
00163
00164 case TwoFrontOneBack:
00165 node->frontnode->nodepolylist[front] = output[0];
00166 node->frontnode->nodepolylist[front + 1] = output[1];
00167 front += 2;
00168 node->backnode->nodepolylist[back] = output[2];
00169 back++;
00170 break;
00171
00172 case OneFrontTwoBack:
00173 node->frontnode->nodepolylist[front] = output[0];
00174 front++;
00175 node->backnode->nodepolylist[back] = output[1];
00176 node->backnode->nodepolylist[back + 1] = output[2];
00177 back += 2;
00178 break;
00179
00180 case OneFrontOneBack:
00181 node->frontnode->nodepolylist[front] = output[0];
00182 front++;
00183 node->backnode->nodepolylist[back] = output[1];
00184 back++;
00185 break;
00186 }
00187 }
00188
00189 node->numpolys = 0;
00190 delete[] node->nodepolylist;
00191 node->nodepolylist = 0;
00192 // delete[] node->nodelightmaplist;
00193
00194 BuildBSP(node->frontnode);
00195 BuildBSP(node->backnode);
00196 }
|
|
|
Definition at line 307 of file bsp.cpp. References BSP_node::backnode, LinkedList< PORTAL >::Delete(), BSP_node::frontnode, LinkedList< PORTAL >::Get(), BSP_node::leaf, BSP_node::nodelightmaplist, BSP_node::nodepolylist, BSP_node::numportals, BSP_node::portallist, and PORTAL::Vertex. Referenced by WndProc().
00308 {
00309 if (node->leaf == true)
00310 {
00311 delete[] node->nodepolylist;
00312 delete[] node->nodelightmaplist;
00313 for (int i = node->numportals; i > 0 ; i--)
00314 {
00315 PORTAL* temp = node->portallist.Get(i);
00316 delete[] temp->Vertex;
00317 node->portallist.Delete(i);
00318 delete temp;
00319 }
00320 node->numportals = 0;
00321 return;
00322 }
00323
00324 DeleteBSP(node->frontnode);
00325 delete node->frontnode;
00326 DeleteBSP(node->backnode);
00327 delete node->backnode;
00328 }
|
|
|
Definition at line 330 of file bsp.cpp. References VECTOR::x, VECTOR::y, and VECTOR::z.
00331 {
00332 float mat_ambient[] = { 0.2, 1.0, 0.1, 1.0 };
00333 float mat_diffuse[] = { 0.2, 1.0, 0.1, 1.0 };
00334 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
00335 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
00336 glDisable(GL_TEXTURE_2D);
00337 glPushMatrix();
00338 glTranslatef(coordinates.x, coordinates.y, coordinates.z);
00339 GLUquadricObj * sphere = gluNewQuadric();
00340 gluQuadricOrientation(sphere, GLU_OUTSIDE);
00341 gluSphere(sphere,0.3,20,20);
00342 glPopMatrix();
00343 glEnable(GL_TEXTURE_2D);
00344 }
|
|
||||||||||||
|
Definition at line 25 of file bsp.cpp. References BSP_node::backnode, ClassifyPoint(), CrossVector(), BSP_node::frontnode, BSP_node::leaf, BSP_node::nodeid, numcurrentportals, BSP_node::numportals, BSP_node::partition, POLYGON::Vertex, VERTEX::x, VECTOR::x, VERTEX::y, VECTOR::y, VERTEX::z, and VECTOR::z. Referenced by DrawGLScene().
00026 {
00027 if (node->leaf == true)
00028 {
00029 numcurrentportals = node->numportals;
00030 return node->nodeid;
00031 }
00032
00033 VECTOR edge1, edge2, planeNormal, temp;
00034 // get the partitioning planes normal
00035 edge1.x = node->partition.Vertex[1].x - node->partition.Vertex[0].x;
00036 edge1.y = node->partition.Vertex[1].y - node->partition.Vertex[0].y;
00037 edge1.z = node->partition.Vertex[1].z - node->partition.Vertex[0].z;
00038 edge2.x = node->partition.Vertex[2].x - node->partition.Vertex[0].x;
00039 edge2.y = node->partition.Vertex[2].y - node->partition.Vertex[0].y;
00040 edge2.z = node->partition.Vertex[2].z - node->partition.Vertex[0].z;
00041 planeNormal = CrossVector(edge1, edge2);
00042 temp.x = node->partition.Vertex[0].x;
00043 temp.y = node->partition.Vertex[0].y;
00044 temp.z = node->partition.Vertex[0].z;
00045
00046 int side = ClassifyPoint(Position, temp, planeNormal);
00047
00048 if (side == 1 || side == 0)
00049 {
00050 return FindCurrentLeaf(Position, node->frontnode);
00051 }
00052 else
00053 {
00054 return FindCurrentLeaf(Position, node->backnode);
00055 }
00056 }
|
|
|
Definition at line 198 of file bsp.cpp. References BSP_node::backnode, ClassifyPoint(), CrossVector(), currentCamera, currentleaf, BSP_node::frontnode, LinkedList< PORTAL >::Get(), BSP_node::leaf, BSP_node::nodeid, BSP_node::nodelightmaplist, BSP_node::nodepolylist, BSP_node::numpolys, BSP_node::numportals, PORTAL::numVertices, VERTEX::nx, BSP_node::partition, BSP_node::portallist, POLYGON::Rotate, POLYGON::Scale, POLYGON::Shift, TEXTURE::TexID, Lightmap::Texture, POLYGON::Texture, VERTEX::u, VERTEX::v, PORTAL::Vertex, POLYGON::Vertex, Lightmap::vertex_u, Lightmap::vertex_v, VERTEX::x, VECTOR::x, VERTEX::y, VECTOR::y, VERTEX::z, and VECTOR::z. Referenced by DrawWorld().
00199 {
00200 int Side;
00201 VECTOR Position, edge1, edge2, planeNormal, temp;
00202
00203 //The current position of the player/viewpoint
00204 Position.x = camera[currentCamera].Position.x;
00205 Position.y = camera[currentCamera].Position.y;
00206 Position.z = camera[currentCamera].Position.z;
00207
00208 if (!node->leaf)
00209 {
00210 // get the partitioning planes normal
00211 edge1.x = node->partition.Vertex[1].x - node->partition.Vertex[0].x;
00212 edge1.y = node->partition.Vertex[1].y - node->partition.Vertex[0].y;
00213 edge1.z = node->partition.Vertex[1].z - node->partition.Vertex[0].z;
00214 edge2.x = node->partition.Vertex[2].x - node->partition.Vertex[0].x;
00215 edge2.y = node->partition.Vertex[2].y - node->partition.Vertex[0].y;
00216 edge2.z = node->partition.Vertex[2].z - node->partition.Vertex[0].z;
00217 planeNormal = CrossVector(edge1, edge2);
00218 temp.x = node->partition.Vertex[0].x;
00219 temp.y = node->partition.Vertex[0].y;
00220 temp.z = node->partition.Vertex[0].z;
00221 Side = ClassifyPoint(Position, temp, planeNormal);
00222
00223 if (Side == -1)
00224 {
00225 RenderBSP(node->frontnode);
00226 RenderBSP(node->backnode);
00227 }
00228 else
00229 {
00230 RenderBSP(node->backnode);
00231 RenderBSP(node->frontnode);
00232 }
00233 }
00234
00235 if (node->leaf)
00236 {
00237 //Draw polygons that are in the leaf
00238 for (int loop = 0; loop < node->numpolys; loop++)
00239 {
00240 glMatrixMode(GL_TEXTURE);
00241 glPushMatrix();
00242
00243 glScalef(node->nodepolylist[loop].Scale[0], node->nodepolylist[loop].Scale[1], 1.0f);
00244 glTranslatef(node->nodepolylist[loop].Shift[0], node->nodepolylist[loop].Shift[1], 0.0f);
00245 glRotatef(node->nodepolylist[loop].Rotate, 0.0f, 0.0f, 1.0f);
00246 glBindTexture(GL_TEXTURE_2D, node->nodepolylist[loop].Texture);
00247 glBegin(GL_TRIANGLES);
00248 glNormal3fv(&node->nodepolylist[loop].Vertex[0].nx);
00249 glTexCoord2f(node->nodepolylist[loop].Vertex[0].u, node->nodepolylist[loop].Vertex[0].v);
00250 glVertex3fv(&node->nodepolylist[loop].Vertex[0].x);
00251 glTexCoord2f(node->nodepolylist[loop].Vertex[1].u, node->nodepolylist[loop].Vertex[1].v);
00252 glVertex3fv(&node->nodepolylist[loop].Vertex[1].x);
00253 glTexCoord2f(node->nodepolylist[loop].Vertex[2].u, node->nodepolylist[loop].Vertex[2].v);
00254 glVertex3fv(&node->nodepolylist[loop].Vertex[2].x);
00255 glEnd();
00256 glPopMatrix();
00257 glMatrixMode(GL_MODELVIEW);
00258
00259 glEnable(GL_BLEND);
00260 glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
00261
00262 glBindTexture(GL_TEXTURE_2D, node->nodelightmaplist[loop].Texture.TexID);
00263 glBegin(GL_TRIANGLES);
00264 glNormal3fv(&node->nodepolylist[loop].Vertex[0].nx);
00265 glTexCoord2f(node->nodelightmaplist[loop].vertex_u[0], node->nodelightmaplist[loop].vertex_v[0]);
00266 glVertex3fv(&node->nodepolylist[loop].Vertex[0].x);
00267 glTexCoord2f(node->nodelightmaplist[loop].vertex_u[1], node->nodelightmaplist[loop].vertex_v[1]);
00268 glVertex3fv(&node->nodepolylist[loop].Vertex[1].x);
00269 glTexCoord2f(node->nodelightmaplist[loop].vertex_u[2], node->nodelightmaplist[loop].vertex_v[2]);
00270 glVertex3fv(&node->nodepolylist[loop].Vertex[2].x);
00271 glEnd();
00272 glDisable(GL_BLEND);
00273 }
00274
00275 if (showportals)
00276 {
00277 // Draw the leaf portals
00278 glDisable(GL_TEXTURE_2D);
00279 glDisable(GL_LIGHTING);
00280 glEnable(GL_BLEND);
00281 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00282 glEnable(GL_ALPHA_TEST);
00283 glAlphaFunc(GL_GREATER, 0);
00284 glColor4f(1.0, 1.0, 0.0, 0.2);
00285
00286 if (currentleaf == node->nodeid)
00287 {
00288 for (int loop = 1; loop <= node->numportals; loop++)
00289 {
00290 PORTAL* tempportal = node->portallist.Get(loop);
00291 glBegin(GL_POLYGON);
00292 glNormal3fv(&tempportal->Vertex[0].nx);
00293 for (int innerloop = 0; innerloop < tempportal->numVertices; innerloop++)
00294 glVertex3f(tempportal->Vertex[innerloop].x, tempportal->Vertex[innerloop].y, tempportal->Vertex[innerloop].z);
00295 glEnd();
00296 }
00297 }
00298 glDisable(GL_BLEND);
00299 glDisable(GL_ALPHA_TEST);
00300 glEnable(GL_TEXTURE_2D);
00301 glEnable(GL_LIGHTING);
00302 }
00303 }
00304 return 1;
00305 }
|
|
||||||||||||||||||||
|
Definition at line 58 of file bsp.cpp. References Back, Front, OneFrontOneBack, OneFrontTwoBack, SplitPolygon(), and TwoFrontOneBack. Referenced by BuildBSP().
00059 {
00060 int count = 0, result, absdifference = 1000000000, bestplane = 0, front, back, potentialplane, polytoclassify;
00061 VECTOR temp;
00062
00063 // Loop through all the polygons and find the best splitting plane
00064 for(potentialplane = 0; potentialplane < numpolys; potentialplane++)
00065 {
00066 front = back = 0;
00067 for (polytoclassify = 0; polytoclassify < numpolys; polytoclassify++)
00068 {
00069 result = SplitPolygon(nodepolylist[polytoclassify], nodepolylist[potentialplane], NULL);
00070 switch (result)
00071 {
00072 case Front:
00073 front++;
00074 break;
00075
00076 case Back:
00077 back++;
00078 break;
00079
00080 case TwoFrontOneBack:
00081 front += 2;
00082 back++;
00083 break;
00084
00085 case OneFrontTwoBack:
00086 front++;
00087 back += 2;
00088 break;
00089
00090 case OneFrontOneBack:
00091 front++;
00092 back++;
00093 break;
00094 }
00095 }
00096 if (abs(front - back) < absdifference)
00097 {
00098 absdifference = abs(front - back);
00099 bestplane = potentialplane;
00100 *bestfront = front;
00101 *bestback = back;
00102 }
00103 if (front == 0 || back == 0)
00104 count++;
00105 }
00106 if (count == numpolys)
00107 return -1;
00108 else
00109 return bestplane;
00110 }
|
|
||||||||||||||||
|
Definition at line 337 of file polygon.cpp.
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; // texture calculation variables
00343 VECTOR t1, t2;
00344 float scale;
00345
00346 // get a point on the plane
00347 pointOnPlane.x = planeTriangle.Vertex[0].x;
00348 pointOnPlane.y = planeTriangle.Vertex[0].y;
00349 pointOnPlane.z = planeTriangle.Vertex[0].z;
00350
00351 // get the splitting planes normal
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 // get the normal of the triangle to split
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 // check if the triangle lies on the plane
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 // find if all of the points are infront of or behind the plane
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 // try to split the triangle
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 // find intersection
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 // find the new texture coordinates
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 // find intersection
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 // find the new texture coordinates
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) // two triangles are infront, one behind
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) // one triangle is infront, two behind
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) // plane bisects the triangle
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 // then triangle must be totally infront of or behind the plane
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 }
|
1.2.15