Пример #1
0
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, &center)) {
					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, &center)) {
				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, &center)) {
					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, &center)) {
					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;
}
Пример #2
0
__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, &center)) 
				{
					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, &center)) 
			{
				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, &center)) 
				{
					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, &center)) 
				{
					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;
}