00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "selection.h"
00012 #include "camera.h"
00013 #include "general.h"
00014 #include "collision.h"
00015
00016 extern CAMERA* camera;
00017 extern int currentCamera;
00018
00019 int SelectPolygon(HWND hWnd, POLYGON* Polygons, int numPolys, int MouseX, int MouseY)
00020 {
00021 POLYGON tempPolygon;
00022 VECTOR CollisionPoint, p0, pN, a, b, c;
00023 int tempPolygonNumber;
00024 VECTOR tempVect;
00025 float Distance;
00026 VERTEX tempVertex;
00027 VECTOR WorldPos;
00028 float ShortestDistance = 10000000;
00029 bool flag = false;
00030
00031
00032 int numNewPolygons = 0;
00033 POLYGON newPolygon[30];
00034
00035
00036 double WorldPosX, WorldPosY, WorldPosZ, MousePosX, MousePosY, MousePosZ;
00037 double ModelMatrix[16];
00038 glGetDoublev(GL_MODELVIEW_MATRIX, ModelMatrix);
00039 double ProjMatrix[16];
00040 glGetDoublev(GL_PROJECTION_MATRIX, ProjMatrix);
00041
00042
00043 int Viewport[4];
00044 glGetIntegerv(GL_VIEWPORT, Viewport);
00045
00046 if (MouseX >= Viewport[0] && MouseX <= Viewport[2] && MouseY >= Viewport[1] && MouseY <= Viewport[3])
00047 {
00048
00049 MousePosX = MouseX;
00050 MousePosY = Viewport[3] - MouseY;
00051 MousePosZ = 0.5;
00052
00053
00054 gluUnProject
00055 (
00056 MousePosX,
00057 MousePosY,
00058 MousePosZ,
00059 ModelMatrix,
00060 ProjMatrix,
00061 Viewport,
00062 &WorldPosX,
00063 &WorldPosY,
00064 &WorldPosZ
00065 );
00066 WorldPos.x = WorldPosX;
00067 WorldPos.y = WorldPosY;
00068 WorldPos.z = WorldPosZ;
00069
00070
00071 for (int outerloop = 0; outerloop < numPolys; outerloop++)
00072 {
00073
00074 tempPolygon.Vertex[0] = Polygons[outerloop].Vertex[0];
00075 tempPolygon.Vertex[1] = Polygons[outerloop].Vertex[1];
00076 tempPolygon.Vertex[2] = Polygons[outerloop].Vertex[2];
00077 tempPolygon.numVertices = Polygons[outerloop].numVertices;
00078
00079 p0 = tempPolygon.Vertex[0].coords;
00080
00081 pN = tempPolygon.Vertex[0].normal;
00082
00083 CollisionPoint = line_plane_collision(&camera[currentCamera].Position, &WorldPos, &tempPolygon);
00084
00085 if (!CheckClipPlanes(camera[currentCamera], CollisionPoint))
00086 continue;
00087
00088
00089 numNewPolygons = 0;
00090 for (int innerloop = 2; innerloop < tempPolygon.numVertices; innerloop++)
00091 {
00092 numNewPolygons++;
00093 newPolygon[innerloop - 2].Vertex[0] = tempPolygon.Vertex[0];
00094 newPolygon[innerloop - 2].Vertex[1] = tempPolygon.Vertex[innerloop - 1];
00095 newPolygon[innerloop - 2].Vertex[2] = tempPolygon.Vertex[innerloop];
00096 }
00097
00098
00099 for (int innerloop = 0; innerloop < numNewPolygons; innerloop++)
00100 {
00101 a = newPolygon[innerloop].Vertex[0].coords;
00102 b = newPolygon[innerloop].Vertex[1].coords;
00103 c = newPolygon[innerloop].Vertex[2].coords;
00104 if (CheckPointInTriangle(CollisionPoint, a, b, c))
00105 {
00106
00107 tempVect = CollisionPoint - camera[currentCamera].Position;
00108 Distance = tempVect.GetMagnitude();
00109
00110 if (Distance < ShortestDistance)
00111 {
00112 tempPolygonNumber = outerloop;
00113 ShortestDistance = Distance;
00114 flag = true;
00115 }
00116 }
00117 }
00118 }
00119 if (flag)
00120 return tempPolygonNumber;
00121 else
00122 return -1;
00123 }
00124 }
00125