Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 3 additions & 24 deletions src/application/SimulationCanvasWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,27 +51,6 @@ bool matchesFloor(const std::string& elementFloorId, const std::string& floorId)
return floorId.empty() || elementFloorId.empty() || elementFloorId == floorId;
}

bool intervalContains(const safecrowd::domain::ConnectionBlockIntervalDraft& interval, double timeSeconds) {
const auto start = std::max(0.0, interval.startSeconds);
const auto end = std::max(start, interval.endSeconds);
return timeSeconds + 1e-9 >= start && timeSeconds <= end + 1e-9;
}

bool connectionShouldBeBlocked(const safecrowd::domain::ConnectionBlockDraft& block, double timeSeconds) {
if (block.connectionId.empty()) {
return false;
}
if (block.intervals.empty()) {
return true;
}
for (const auto& interval : block.intervals) {
if (intervalContains(interval, timeSeconds)) {
return true;
}
}
return false;
}

QString hazardKindLabel(safecrowd::domain::EnvironmentHazardKind kind) {
switch (kind) {
case safecrowd::domain::EnvironmentHazardKind::Smoke:
Expand Down Expand Up @@ -217,7 +196,7 @@ std::optional<std::size_t> hoveredBlockedConnectionIndex(

for (std::size_t index = 0; index < blocks.size(); ++index) {
const auto& block = blocks[index];
if (!connectionShouldBeBlocked(block, elapsedSeconds)) {
if (!safecrowd::domain::connectionBlockActiveAt(block, elapsedSeconds)) {
continue;
}
const auto it = std::find_if(layout.connections.begin(), layout.connections.end(), [&](const auto& connection) {
Expand Down Expand Up @@ -363,7 +342,7 @@ std::optional<QPointF> routeGuidanceMarkerCenter(
std::vector<QPointF> blockedCenters;
blockedCenters.reserve(blocks.size());
for (const auto& block : blocks) {
if (!connectionShouldBeBlocked(block, elapsedSeconds)) {
if (!safecrowd::domain::connectionBlockActiveAt(block, elapsedSeconds)) {
continue;
}
const auto connectionIt = std::find_if(layout.connections.begin(), layout.connections.end(), [&](const auto& connection) {
Expand Down Expand Up @@ -886,7 +865,7 @@ void SimulationCanvasWidget::drawConnectionBlockOverlay(QPainter& painter, const
painter.setPen(QPen(QColor("#c0392b"), 2.8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));

for (const auto& block : connectionBlocks_) {
if (!connectionShouldBeBlocked(block, elapsedSeconds)) {
if (!safecrowd::domain::connectionBlockActiveAt(block, elapsedSeconds)) {
continue;
}

Expand Down
2 changes: 2 additions & 0 deletions src/domain/AgentComponents.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ struct EvacuationRoute {
double nextSegmentReplanSeconds{0.0};
std::uint64_t observedLayoutRevision{0};
bool noExitAvailable{false};
bool holdingForClosure{false};
Point2D closureHoldTarget{};
bool followsGuidance{false};
std::string destinationZoneId{};
std::string originalDestinationZoneId{};
Expand Down
23 changes: 23 additions & 0 deletions src/domain/ScenarioAuthoring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,4 +379,27 @@ std::string environmentHazardFloorId(const FacilityLayout2D& layout, const Envir
return it == layout.zones.end() ? std::string{} : it->floorId;
}

bool connectionBlockIntervalActiveAt(const ConnectionBlockIntervalDraft& interval, double elapsedSeconds) {
const auto start = std::max(0.0, interval.startSeconds);
if (elapsedSeconds + 1e-9 < start) {
return false;
}
if (interval.endSeconds <= interval.startSeconds) {
return true;
}
return elapsedSeconds <= std::max(start, interval.endSeconds) + 1e-9;
}

bool connectionBlockActiveAt(const ConnectionBlockDraft& block, double elapsedSeconds) {
if (block.connectionId.empty()) {
return false;
}
if (block.intervals.empty()) {
return true;
}
return std::any_of(block.intervals.begin(), block.intervals.end(), [&](const auto& interval) {
return connectionBlockIntervalActiveAt(interval, elapsedSeconds);
});
}

} // namespace safecrowd::domain
2 changes: 2 additions & 0 deletions src/domain/ScenarioAuthoring.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,5 +143,7 @@ EnvironmentHazardRuntimeProfile environmentHazardRuntimeProfile(const Environmen
bool environmentHazardHasOpenEndedSchedule(const EnvironmentHazardDraft& hazard);
bool environmentHazardActiveAt(const EnvironmentHazardDraft& hazard, double elapsedSeconds);
std::string environmentHazardFloorId(const FacilityLayout2D& layout, const EnvironmentHazardDraft& hazard);
bool connectionBlockIntervalActiveAt(const ConnectionBlockIntervalDraft& interval, double elapsedSeconds);
bool connectionBlockActiveAt(const ConnectionBlockDraft& block, double elapsedSeconds);

} // namespace safecrowd::domain
Loading
Loading