//*************************************************************************************
//*************************************************************************************
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;
}
예제 #2
0
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;
}