[Partial Fix] Mostly fixed system info view to show triple and quadruple

systems.
This commit is contained in:
Rtch90 2018-01-15 23:23:28 +00:00
parent dc836e99b1
commit 97dbcae545
5 changed files with 51 additions and 58 deletions

View File

@ -37,9 +37,20 @@ void GenericSystemView::Draw3D(void) {
char buf[256]; char buf[256];
snprintf(buf, sizeof(buf), "Dist. %.2f light years.", dist); snprintf(buf, sizeof(buf), "Dist. %.2f light years.", dist);
std::string desc;
if(s->GetNumStars() == 4) {
desc= "Quadruple system. ";
} else if(s->GetNumStars() == 3) {
desc = "Triple system. ";
} else if(s->GetNumStars() == 2) {
desc = "Binary system. ";
} else {
desc = s->rootBody->GetAstroDescription();
}
m_systemName->SetText(s->rootBody->name); m_systemName->SetText(s->rootBody->name);
m_distance->SetText(buf); m_distance->SetText(buf);
m_starType->SetText(s->rootBody->GetAstroDescription()); m_starType->SetText(desc);
m_shortDesc->SetText("Short description of system"); m_shortDesc->SetText("Short description of system");
onSelectedSystemChanged.emit(s); onSelectedSystemChanged.emit(s);

View File

@ -460,6 +460,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
primary->name = s.m_systems[system_idx].name; primary->name = s.m_systems[system_idx].name;
MakeStarOfType(primary, type, rand); MakeStarOfType(primary, type, rand);
rootBody = primary; rootBody = primary;
m_numStars = 1;
} else { } else {
SBody* centGrav = new SBody; SBody* centGrav = new SBody;
centGrav->type = TYPE_GRAVPOINT; centGrav->type = TYPE_GRAVPOINT;
@ -486,6 +487,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
centGrav->mass = star[0]->mass + star[1]->mass; centGrav->mass = star[0]->mass + star[1]->mass;
centGrav->children.push_back(star[0]); centGrav->children.push_back(star[0]);
centGrav->children.push_back(star[1]); centGrav->children.push_back(star[1]);
m_numStars = 2;
if((star[0]->orbMax < fixed(100, 1)) && if((star[0]->orbMax < fixed(100, 1)) &&
(!rand.Int32(3))) { (!rand.Int32(3))) {
@ -497,6 +499,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
star[2]->orbMax = 0; star[2]->orbMax = 0;
MakeRandomStarLighterThan(star[2], star[0]->mass, rand); MakeRandomStarLighterThan(star[2], star[0]->mass, rand);
centGrav2 = star[2]; centGrav2 = star[2];
m_numStars = 3;
} else { } else {
centGrav2 = new SBody; centGrav2 = new SBody;
centGrav2->type = TYPE_GRAVPOINT; centGrav2->type = TYPE_GRAVPOINT;
@ -518,6 +521,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
centGrav2->mass = star[2]->mass + star[3]->mass; centGrav2->mass = star[2]->mass + star[3]->mass;
centGrav2->children.push_back(star[2]); centGrav2->children.push_back(star[2]);
centGrav2->children.push_back(star[3]); centGrav2->children.push_back(star[3]);
m_numStars = 4;
} }
SBody* superCentGrav = new SBody; SBody* superCentGrav = new SBody;
superCentGrav->type = TYPE_GRAVPOINT; superCentGrav->type = TYPE_GRAVPOINT;

View File

@ -26,6 +26,8 @@ public:
*sec_x = m_secx; *sec_y = m_secy, *sys_idx = m_sysIdx; *sec_x = m_secx; *sec_y = m_secy, *sys_idx = m_sysIdx;
} }
int GetNumStars(void) const { return m_numStars; }
static float starColors[][3]; static float starColors[][3];
struct Orbit { struct Orbit {
@ -133,6 +135,7 @@ private:
void GenerateFromCustom(const CustomSBody*); void GenerateFromCustom(const CustomSBody*);
int m_secx, m_secy, m_sysIdx; int m_secx, m_secy, m_sysIdx;
int m_numStars;
MTRand rand; MTRand rand;
}; };

View File

@ -55,69 +55,43 @@ void SystemInfoView::OnBodySelected(StarSystem::SBody* b) {
m_infoText->SetText(desc); m_infoText->SetText(desc);
} }
void SystemInfoView::PutBodies(StarSystem::SBody* body, int dir, float pos[2], int& majorBodies) {
float size[2];
float myPos[2];
myPos[0] = pos[0];
myPos[1] = pos[1];
if(body->type != StarSystem::TYPE_GRAVPOINT) {
Gui::ImageButton* ib = new Gui::ImageButton(body->GetIcon());
ib->GetSize(size);
size[1] = -size[1];
pos[dir] += size[dir];
myPos[dir] += size[dir];
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), body));
Add(ib, pos[0], pos[1]+0.5*size[1]);
majorBodies++;
dir = !dir;
myPos[dir] += 0.5*size[dir];
} else {
pos[!dir] += 320;
}
for(std::vector<StarSystem::SBody*>::iterator i = body->children.begin();
i != body->children.end(); ++i) {
PutBodies(*i, dir, myPos, majorBodies);
}
}
void SystemInfoView::SystemChanged(StarSystem* s) { void SystemInfoView::SystemChanged(StarSystem* s) {
DeleteAllChildren(); DeleteAllChildren();
float csize[2]; float csize[2];
int majorBodies = 0; int majorBodies = 0;
GetSize(csize); GetSize(csize);
float xpos = 0; float pos[2];
float size[2]; pos[0] = 50;
float ycent; pos[1] = csize[1]+40;
std::vector<StarSystem::SBody*>::iterator i = s->rootBody->children.begin();
if(s->rootBody->type == StarSystem::TYPE_GRAVPOINT) { PutBodies(s->rootBody, 1, pos, majorBodies);
/* Binary system. */
Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
ib->GetSize(size);
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
Add(ib, 0, csize[1] - size[1]);
float yoffset = size[1];
float xoffset = size[0];
++i; majorBodies++;
ib = new Gui::ImageButton((*i)->GetIcon());
ib->GetSize(size);
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
Add(ib, 0, csize[1] - size[1] - yoffset);
++i; majorBodies++;
xpos += xoffset;
ycent = csize[1] - yoffset*0.5;
} else {
Gui::ImageButton* ib = new Gui::ImageButton(s->rootBody->GetIcon());
ib->GetSize(size);
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), s->rootBody));
Add(ib, 0, csize[1] - size[1]);
xpos += size[0];
ycent = csize[1] - size[1]*0.5;
majorBodies++;
}
for(; i != s->rootBody->children.end(); ++i) {
if((*i)->type == StarSystem::TYPE_GRAVPOINT) {
} else {
Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
ib->GetSize(size);
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
Add(ib, xpos, ycent - 0.5*size[1]);
majorBodies++;
}
float moon_ypos = ycent - size[1] - 5;
if((*i)->children.size())
for(std::vector<StarSystem::SBody*>::iterator moon = (*i)->children.begin();
moon != (*i)->children.end(); ++moon) {
float msize[2];
Gui::ImageButton* ib = new Gui::ImageButton((*moon)->GetIcon());
ib->GetSize(msize);
ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *moon));
Add(ib, xpos + 0.5*size[0] - 0.5*msize[0], moon_ypos);
moon_ypos -= msize[1];
}
xpos += size[0];
}
char buf[512]; char buf[512];
snprintf(buf, sizeof(buf), "Stable system with %d major bodies", majorBodies); snprintf(buf, sizeof(buf), "Stable system with %d major bodies", majorBodies);

View File

@ -13,6 +13,7 @@ public:
private: private:
void SystemChanged(StarSystem* s); void SystemChanged(StarSystem* s);
void OnBodySelected(StarSystem::SBody* b); void OnBodySelected(StarSystem::SBody* b);
void PutBodies(StarSystem::SBody* body, int dir, float pos[2], int& majorBodies);
StarSystem::SBody* m_bodySelected; StarSystem::SBody* m_bodySelected;
Gui::Label* m_infoText; Gui::Label* m_infoText;
}; };