bool CheckInsidePoly(float x1, float y1, float x2, float y2, float x3, float y3, float px, float py)
{
float check = ((x2 - x1) * (py - y1)) - ((px - x1) * (y2 - y1));
if (check > 0.0) {
check = ((x3 - x2) * (py - y2)) - ((px - x2) * (y3 - y2));
if (check > 0.0) {
check = ((x1 - x3) * (py - y3)) - ((px - x3) * (y1 - y3));
if (check > 0.0)
return true;
};
};
check = ((x2 - x1) * (py - y1)) - ((px - x1) * (y2 - y1));
if (-check > 0.0) {
check = ((x3 - x2) * (py - y2)) - ((px - x2) * (y3 - y2));
if (-check > 0.0) {
check = ((x1 - x3) * (py - y3)) - ((px - x3) * (y1 - y3));
if (-check > 0.0)
return true;
};
};
return false;
};
void CheckCollision3D()
{
ColCounter = 0;
int i, j, k;
bool Or1, Or2, Or3;
float x1, x2, y1, y2, z1, z2; //Richtungsvektoren
float ex, ey, ez; //Ebene
float b, t;
float x_fix, y_fix, z_fix;
float uuu, vvv, www, uuu1, vvv1, www1, uuu2, vvv2, www2;
double dist;
for (i=0;i<Mapcounter;i++) {
for (k=0;k<Objcounter;k++) {
if (ObjectName[k] == MapInfoName[i])
break;
};
for (j=0;j<VertexCounter[k];j++) {
Or1 = CheckInsidePoly(Object[k][j][0][0]+MapInfo[i][0], Object[k][j][0][2]+MapInfo[i][2], Object[k][j][1][0]+MapInfo[i][0], Object[k][j][1][2]+MapInfo[i][2], Object[k][j][2][0]+MapInfo[i][0], Object[k][j][2][2]+MapInfo[i][2], Move_x, Move_z); //Y-Col
Or2 = CheckInsidePoly(Object[k][j][0][1]+MapInfo[i][1], Object[k][j][0][2]+MapInfo[i][2], Object[k][j][1][1]+MapInfo[i][1], Object[k][j][1][2]+MapInfo[i][2], Object[k][j][2][1]+MapInfo[i][1], Object[k][j][2][2]+MapInfo[i][2], Move_y, Move_z); //X-Col
//Aktuelles Polygone
uuu = Collision[ColCounter][0] = Object[k][j][0][0]+MapInfo[i][0];
vvv = Collision[ColCounter][1] = Object[k][j][0][1]+MapInfo[i][1];
www = Collision[ColCounter][2] = Object[k][j][0][2]+MapInfo[i][2];
uuu1 = Collision[ColCounter][3] = Object[k][j][1][0]+MapInfo[i][0];
vvv1 = Collision[ColCounter][4] = Object[k][j][1][1]+MapInfo[i][1];
www1 = Collision[ColCounter][5] = Object[k][j][1][2]+MapInfo[i][2];
uuu2 = Collision[ColCounter][6] = Object[k][j][2][0]+MapInfo[i][0];
vvv2 = Collision[ColCounter][7] = Object[k][j][2][1]+MapInfo[i][1];
www2 = Collision[ColCounter][8] = Object[k][j][2][2]+MapInfo[i][2];
x1 = uuu1 - uuu;
x2 = uuu2 - uuu;
y1 = vvv1 - vvv;
y2 = vvv2 - vvv;
z1 = www1 - www;
z2 = www2 - www;
//Ebene mit Kreuzprodukt
ex = (y1 * z2) - (z1 * y2);
ey = (z1 * x2) - (x1 * z2);
ez = (x1 * y2) - (y1 * x2);
if (Or1) {
ColCounter++;
b = ex * uuu + ey * vvv + ez * www;
t = (b - (Move_y * ey)) / ey;
final_x = Move_x;
final_y = Move_y + t;
final_z = Move_z;
y_fix = Move_y - final_y;
dist = sqrt(y_fix*y_fix);
if (dist < 1.5)
Move_y = Move_y_old;
};
if (Or2) {
ColCounter++;
b = ex * uuu + ey * vvv + ez * www;
t = (b - (Move_x * ex)) / ex;
final_x = Move_x + t;
final_y = Move_y;
final_z = Move_z;
x_fix = Move_x - final_x;
dist = sqrt(x_fix*x_fix);
if (dist < 1.5) {
Move_x = Move_x_old;
}
};
};
};
};