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(); }
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); }