// USAGE/FUNCTION // io can be NULL if io is valid io->bbox3D contains 3D world-bbox // bboxmin & bboxmax ARE in fact 2D-screen BBOXes using only (x,y). // RETURN: // return true if IO cannot be seen, false if visible // TODO: // Implement all Portal Methods // Return a reduced clipbox which can be used for polys clipping in the case of partial visibility bool ARX_SCENE_PORTAL_ClipIO(Entity * io, const Vec3f & position) { if(io==entities.player()) return false; if(io && (io->ioflags & IO_FORCEDRAW)) return false; if(portals) { Vec3f posi = position + Vec3f(0, -60, 0); // -20 ? long room_num; if(io) { if(io->requestRoomUpdate) UpdateIORoom(io); room_num = io->room;// } else { room_num = ARX_PORTALS_GetRoomNumForPosition(posi); } if(room_num == -1) { posi.y = position.y - 120; room_num = ARX_PORTALS_GetRoomNumForPosition(posi); } if(room_num >= 0 && size_t(room_num) < RoomDraw.size()) { if(RoomDraw[room_num].count == 0) { if(io) { io->bbox2D.min = Vec2f(-1.f, -1.f); io->bbox2D.max = Vec2f(-1.f, -1.f); } return true; } if(io) { Sphere sphere; sphere.origin = (io->bbox3D.min + io->bbox3D.max) * .5f; sphere.radius = glm::distance(sphere.origin, io->bbox3D.min) + 10.f; EERIE_FRUSTRUM_DATA & frustrums = RoomDraw[room_num].frustrum; if(FrustrumsClipSphere(frustrums, sphere) || FrustrumsClipBBox3D(frustrums, io->bbox3D) ) { io->bbox2D.min = Vec2f(-1.f, -1.f); io->bbox2D.max = Vec2f(-1.f, -1.f); return true; } } } } return false; }
bool VisibleSphere(const Sphere & sphere) { ARX_PROFILE_FUNC(); if(fartherThan(sphere.origin, ACTIVECAM->orgTrans.pos, ACTIVECAM->cdepth*0.5f + sphere.radius)) return false; long room_num = ARX_PORTALS_GetRoomNumForPosition(sphere.origin); if(room_num>=0) { EERIE_FRUSTRUM_DATA & frustrums = RoomDraw[room_num].frustrum; if (FrustrumsClipSphere(frustrums, sphere)) return false; } return true; }
bool VisibleSphere(const Vec3f & pos, float radius) { if(fartherThan(pos, ACTIVECAM->orgTrans.pos, ACTIVECAM->cdepth*0.5f + radius)) return false; long room_num = ARX_PORTALS_GetRoomNumForPosition(pos); if (room_num>=0) { Sphere sphere; sphere.origin = pos; sphere.radius = radius; EERIE_FRUSTRUM_DATA & frustrums = RoomDraw[room_num].frustrum; if (FrustrumsClipSphere(frustrums, sphere)) return false; } return true; }