static EERIEPOLY * ANCHOR_CheckInPoly(const Vec3f & pos) { long x = pos.x * ACTIVEBKG->Xmul; long z = pos.z * ACTIVEBKG->Zmul; if(x < 0 || x >= ACTIVEBKG->Xsize || z < 0 || z >= ACTIVEBKG->Zsize) return NULL; EERIEPOLY *found = NULL; EERIE_BKG_INFO *feg = &ACTIVEBKG->fastdata[x][z]; for(long k = 0; k < feg->nbpolyin; k++) { EERIEPOLY *ep = feg->polyin[k]; if (!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && (ep->max.y >= pos.y) && (ep != found) && ((ep->norm.y < 0.f) || ((ep->type & POLY_QUAD) && (ep->norm2.y < 0.f))) && (PointIn2DPolyXZ(ep, pos.x, pos.z))) { if(!found || (found && ep->min.y < found->min.y)) found = ep; } } if(!found) return CheckInPoly(pos); return found; }
static EERIEPOLY * ANCHOR_CheckInPolyPrecis(const Vec3f & pos) { long px = pos.x * ACTIVEBKG->Xmul; long pz = pos.z * ACTIVEBKG->Zmul; if(px <= 0 || px >= ACTIVEBKG->Xsize - 1 || pz <= 0 || pz >= ACTIVEBKG->Zsize - 1) return NULL; EERIEPOLY * found = NULL; float foundY = 9999999.f; for(short z = pz - 1; z <= pz + 1; z++) for(short x = px - 1; x <= px + 1; x++) { EERIE_BKG_INFO *feg = &ACTIVEBKG->fastdata[x][z]; for(long k = 0; k < feg->nbpolyin; k++) { EERIEPOLY *ep = feg->polyin[k]; if(!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && PointIn2DPolyXZ(ep, pos.x, pos.z)) { Vec3f poss = pos; float yy; if(GetTruePolyY(ep, poss, &yy) && yy >= pos.y && (!found || (found && (yy <= foundY)))) { found = ep; foundY = yy; } } } } return found; }
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; }
// flag==1 for player long ARX_PORTALS_GetRoomNumForPosition(const Vec3f & pos,long flag) { ARX_PROFILE_FUNC(); long num; float height; if(flag & 1) num=ARX_PORTALS_GetRoomNumForCamera(&height); else num=ARX_PORTALS_GetRoomNumForPosition2(pos,flag,&height); if(num > -1) { long nearest = -1; float nearest_dist = 99999.f; for(size_t n = 0; n < portals->rooms.size(); n++) { for(long lll = 0; lll < portals->rooms[n].nb_portals; lll++) { EERIE_PORTALS *po = &portals->portals[portals->rooms[n].portals[lll]]; EERIEPOLY *epp = &po->poly; if(PointIn2DPolyXZ(epp, pos.x, pos.z)) { float yy; if(GetTruePolyY(epp, pos, &yy)) { if(height > yy) { if(yy >= pos.y && yy-pos.y < nearest_dist) { if(epp->norm.y>0) nearest = po->room_2; else nearest = po->room_1; nearest_dist = yy - pos.y; } } } } } } if(nearest>-1) num = nearest; } return num; }
//************************************************************************************* //************************************************************************************* EERIEPOLY * BCCheckInPoly(float x, float y, float z) { long px, pz; F2L(x * ACTIVEBKG->Xmul, &px); if ((px >= ACTIVEBKG->Xsize) || (px < 0)) return NULL; F2L(z * ACTIVEBKG->Zmul, &pz); if ((pz >= ACTIVEBKG->Zsize) || (pz < 0)) return NULL; EERIEPOLY * ep; EERIE_BKG_INFO * eg; EERIEPOLY * found = NULL; eg = (EERIE_BKG_INFO *)&ACTIVEBKG->Backg[px+pz*ACTIVEBKG->Xsize]; for (long k = 0; k < eg->nbpolyin; k++) { ep = eg->polyin[k]; if (!(ep->type & POLY_WATER) && !(ep->type & POLY_TRANS)) { if (ep->min.y > y) { if (PointIn2DPolyXZ(ep, x, z)) { if (found == NULL) found = ep; else if (ep->min.y < found->min.y) found = ep; } } else if (ep->min.y + 45.f > y) if (PointIn2DPolyXZ(ep, x, z)) { return NULL; } } } if (found) { eg = (EERIE_BKG_INFO *)&ACTIVEBKG->Backg[px+pz*ACTIVEBKG->Xsize]; for (long k = 0; k < eg->nbpolyin; k++) { ep = eg->polyin[k]; if (!(ep->type & POLY_WATER) && !(ep->type & POLY_TRANS)) { if (ep != found) if (ep->min.y < found->min.y) if (ep->min.y > found->min.y - 160.f) { if (PointIn2DPolyXZ(ep, x, z)) { return NULL; } } } } } return found; }
EERIEPOLY * ANCHOR_CheckInPolyPrecis(float x, float y, float z) { long px, pz; F2L(x * ACTIVEBKG->Xmul, &px); if (px >= ACTIVEBKG->Xsize - 1) { return NULL; } if (px <= 0) { return NULL; } F2L(z * ACTIVEBKG->Zmul, &pz); if (pz >= ACTIVEBKG->Zsize - 1) { return NULL; } if (pz <= 0) { return NULL; } EERIEPOLY * ep; FAST_BKG_DATA * feg; EERIEPOLY * found = NULL; float foundY = 9999999.f; for (long j = pz - 1; j <= pz + 1; j++) for (long i = px - 1; i <= px + 1; i++) { feg = &ACTIVEBKG->fastdata[i][j]; for (long k = 0; k < feg->nbpolyin; k++) { ep = feg->polyin[k]; if (!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && (PointIn2DPolyXZ(ep, x, z)) ) { EERIE_3D poss; poss.x = x; poss.y = y; poss.z = z; float yy; if ((GetTruePolyY(ep, &poss, &yy)) && (yy >= y) && ((found == NULL) || ((found != NULL) && (yy <= foundY))) ) { found = ep; foundY = yy; } } } } return found; }