float ANCHOR_IsPolyInCylinder(const EERIEPOLY & ep, const Cylinder & cyl, CollisionFlags flags) { if (!(flags & CFLAG_EXTRA_PRECISION)) { if (ep.area < 100.f) return 999999.f; } if (PointInCylinder(cyl, &ep.center)) { if (ep.norm.y < 0.5f) return ep.min.y; return ep.center.y; } float minf = std::min(cyl.origin.y, cyl.origin.y + cyl.height); float maxf = std::max(cyl.origin.y, cyl.origin.y + cyl.height); if (minf > ep.max.y) return 999999.f; if (maxf < ep.min.y) return 999999.f; long to = (ep.type & POLY_QUAD) ? 4 : 3; long r = to - 1; float anything = 999999.f; Vec3f center; long n; for (n = 0; n < to; n++) { if (flags & CFLAG_EXTRA_PRECISION) { for (long o = 0; o < 5; o++) { float p = (float)o * ( 1.0f / 5 ); center = ep.v[n].p * p + ep.center * (1.f - p); if(PointInCylinder(cyl, ¢er)) { anything = std::min(anything, center.y); return anything; } } } if ((ep.area > 2000.f) || (flags & CFLAG_EXTRA_PRECISION) ) { center = (ep.v[n].p + ep.v[r].p) * 0.5f; if(PointInCylinder(cyl, ¢er)) { anything = std::min(anything, center.y); return anything; } if ((ep.area > 4000.f) || (flags & CFLAG_EXTRA_PRECISION)) { center = (ep.v[n].p + ep.center) * 0.5f; if(PointInCylinder(cyl, ¢er)) { anything = std::min(anything, center.y); return anything; } } if ((ep.area > 6000.f) || (flags & CFLAG_EXTRA_PRECISION)) { center = (center + ep.v[n].p) * 0.5f; if(PointInCylinder(cyl, ¢er)) { anything = std::min(anything, center.y); return anything; } } } if(PointInCylinder(cyl, &ep.v[n].p)) { anything = std::min(anything, ep.v[n].p.y); return anything; } r++; if (r >= to) r = 0; } if ((anything != 999999.f) && (ep.norm.y < 0.1f) && (ep.norm.y > -0.1f)) anything = std::min(anything, ep.min.y); return anything; }
__inline float ANCHOR_IsPolyInCylinder(EERIEPOLY * ep, EERIE_CYLINDER * cyl, long flags) { if (!(flags & CFLAG_EXTRA_PRECISION)) { if (ep->area < 100.f) return 999999.f; } if (PointInCylinder(cyl, &ep->center)) { if (ep->norm.y < 0.5f) return ep->min.y; return ep->center.y; } float min = __min(cyl->origin.y, cyl->origin.y + cyl->height); float max = __max(cyl->origin.y, cyl->origin.y + cyl->height); if (min > ep->max.y) return 999999.f; if (max < ep->min.y) return 999999.f; long to; if (ep->type & POLY_QUAD) to = 4; else to = 3; long r = to - 1; float anything = 999999.f; EERIE_3D center; long n; for (n = 0; n < to; n++) { if (flags & CFLAG_EXTRA_PRECISION) { for (long o = 0; o < 5; o++) { float p = (float)o * DIV5; center.x = (ep->v[n].sx * p + ep->center.x * (1.f - p)); center.y = (ep->v[n].sy * p + ep->center.y * (1.f - p)); center.z = (ep->v[n].sz * p + ep->center.z * (1.f - p)); if (PointInCylinder(cyl, ¢er)) { anything = __min(anything, center.y); return anything; } } } if ((ep->area > 2000.f) || (flags & CFLAG_EXTRA_PRECISION) ) { center.x = (ep->v[n].sx + ep->v[r].sx) * DIV2; center.y = (ep->v[n].sy + ep->v[r].sy) * DIV2; center.z = (ep->v[n].sz + ep->v[r].sz) * DIV2; if (PointInCylinder(cyl, ¢er)) { anything = __min(anything, center.y); return anything; } if ((ep->area > 4000.f) || (flags & CFLAG_EXTRA_PRECISION)) { center.x = (ep->v[n].sx + ep->center.x) * DIV2; center.y = (ep->v[n].sy + ep->center.y) * DIV2; center.z = (ep->v[n].sz + ep->center.z) * DIV2; if (PointInCylinder(cyl, ¢er)) { anything = __min(anything, center.y); return anything; } } if ((ep->area > 6000.f) || (flags & CFLAG_EXTRA_PRECISION)) { center.x = (center.x + ep->v[n].sx) * DIV2; center.y = (center.y + ep->v[n].sy) * DIV2; center.z = (center.z + ep->v[n].sz) * DIV2; if (PointInCylinder(cyl, ¢er)) { anything = __min(anything, center.y); return anything; } } } if (PointInCylinder(cyl, (EERIE_3D *)&ep->v[n])) { anything = __min(anything, ep->v[n].sy); return anything; } r++; if (r >= to) r = 0; } if ((anything != 999999.f) && (ep->norm.y < 0.1f) && (ep->norm.y > -0.1f)) anything = __min(anything, ep->min.y); return anything; }