示例#1
0
void ARX_SPECIAL_ATTRACTORS_ComputeForIO(INTERACTIVE_OBJ * ioo, EERIE_3D * force)
{
    force->x = 0;
    force->y = 0;
    force->z = 0;

    for (long i = 0; i < MAX_ATTRACTORS; i++)
    {
        if (attractors[i].ionum != -1)
        {
            if (ValidIONum(attractors[i].ionum))
            {
                INTERACTIVE_OBJ * io = inter.iobj[attractors[i].ionum];

                if ((io->show == SHOW_FLAG_IN_SCENE)
                        && !(io->ioflags & IO_NO_COLLISIONS)
                        && (io->GameFlags & GFLAG_ISINTREATZONE))
                {
                    float power = attractors[i].power;
                    EERIE_3D pos;
                    pos.x = ioo->pos.x;
                    pos.y = ioo->pos.y;
                    pos.z = ioo->pos.z;
                    float dist = EEDistance3D(&pos, &io->pos);

                    if ((dist > ioo->physics.cyl.radius + io->physics.cyl.radius + 10.f)
                            || (power < 0.f))
                    {
                        float max_radius = attractors[i].radius;

                        if (dist < max_radius)
                        {
                            float ratio_dist = 1.f - (dist / max_radius);
                            EERIE_3D vect;
                            vect.x = io->pos.x - pos.x;
                            vect.y = io->pos.y - pos.y;
                            vect.z = io->pos.z - pos.z;
                            Vector_Normalize(&vect);
                            power *= ratio_dist * 0.01f;
                            force->x = vect.x * power;
                            force->y = vect.y * power;
                            force->z = vect.z * power;
                        }
                    }
                }
            }
        }
    }
}
/*--------------------------------------------------------------------------*/
float CLevitate::Render(LPDIRECT3DDEVICE7 device)
{
	if (this->key > 1) return 0;

	SETALPHABLEND(device, TRUE);
	SETZWRITE(device, FALSE);

	//calcul du cone
	D3DTLVERTEX d3dvs, *d3dv;
	EERIE_3D	* vertex;
	int			nb, nbc, col;
	float		ddu = this->ang;
	float		u = ddu, du = .99999999f / (float)this->def;

	switch (this->key)
	{
		case 0:
			nbc = 2;

			while (nbc--)
			{
				vertex = this->cone[nbc].conevertex;
				d3dv = this->cone[nbc].coned3d;
				nb = (this->cone[nbc].conenbvertex) >> 1;

				while (nb)
				{
					d3dvs.sx = this->pos.x + (vertex + 1)->x + ((vertex->x - (vertex + 1)->x) * this->scale);
					d3dvs.sy = this->pos.y + (vertex + 1)->y + ((vertex->y - (vertex + 1)->y) * this->scale);
					d3dvs.sz = this->pos.z + (vertex + 1)->z + ((vertex->z - (vertex + 1)->z) * this->scale);
					
					EE_RT2(&d3dvs, d3dv);


					float fRandom	= rnd() * 80.f ;
					ARX_CHECK_INT(fRandom);

					col	= ARX_CLEAN_WARN_CAST_INT(fRandom);


					if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(col, col, col, col);

					d3dv->tu = u;
					d3dv->tv = 0.f;
					vertex++;
					d3dv++;

					d3dvs.sx = this->pos.x + vertex->x;
					d3dvs.sy = this->pos.y;
					d3dvs.sz = this->pos.z + vertex->z;
					
					EE_RT2(&d3dvs, d3dv);


					fRandom = rnd() * 80.f ;
					ARX_CHECK_INT(fRandom);

					col = ARX_CLEAN_WARN_CAST_INT(fRandom);


					if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(0, 0, 0, col);

					d3dv->tu = u;
					d3dv->tv = 0.9999999f;
					vertex++;
					d3dv++;

					u += du;
					nb--;
				}

				u = ddu;
				du = -du;
			}

			nbc = 3;

			while (nbc--)
			{
				int j = ARX_PARTICLES_GetFree();

				if ((j != -1) && (!ARXPausedTimer))
				{
					ParticleCount++;
					particle[j].exist = 1;
					particle[j].zdec = 0;

					float a = DEG2RAD(360.f * rnd());

					particle[j].ov.x = this->pos.x + this->rbase * EEcos(a);
					particle[j].ov.y = this->pos.y;
					particle[j].ov.z = this->pos.z + this->rbase * EEsin(a);
					float t = EEDistance3D(&particle[j].ov, &this->pos);
					particle[j].move.x = (5.f + 5.f * rnd()) * ((particle[j].ov.x - this->pos.x) / t);
					particle[j].move.y = 3.f * rnd();
					particle[j].move.z = (5.f + 5.f * rnd()) * ((particle[j].ov.z - this->pos.z) / t);
					particle[j].siz = 30.f + 30.f * rnd();
					particle[j].tolive = 3000;
					particle[j].scale.x = 1.f;
					particle[j].scale.y = 1.f;
					particle[j].scale.z = 1.f;
					particle[j].timcreation = -(long)(ARXTime + 3000); //spells[i].lastupdate;
					particle[j].tc = NULL;
					particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING;
					particle[j].fparam = 0.0000001f;
					particle[j].r = 1.f;
					particle[j].g = 1.f;
					particle[j].b = 1.f;
				}
			}
			break;
		case 1:
			nbc = 2;

			while (nbc--)
			{
				vertex = this->cone[nbc].conevertex;
				d3dv = this->cone[nbc].coned3d;
				nb = (this->cone[nbc].conenbvertex) >> 1;

				while (nb)
				{
					d3dvs.sx = this->pos.x + vertex->x;
					d3dvs.sy = this->pos.y + vertex->y;
					d3dvs.sz = this->pos.z + vertex->z;
	
					EE_RT2(&d3dvs, d3dv);
					col = (int)(rnd() * 80.f);

					if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(col, col, col, col);

					d3dv->tu = u;
					d3dv->tv = 0.f;
					vertex++;
					d3dv++;

					d3dvs.sx = this->pos.x + vertex->x;
					d3dvs.sy = this->pos.y;
					d3dvs.sz = this->pos.z + vertex->z;

					EE_RT2(&d3dvs, d3dv);
					col = (int)(rnd() * 80.f);

					if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(0, 0, 0, col);

					d3dv->tu = u;
					d3dv->tv = 1; 
					vertex++;
					d3dv++;

					u += du;
					nb--;
				}

				u = ddu;
				du = -du;
			}

			nbc = 10;

			while (nbc--)
			{
				int j = ARX_PARTICLES_GetFree();

				if ((j != -1) && (!ARXPausedTimer))
				{
					ParticleCount++;
					particle[j].exist = 1;
					particle[j].zdec = 0;

					float a = DEG2RAD(360.f * rnd());

					particle[j].ov.x = this->pos.x + this->rbase * EEcos(a);
					particle[j].ov.y = this->pos.y;
					particle[j].ov.z = this->pos.z + this->rbase * EEsin(a);
					float t = EEDistance3D(&particle[j].ov, &this->pos);
					particle[j].move.x = (5.f + 5.f * rnd()) * ((particle[j].ov.x - this->pos.x) / t);
					particle[j].move.y = 3.f * rnd();
					particle[j].move.z = (5.f + 5.f * rnd()) * ((particle[j].ov.z - this->pos.z) / t);
					particle[j].siz = 30.f + 30.f * rnd();
					particle[j].tolive = 3000;
					particle[j].scale.x = 1.f;
					particle[j].scale.y = 1.f;
					particle[j].scale.z = 1.f;
					particle[j].timcreation = -(long)(ARXTime + 3000);
					particle[j].tc = NULL;
					particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING;
					particle[j].fparam = 0.0000001f;
					particle[j].r = 1.f;
					particle[j].g = 1.f;
					particle[j].b = 1.f;
				}
			}

			break;
	}

	//tracé du cone back
	device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
	device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
	SETALPHABLEND(device, TRUE);
	SETTEXTUREWRAPMODE(device, D3DTADDRESS_MIRROR);

	if (this->tsouffle) device->SetTexture(0, this->tsouffle->m_pddsSurface);
	else device->SetTexture(0, NULL);

	SETCULL(device, D3DCULL_CW);
	int i = cone[1].conenbfaces - 2;
	int j = 0;

	while (i--)
	{
		ARX_DrawPrimitive_SoftClippZ(&cone[1].coned3d[j],
		                             &cone[1].coned3d[j+1],
		                             &cone[1].coned3d[j+2]);
		j++;
	}

	i = cone[0].conenbfaces - 2;
	j = 0;

	while (i--)
	{
		ARX_DrawPrimitive_SoftClippZ(&cone[0].coned3d[j],
		                             &cone[0].coned3d[j+1],
		                             &cone[0].coned3d[j+2]);
		j++;
	}

	//tracé du cone front
	SETCULL(device, D3DCULL_CCW);
	
	i = cone[1].conenbfaces - 2;
	j = 0;

	while (i--)
	{
		ARX_DrawPrimitive_SoftClippZ(&cone[1].coned3d[j],
		                             &cone[1].coned3d[j+1],
		                             &cone[1].coned3d[j+2]);
		j++;
	}

	i = cone[0].conenbfaces - 2;
	j = 0;

	while (i--)
	{
		ARX_DrawPrimitive_SoftClippZ(&cone[0].coned3d[j],
		                             &cone[0].coned3d[j+1],
		                             &cone[0].coned3d[j+2]);
		j++;
	}

	//tracé des pierres
	device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA);
	device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
	this->DrawStone(device);

	device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
	device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
	SETALPHABLEND(device, FALSE);
	SETZWRITE(device, TRUE);

	return 0;
}
BOOL IsFULLObjectVertexInValidPosition(EERIE_3DOBJ * obj, long flags, long source, long * validd)
{
	BOOL ret = TRUE;
	long px, pz;
	float x = obj->pbox->vert[0].pos.x;
	F2L(x * ACTIVEBKG->Xmul, &px);
	float z = obj->pbox->vert[0].pos.z;
	F2L(z * ACTIVEBKG->Zmul, &pz);
	long ix, iz, ax, az;
	long n;
	F2L(obj->pbox->radius * DIV100, &n);
	n = __min(2, n + 1);
	ix = __max(px - n, 0);
	ax = __min(px + n, ACTIVEBKG->Xsize - 1);
	iz = __max(pz - n, 0);
	az = __min(pz + n, ACTIVEBKG->Zsize - 1);
	LAST_COLLISION_POLY = NULL;
	EERIEPOLY * ep;
	EERIE_BKG_INFO * eg;


	for (pz = iz; pz <= az; pz++)
		for (px = ix; px <= ax; px++)
		{
			eg = &ACTIVEBKG->Backg[px+pz*ACTIVEBKG->Xsize];

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

				if ( (ep->area > 190.f)
				    &&	(!(ep->type & (POLY_WATER)))
				    &&	(!(ep->type & (POLY_TRANS)))
				    &&	(!(ep->type & (POLY_NOCOL)))
				)
				{
					if ((EEDistance3D(&ep->center, &obj->pbox->vert[0].pos) > obj->pbox->radius + 75.f)
					        &&	(EEDistance3D((EERIE_3D *)&ep->v[0], &obj->pbox->vert[0].pos) > obj->pbox->radius + 55.f)
					        &&	(EEDistance3D((EERIE_3D *)&ep->v[1], &obj->pbox->vert[0].pos) > obj->pbox->radius + 55.f)
					        &&	(EEDistance3D((EERIE_3D *)&ep->v[2], &obj->pbox->vert[0].pos) > obj->pbox->radius + 55.f))
						continue;

					if (IsObjectVertexCollidingPoly(obj, ep, -1, NULL)) 
					{
						LAST_COLLISION_POLY = ep;

						if (ep->type & POLY_METAL) CUR_COLLISION_MATERIAL = MATERIAL_METAL;
						else if (ep->type & POLY_WOOD) CUR_COLLISION_MATERIAL = MATERIAL_WOOD;
						else if (ep->type & POLY_STONE) CUR_COLLISION_MATERIAL = MATERIAL_STONE;
						else if (ep->type & POLY_GRAVEL) CUR_COLLISION_MATERIAL = MATERIAL_GRAVEL;
						else if (ep->type & POLY_WATER) CUR_COLLISION_MATERIAL = MATERIAL_WATER;
						else if (ep->type & POLY_EARTH) CUR_COLLISION_MATERIAL = MATERIAL_EARTH;
						else CUR_COLLISION_MATERIAL = MATERIAL_STONE;

						ret = FALSE;
						return FALSE;
					}
				}
			}
		}

	return ret;
}
示例#4
0
// Pathfinder Thread
LPTHREAD_START_ROUTINE PATHFINDER_Proc(char *)
{
	EERIE_BACKGROUND * eb = ACTIVEBKG;
	PathFinder pathfinder(eb->nbanchors, eb->anchors,
	                      MAX_LIGHTS, (EERIE_LIGHT **)GLight,
	                      MAX_DYNLIGHTS, (EERIE_LIGHT **)PDL);

	bExitPathfinderThread = false;

	while (!bExitPathfinderThread)
	{
		QueryPerformanceCounter(&Pstart_chrono);

		if (WaitForSingleObject(PATHFINDER_MUTEX, PATHFINDER_MUTEX_WAIT) == WAIT_TIMEOUT)
			continue;

		PATHFINDER_WORKING = 1;

		if (EERIE_PATHFINDER_Get_Next_Request(&pr) && pr.isvalid)
		{

			PATHFINDER_REQUEST curpr;
			memcpy(&curpr, &pr, sizeof(PATHFINDER_REQUEST));
			CURPATHFINDIO = curpr.ioid;
			PATHFINDER_WORKING = 2;

			if (CURPATHFINDIO->ident == 43)
				CURPATHFINDIO->ident = 43;

			if (curpr.ioid && curpr.ioid->_npcdata)
			{
				unsigned long flags(MINOS_REGULAR);
				unsigned char found(0);
				float heuristic(PATHFINDER_HEURISTIC_MAX);

				pathfinder.SetCylinder(curpr.ioid->physics.cyl.radius, curpr.ioid->physics.cyl.height);

				if (curpr.ioid->_npcdata->behavior & BEHAVIOUR_FIGHT)
					flags |= MINOS_TACTIC;

				if (curpr.ioid->_npcdata->behavior & (BEHAVIOUR_SNEAK | BEHAVIOUR_HIDE))
					flags |= MINOS_STEALTH;

				if ((curpr.ioid->_npcdata->behavior & BEHAVIOUR_MOVE_TO)
				        || (curpr.ioid->_npcdata->behavior & BEHAVIOUR_GO_HOME))
				{
					float distance(EEDistance3D(&ACTIVEBKG->anchors[curpr.from].pos, &ACTIVEBKG->anchors[curpr.to].pos));

					if (distance < PATHFINDER_DISTANCE_MAX)
						heuristic = PATHFINDER_HEURISTIC_MIN + PATHFINDER_HEURISTIC_RANGE * (distance / PATHFINDER_DISTANCE_MAX);

					pathfinder.SetHeuristic(heuristic);
					found = pathfinder.Move(flags,
					                        curpr.from, curpr.to,
					                        curpr.returnnumber, curpr.returnlist);
				}
				else if (curpr.ioid->_npcdata->behavior & BEHAVIOUR_WANDER_AROUND)
				{
					if (curpr.ioid->_npcdata->behavior_param < PATHFINDER_DISTANCE_MAX)
						heuristic = PATHFINDER_HEURISTIC_MIN + PATHFINDER_HEURISTIC_RANGE * (curpr.ioid->_npcdata->behavior_param / PATHFINDER_DISTANCE_MAX);

					pathfinder.SetHeuristic(heuristic);
					found = pathfinder.WanderAround(flags,
					                                curpr.from, curpr.ioid->_npcdata->behavior_param,
					                                curpr.returnnumber, curpr.returnlist);
				}
				else if (curpr.ioid->_npcdata->behavior & (BEHAVIOUR_FLEE | BEHAVIOUR_HIDE))
				{
					if (curpr.ioid->_npcdata->behavior_param < PATHFINDER_DISTANCE_MAX)
						heuristic = PATHFINDER_HEURISTIC_MIN + PATHFINDER_HEURISTIC_RANGE * (curpr.ioid->_npcdata->behavior_param / PATHFINDER_DISTANCE_MAX);

					pathfinder.SetHeuristic(heuristic);
					float safedist = curpr.ioid->_npcdata->behavior_param + EEDistance3D(&curpr.ioid->target, &curpr.ioid->pos);

					found = pathfinder.Flee(flags,
					                        curpr.from,
					                        curpr.ioid->target,
					                        safedist, 
					                        curpr.returnnumber,
					                        curpr.returnlist);
				}
				else if (curpr.ioid->_npcdata->behavior & BEHAVIOUR_LOOK_FOR)
				{
					float distance(EEDistance3D(&curpr.ioid->pos, &curpr.ioid->target));

					if (distance < PATHFINDER_DISTANCE_MAX)
						heuristic = PATHFINDER_HEURISTIC_MIN + PATHFINDER_HEURISTIC_RANGE * (distance / PATHFINDER_DISTANCE_MAX);

					pathfinder.SetHeuristic(heuristic);
					found = pathfinder.LookFor(flags, curpr.from,
					                           curpr.ioid->target, curpr.ioid->_npcdata->behavior_param,
					                           curpr.returnnumber, curpr.returnlist);
				}
			}
		}

		CURPATHFINDIO = NULL;

		PATHFINDER_WORKING = 0;

		ReleaseMutex(PATHFINDER_MUTEX);
		QueryPerformanceCounter(&Pend_chrono);
		BENCH_PATHFINDER += (unsigned long)(Pend_chrono.QuadPart - Pstart_chrono.QuadPart);
		Sleep(PATHFINDER_UPDATE_INTERVAL);
	}

	//fix leaks memory but freeze characters
	//	pathfinder.Clean();

	PATHFINDER_WORKING = 0;

	ExitThread(0);

	return 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;
}