Exemplo n.º 1
0
/*!
 * \brief Check if anything is in a cylinder
 * \param cyl the cylinder to check
 * \param flags collision flags
 * \return 0 if nothing in cyl else returns Y Offset to put cylinder in a proper place
 */
static float ANCHOR_CheckAnythingInCylinder(const Cylinder & cyl, CollisionFlags flags) {
	
	long rad = (cyl.radius + 230) * ACTIVEBKG->Xmul;
	
	long px = cyl.origin.x * ACTIVEBKG->Xmul;
	long pz = cyl.origin.z * ACTIVEBKG->Zmul;
	
	if(px > ACTIVEBKG->Xsize - 2 - rad)
		return 0.f;
	if(px < 1 + rad)
		return 0.f;
	if(pz > ACTIVEBKG->Zsize - 2 - rad)
		return 0.f;
	if(pz < 1 + rad)
		return 0.f;
	
	float anything = 999999.f; 
	
	for(short z = pz - rad; z <= pz + rad; z++)
	for(short x = px - rad; x <= px + rad; x++) {
		const EERIE_BKG_INFO feg = ACTIVEBKG->fastdata[x][z];
		
		for(long k = 0; k < feg.nbpoly; k++) {
			const EERIEPOLY ep = feg.polydata[k];
			
			if(ep.type & (POLY_WATER | POLY_TRANS | POLY_NOCOL))
				continue;
			
			if(ep.min.y < anything) {
				float minanything = std::min(anything, ANCHOR_IsPolyInCylinder(ep, cyl, flags));
				
				if(anything != minanything)
					anything = minanything;
			}
		}
	}
	
	EERIEPOLY *ep = ANCHOR_CheckInPolyPrecis(cyl.origin + Vec3f(0.f, cyl.height, 0.f));
	
	if(ep)
		anything = std::min(anything, ep->min.y);
	
	float tempo;
	
	if(ep && GetTruePolyY(ep, cyl.origin, &tempo))
		anything = std::min(anything, tempo);
	
	anything = anything - cyl.origin.y;
	return anything;
}
Exemplo n.º 2
0
//-----------------------------------------------------------------------------
// Returns 0 if nothing in cyl
// Else returns Y Offset to put cylinder in a proper place
float ANCHOR_CheckAnythingInCylinder(EERIE_CYLINDER * cyl, INTERACTIVE_OBJ * ioo, long flags)
{
	long rad;
	F2L((cyl->radius + 230)*ACTIVEBKG->Xmul, &rad); 

	long px, pz;
	F2L(cyl->origin.x * ACTIVEBKG->Xmul, &px);

	if (px > ACTIVEBKG->Xsize - 2 - rad)
		return 0.f;

	if (px < 1 + rad)
		return 0.f;

	F2L(cyl->origin.z * ACTIVEBKG->Zmul, &pz);

	if (pz > ACTIVEBKG->Zsize - 2 - rad)
		return 0.f;

	if (pz < 1 + rad)
		return 0.f;

	float anything = 999999.f; 

	EERIEPOLY * ep;
	FAST_BKG_DATA * feg;

	/* TO KEEP...
		EERIE_BKG_INFO * eg=&ACTIVEBKG->Backg[px+pz*ACTIVEBKG->Xsize];
		if (	(cyl->origin.y+cyl->height < eg->tile_miny)
				&& (cyl->origin.y > eg->tile_miny)
			//||	(cyl->origin.y > eg->tile_maxy)
			)
		{
			return 999999.f;
		}
		*/

	for (long j = pz - rad; j <= pz + rad; j++)
		for (long i = px - rad; i <= px + rad; i++)
		{
			feg = &ACTIVEBKG->fastdata[i][j];

			for (long k = 0; k < feg->nbpoly; k++)
			{
				ep = &feg->polydata[k];

				if (ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) continue;

				if (ep->min.y < anything)
				{
					float minanything = __min(anything, ANCHOR_IsPolyInCylinder(ep, cyl, flags));

					if (anything != minanything)
					{
						anything = minanything;
					}
				}
			}
		}

	ep = ANCHOR_CheckInPolyPrecis(cyl->origin.x, cyl->origin.y + cyl->height, cyl->origin.z);

	if (ep) anything = __min(anything, ep->min.y);

	float tempo;

	if ((ep) && (GetTruePolyY(ep, &cyl->origin, &tempo)))
		anything = __min(anything, tempo);

	anything = anything - cyl->origin.y;
	return anything;
}