コード例 #1
0
ファイル: Projectile.cpp プロジェクト: hulu1528/ArxLibertatis
static EERIEPOLY * CheckArrowPolyCollision(const Vec3f & start, const Vec3f & end) {
	
	EERIE_TRI pol;
	pol.v[0] = start;
	pol.v[2] = end - Vec3f(2.f, 15.f, 2.f);
	pol.v[1] = end;

	// TODO copy-paste background tiles
	short tilex = end.x * ACTIVEBKG->Xmul;
	short tilez = end.z * ACTIVEBKG->Zmul;
	short radius = 2;
	
	short minx = std::max(tilex - radius, 0);
	short maxx = std::min(tilex + radius, ACTIVEBKG->Xsize - 1);
	short minz = std::max(tilez - radius, 0);
	short maxz = std::min(tilez + radius, ACTIVEBKG->Zsize - 1);
	
	for(short z = minz; z <= maxz; z++)
	for(short x = minx; x <= maxx; x++) {
		const EERIE_BKG_INFO & feg = ACTIVEBKG->fastdata[x][z];
		for(long l = 0; l < feg.nbpolyin; l++) {
			EERIEPOLY * ep = feg.polyin[l];

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

			EERIE_TRI pol2;
			pol2.v[0] = ep->v[0].p;
			pol2.v[1] = ep->v[1].p;
			pol2.v[2] = ep->v[2].p;

			if(Triangles_Intersect(pol2, pol)) {
				return ep;
			}

			if(ep->type & POLY_QUAD) {
				pol2.v[0] = ep->v[1].p;
				pol2.v[1] = ep->v[3].p;
				pol2.v[2] = ep->v[2].p;
				if(Triangles_Intersect(pol2, pol)) {
					return ep;
				}
			}

		}
	}

	return NULL;
}
コード例 #2
0
//*************************************************************************************
// Checks is a triangle of a physical object is colliding a triangle
//*************************************************************************************
BOOL IsObjectVertexCollidingTriangle(EERIE_3DOBJ * obj, EERIE_3D * verts, long k, long * validd)
{
	EERIE_TRI t1, t2;
	BOOL ret = FALSE;
	memcpy(&t2, verts, sizeof(EERIE_3D) * 3);

	PHYSVERT * vert = obj->pbox->vert;

	EERIE_3D center;
	center.x = (verts[0].x + verts[1].x + verts[2].x) * DIV3;
	center.y = (verts[0].y + verts[1].y + verts[2].y) * DIV3;
	center.z = (verts[0].z + verts[1].z + verts[2].z) * DIV3;
	float rad = EEDistance3D(&center, &verts[0]);

	if (k == -1)
	{
		long nn = 0;

		for (; nn < obj->pbox->nb_physvert; nn++)
		{
			if (EEDistance3D(&center, &vert[nn].pos) <= __max(60, rad + 25))
			{
				nn = 1000;
			}
		}

		if (nn < 1000)
			return FALSE;
	}
	else
	{
		if (EEDistance3D(&center, &vert[k].pos) > rad + 25)
			return FALSE;
	}

	//TOP
	if ((k == -1) || (k == 1) || (k == 2) || (k == 3))
	{
		Vector_Copy(&t1.v[0], &vert[1].pos);
		Vector_Copy(&t1.v[1], &vert[2].pos);
		Vector_Copy(&t1.v[2], &vert[3].pos);
		PHYS_COLLIDER = 1;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[1] = 0;
				validd[2] = 0;
				validd[3] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 1) || (k == 4) || (k == 3))
	{
		Vector_Copy(&t1.v[0], &vert[3].pos);
		Vector_Copy(&t1.v[1], &vert[4].pos);
		Vector_Copy(&t1.v[2], &vert[1].pos);
		PHYS_COLLIDER = 1;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[1] = 0;
				validd[3] = 0;
				validd[4] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//BOTTOM
	if ((k == -1) || (k == 9) || (k == 10) || (k == 12))
	{
		Vector_Copy(&t1.v[0], &vert[10].pos);
		Vector_Copy(&t1.v[1], &vert[9].pos);
		Vector_Copy(&t1.v[2], &vert[11].pos);
		PHYS_COLLIDER = 9;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[0] = 0;
				validd[10] = 0;
				validd[12] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 10) || (k == 11) || (k == 12))
	{
		Vector_Copy(&t1.v[0], &vert[9].pos);
		Vector_Copy(&t1.v[1], &vert[12].pos);
		Vector_Copy(&t1.v[2], &vert[11].pos);
		PHYS_COLLIDER = 10;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[10] = 0;
				validd[11] = 0;
				validd[12] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//UP/FRONT
	if ((k == -1) || (k == 1) || (k == 4) || (k == 5))
	{
		Vector_Copy(&t1.v[0], &vert[1].pos);
		Vector_Copy(&t1.v[1], &vert[4].pos);
		Vector_Copy(&t1.v[2], &vert[5].pos);
		PHYS_COLLIDER = 4;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[1] = 0;
				validd[4] = 0;
				validd[5] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 4) || (k == 5) || (k == 8))
	{
		Vector_Copy(&t1.v[0], &vert[4].pos);
		Vector_Copy(&t1.v[1], &vert[8].pos);
		Vector_Copy(&t1.v[2], &vert[5].pos);
		PHYS_COLLIDER = 5;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[4] = 0;
				validd[5] = 0;
				validd[8] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//DOWN/FRONT
	if ((k == -1) || (k == 5) || (k == 8) || (k == 9))
	{
		Vector_Copy(&t1.v[0], &vert[5].pos);
		Vector_Copy(&t1.v[1], &vert[8].pos);
		Vector_Copy(&t1.v[2], &vert[9].pos);
		PHYS_COLLIDER = 8;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[5] = 0;
				validd[8] = 0;
				validd[9] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 8) || (k == 12) || (k == 9))
	{
		Vector_Copy(&t1.v[0], &vert[8].pos);
		Vector_Copy(&t1.v[1], &vert[12].pos);
		Vector_Copy(&t1.v[2], &vert[9].pos);
		PHYS_COLLIDER = 12;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[8] = 0;
				validd[12] = 0;
				validd[9] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//UP/BACK
	if ((k == -1) || (k == 3) || (k == 2) || (k == 7))
	{
		Vector_Copy(&t1.v[0], &vert[3].pos);
		Vector_Copy(&t1.v[1], &vert[2].pos);
		Vector_Copy(&t1.v[2], &vert[7].pos);
		PHYS_COLLIDER = 3;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[3] = 0;
				validd[2] = 0;
				validd[7] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 2) || (k == 6) || (k == 7))
	{
		Vector_Copy(&t1.v[0], &vert[2].pos);
		Vector_Copy(&t1.v[1], &vert[6].pos);
		Vector_Copy(&t1.v[2], &vert[7].pos);
		PHYS_COLLIDER = 2;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[2] = 0;
				validd[6] = 0;
				validd[7] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//DOWN/BACK
	if ((k == -1) || (k == 7) || (k == 6) || (k == 11))
	{
		Vector_Copy(&t1.v[0], &vert[7].pos);
		Vector_Copy(&t1.v[1], &vert[6].pos);
		Vector_Copy(&t1.v[2], &vert[11].pos);
		PHYS_COLLIDER = 7;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[6] = 0;
				validd[7] = 0;
				validd[11] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 6) || (k == 10) || (k == 11))
	{
		Vector_Copy(&t1.v[0], &vert[6].pos);
		Vector_Copy(&t1.v[1], &vert[10].pos);
		Vector_Copy(&t1.v[2], &vert[11].pos);
		PHYS_COLLIDER = 6;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[6] = 0;
				validd[10] = 0;
				validd[11] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//UP/LEFT
	if ((k == -1) || (k == 1) || (k == 2) || (k == 6))
	{
		Vector_Copy(&t1.v[0], &vert[6].pos);
		Vector_Copy(&t1.v[1], &vert[2].pos);
		Vector_Copy(&t1.v[2], &vert[1].pos);
		PHYS_COLLIDER = 2;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[1] = 0;
				validd[2] = 0;
				validd[6] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 1) || (k == 5) || (k == 6))
	{
		Vector_Copy(&t1.v[0], &vert[1].pos);
		Vector_Copy(&t1.v[1], &vert[5].pos);
		Vector_Copy(&t1.v[2], &vert[6].pos);
		PHYS_COLLIDER = 5;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[1] = 0;
				validd[5] = 0;
				validd[6] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//DOWN/LEFT
	if ((k == -1) || (k == 10) || (k == 6) || (k == 5))
	{
		Vector_Copy(&t1.v[0], &vert[10].pos);
		Vector_Copy(&t1.v[1], &vert[6].pos);
		Vector_Copy(&t1.v[2], &vert[5].pos);
		PHYS_COLLIDER = 6;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[10] = 0;
				validd[6] = 0;
				validd[5] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 5) || (k == 9) || (k == 10))
	{
		Vector_Copy(&t1.v[0], &vert[5].pos);
		Vector_Copy(&t1.v[1], &vert[9].pos);
		Vector_Copy(&t1.v[2], &vert[10].pos);
		PHYS_COLLIDER = 5;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[5] = 0;
				validd[9] = 0;
				validd[10] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//UP/RIGHT
	if ((k == -1) || (k == 4) || (k == 3) || (k == 7))
	{
		Vector_Copy(&t1.v[0], &vert[4].pos);
		Vector_Copy(&t1.v[1], &vert[3].pos);
		Vector_Copy(&t1.v[2], &vert[7].pos);
		PHYS_COLLIDER = 4;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[3] = 0;
				validd[4] = 0;
				validd[7] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 7) || (k == 8) || (k == 4))
	{
		Vector_Copy(&t1.v[0], &vert[7].pos);
		Vector_Copy(&t1.v[1], &vert[8].pos);
		Vector_Copy(&t1.v[2], &vert[4].pos);
		PHYS_COLLIDER = 7;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[4] = 0;
				validd[7] = 0;
				validd[8] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif

	//DOWN/RIGHT
	if ((k == -1) || (k == 8) || (k == 7) || (k == 11))
	{
		Vector_Copy(&t1.v[0], &vert[8].pos);
		Vector_Copy(&t1.v[1], &vert[7].pos);
		Vector_Copy(&t1.v[2], &vert[11].pos);
		PHYS_COLLIDER = 8;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[7] = 0;
				validd[8] = 0;
				validd[11] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#if FULLTESTS==TRUE

	if ((k == -1) || (k == 11) || (k == 12) || (k == 8))
	{
		Vector_Copy(&t1.v[0], &vert[11].pos);
		Vector_Copy(&t1.v[1], &vert[12].pos);
		Vector_Copy(&t1.v[2], &vert[8].pos);
		PHYS_COLLIDER = 11;

		if (Triangles_Intersect(&t1, &t2))
		{
			if (validd)
			{
				validd[8] = 0;
				validd[11] = 0;
				validd[12] = 0;
				ret = TRUE;
			}
			else return TRUE;
		}//MAKE_COLL_TEST
	}

#endif
	return ret;
}