Exemple #1
0
static void AnchorData_Create_Links_Original_Method(EERIE_BACKGROUND * eb) {
	
	Vec3f p1, p2; 
	long count = 0;
	long per;
	long lastper = -1;
	long total = eb->Zsize * eb->Xsize;

	for(long j = 0; j < eb->Zsize; j++)
	for(long i = 0; i < eb->Xsize; i++) {
		per = count / total * 100.f;
		
		if(per != lastper) {
			LogInfo << "Anchor Links Generation: %" << per;
			lastper = per;
		}
		
		count++;
		EERIE_BKG_INFO * eg = &eb->fastdata[i][j];
		long precise = 0;
		
		for(long kkk = 0; kkk < eg->nbpolyin; kkk++) {
			EERIEPOLY * ep = eg->polyin[kkk];
			
			if(ep->type & POLY_PRECISE_PATH) {
				precise = 1;
				break;
			}
		}
		
		
		for(long k = 0; k < eg->nbianchors; k++) {
			long ii = glm::clamp(i - 2, 0l, eb->Xsize - 1l);
			long ia = glm::clamp(i + 2, 0l, eb->Xsize - 1l);
			long ji = glm::clamp(j - 2, 0l, eb->Zsize - 1l);
			long ja = glm::clamp(j + 2, 0l, eb->Zsize - 1l);
			
			for(long j2 = ji; j2 <= ja; j2++)
			for(long i2 = ii; i2 <= ia; i2++) {
				EERIE_BKG_INFO * eg2 = &eb->fastdata[i2][j2];
				long precise2 = 0;
				
				for(long kkk = 0; kkk < eg2->nbpolyin; kkk++) {
					EERIEPOLY * ep2 = eg2->polyin[kkk];
					
					if(ep2->type & POLY_PRECISE_PATH) {
						precise2 = 1;
						break;
					}
				}
				
				for(long k2 = 0; k2 < eg2->nbianchors; k2++) {
					// don't treat currently treated anchor
					if(eg->ianchors[k] == eg2->ianchors[k2])
						continue;
					
					p1 = eb->anchors[eg->ianchors[k]].pos;
					p2 = eb->anchors[eg2->ianchors[k2]].pos;
					p1.y += 10.f;
					p2.y += 10.f;
					long _onetwo = 0;
					bool treat = true;
					float _dist = glm::distance(p1, p2);
					float dd = glm::distance(Vec2f(p1.x, p1.z), Vec2f(p2.x, p2.z));
					
					if(dd < 5.f)
						continue;
					
					if(dd > 200.f)
						continue; 
					
					if(precise || precise2) {
						if(_dist > 120.f)
							continue;
					} else if(_dist > 200.f) {
						continue;
					}
					
					if(glm::abs(p1.y - p2.y) > dd * 0.9f)
						continue;
					
					IO_PHYSICS ip;
					ip.startpos = ip.cyl.origin = p1;
					ip.targetpos = p2;
					
					ip.cyl.height = eb->anchors[eg->ianchors[k]].height; 
					ip.cyl.radius = eb->anchors[eg->ianchors[k]].radius;
					
					long t = 2;
					
					//TODO check for dead code CFLAG_SPECIAL
					if(ANCHOR_ARX_COLLISION_Move_Cylinder(&ip, NULL, 20, CFLAG_CHECK_VALID_POS | CFLAG_NO_INTERCOL | CFLAG_EASY_SLIDING | CFLAG_NPC | CFLAG_JUST_TEST | CFLAG_EXTRA_PRECISION)) {
						if(fartherThan(Vec2f(ip.cyl.origin.x, ip.cyl.origin.z), Vec2f(ip.targetpos.x, ip.targetpos.z), 25.f)) { 
							t--;
						} else {
							_onetwo = 1;
						}
					} else {
						t--;
					}
					
					if(t == 1) {
						ip.startpos = ip.cyl.origin = p2;
						ip.targetpos = p1;
						
						ip.cyl.height = eb->anchors[eg2->ianchors[k2]].height;
						ip.cyl.radius = eb->anchors[eg2->ianchors[k2]].radius; 
						
						//CFLAG_SPECIAL
						if(ANCHOR_ARX_COLLISION_Move_Cylinder(&ip, NULL, 20, CFLAG_CHECK_VALID_POS | CFLAG_NO_INTERCOL | CFLAG_EASY_SLIDING | CFLAG_NPC | CFLAG_JUST_TEST | CFLAG_EXTRA_PRECISION | CFLAG_RETURN_HEIGHT)) {
							if(fartherThan(Vec2f(ip.cyl.origin.x, ip.cyl.origin.z), Vec2f(ip.targetpos.x, ip.targetpos.z), 25.f)) {
								t--;
							} else {
								_onetwo |= 2;
							}
						} else {
							t--;
						}
					} else {
						t--;
					}
					
					if(t <= 0)
						treat = false;
					else
						treat = true;
					
					if(treat) {
						if(_onetwo) {
							AddAnchorLink(eb, eg->ianchors[k], eg2->ianchors[k2]);
							AddAnchorLink(eb, eg2->ianchors[k2], eg->ianchors[k]);
						}
					}
				}
			}
		}
	}
	
	EERIE_PATHFINDER_Create();
}
Exemple #2
0
void AnchorData_Create_Links_Original_Method(EERIE_BACKGROUND * eb)
{
	EERIE_BKG_INFO * eg;
	EERIE_BKG_INFO * eg2;
	long ii, ia, ji, ja;
	EERIE_3D p1, p2; 
	char text[256];
	long count = 0;
	long per;
	long lastper = -1;
	long total = eb->Zsize * eb->Xsize;

	for (long j = 0; j < eb->Zsize; j++)
		for (long i = 0; i < eb->Xsize; i++)
		{
			F2L((float)count / (float)total * 100.f, &per);

			if (per != lastper)
			{
				sprintf(text, "Anchor Links Generation: %d%%", per);
				lastper = per;
				_ShowText(text);
			}

			danaeApp.WinManageMess();
			count++;
			eg = &eb->Backg[i+j*eb->Xsize];
			long precise = 0;

			for (long kkk = 0; kkk < eg->nbpolyin; kkk++)
			{
				EERIEPOLY * ep = eg->polyin[kkk];

				if (ep->type & POLY_PRECISE_PATH)
				{
					precise = 1;
					break;
				}
			}


			for (long k = 0; k < eg->nbianchors; k++)
			{
				ii = i - 2;
				ia = i + 2;
				ji = j - 2;
				ja = j + 2;
				FORCERANGE(ii, 0, eb->Xsize - 1);
				FORCERANGE(ia, 0, eb->Xsize - 1);
				FORCERANGE(ji, 0, eb->Zsize - 1);
				FORCERANGE(ja, 0, eb->Zsize - 1);

				for (long j2 = ji; j2 <= ja; j2++)
					for (long i2 = ii; i2 <= ia; i2++)
					{
						eg2 = &eb->Backg[i2+j2*eb->Xsize];
						long precise2 = 0;

						for (long kkk = 0; kkk < eg2->nbpolyin; kkk++)
						{
							EERIEPOLY * ep2 = eg2->polyin[kkk];

							if (ep2->type & POLY_PRECISE_PATH)
							{
								precise2 = 1;
								break;
							}
						}

						for (long k2 = 0; k2 < eg2->nbianchors; k2++)
						{
							// don't treat currently treated anchor
							if (eg->ianchors[k] == eg2->ianchors[k2]) continue;

							memcpy(&p1, &eb->anchors[eg->ianchors[k]].pos, sizeof(EERIE_3D));
							memcpy(&p2, &eb->anchors[eg2->ianchors[k2]].pos, sizeof(EERIE_3D));
							p1.y += 10.f;
							p2.y += 10.f;
							long _onetwo = 0;
							BOOL treat = TRUE;
							float dist = TRUEEEDistance3D(&p1, &p2);
							float dd = TRUEDistance2D(p1.x, p1.z, p2.x, p2.z);

							if (dd < 5.f) continue;

							if (dd > 200.f) continue; 

							if (precise || precise2)
							{
								if (dist > 120.f) continue;
							}
							else	if (dist > 200.f) continue;

							if (EEfabs(p1.y - p2.y) > dd * 0.9f) continue;

					
							IO_PHYSICS ip;
							ip.startpos.x = ip.cyl.origin.x = p1.x;
							ip.startpos.y = ip.cyl.origin.y = p1.y;
							ip.startpos.z = ip.cyl.origin.z = p1.z;
							ip.targetpos.x = p2.x;
							ip.targetpos.y = p2.y;
							ip.targetpos.z = p2.z;
						
							ip.cyl.height = eb->anchors[eg->ianchors[k]].height; 
							ip.cyl.radius = eb->anchors[eg->ianchors[k]].radius;
							EERIE_3D vect;
							vect.x = p2.x - p1.x;
							vect.y = p2.y - p1.y;
							vect.z = p2.z - p1.z;

							long t = 2;

							if (ANCHOR_ARX_COLLISION_Move_Cylinder(&ip, NULL, 20, CFLAG_CHECK_VALID_POS | CFLAG_NO_INTERCOL | CFLAG_EASY_SLIDING | CFLAG_NPC | CFLAG_JUST_TEST | CFLAG_EXTRA_PRECISION)) //CFLAG_SPECIAL
							{
								if (TRUEDistance2D(ip.cyl.origin.x, ip.cyl.origin.z, ip.targetpos.x, ip.targetpos.z) > 25) 
									t--;
								else _onetwo = 1;
							}
							else t--;

							if (t == 1)
							{
								ip.startpos.x = ip.cyl.origin.x = p2.x;
								ip.startpos.y = ip.cyl.origin.y = p2.y;
								ip.startpos.z = ip.cyl.origin.z = p2.z;
								ip.targetpos.x = p1.x;
								ip.targetpos.y = p1.y;
								ip.targetpos.z = p1.z;

								ip.cyl.height = eb->anchors[eg2->ianchors[k2]].height;
								ip.cyl.radius = eb->anchors[eg2->ianchors[k2]].radius; 

								if (ANCHOR_ARX_COLLISION_Move_Cylinder(&ip, NULL, 20, CFLAG_CHECK_VALID_POS | CFLAG_NO_INTERCOL | CFLAG_EASY_SLIDING | CFLAG_NPC | CFLAG_JUST_TEST | CFLAG_EXTRA_PRECISION | CFLAG_RETURN_HEIGHT)) //CFLAG_SPECIAL
								{
									if (TRUEDistance2D(ip.cyl.origin.x, ip.cyl.origin.z, ip.targetpos.x, ip.targetpos.z) > 25) 
										t--;
									else _onetwo |= 2;
								}
								else t--;
							}
							else t--;

							if (t <= 0)
								treat = FALSE;
							else treat = TRUE;

							if (treat)
							{
								if (_onetwo)
								{
									AddAnchorLink(eb, eg->ianchors[k], eg2->ianchors[k2]);
									AddAnchorLink(eb, eg2->ianchors[k2], eg->ianchors[k]);
								}

							}
						}
					}
			}
		}

	EERIE_PATHFINDER_Create(eb);
}