void TaskPointRenderer::DrawOrdered(const OrderedTaskPoint &tp, Layer layer) { switch (layer) { case LAYER_OZ_SHADE: if (tp.BoundingBoxOverlaps(bb_screen)) // draw shaded part of observation zone DrawOZBackground(canvas, tp); break; case LAYER_LEG: if (index > 0) DrawTaskLine(last_point, tp.GetLocationRemaining()); last_point = tp.GetLocationRemaining(); break; case LAYER_OZ_OUTLINE: if (tp.BoundingBoxOverlaps(bb_screen)) DrawOZForeground(tp); break; case LAYER_SYMBOLS: return; } }
void TaskPointRenderer::DrawOrdered(const OrderedTaskPoint &tp, Layer layer) { int offset = index - active_index; if (offset == 0 && task_finished && tp.GetType() == TaskPointType::FINISH) /* if the task is finished, pretend the active_index is past the current index; we need this because XCSoar never moves active_index to one after the finish point, because that would point to an invalid task point index */ offset = -1; switch (layer) { case LAYER_OZ_SHADE: if (tp.BoundingBoxOverlaps(bb_screen)) // draw shaded part of observation zone DrawOZBackground(canvas, tp, offset); break; case LAYER_LEG: if (index > 0) DrawTaskLine(last_point, tp.GetLocationRemaining()); last_point = tp.GetLocationRemaining(); break; case LAYER_OZ_OUTLINE: if (tp.BoundingBoxOverlaps(bb_screen)) { if (mode_optional_start && offset == 0) /* render optional starts as deactivated */ offset = -1; DrawOZForeground(tp, offset); } break; case LAYER_SYMBOLS: return; } }
bool OrderedTask::CheckTransitionPoint(OrderedTaskPoint &point, const AircraftState &state, const AircraftState &state_last, const FlatBoundingBox &bb_now, const FlatBoundingBox &bb_last, bool &transition_enter, bool &transition_exit, bool &last_started, const bool is_start) { const bool nearby = point.BoundingBoxOverlaps(bb_now) || point.BoundingBoxOverlaps(bb_last); if (nearby && point.TransitionEnter(state, state_last)) { transition_enter = true; if (task_events != NULL) task_events->EnterTransition(point); } if (nearby && point.TransitionExit(state, state_last, task_projection)) { transition_exit = true; if (task_events != NULL) task_events->ExitTransition(point); // detect restart if (is_start && last_started) last_started = false; } if (is_start) UpdateStartTransition(state, point); return nearby ? point.UpdateSampleNear(state, task_projection) : point.UpdateSampleFar(state, task_projection); }