bool CylinderAboveInvalidZone(EERIE_CYLINDER * cyl) { float count = 0; float failcount = 0; for (float rad = 0; rad < cyl->radius; rad += 10.f) for (float ang = 0; ang < 360; ang += 45) { if (rad == 0) ang = 360; EERIE_3D pos; pos.x = cyl->origin.x - EEsin(DEG2RAD(ang)) * rad; pos.y = cyl->origin.y - 20.f; pos.z = cyl->origin.z + EEcos(DEG2RAD(ang)) * rad; EERIEPOLY * ep = ANCHOR_CheckInPoly(pos.x, pos.y, pos.z); if (!ep) continue; if (ep->type & POLY_NOPATH) return true; count += 1.f; float vy; GetTruePolyY(ep, &pos, &vy); if (EEfabs(vy - cyl->origin.y) > 160.f) failcount++; } float failratio = failcount / count; if (failratio > 0.75f) return true; return false; }
static EERIEPOLY * ANCHOR_CheckInPolyPrecis(const Vec3f & pos) { long px = pos.x * ACTIVEBKG->Xmul; long pz = pos.z * ACTIVEBKG->Zmul; if(px <= 0 || px >= ACTIVEBKG->Xsize - 1 || pz <= 0 || pz >= ACTIVEBKG->Zsize - 1) return NULL; EERIEPOLY * found = NULL; float foundY = 9999999.f; for(short z = pz - 1; z <= pz + 1; z++) for(short x = px - 1; x <= px + 1; x++) { EERIE_BKG_INFO *feg = &ACTIVEBKG->fastdata[x][z]; for(long k = 0; k < feg->nbpolyin; k++) { EERIEPOLY *ep = feg->polyin[k]; if(!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && PointIn2DPolyXZ(ep, pos.x, pos.z)) { Vec3f poss = pos; float yy; if(GetTruePolyY(ep, poss, &yy) && yy >= pos.y && (!found || (found && (yy <= foundY)))) { found = ep; foundY = yy; } } } } return found; }
/*! * \brief Check if anything is in a cylinder * \param cyl the cylinder to check * \param flags collision flags * \return 0 if nothing in cyl else returns Y Offset to put cylinder in a proper place */ static float ANCHOR_CheckAnythingInCylinder(const Cylinder & cyl, CollisionFlags flags) { long rad = (cyl.radius + 230) * ACTIVEBKG->Xmul; long px = cyl.origin.x * ACTIVEBKG->Xmul; long pz = cyl.origin.z * ACTIVEBKG->Zmul; if(px > ACTIVEBKG->Xsize - 2 - rad) return 0.f; if(px < 1 + rad) return 0.f; if(pz > ACTIVEBKG->Zsize - 2 - rad) return 0.f; if(pz < 1 + rad) return 0.f; float anything = 999999.f; for(short z = pz - rad; z <= pz + rad; z++) for(short x = px - rad; x <= px + rad; x++) { const EERIE_BKG_INFO feg = ACTIVEBKG->fastdata[x][z]; for(long k = 0; k < feg.nbpoly; k++) { const EERIEPOLY ep = feg.polydata[k]; if(ep.type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) continue; if(ep.min.y < anything) { float minanything = std::min(anything, ANCHOR_IsPolyInCylinder(ep, cyl, flags)); if(anything != minanything) anything = minanything; } } } EERIEPOLY *ep = ANCHOR_CheckInPolyPrecis(cyl.origin + Vec3f(0.f, cyl.height, 0.f)); if(ep) anything = std::min(anything, ep->min.y); float tempo; if(ep && GetTruePolyY(ep, cyl.origin, &tempo)) anything = std::min(anything, tempo); anything = anything - cyl.origin.y; return anything; }
// flag==1 for player long ARX_PORTALS_GetRoomNumForPosition(const Vec3f & pos,long flag) { ARX_PROFILE_FUNC(); long num; float height; if(flag & 1) num=ARX_PORTALS_GetRoomNumForCamera(&height); else num=ARX_PORTALS_GetRoomNumForPosition2(pos,flag,&height); if(num > -1) { long nearest = -1; float nearest_dist = 99999.f; for(size_t n = 0; n < portals->rooms.size(); n++) { for(long lll = 0; lll < portals->rooms[n].nb_portals; lll++) { EERIE_PORTALS *po = &portals->portals[portals->rooms[n].portals[lll]]; EERIEPOLY *epp = &po->poly; if(PointIn2DPolyXZ(epp, pos.x, pos.z)) { float yy; if(GetTruePolyY(epp, pos, &yy)) { if(height > yy) { if(yy >= pos.y && yy-pos.y < nearest_dist) { if(epp->norm.y>0) nearest = po->room_2; else nearest = po->room_1; nearest_dist = yy - pos.y; } } } } } } if(nearest>-1) num = nearest; } return num; }
bool CylinderAboveInvalidZone(const Cylinder & cyl) { float count = 0; float failcount = 0; for(float rad = 0; rad < cyl.radius; rad += 10.f) { for(float ang = 0; ang < 360; ang += 45) { if(rad == 0) ang = 360; Vec3f pos; pos.x = cyl.origin.x - std::sin(glm::radians(ang)) * rad; pos.y = cyl.origin.y - 20.f; pos.z = cyl.origin.z + std::cos(glm::radians(ang)) * rad; EERIEPOLY * ep = ANCHOR_CheckInPoly(pos); if(!ep) continue; if(ep->type & POLY_NOPATH) return true; count += 1.f; float vy; GetTruePolyY(ep, pos, &vy); if(glm::abs(vy - cyl.origin.y) > 160.f) failcount++; } } float failratio = failcount / count; if(failratio > 0.75f) return true; return false; }
void ShowInfoText() { DebugBox frameInfo = DebugBox(Vec2i(10, 10), "FrameInfo"); frameInfo.add("Platform time", prettyUs(toUs(g_platformTime.frameStart()))); frameInfo.add("Game time", prettyUs(toUs(g_gameTime.now()))); frameInfo.add("Prims", EERIEDrawnPolys); frameInfo.add("Particles", getParticleCount()); frameInfo.add("Sparks", ParticleSparkCount()); frameInfo.add("Polybooms", long(PolyBoomCount())); frameInfo.print(); DebugBox camBox = DebugBox(Vec2i(10, frameInfo.size().y + 5), "Camera"); camBox.add("Position", g_camera->m_pos); camBox.add("Rotation", g_camera->angle); camBox.add("Focal", g_camera->focal); camBox.print(); DebugBox playerBox = DebugBox(Vec2i(10, camBox.size().y + 5), "Player"); playerBox.add("Position", player.pos); playerBox.add("Rotation", player.angle); playerBox.add("Velocity", player.physics.velocity); EERIEPOLY * ep = CheckInPoly(player.pos); float truePolyY = -666.66f; if(ep) { float tempY = 0.f; if(GetTruePolyY(ep, player.pos, &tempY)) { truePolyY = tempY; } } ep = CheckInPoly(player.pos + Vec3f(0.f, -10.f, 0.f)); float slope = 0.f; if(ep) slope = ep->norm.y; long zap = IsAnyPolyThere(player.pos.x, player.pos.z); playerBox.add("Ground Slope", slope); playerBox.add("Ground truePolyY", truePolyY); playerBox.add("Ground POLY", zap); playerBox.add("Color", CURRENT_PLAYER_COLOR); playerBox.add("Stealth", GetPlayerStealth()); playerBox.add("Jump", player.jumplastposition); playerBox.add("OFFGRND", (!player.onfirmground ? "OFFGRND" : "")); playerBox.add("Life", player.lifePool); playerBox.add("Mana", player.manaPool); playerBox.add("Poisoned", player.poison); playerBox.add("Hunger", player.hunger); playerBox.add("Magic", static_cast<long>(player.doingmagic)); playerBox.print(); DebugBox miscBox = DebugBox(Vec2i(10, playerBox.size().y + 5), "Misc"); miscBox.add(arx_name + " version", arx_version); miscBox.add("Level", LastLoadedScene.string()); miscBox.add("Spell failed seq", LAST_FAILED_SEQUENCE); miscBox.add("Cinema", cinematicBorder.CINEMA_DECAL); miscBox.add("Mouse", Vec2i(DANAEMouse)); miscBox.add("Pathfind queue", EERIE_PATHFINDER_Get_Queued_Number()); miscBox.add("Pathfind status", EERIE_PATHFINDER_Is_Busy() ? "Working" : "Idled"); miscBox.print(); { struct ScriptDebugReport { std::string entityName; long events; long sends; ScriptDebugReport() : entityName("") , events(0) , sends(0) {} }; ScriptDebugReport maxEvents; Entity * io = ARX_SCRIPT_Get_IO_Max_Events(); if(io) { maxEvents.entityName = io->idString(); maxEvents.events = io->stat_count; } ScriptDebugReport maxSender; io = ARX_SCRIPT_Get_IO_Max_Events_Sent(); if(io) { maxSender.entityName = io->idString(); maxSender.sends = io->stat_sent; } DebugBox scriptBox = DebugBox(Vec2i(10, miscBox.size().y + 5), "Script"); scriptBox.add("Events", ScriptEvent::totalCount); scriptBox.add("Timers", ARX_SCRIPT_CountTimers()); scriptBox.add("Max events", maxEvents.entityName); scriptBox.add("Max events#", maxEvents.events); scriptBox.add("Max sender", maxSender.entityName); scriptBox.add("Max sender#", maxSender.sends); scriptBox.print(); } Entity * io = entities.get(LastSelectedIONum); if(io) { DebugBox entityBox = DebugBox(Vec2i(500, 10), "Entity " + io->idString()); entityBox.add("Pos", io->pos); entityBox.add("Angle", io->angle); entityBox.add("Room", static_cast<long>(io->room)); entityBox.add("Move", io->move); entityBox.add("Flags", flagNames(EntityFlagNames, io->ioflags)); entityBox.add("GFlags", flagNames(GameFlagNames, io->gameFlags)); entityBox.add("Show", entityVisilibityToString(io->show)); entityBox.print(); if(io->ioflags & IO_NPC) { IO_NPCDATA * npcData = io->_npcdata; DebugBox npcBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "NPC"); npcBox.add("Life", npcData->lifePool); npcBox.add("Mana", npcData->manaPool); npcBox.add("Poisoned", npcData->poisonned); npcBox.add("ArmorClass", ARX_INTERACTIVE_GetArmorClass(io)); npcBox.add("Absorb", npcData->absorb); npcBox.add("Moveproblem", npcData->moveproblem); npcBox.add("Pathfind listpos", static_cast<long>(npcData->pathfind.listpos)); npcBox.add("Pathfind listnb", npcData->pathfind.listnb); npcBox.add("Pathfind targ", npcData->pathfind.truetarget.handleData()); npcBox.add("Behavior", flagNames(BehaviourFlagNames, npcData->behavior)); // TODO should those really be flags ? PathfindFlags pflag = io->_npcdata->pathfind.flags; std::string pflags; if(pflag & PATHFIND_ALWAYS) pflags += "ALWAYS "; if(pflag & PATHFIND_ONCE) pflags += "ONCE "; if(pflag & PATHFIND_NO_UPDATE) pflags += "NO_UPDATE "; npcBox.add("Pathfind flgs", pflags); npcBox.print(); } if(io->ioflags & (IO_FIX | IO_ITEM)) { DebugBox itemBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "Item"); itemBox.add("Durability", io->durability); itemBox.add("Durability max", io->max_durability); itemBox.add("Poisonous", static_cast<long>(io->poisonous)); itemBox.add("Poisonous count", static_cast<long>(io->poisonous_count)); itemBox.print(); } long column2y = 400; for(size_t i = 0; i < MAX_ANIM_LAYERS; i++) { AnimLayer & layer = io->animlayer[i]; DebugBox animLayerBox = DebugBox(Vec2i(500, column2y), str(boost::format("Anim Layer %1%") % i)); animLayerBox.add("ctime", long(layer.ctime.t)); animLayerBox.add("flags", flagNames(AnimUseFlagNames, layer.flags)); animLayerBox.add("currentFrame", layer.currentFrame); if(layer.cur_anim) { animLayerBox.add("cur_anim", layer.cur_anim->path.string()); } else { animLayerBox.add("cur_anim", "none"); } animLayerBox.print(); column2y = animLayerBox.size().y + 5; } } ARX_SCRIPT_Init_Event_Stats(); }
EERIEPOLY * ANCHOR_CheckInPolyPrecis(float x, float y, float z) { long px, pz; F2L(x * ACTIVEBKG->Xmul, &px); if (px >= ACTIVEBKG->Xsize - 1) { return NULL; } if (px <= 0) { return NULL; } F2L(z * ACTIVEBKG->Zmul, &pz); if (pz >= ACTIVEBKG->Zsize - 1) { return NULL; } if (pz <= 0) { return NULL; } EERIEPOLY * ep; FAST_BKG_DATA * feg; EERIEPOLY * found = NULL; float foundY = 9999999.f; for (long j = pz - 1; j <= pz + 1; j++) for (long i = px - 1; i <= px + 1; i++) { feg = &ACTIVEBKG->fastdata[i][j]; for (long k = 0; k < feg->nbpolyin; k++) { ep = feg->polyin[k]; if (!(ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) && (PointIn2DPolyXZ(ep, x, z)) ) { EERIE_3D poss; poss.x = x; poss.y = y; poss.z = z; float yy; if ((GetTruePolyY(ep, &poss, &yy)) && (yy >= y) && ((found == NULL) || ((found != NULL) && (yy <= foundY))) ) { found = ep; foundY = yy; } } } } return found; }
//----------------------------------------------------------------------------- // Returns 0 if nothing in cyl // Else returns Y Offset to put cylinder in a proper place float ANCHOR_CheckAnythingInCylinder(EERIE_CYLINDER * cyl, INTERACTIVE_OBJ * ioo, long flags) { long rad; F2L((cyl->radius + 230)*ACTIVEBKG->Xmul, &rad); long px, pz; F2L(cyl->origin.x * ACTIVEBKG->Xmul, &px); if (px > ACTIVEBKG->Xsize - 2 - rad) return 0.f; if (px < 1 + rad) return 0.f; F2L(cyl->origin.z * ACTIVEBKG->Zmul, &pz); if (pz > ACTIVEBKG->Zsize - 2 - rad) return 0.f; if (pz < 1 + rad) return 0.f; float anything = 999999.f; EERIEPOLY * ep; FAST_BKG_DATA * feg; /* TO KEEP... EERIE_BKG_INFO * eg=&ACTIVEBKG->Backg[px+pz*ACTIVEBKG->Xsize]; if ( (cyl->origin.y+cyl->height < eg->tile_miny) && (cyl->origin.y > eg->tile_miny) //|| (cyl->origin.y > eg->tile_maxy) ) { return 999999.f; } */ for (long j = pz - rad; j <= pz + rad; j++) for (long i = px - rad; i <= px + rad; i++) { feg = &ACTIVEBKG->fastdata[i][j]; for (long k = 0; k < feg->nbpoly; k++) { ep = &feg->polydata[k]; if (ep->type & (POLY_WATER | POLY_TRANS | POLY_NOCOL)) continue; if (ep->min.y < anything) { float minanything = __min(anything, ANCHOR_IsPolyInCylinder(ep, cyl, flags)); if (anything != minanything) { anything = minanything; } } } } ep = ANCHOR_CheckInPolyPrecis(cyl->origin.x, cyl->origin.y + cyl->height, cyl->origin.z); if (ep) anything = __min(anything, ep->min.y); float tempo; if ((ep) && (GetTruePolyY(ep, &cyl->origin, &tempo))) anything = __min(anything, tempo); anything = anything - cyl->origin.y; return anything; }
void ShowInfoText() { DebugBox frameInfo = DebugBox(Vec2i(10, 10), "FrameInfo"); frameInfo.add("Prims", EERIEDrawnPolys); frameInfo.add("Particles", getParticleCount()); frameInfo.add("Polybooms", long(polyboom.size())); frameInfo.add("TIME", static_cast<long>(arxtime.now_ul() / 1000)); frameInfo.print(); DebugBox playerBox = DebugBox(Vec2i(10, frameInfo.size().y + 5), "Player"); playerBox.add("Position", player.pos); playerBox.add("AnchorPos", player.pos - Mscenepos); playerBox.add("Rotation", player.angle); playerBox.add("Velocity", player.physics.velocity); EERIEPOLY * ep = CheckInPoly(player.pos); float truePolyY = -666.66f; if(ep) { float tempY = 0.f; if(GetTruePolyY(ep, player.pos, &tempY)) { truePolyY = tempY; } } ep = CheckInPoly(player.pos + Vec3f(0.f, -10.f, 0.f)); float slope = 0.f; if(ep) slope = ep->norm.y; long zap = IsAnyPolyThere(player.pos.x,player.pos.z); playerBox.add("Ground Slope", slope); playerBox.add("Ground truePolyY", truePolyY); playerBox.add("Ground POLY", zap); playerBox.add("Color", CURRENT_PLAYER_COLOR); playerBox.add("Stealth", GetPlayerStealth()); playerBox.add("Jump", player.jumplastposition); playerBox.add("OFFGRND", (!player.onfirmground ? "OFFGRND" : "")); playerBox.add("Life", player.lifePool); playerBox.add("Mana", player.manaPool); playerBox.add("Poisoned", player.poison); playerBox.add("Hunger", player.hunger); playerBox.add("Magic", static_cast<long>(player.doingmagic)); playerBox.print(); DebugBox miscBox = DebugBox(Vec2i(10, playerBox.size().y + 5), "Misc"); miscBox.add("Arx version", arx_version); miscBox.add("Level", LastLoadedScene.string().c_str()); miscBox.add("Spell failed seq", LAST_FAILED_SEQUENCE.c_str()); miscBox.add("Camera focal", ACTIVECAM->focal); miscBox.add("Cinema", CINEMA_DECAL); miscBox.add("Mouse", Vec2i(DANAEMouse)); miscBox.add("Pathfind queue", EERIE_PATHFINDER_Get_Queued_Number()); miscBox.add("Pathfind status", (PATHFINDER_WORKING ? "Working" : "Idled")); miscBox.print(); { struct ScriptDebugReport { std::string entityName; long events; long sends; ScriptDebugReport() : entityName("") , events(0) , sends(0) {} }; ScriptDebugReport maxEvents; Entity * io = ARX_SCRIPT_Get_IO_Max_Events(); if(io) { maxEvents.entityName = io->idString(); maxEvents.events = io->stat_count; } ScriptDebugReport maxSender; io = ARX_SCRIPT_Get_IO_Max_Events_Sent(); if(io) { maxSender.entityName = io->idString(); maxSender.sends = io->stat_sent; } DebugBox scriptBox = DebugBox(Vec2i(10, miscBox.size().y + 5), "Script"); scriptBox.add("Events", ScriptEvent::totalCount); scriptBox.add("Timers", ARX_SCRIPT_CountTimers()); scriptBox.add("Max events", maxEvents.entityName); scriptBox.add("Max events#", maxEvents.events); scriptBox.add("Max sender", maxSender.entityName); scriptBox.add("Max sender#", maxSender.sends); scriptBox.print(); } if(ValidIONum(LastSelectedIONum)) { Entity * io = entities[LastSelectedIONum]; if(io) { DebugBox entityBox = DebugBox(Vec2i(500, 10), "Entity " + io->idString()); entityBox.add("Pos", io->pos); entityBox.add("Angle", io->angle); entityBox.add("Room", static_cast<long>(io->room)); entityBox.add("Move", io->move); entityBox.add("Flags", flagNames(EntityFlagNames, io->ioflags)); entityBox.add("Show", entityVisilibityToString(io->show)); entityBox.print(); if(io->ioflags & IO_NPC) { IO_NPCDATA * npcData = io->_npcdata; DebugBox npcBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "NPC"); npcBox.add("Life", npcData->lifePool); npcBox.add("Mana", npcData->manaPool); npcBox.add("Poisoned", npcData->poisonned); npcBox.add("ArmorClass", ARX_INTERACTIVE_GetArmorClass(io)); npcBox.add("Absorb", npcData->absorb); npcBox.add("Moveproblem", npcData->moveproblem); npcBox.add("Pathfind listpos", static_cast<long>(npcData->pathfind.listpos)); npcBox.add("Pathfind listnb", npcData->pathfind.listnb); npcBox.add("Pathfind targ", npcData->pathfind.truetarget.handleData()); npcBox.add("Behavior", flagNames(BehaviourFlagNames, npcData->behavior)); // TODO should those really be flags ? PathfindFlags pflag = io->_npcdata->pathfind.flags; std::string pflags; if(pflag & PATHFIND_ALWAYS) pflags += "ALWAYS "; if(pflag & PATHFIND_ONCE) pflags += "ONCE "; if(pflag & PATHFIND_NO_UPDATE) pflags += "NO_UPDATE "; npcBox.add("Pathfind flgs", pflags); npcBox.print(); } if(io->ioflags & (IO_FIX | IO_ITEM)) { DebugBox itemBox = DebugBox(Vec2i(500, entityBox.size().y + 5), "Item"); itemBox.add("Durability", io->durability); itemBox.add("Durability max", io->max_durability); itemBox.add("Poisonous", static_cast<long>(io->poisonous)); itemBox.add("Poisonous count", static_cast<long>(io->poisonous_count)); itemBox.print(); } } } ARX_SCRIPT_Init_Event_Stats(); }