Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
// 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;
}
Exemplo n.º 5
0
//*************************************************************************************
//*************************************************************************************
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;
}
Exemplo n.º 6
0
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;
}