static EERIEPOLY * CheckArrowPolyCollision(const Vec3f & start, const Vec3f & end) { EERIE_TRI pol; pol.v[0] = start; pol.v[2] = end - Vec3f(2.f, 15.f, 2.f); pol.v[1] = end; // TODO copy-paste background tiles short tilex = end.x * ACTIVEBKG->Xmul; short tilez = end.z * ACTIVEBKG->Zmul; short radius = 2; short minx = std::max(tilex - radius, 0); short maxx = std::min(tilex + radius, ACTIVEBKG->Xsize - 1); short minz = std::max(tilez - radius, 0); short maxz = std::min(tilez + radius, ACTIVEBKG->Zsize - 1); for(short z = minz; z <= maxz; z++) for(short x = minx; x <= maxx; x++) { const EERIE_BKG_INFO & feg = ACTIVEBKG->fastdata[x][z]; for(long l = 0; l < feg.nbpolyin; l++) { EERIEPOLY * ep = feg.polyin[l]; if(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) { continue; } EERIE_TRI pol2; pol2.v[0] = ep->v[0].p; pol2.v[1] = ep->v[1].p; pol2.v[2] = ep->v[2].p; if(Triangles_Intersect(pol2, pol)) { return ep; } if(ep->type & POLY_QUAD) { pol2.v[0] = ep->v[1].p; pol2.v[1] = ep->v[3].p; pol2.v[2] = ep->v[2].p; if(Triangles_Intersect(pol2, pol)) { return ep; } } } } return NULL; }
//************************************************************************************* // Checks is a triangle of a physical object is colliding a triangle //************************************************************************************* BOOL IsObjectVertexCollidingTriangle(EERIE_3DOBJ * obj, EERIE_3D * verts, long k, long * validd) { EERIE_TRI t1, t2; BOOL ret = FALSE; memcpy(&t2, verts, sizeof(EERIE_3D) * 3); PHYSVERT * vert = obj->pbox->vert; EERIE_3D center; center.x = (verts[0].x + verts[1].x + verts[2].x) * DIV3; center.y = (verts[0].y + verts[1].y + verts[2].y) * DIV3; center.z = (verts[0].z + verts[1].z + verts[2].z) * DIV3; float rad = EEDistance3D(¢er, &verts[0]); if (k == -1) { long nn = 0; for (; nn < obj->pbox->nb_physvert; nn++) { if (EEDistance3D(¢er, &vert[nn].pos) <= __max(60, rad + 25)) { nn = 1000; } } if (nn < 1000) return FALSE; } else { if (EEDistance3D(¢er, &vert[k].pos) > rad + 25) return FALSE; } //TOP if ((k == -1) || (k == 1) || (k == 2) || (k == 3)) { Vector_Copy(&t1.v[0], &vert[1].pos); Vector_Copy(&t1.v[1], &vert[2].pos); Vector_Copy(&t1.v[2], &vert[3].pos); PHYS_COLLIDER = 1; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[1] = 0; validd[2] = 0; validd[3] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 1) || (k == 4) || (k == 3)) { Vector_Copy(&t1.v[0], &vert[3].pos); Vector_Copy(&t1.v[1], &vert[4].pos); Vector_Copy(&t1.v[2], &vert[1].pos); PHYS_COLLIDER = 1; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[1] = 0; validd[3] = 0; validd[4] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //BOTTOM if ((k == -1) || (k == 9) || (k == 10) || (k == 12)) { Vector_Copy(&t1.v[0], &vert[10].pos); Vector_Copy(&t1.v[1], &vert[9].pos); Vector_Copy(&t1.v[2], &vert[11].pos); PHYS_COLLIDER = 9; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[0] = 0; validd[10] = 0; validd[12] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 10) || (k == 11) || (k == 12)) { Vector_Copy(&t1.v[0], &vert[9].pos); Vector_Copy(&t1.v[1], &vert[12].pos); Vector_Copy(&t1.v[2], &vert[11].pos); PHYS_COLLIDER = 10; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[10] = 0; validd[11] = 0; validd[12] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //UP/FRONT if ((k == -1) || (k == 1) || (k == 4) || (k == 5)) { Vector_Copy(&t1.v[0], &vert[1].pos); Vector_Copy(&t1.v[1], &vert[4].pos); Vector_Copy(&t1.v[2], &vert[5].pos); PHYS_COLLIDER = 4; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[1] = 0; validd[4] = 0; validd[5] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 4) || (k == 5) || (k == 8)) { Vector_Copy(&t1.v[0], &vert[4].pos); Vector_Copy(&t1.v[1], &vert[8].pos); Vector_Copy(&t1.v[2], &vert[5].pos); PHYS_COLLIDER = 5; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[4] = 0; validd[5] = 0; validd[8] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //DOWN/FRONT if ((k == -1) || (k == 5) || (k == 8) || (k == 9)) { Vector_Copy(&t1.v[0], &vert[5].pos); Vector_Copy(&t1.v[1], &vert[8].pos); Vector_Copy(&t1.v[2], &vert[9].pos); PHYS_COLLIDER = 8; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[5] = 0; validd[8] = 0; validd[9] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 8) || (k == 12) || (k == 9)) { Vector_Copy(&t1.v[0], &vert[8].pos); Vector_Copy(&t1.v[1], &vert[12].pos); Vector_Copy(&t1.v[2], &vert[9].pos); PHYS_COLLIDER = 12; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[8] = 0; validd[12] = 0; validd[9] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //UP/BACK if ((k == -1) || (k == 3) || (k == 2) || (k == 7)) { Vector_Copy(&t1.v[0], &vert[3].pos); Vector_Copy(&t1.v[1], &vert[2].pos); Vector_Copy(&t1.v[2], &vert[7].pos); PHYS_COLLIDER = 3; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[3] = 0; validd[2] = 0; validd[7] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 2) || (k == 6) || (k == 7)) { Vector_Copy(&t1.v[0], &vert[2].pos); Vector_Copy(&t1.v[1], &vert[6].pos); Vector_Copy(&t1.v[2], &vert[7].pos); PHYS_COLLIDER = 2; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[2] = 0; validd[6] = 0; validd[7] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //DOWN/BACK if ((k == -1) || (k == 7) || (k == 6) || (k == 11)) { Vector_Copy(&t1.v[0], &vert[7].pos); Vector_Copy(&t1.v[1], &vert[6].pos); Vector_Copy(&t1.v[2], &vert[11].pos); PHYS_COLLIDER = 7; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[6] = 0; validd[7] = 0; validd[11] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 6) || (k == 10) || (k == 11)) { Vector_Copy(&t1.v[0], &vert[6].pos); Vector_Copy(&t1.v[1], &vert[10].pos); Vector_Copy(&t1.v[2], &vert[11].pos); PHYS_COLLIDER = 6; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[6] = 0; validd[10] = 0; validd[11] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //UP/LEFT if ((k == -1) || (k == 1) || (k == 2) || (k == 6)) { Vector_Copy(&t1.v[0], &vert[6].pos); Vector_Copy(&t1.v[1], &vert[2].pos); Vector_Copy(&t1.v[2], &vert[1].pos); PHYS_COLLIDER = 2; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[1] = 0; validd[2] = 0; validd[6] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 1) || (k == 5) || (k == 6)) { Vector_Copy(&t1.v[0], &vert[1].pos); Vector_Copy(&t1.v[1], &vert[5].pos); Vector_Copy(&t1.v[2], &vert[6].pos); PHYS_COLLIDER = 5; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[1] = 0; validd[5] = 0; validd[6] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //DOWN/LEFT if ((k == -1) || (k == 10) || (k == 6) || (k == 5)) { Vector_Copy(&t1.v[0], &vert[10].pos); Vector_Copy(&t1.v[1], &vert[6].pos); Vector_Copy(&t1.v[2], &vert[5].pos); PHYS_COLLIDER = 6; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[10] = 0; validd[6] = 0; validd[5] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 5) || (k == 9) || (k == 10)) { Vector_Copy(&t1.v[0], &vert[5].pos); Vector_Copy(&t1.v[1], &vert[9].pos); Vector_Copy(&t1.v[2], &vert[10].pos); PHYS_COLLIDER = 5; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[5] = 0; validd[9] = 0; validd[10] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //UP/RIGHT if ((k == -1) || (k == 4) || (k == 3) || (k == 7)) { Vector_Copy(&t1.v[0], &vert[4].pos); Vector_Copy(&t1.v[1], &vert[3].pos); Vector_Copy(&t1.v[2], &vert[7].pos); PHYS_COLLIDER = 4; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[3] = 0; validd[4] = 0; validd[7] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 7) || (k == 8) || (k == 4)) { Vector_Copy(&t1.v[0], &vert[7].pos); Vector_Copy(&t1.v[1], &vert[8].pos); Vector_Copy(&t1.v[2], &vert[4].pos); PHYS_COLLIDER = 7; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[4] = 0; validd[7] = 0; validd[8] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif //DOWN/RIGHT if ((k == -1) || (k == 8) || (k == 7) || (k == 11)) { Vector_Copy(&t1.v[0], &vert[8].pos); Vector_Copy(&t1.v[1], &vert[7].pos); Vector_Copy(&t1.v[2], &vert[11].pos); PHYS_COLLIDER = 8; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[7] = 0; validd[8] = 0; validd[11] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #if FULLTESTS==TRUE if ((k == -1) || (k == 11) || (k == 12) || (k == 8)) { Vector_Copy(&t1.v[0], &vert[11].pos); Vector_Copy(&t1.v[1], &vert[12].pos); Vector_Copy(&t1.v[2], &vert[8].pos); PHYS_COLLIDER = 11; if (Triangles_Intersect(&t1, &t2)) { if (validd) { validd[8] = 0; validd[11] = 0; validd[12] = 0; ret = TRUE; } else return TRUE; }//MAKE_COLL_TEST } #endif return ret; }