//************************************************************************************* //************************************************************************************* BOOL IsObjectVertexInValidPosition(EERIE_3DOBJ * obj, long kk, long flags, long source) { EERIEPOLY * back_ep = CheckInPolyPrecis(obj->pbox->vert[kk].pos.x, obj->pbox->vert[kk].pos.y, obj->pbox->vert[kk].pos.z); if (!back_ep) { EERIE_3D posi; Vector_Copy(&posi, &obj->pbox->vert[kk].pos); posi.y -= 30.f; CUR_COLLISION_MATERIAL = MATERIAL_STONE; return FALSE; } if (!(flags & 1)) { EERIE_SPHERE sphere; EERIE_3D * pos = &obj->pbox->vert[kk].pos; sphere.origin.x = pos->x; sphere.origin.y = pos->y; sphere.origin.z = pos->z; sphere.radius = 8.f; if (ARX_INTERACTIVE_CheckCollision(obj, kk, source)) { CUR_COLLISION_MATERIAL = 11; return FALSE; } } return TRUE; }
EERIEPOLY * ANCHOR_CheckInPoly(float x, float y, float z) { long px, pz; F2L(x * ACTIVEBKG->Xmul, &px); if (px >= ACTIVEBKG->Xsize) { return NULL; } if (px < 0) { return NULL; } F2L(z * ACTIVEBKG->Zmul, &pz); if (pz >= ACTIVEBKG->Zsize) { return NULL; } if (pz < 0) { return NULL; } EERIEPOLY * ep; FAST_BKG_DATA * feg; EERIEPOLY * found = NULL; feg = &ACTIVEBKG->fastdata[px][pz]; for (long k = 0; k < feg->nbpolyin; k++) { ep = feg->polyin[k]; if (!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && (ep->max.y >= y) && (ep != found) && ((ep->norm.y < 0.f) || ((ep->type & POLY_QUAD) && (ep->norm2.y < 0.f))) && (PointIn2DPolyXZ(ep, x, z))) { if ((found == NULL) || ((found != NULL) && (ep->min.y < found->min.y))) found = ep; } } if (!found) return CheckInPolyPrecis(x, y, z); return found; }