void SectorView::DrawNearSector(int sx, int sy, int sz, const vector3f &playerAbsPos,const matrix4x4f &trans) { m_renderer->SetTransform(trans); Sector* ps = GetCached(sx, sy, sz); int cz = int(floor(m_pos.z+0.5f)); if (cz == sz) { const Color darkgreen(0.f, 0.2f, 0.f, 1.f); const vector3f vts[] = { vector3f(0.f, 0.f, 0.f), vector3f(0.f, Sector::SIZE, 0.f), vector3f(Sector::SIZE, Sector::SIZE, 0.f), vector3f(Sector::SIZE, 0.f, 0.f) }; m_renderer->DrawLines(4, vts, darkgreen, LINE_LOOP); } Uint32 sysIdx = 0; for (std::vector<Sector::System>::iterator i = ps->m_systems.begin(); i != ps->m_systems.end(); ++i, ++sysIdx) { // calculate where the system is in relation the centre of the view... const vector3f sysAbsPos = Sector::SIZE*vector3f(float(sx), float(sy), float(sz)) + (*i).p; const vector3f toCentreOfView = m_pos*Sector::SIZE - sysAbsPos; // ...and skip the system if it doesn't fall within the sphere we're viewing. if (toCentreOfView.Length() > OUTER_RADIUS) continue; // if the system is the current system or target we can't skip it bool can_skip = !i->IsSameSystem(m_selected) && !i->IsSameSystem(m_hyperspaceTarget) && !i->IsSameSystem(m_current); // if the system belongs to a faction we've chosen to temporarily hide // then skip it if we can m_visibleFactions.insert(i->faction); if (m_hiddenFactions.find(i->faction) != m_hiddenFactions.end() && can_skip) continue; // determine if system in hyperjump range or not Sector *playerSec = GetCached(m_current.sectorX, m_current.sectorY, m_current.sectorZ); float dist = Sector::DistanceBetween(ps, sysIdx, playerSec, m_current.systemIndex); bool inRange = dist <= m_playerHyperspaceRange; // don't worry about looking for inhabited systems if they're // unexplored (same calculation as in StarSystem.cpp) or we've // already retrieved their population. if ((*i).population < 0 && isqrt(1 + sx*sx + sy*sy + sz*sz) <= 90) { // only do this once we've pretty much stopped moving. vector3f diff = vector3f( fabs(m_posMovingTo.x - m_pos.x), fabs(m_posMovingTo.y - m_pos.y), fabs(m_posMovingTo.z - m_pos.z)); // Ideally, since this takes so f'ing long, it wants to be done as a threaded job but haven't written that yet. if( (diff.x < 0.001f && diff.y < 0.001f && diff.z < 0.001f) ) { SystemPath current = SystemPath(sx, sy, sz, sysIdx); RefCountedPtr<StarSystem> pSS = StarSystem::GetCached(current); (*i).population = pSS->GetTotalPop(); } } matrix4x4f systrans = trans * matrix4x4f::Translation((*i).p.x, (*i).p.y, (*i).p.z); m_renderer->SetTransform(systrans); // for out-of-range systems draw leg only if we draw label if (m_drawSystemLegButton->GetPressed() && (inRange || m_drawOutRangeLabelButton->GetPressed()) || !can_skip){ const Color light(0.5f); const Color dark(0.2f); // draw system "leg" float z = -(*i).p.z; if (sz <= cz) z = z+abs(cz-sz)*Sector::SIZE; else z = z-abs(cz-sz)*Sector::SIZE; m_lineVerts->Add(systrans * vector3f(0.f, 0.f, z), light); m_lineVerts->Add(systrans * vector3f(0.f, 0.f, z * 0.5f), dark); m_lineVerts->Add(systrans * vector3f(0.f, 0.f, z * 0.5f), dark); m_lineVerts->Add(systrans * vector3f(0.f, 0.f, 0.f), light); //cross at other end m_lineVerts->Add(systrans * vector3f(-0.1f, -0.1f, z), light); m_lineVerts->Add(systrans * vector3f(0.1f, 0.1f, z), light); m_lineVerts->Add(systrans * vector3f(-0.1f, 0.1f, z), light); m_lineVerts->Add(systrans * vector3f(0.1f, -0.1f, z), light); } if (i->IsSameSystem(m_selected)) { m_jumpLine.SetStart(vector3f(0.f, 0.f, 0.f)); m_jumpLine.SetEnd(playerAbsPos - sysAbsPos); m_jumpLine.Draw(m_renderer); } // draw star blob itself systrans.Rotate(DEG2RAD(-m_rotZ), 0, 0, 1); systrans.Rotate(DEG2RAD(-m_rotX), 1, 0, 0); systrans.Scale((StarSystem::starScale[(*i).starType[0]])); m_renderer->SetTransform(systrans); float *col = StarSystem::starColors[(*i).starType[0]]; m_disk->SetColor(Color(col[0], col[1], col[2])); m_disk->Draw(m_renderer); // player location indicator if (m_inSystem && i->IsSameSystem(m_current)) { glDepthRange(0.2,1.0); m_disk->SetColor(Color(0.f, 0.f, 0.8f)); m_renderer->SetTransform(systrans * matrix4x4f::ScaleMatrix(3.f)); m_disk->Draw(m_renderer); } // selected indicator if (i->IsSameSystem(m_current)) { glDepthRange(0.1,1.0); m_disk->SetColor(Color(0.f, 0.8f, 0.f)); m_renderer->SetTransform(systrans * matrix4x4f::ScaleMatrix(2.f)); m_disk->Draw(m_renderer); } // hyperspace target indicator (if different from selection) if (i->IsSameSystem(m_hyperspaceTarget) && m_hyperspaceTarget != m_selected && (!m_inSystem || m_hyperspaceTarget != m_current)) { glDepthRange(0.1,1.0); m_disk->SetColor(Color(0.3f)); m_renderer->SetTransform(systrans * matrix4x4f::ScaleMatrix(2.f)); m_disk->Draw(m_renderer); } } }