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; }
// 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(¢er, &verts[0]); if (k == -1) { long nn = 0; for (; nn < obj->pbox->nb_physvert; nn++) { if (EEDistance3D(¢er, &vert[nn].pos) <= __max(60, rad + 25)) { nn = 1000; } } if (nn < 1000) return FALSE; } else { if (EEDistance3D(¢er, &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; }