2008-06-24 03:17:31 -07:00
|
|
|
#include "SystemView.h"
|
|
|
|
#include "Pi.h"
|
|
|
|
#include "SectorView.h"
|
|
|
|
#include "StarSystem.h"
|
2011-07-27 03:46:56 -07:00
|
|
|
#include "Lang.h"
|
2011-08-23 20:18:53 -07:00
|
|
|
#include "StringF.h"
|
2011-09-14 13:13:53 -07:00
|
|
|
#include "Space.h"
|
|
|
|
#include "Player.h"
|
2011-09-22 14:49:13 -07:00
|
|
|
#include "FloatComparison.h"
|
2011-11-19 02:33:36 -08:00
|
|
|
#include "Game.h"
|
2012-02-21 02:04:06 -08:00
|
|
|
#include "graphics/Material.h"
|
|
|
|
#include "graphics/Renderer.h"
|
|
|
|
|
|
|
|
using namespace Graphics;
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2011-10-18 13:19:29 -07:00
|
|
|
const double SystemView::PICK_OBJECT_RECT_SIZE = 12.0;
|
|
|
|
|
2011-02-10 18:03:27 -08:00
|
|
|
SystemView::SystemView()
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
|
|
|
SetTransparency(true);
|
|
|
|
|
2011-07-21 00:07:09 -07:00
|
|
|
Gui::Screen::PushFont("OverlayFont");
|
2011-01-19 21:07:28 -08:00
|
|
|
m_objectLabels = new Gui::LabelSet();
|
|
|
|
Add(m_objectLabels, 0, 0);
|
2011-07-21 00:07:09 -07:00
|
|
|
Gui::Screen::PopFont();
|
2011-01-19 21:07:28 -08:00
|
|
|
|
2009-10-08 16:49:43 -07:00
|
|
|
m_timePoint = (new Gui::Label(""))->Color(0.7f, 0.7f, 0.7f);
|
2008-11-24 13:06:00 -08:00
|
|
|
Add(m_timePoint, 2, Gui::Screen::GetHeight()-Gui::Screen::GetFontHeight()-66);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2009-10-18 09:12:51 -07:00
|
|
|
m_infoLabel = (new Gui::Label(""))->Color(0.7f, 0.7f, 0.7f);
|
|
|
|
Add(m_infoLabel, 2, 0);
|
|
|
|
|
|
|
|
m_infoText = (new Gui::Label(""))->Color(0.7f, 0.7f, 0.7f);
|
|
|
|
Add(m_infoText, 200, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
m_zoomInButton = new Gui::ImageButton("icons/zoom_in.png");
|
2011-07-27 03:46:56 -07:00
|
|
|
m_zoomInButton->SetToolTip(Lang::ZOOM_IN);
|
2009-10-20 09:47:54 -07:00
|
|
|
Add(m_zoomInButton, 700, 5);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
m_zoomOutButton = new Gui::ImageButton("icons/zoom_out.png");
|
2011-07-27 03:46:56 -07:00
|
|
|
m_zoomOutButton->SetToolTip(Lang::ZOOM_OUT);
|
2009-10-20 09:47:54 -07:00
|
|
|
Add(m_zoomOutButton, 732, 5);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
Gui::ImageButton *b = new Gui::ImageButton("icons/sysview_accel_r3.png", "icons/sysview_accel_r3_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), -10000000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 0, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
b = new Gui::ImageButton("icons/sysview_accel_r2.png", "icons/sysview_accel_r2_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), -1000000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 26, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
b = new Gui::ImageButton("icons/sysview_accel_r1.png", "icons/sysview_accel_r1_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), -100000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 45, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
b = new Gui::ImageButton("icons/sysview_accel_f1.png", "icons/sysview_accel_f1_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 100000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 64, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
b = new Gui::ImageButton("icons/sysview_accel_f2.png", "icons/sysview_accel_f2_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 1000000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 83, 0);
|
|
|
|
|
2012-02-18 01:01:45 -08:00
|
|
|
b = new Gui::ImageButton("icons/sysview_accel_f3.png", "icons/sysview_accel_f3_on.png");
|
2012-03-31 01:44:53 -07:00
|
|
|
b->onPress.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 10000000.f));
|
2012-03-31 03:08:15 -07:00
|
|
|
b->onRelease.connect(sigc::bind(sigc::mem_fun(this, &SystemView::OnClickAccel), 0.0f));
|
2008-06-24 03:17:31 -07:00
|
|
|
m_rightRegion2->Add(b, 102, 0);
|
2010-03-13 10:33:15 -08:00
|
|
|
|
2010-03-14 04:28:21 -07:00
|
|
|
m_onMouseButtonDown =
|
|
|
|
Pi::onMouseButtonDown.connect(sigc::mem_fun(this, &SystemView::MouseButtonDown));
|
2008-06-24 03:17:31 -07:00
|
|
|
|
|
|
|
ResetViewpoint();
|
|
|
|
}
|
|
|
|
|
|
|
|
SystemView::~SystemView()
|
|
|
|
{
|
2010-03-14 04:28:21 -07:00
|
|
|
m_onMouseButtonDown.disconnect();
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void SystemView::OnClickAccel(float step)
|
|
|
|
{
|
|
|
|
m_timeStep = step;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SystemView::ResetViewpoint()
|
|
|
|
{
|
|
|
|
m_selectedObject = 0;
|
2010-03-13 10:33:15 -08:00
|
|
|
m_rot_z = 0;
|
|
|
|
m_rot_x = 50;
|
2012-04-02 17:13:51 -07:00
|
|
|
m_zoom = 1.0f/float(AU);
|
2008-06-24 03:17:31 -07:00
|
|
|
m_timeStep = 1.0f;
|
2011-11-21 13:33:03 -08:00
|
|
|
m_time = Pi::game->GetTime();
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
void SystemView::PutOrbit(SBody *b, vector3d offset)
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
2012-02-06 16:31:59 -08:00
|
|
|
std::vector<vector3f> vts;
|
|
|
|
Color green(0.f, 1.f, 0.f, 1.f);
|
2012-01-17 18:29:18 -08:00
|
|
|
int vcount = 0;
|
2009-10-11 10:25:10 -07:00
|
|
|
for (double t=0.0; t<1.0; t += 0.01) {
|
|
|
|
vector3d pos = b->orbit.EvenSpacedPosAtTime(t);
|
2011-05-10 17:57:37 -07:00
|
|
|
pos = offset + pos * double(m_zoom);
|
2012-02-06 16:31:59 -08:00
|
|
|
vts.push_back(vector3f(pos));
|
2012-01-17 18:29:18 -08:00
|
|
|
vcount++;
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
2012-02-06 16:31:59 -08:00
|
|
|
m_renderer->DrawLines(vcount-1, &vts[0], green, LINE_LOOP);
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
|
2011-01-19 21:07:28 -08:00
|
|
|
void SystemView::OnClickObject(SBody *b)
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
|
|
|
m_selectedObject = b;
|
2009-10-18 09:12:51 -07:00
|
|
|
std::string desc;
|
|
|
|
std::string data;
|
|
|
|
|
2011-07-27 03:46:56 -07:00
|
|
|
desc += std::string(Lang::NAME);
|
2011-09-14 13:13:53 -07:00
|
|
|
desc += ":\n";
|
2009-10-18 09:12:51 -07:00
|
|
|
data += b->name+"\n";
|
|
|
|
|
2011-07-27 03:46:56 -07:00
|
|
|
desc += std::string(Lang::DAY_LENGTH);
|
|
|
|
desc += std::string(Lang::ROTATIONAL_PERIOD);
|
2011-09-14 13:13:53 -07:00
|
|
|
desc += ":\n";
|
2011-08-23 20:18:53 -07:00
|
|
|
data += stringf(Lang::N_DAYS, formatarg("days", b->rotationPeriod.ToFloat())) + "\n";
|
2009-10-18 09:12:51 -07:00
|
|
|
|
2011-07-27 03:46:56 -07:00
|
|
|
desc += std::string(Lang::RADIUS);
|
2011-09-14 13:13:53 -07:00
|
|
|
desc += ":\n";
|
2009-10-18 09:12:51 -07:00
|
|
|
data += format_distance(b->GetRadius())+"\n";
|
|
|
|
|
|
|
|
if (b->parent) {
|
2011-07-27 03:46:56 -07:00
|
|
|
desc += std::string(Lang::SEMI_MAJOR_AXIS);
|
2011-09-14 13:13:53 -07:00
|
|
|
desc += ":\n";
|
2009-10-18 09:12:51 -07:00
|
|
|
data += format_distance(b->orbit.semiMajorAxis)+"\n";
|
|
|
|
|
2011-07-27 03:46:56 -07:00
|
|
|
desc += std::string(Lang::ORBITAL_PERIOD);
|
2011-09-14 13:13:53 -07:00
|
|
|
desc += ":\n";
|
2011-08-23 20:18:53 -07:00
|
|
|
data += stringf(Lang::N_DAYS, formatarg("days", b->orbit.period / (24*60*60))) + "\n";
|
2009-10-18 09:12:51 -07:00
|
|
|
}
|
|
|
|
m_infoLabel->SetText(desc);
|
|
|
|
m_infoText->SetText(data);
|
2011-09-14 13:13:53 -07:00
|
|
|
|
|
|
|
if (Pi::KeyState(SDLK_LSHIFT) || Pi::KeyState(SDLK_RSHIFT)) {
|
|
|
|
SystemPath path = m_system->GetPathOf(b);
|
2011-11-19 02:33:36 -08:00
|
|
|
if (Pi::game->GetSpace()->GetStarSystem()->GetPath() == m_system->GetPath()) {
|
|
|
|
Body* body = Pi::game->GetSpace()->FindBodyForPath(&path);
|
2011-09-14 13:13:53 -07:00
|
|
|
if (body != 0)
|
|
|
|
Pi::player->SetNavTarget(body);
|
|
|
|
}
|
|
|
|
}
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
void SystemView::PutLabel(SBody *b, vector3d offset)
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
|
|
|
Gui::Screen::EnterOrtho();
|
2011-10-18 13:19:29 -07:00
|
|
|
|
2008-06-24 03:17:31 -07:00
|
|
|
vector3d pos;
|
2011-02-20 13:01:37 -08:00
|
|
|
if (Gui::Screen::Project(offset, pos)) {
|
2008-06-24 03:17:31 -07:00
|
|
|
// libsigc++ is a beautiful thing
|
2011-02-20 13:01:37 -08:00
|
|
|
m_objectLabels->Add(b->name, sigc::bind(sigc::mem_fun(this, &SystemView::OnClickObject), b), pos.x, pos.y);
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Gui::Screen::LeaveOrtho();
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
}
|
|
|
|
|
|
|
|
// i don't know how to name it
|
|
|
|
#define ROUGH_SIZE_OF_TURD 10.0
|
|
|
|
|
2009-10-18 09:12:51 -07:00
|
|
|
matrix4x4f s_invRot;
|
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
void SystemView::PutBody(SBody *b, vector3d offset)
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
2009-02-17 16:09:05 -08:00
|
|
|
if (b->type == SBody::TYPE_STARPORT_SURFACE) return;
|
|
|
|
if (b->type != SBody::TYPE_GRAVPOINT) {
|
2009-10-18 09:12:51 -07:00
|
|
|
glGetFloatv (GL_MODELVIEW_MATRIX, &s_invRot[0]);
|
|
|
|
s_invRot[12] = s_invRot[13] = s_invRot[14] = 0;
|
|
|
|
s_invRot = s_invRot.InverseOf();
|
|
|
|
|
2012-01-19 19:14:16 -08:00
|
|
|
// Draw a filled circle
|
2012-02-06 16:31:59 -08:00
|
|
|
VertexArray va(ATTRIB_POSITION);
|
|
|
|
Material mat;
|
|
|
|
mat.unlit = true;
|
|
|
|
mat.diffuse = Color(1.f);
|
2012-01-20 10:05:28 -08:00
|
|
|
const double radius = b->GetRadius() * m_zoom;
|
2011-10-27 20:12:22 -07:00
|
|
|
const vector3f offsetf(offset);
|
2012-04-02 05:39:14 -07:00
|
|
|
for (float ang=0; ang<2.0f*float(M_PI); ang+=float(M_PI)*0.05f) {
|
2011-10-27 20:12:22 -07:00
|
|
|
vector3f p = offsetf + s_invRot * vector3f(radius*sin(ang), -radius*cos(ang), 0);
|
2012-02-06 16:31:59 -08:00
|
|
|
va.Add(p);
|
2009-10-18 09:12:51 -07:00
|
|
|
}
|
2012-02-06 16:31:59 -08:00
|
|
|
m_renderer->DrawTriangles(&va, &mat, TRIANGLE_FAN);
|
2008-08-12 09:38:23 -07:00
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
PutLabel(b, offset);
|
2008-08-12 09:38:23 -07:00
|
|
|
}
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2009-02-17 16:09:05 -08:00
|
|
|
if (b->children.size()) for(std::vector<SBody*>::iterator kid = b->children.begin(); kid != b->children.end(); ++kid) {
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2012-02-18 19:22:01 -08:00
|
|
|
if (is_zero_general((*kid)->orbit.semiMajorAxis)) continue;
|
2009-10-01 03:42:01 -07:00
|
|
|
if ((*kid)->orbit.semiMajorAxis * m_zoom < ROUGH_SIZE_OF_TURD) {
|
2009-05-04 05:02:58 -07:00
|
|
|
PutOrbit(*kid, offset);
|
2009-10-01 03:42:01 -07:00
|
|
|
}
|
2011-08-18 19:10:15 -07:00
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
// not using current time yet
|
2009-10-11 10:25:10 -07:00
|
|
|
vector3d pos = (*kid)->orbit.OrbitalPosAtTime(m_time);
|
2011-05-10 17:57:37 -07:00
|
|
|
pos *= double(m_zoom);
|
2009-05-04 05:02:58 -07:00
|
|
|
//glTranslatef(pos.x, pos.y, pos.z);
|
2011-08-18 19:10:15 -07:00
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
PutBody(*kid, offset + pos);
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-18 13:19:29 -07:00
|
|
|
void SystemView::PutSelectionBox(const SBody *b, const vector3d &rootPos, const Color &col)
|
|
|
|
{
|
|
|
|
// surface starports just show the planet as being selected,
|
|
|
|
// because SystemView doesn't render terrains anyway
|
|
|
|
if (b->type == SBody::TYPE_STARPORT_SURFACE)
|
|
|
|
b = b->parent;
|
|
|
|
assert(b);
|
|
|
|
|
|
|
|
vector3d pos = rootPos;
|
|
|
|
// while (b->parent), not while (b) because the root SBody is defined to be at (0,0,0)
|
|
|
|
while (b->parent) {
|
|
|
|
pos += b->orbit.OrbitalPosAtTime(m_time) * double(m_zoom);
|
|
|
|
b = b->parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
PutSelectionBox(pos, col);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SystemView::PutSelectionBox(const vector3d &worldPos, const Color &col)
|
|
|
|
{
|
2012-01-19 19:14:16 -08:00
|
|
|
// XXX EnterOrtho shouldn't be necessary after Gui uses DrawLines2D correctly
|
2011-10-18 13:19:29 -07:00
|
|
|
Gui::Screen::EnterOrtho();
|
|
|
|
|
|
|
|
vector3d screenPos;
|
|
|
|
if (Gui::Screen::Project(worldPos, screenPos)) {
|
|
|
|
// XXX copied from WorldView::DrawTargetSquare -- these should be unified
|
|
|
|
const float x1 = float(screenPos.x - SystemView::PICK_OBJECT_RECT_SIZE * 0.5);
|
|
|
|
const float x2 = float(x1 + SystemView::PICK_OBJECT_RECT_SIZE);
|
|
|
|
const float y1 = float(screenPos.y - SystemView::PICK_OBJECT_RECT_SIZE * 0.5);
|
|
|
|
const float y2 = float(y1 + SystemView::PICK_OBJECT_RECT_SIZE);
|
|
|
|
|
2012-02-13 07:37:51 -08:00
|
|
|
const GLfloat vtx[8] = {
|
|
|
|
x1, y1,
|
|
|
|
x2, y1,
|
|
|
|
x2, y2,
|
|
|
|
x1, y2
|
|
|
|
};
|
|
|
|
glColor4f(col.r, col.g, col.b, col.a);
|
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, vtx);
|
|
|
|
glDrawArrays(GL_LINE_LOOP, 0, 4);
|
2012-02-11 06:45:08 -08:00
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
2011-10-18 13:19:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Gui::Screen::LeaveOrtho();
|
|
|
|
}
|
|
|
|
|
2012-03-31 01:44:53 -07:00
|
|
|
static const GLfloat fogDensity = 0.1f;
|
|
|
|
static const GLfloat fogColor[4] = { 0,0,0,1.0f };
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
void SystemView::GetTransformTo(SBody *b, vector3d &pos)
|
2008-06-24 03:17:31 -07:00
|
|
|
{
|
|
|
|
if (b->parent) {
|
2009-05-04 05:02:58 -07:00
|
|
|
GetTransformTo(b->parent, pos);
|
2011-05-10 17:57:37 -07:00
|
|
|
pos -= double(m_zoom) * b->orbit.OrbitalPosAtTime(m_time);
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SystemView::Draw3D()
|
|
|
|
{
|
2012-02-06 11:21:40 -08:00
|
|
|
m_renderer->SetPerspectiveProjection(50.f, Pi::GetScrAspect(), 1.f, 1000.f);
|
2012-02-13 07:37:51 -08:00
|
|
|
m_renderer->ClearScreen();
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2011-06-27 17:33:37 -07:00
|
|
|
SystemPath path = Pi::sectorView->GetSelectedSystem();
|
2008-06-24 03:17:31 -07:00
|
|
|
if (m_system) {
|
2011-06-27 05:31:49 -07:00
|
|
|
if (!m_system->GetPath().IsSameSystem(path)) {
|
2011-11-14 21:56:55 -08:00
|
|
|
m_system.Reset();
|
2008-06-24 03:17:31 -07:00
|
|
|
ResetViewpoint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_time += m_timeStep*Pi::GetFrameTime();
|
2011-07-27 03:46:56 -07:00
|
|
|
std::string t = Lang::TIME_POINT+format_date(m_time);
|
2008-06-24 03:17:31 -07:00
|
|
|
m_timePoint->SetText(t);
|
|
|
|
|
2011-06-27 05:31:49 -07:00
|
|
|
if (!m_system) m_system = StarSystem::GetCached(path);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2012-02-14 07:25:40 -08:00
|
|
|
// XXX fog is not going to be supported in renderer likely -
|
|
|
|
// fade the circles some other way
|
2008-06-24 03:17:31 -07:00
|
|
|
glEnable(GL_FOG);
|
|
|
|
glFogi(GL_FOG_MODE, GL_EXP2);
|
|
|
|
glFogfv(GL_FOG_COLOR, fogColor);
|
|
|
|
glFogf(GL_FOG_DENSITY, fogDensity);
|
|
|
|
glHint(GL_FOG_HINT, GL_NICEST);
|
|
|
|
|
2012-02-14 07:25:40 -08:00
|
|
|
matrix4x4f trans = matrix4x4f::Identity();
|
|
|
|
trans.Translate(0,0,-ROUGH_SIZE_OF_TURD);
|
|
|
|
trans.Rotate(DEG2RAD(m_rot_x), 1, 0, 0);
|
|
|
|
trans.Rotate(DEG2RAD(m_rot_z), 0, 0, 1);
|
|
|
|
m_renderer->SetTransform(trans);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2009-05-04 05:02:58 -07:00
|
|
|
vector3d pos(0,0,0);
|
|
|
|
if (m_selectedObject) GetTransformTo(m_selectedObject, pos);
|
2008-06-24 03:17:31 -07:00
|
|
|
|
2011-01-19 21:07:28 -08:00
|
|
|
m_objectLabels->Clear();
|
2011-02-10 13:48:50 -08:00
|
|
|
if (m_system->m_unexplored)
|
2011-07-27 03:46:56 -07:00
|
|
|
m_infoLabel->SetText(Lang::UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW);
|
2011-10-18 13:19:29 -07:00
|
|
|
else if (m_system->rootBody) {
|
2011-02-10 13:48:50 -08:00
|
|
|
PutBody(m_system->rootBody, pos);
|
2011-11-19 02:33:36 -08:00
|
|
|
if (Pi::game->GetSpace()->GetStarSystem() == m_system) {
|
2011-10-18 13:19:29 -07:00
|
|
|
const Body *navTarget = Pi::player->GetNavTarget();
|
|
|
|
const SBody *navTargetSBody = navTarget ? navTarget->GetSBody() : 0;
|
|
|
|
if (navTargetSBody)
|
|
|
|
PutSelectionBox(navTargetSBody, pos, Color(0.0, 1.0, 0.0, 1.0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-24 03:17:31 -07:00
|
|
|
glDisable(GL_FOG);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SystemView::Update()
|
|
|
|
{
|
2008-06-28 13:00:50 -07:00
|
|
|
const float ft = Pi::GetFrameTime();
|
2011-09-18 15:18:02 -07:00
|
|
|
// XXX ugly hack checking for console here
|
|
|
|
if (!Pi::IsConsoleActive()) {
|
|
|
|
if (Pi::KeyState(SDLK_EQUALS) ||
|
|
|
|
m_zoomInButton->IsPressed())
|
|
|
|
m_zoom *= pow(4.0f, ft);
|
|
|
|
if (Pi::KeyState(SDLK_MINUS) ||
|
|
|
|
m_zoomOutButton->IsPressed())
|
|
|
|
m_zoom *= pow(0.25f, ft);
|
|
|
|
}
|
2010-03-13 10:33:15 -08:00
|
|
|
if (Pi::MouseButtonState(SDL_BUTTON_RIGHT)) {
|
2008-06-24 03:17:31 -07:00
|
|
|
int motion[2];
|
|
|
|
Pi::GetMouseMotion(motion);
|
2008-06-28 13:00:50 -07:00
|
|
|
m_rot_x += motion[1]*20*ft;
|
|
|
|
m_rot_z += motion[0]*20*ft;
|
2008-06-24 03:17:31 -07:00
|
|
|
}
|
|
|
|
}
|
2010-03-13 10:33:15 -08:00
|
|
|
|
|
|
|
void SystemView::MouseButtonDown(int button, int x, int y)
|
|
|
|
{
|
2012-01-19 18:43:29 -08:00
|
|
|
if (this == Pi::GetView()) {
|
|
|
|
const float ft = Pi::GetFrameTime();
|
|
|
|
if (Pi::MouseButtonState(SDL_BUTTON_WHEELDOWN))
|
|
|
|
m_zoom *= pow(0.25f, ft);
|
|
|
|
if (Pi::MouseButtonState(SDL_BUTTON_WHEELUP))
|
|
|
|
m_zoom *= pow(4.0f, ft);
|
|
|
|
}
|
2010-03-13 10:33:15 -08:00
|
|
|
}
|