#include "pch.h"
#include "cmdview.h"
CommandGeo::CommandGeo(float radius, float zGrid, int nSegments)
:
m_vertices(
4 * (nSegments + 1),
4 * (nSegments + 1)
),
m_indices(
4 * (nSegments + 1),
4 * (nSegments + 1)
),
m_zGrid(zGrid)
{
int index = 0;
float radius2 = radius * radius;
for (int segment = 0; segment <= nSegments; segment++)
{
float x = (((float)segment / (float)nSegments) - 0.5f) * 2.0f * radius;
float yMax = (float)sqrt(radius2 - x * x);
float yMin = -yMax;
const Color& color = (segment%5 == 0) ? s_colorGridMajor : s_colorGrid;
m_indices.Set(index, index);
m_vertices.Set(
index,
VertexL(
x,
yMin,
zGrid,
color.R(),
color.G(),
color.B(),
1,
0,
0
)
);
index++;
m_indices.Set(index, index);
m_vertices.Set(
index,
VertexL(
x,
yMax,
zGrid,
color.R(),
color.G(),
color.B(),
1,
0,
0
)
);
index++;
m_indices.Set(index, index);
m_vertices.Set(
index,
VertexL(
yMin,
x,
zGrid,
color.R(),
color.G(),
color.B(),
1,
0,
0
)
);
index++;
m_indices.Set(index, index);
m_vertices.Set(
index,
VertexL(
yMax,
x,
zGrid,
color.R(),
color.G(),
color.B(),
1,
0,
0
)
);
index++;
}
ZAssert(index == m_indices.GetCount());
}
void CommandGeo::DrawShips(Context* pcontext)
{
assert (m_pcluster);
int index = 0;
TVector<VertexL> vertices;
TVector<WORD> indices;
const ModelListIGC* models = m_pcluster->GetPickableModels();
assert (models);
ImodelIGC* pmodelOrders[3] =
{ trekClient.GetShip()->GetCommandTarget(c_cmdCurrent),
trekClient.GetShip()->GetCommandTarget(c_cmdAccepted),
trekClient.GetShip()->GetCommandTarget(c_cmdQueued)
};
for (ModelLinkIGC* l = models->first(); (l != NULL); l = l->next())
{
ImodelIGC* pmodel = l->data();
if (pmodel->GetVisibleF())
{
ObjectType type = pmodel->GetObjectType();
switch (type)
{
default:
{
if ((pmodel != pmodelOrders[0]) &&
(pmodel != pmodelOrders[1]) &&
(pmodel != pmodelOrders[2]))
{
break;
}
}
case OT_ship:
case OT_station:
case OT_asteroid:
case OT_warp:
{
const Vector& vecPosition = pmodel->GetPosition();
const Color& color = vecPosition.Z() > m_zGrid ? s_colorDropLineUp : s_colorDropLineDown;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X(),
vecPosition.Y(),
vecPosition.Z(),
color.R(),
color.G(),
color.B(),
1,
0,
0
));
index++;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X(),
vecPosition.Y(),
m_zGrid,
color.R(),
color.G(),
color.B(),
1,
0,
0
));
index++;
static int sizeFeet = 15;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X()+sizeFeet,
vecPosition.Y(),
m_zGrid,
s_colorFeet.R(),
s_colorFeet.G(),
s_colorFeet.B(),
1,
0,
0
));
index++;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X()-sizeFeet,
vecPosition.Y(),
m_zGrid,
s_colorFeet.R(),
s_colorFeet.G(),
s_colorFeet.B(),
1,
0,
0
));
index++;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X(),
vecPosition.Y()+sizeFeet,
m_zGrid,
s_colorFeet.R(),
s_colorFeet.G(),
s_colorFeet.B(),
1,
0,
0
));
index++;
indices.PushEnd(index);
vertices.PushEnd(VertexL(
vecPosition.X(),
vecPosition.Y()-sizeFeet,
m_zGrid,
s_colorFeet.R(),
s_colorFeet.G(),
s_colorFeet.B(),
1,
0,
0
));
index++;
}
}
}
}
if (index)
pcontext->DrawLines(vertices, indices);
}
void CommandGeo::Render(Context* pcontext)
{
pcontext->SetShadeMode(ShadeModeFlat);
DrawShips(pcontext);
pcontext->DrawLines(m_vertices, m_indices);
{
ConsoleImage* pci = GetWindow()->GetConsoleImage();
if (pci)
pci->RenderDropLine(pcontext);
}
}
void CommandGeo::SetCluster(IclusterIGC* pcluster)
{
m_pcluster = pcluster;
}
const Color CommandGeo::s_colorGrid(0,0,64.0f/255.0f);
const Color CommandGeo::s_colorGridMajor(0,0,128.0f/255.0f);
const Color CommandGeo::s_colorDropLineUp(200.0f / 255.0f, 180.0f / 255.0f, 20.0f / 255.0f);
const Color CommandGeo::s_colorDropLineDown(150.0f / 255.0f, 100.0f / 255.0f, 0.0f / 255.0f);
const Color CommandGeo::s_colorFeet(0,0,128.0f/255.0f);
const Color g_colorUp(75 / 255.0f, 124 / 255.0f, 88 / 255.0f);
const Color g_colorDown(2 / 255.0f, 84 / 255.0f, 84 / 255.0f);
ImageStringPane::ImageStringPane(LPCSTR szText, LPCSTR szImage, bool bUp, int Layout)
{
m_pStringPane = new StringPane(szText, TrekResources::SmallFont());
m_pStringPane->SetTextColor(bUp ? g_colorUp : g_colorDown);
TRef<SurfacePane> pSurfacePane;
if (szImage)
pSurfacePane = new SurfacePane(GetModeler()->LoadSurface(szImage, true));
TRef<RowPane> pRow = new RowPane();
if (Layout == ImageLeft && szImage)
pRow->InsertAtBottom(pSurfacePane);
pRow->InsertAtBottom(m_pStringPane);
if (Layout != ImageLeft && szImage)
pRow->InsertAtBottom(pSurfacePane);
TRef<BorderPane> pBorderPane =
new BorderPane(
1,
bUp ? g_colorDown : g_colorUp,
pRow
);
InsertAtBottom(pBorderPane);
}
void ImageStringPane::UpdateLayout()
{
DefaultUpdateLayout();
}
void ImageStringPane::SetString(LPCSTR szText)
{
m_pStringPane->SetString(szText);
}
ImageStringButtonPane::ImageStringButtonPane(LPCSTR szText, LPCSTR szImageUp, LPCSTR szImageDn, int Layout)
{
m_pButtonPane =
CreateTrekButton(
new EdgePane(m_pImageStringPaneUp = new ImageStringPane(szText, szImageUp, true, Layout), true),
new EdgePane(m_pImageStringPaneDn = new ImageStringPane(szText, szImageDn, false, Layout), false)
);
InsertAtBottom(m_pButtonPane);
}
void ImageStringButtonPane::UpdateLayout()
{
DefaultUpdateLayout();
}
void ImageStringButtonPane::SetString(LPCSTR szText)
{
m_pImageStringPaneUp->SetString(szText);
m_pImageStringPaneDn->SetString(szText);
}
IEventSource* ImageStringButtonPane::GetEventSource()
{
return m_pButtonPane->GetEventSource();
}