void CEnergyGrid::ToggleVis() { if (toggleFrame >= circuit->GetLastFrame()) { return; } toggleFrame = circuit->GetLastFrame(); isVis = !isVis; if (isVis) { UpdateVis(); } else { Figure* fig = circuit->GetDrawer()->GetFigure(); fig->Remove(figureFinishedId); fig->Remove(figureBuildId); fig->Remove(figureInvalidId); fig->Remove(figureGridId); fig->Remove(figureKruskalId); delete fig; } }
void CEnergyGrid::UpdateVis() { if (!isVis) { return; } Map* map = circuit->GetMap(); Figure* fig = circuit->GetDrawer()->GetFigure(); fig->Remove(figureFinishedId); fig->Remove(figureBuildId); fig->Remove(figureInvalidId); fig->Remove(figureGridId); // create new figure groups figureFinishedId = fig->DrawLine(ZeroVector, ZeroVector, 0.0f, false, FRAMES_PER_SEC * 300, 0); figureBuildId = fig->DrawLine(ZeroVector, ZeroVector, 0.0f, false, FRAMES_PER_SEC * 300, 0); figureInvalidId = fig->DrawLine(ZeroVector, ZeroVector, 0.0f, false, FRAMES_PER_SEC * 300, 0); figureGridId = fig->DrawLine(ZeroVector, ZeroVector, 0.0f, false, FRAMES_PER_SEC * 300, 0); for (const CEnergyLink& link : links) { int figureId; float height = 20.0f; if (link.IsFinished()) { figureId = figureFinishedId; height = 18.0f; } else if (link.IsBeingBuilt()) { figureId = figureBuildId; } else if (!link.IsValid()) { figureId = figureInvalidId; } else { figureId = figureGridId; height = 18.0f; } AIFloat3 pos0 = link.GetV0()->pos; const AIFloat3 dir = (link.GetV1()->pos - pos0) / 10; pos0.y = map->GetElevationAt(pos0.x, pos0.z) + height; for (int i = 0; i < 10; ++i) { AIFloat3 pos1 = pos0 + dir; pos1.y = map->GetElevationAt(pos1.x, pos1.z) + height; fig->DrawLine(pos0, pos1, 16.0f, false, FRAMES_PER_SEC * 300, figureId); pos0 = pos1; } } fig->SetColor(figureFinishedId, AIColor(0.1f, 0.3f, 1.0f), 255); fig->SetColor(figureBuildId, AIColor(1.0f, 1.0f, 0.0f), 255); fig->SetColor(figureInvalidId, AIColor(1.0f, 0.3f, 0.3f), 255); fig->SetColor(figureGridId, AIColor(0.5f, 0.5f, 0.5f), 255); // Draw planned Kruskal fig->Remove(figureKruskalId); figureKruskalId = fig->DrawLine(ZeroVector, ZeroVector, 0.0f, false, FRAMES_PER_SEC * 300, 0); const CMetalData::Clusters& clusters = circuit->GetMetalManager()->GetClusters(); const CMetalData::Graph& clusterGraph = circuit->GetMetalManager()->GetGraph(); for (const CMetalData::EdgeDesc& edge : spanningTree) { const AIFloat3& posFrom = clusters[boost::source(edge, clusterGraph)].geoCentr; const AIFloat3& posTo = clusters[boost::target(edge, clusterGraph)].geoCentr; AIFloat3 pos0 = posFrom; const AIFloat3 dir = (posTo - pos0) / 10; pos0.y = map->GetElevationAt(pos0.x, pos0.z) + 19.0f; for (int i = 0; i < 10; ++i) { AIFloat3 pos1 = pos0 + dir; pos1.y = map->GetElevationAt(pos1.x, pos1.z) + 19.0f; fig->DrawLine(pos0, pos1, 16.0f, false, FRAMES_PER_SEC * 300, figureKruskalId); pos0 = pos1; } } fig->SetColor(figureKruskalId, AIColor(0.0f, 1.0f, 1.0f), 255); delete fig; }