From 1a8689d0fe94518be7d1796224953e9a842c81d0 Mon Sep 17 00:00:00 2001 From: Allanis Date: Thu, 23 Nov 2017 21:25:46 +0000 Subject: [PATCH] [Change] A bunch more planet work. [Change] Start player in system 0, 0, 0 --- src/main.cpp | 45 +++--------- src/mtrand.h | 6 +- src/planet.cpp | 173 ++++++++++++++++++++++++++++++++++++++------ src/planet.h | 15 ++-- src/sector.cpp | 14 ++-- src/sector.h | 2 +- src/space.cpp | 8 +- src/space.h | 2 +- src/star.cpp | 16 ++-- src/star.h | 12 +-- src/star_system.cpp | 62 ++++++++-------- src/star_system.h | 69 ++++++++++-------- 12 files changed, 276 insertions(+), 148 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 597f6b1..542714f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -185,57 +185,36 @@ void L3D::HandleEvents(void) { } void L3D::MainLoop(void) { - Frame* earth_frame = new Frame(Space::GetRootFrame(), "Earth"); - earth_frame->SetPosition(vector3d(149598000000.0, 0, 0)); - earth_frame->SetRadius(2*380000000); /* 2 moon orbital radii. */ - player = new Player(ShipType::SLEEK); player->SetLabel("Me"); - player->SetFrame(earth_frame); - player->SetPosition(vector3d(0, 0, 8000000.0)); Space::AddBody(player); + StarSystem s(0, 0, 0); + HyperspaceTo(&s); + + /* Linked list eh... Put player at planet f. */ + Frame* pframe = *++(++(++(++(Space::rootFrame->m_children.begin())))); + player->SetFrame(pframe); + player->SetPosition(vector3d(0, 100000, 10000000.0)); + for(int i = 0; i < 4; i++) { Ship* body = new Ship(ShipType::SLEEK/*LADYBIRD*/); char buf[64]; snprintf(buf, sizeof(buf), "X%c-0%02d", "A"+i, i); body->SetLabel(buf); - body->SetFrame(earth_frame); - body->SetPosition(vector3d(i*2000, 0, 8000400)); + body->SetFrame(pframe); + body->SetPosition(vector3d(i*2000, 100000, 10001000)); Space::AddBody(body); } { SpaceStation* body = new SpaceStation(); body->SetLabel("Poemi-chan's Folly"); - body->SetFrame(earth_frame); - body->SetPosition(vector3d(0, 0, 7998000)); + body->SetFrame(pframe); + body->SetPosition(vector3d(5000, 100000, 9990000.0)); Space::AddBody(body); } - Planet* planet = new Planet(StarSystem::SBody::SUBTYPE_PLANET_INDIGENOUS_LIFE); - planet->SetLabel("Earth"); - planet->SetPosition(vector3d(0, 0, 0)); - planet->SetFrame(earth_frame); - Space::AddBody(planet); - - Frame* moon_frame = new Frame(earth_frame, "Moon"); - moon_frame->SetPosition(vector3d(0, -380000000.0, 0)); - moon_frame->SetRadius(10*1738140.0); /* 10 moon radii. */ - Planet* moon = new Planet(StarSystem::SBody::SUBTYPE_PLANET_DWARF); - moon->SetLabel("Moon"); - moon->SetPosition(vector3d(0, 0, 0)); - moon->SetRadius(1738140.0); - moon->SetFrame(moon_frame); - Space::AddBody(moon); - - Star* sol = new Star(StarSystem::SBody::SUBTYPE_STAR_G); - sol->SetLabel("Sol"); - sol->SetRadius(6.955e8); - sol->SetPosition(vector3d(0, 0, 0)); - sol->SetFrame(Space::GetRootFrame()); - Space::AddBody(sol); - Gui::Init(scrWidth, scrHeight, 640, 480); cpan = new ShipCpanel(); diff --git a/src/mtrand.h b/src/mtrand.h index 952a4e5..2c9afea 100644 --- a/src/mtrand.h +++ b/src/mtrand.h @@ -83,7 +83,11 @@ public: /* Divided by 2^32 */ return max*static_cast(rand_int32()) * (1./4294967296.); } - + + unsigned int In32(int min, int max) { + return (rand_int32()%(1+max-min))+min; + } + unsigned int Int32(void) { return rand_int32(); } private: /* Copy and assignment operators not defined. */ MTRand(const MTRand&); diff --git a/src/planet.cpp b/src/planet.cpp index 4ea5098..99dbafb 100644 --- a/src/planet.cpp +++ b/src/planet.cpp @@ -4,33 +4,35 @@ #include "l3d.h" #include "world_view.h" -Planet::Planet(StarSystem::SBody::SubType subtype) : Body() { - m_radius = 6378135.0; - m_pos = vector3d(0, 0, 0); - m_geom = dCreateSphere(0, m_radius); - dGeomSetData(m_geom, static_cast(this)); - m_subtype = subtype; +Planet::Planet(StarSystem::SBody* sbody) : Body() { + radius = 6378135.0; + pos = vector3d(0, 0, 0); + geom = dCreateSphere(0, radius); + dGeomSetData(geom, static_cast(this)); + this->sbody = *sbody; + this->sbody.children.clear(); + this->sbody.parent = 0; } Planet::~Planet(void) { - dGeomDestroy(m_geom); + dGeomDestroy(geom); } vector3d Planet::GetPosition(void) { - return m_pos; + return pos; } void Planet::SetPosition(vector3d p) { - m_pos = p; - dGeomSetPosition(m_geom, p.x, p.y, p.z); + pos = p; + dGeomSetPosition(geom, p.x, p.y, p.z); } void Planet::SetRadius(double radius) { - m_radius = radius; - dGeomSphereSetRadius(m_geom, radius); + radius = radius; + dGeomSphereSetRadius(geom, radius); } -void subdivide(vector3d& v1, vector3d& v2, vector3d& v3, vector3d& v4, int depth) { +static void subdivide(vector3d& v1, vector3d& v2, vector3d& v3, vector3d& v4, int depth) { if(depth) { depth--; vector3d v5 = v1+v2; @@ -80,7 +82,7 @@ void subdivide(vector3d& v1, vector3d& v2, vector3d& v3, vector3d& v4, int depth } } -void DrawLovelyRoundCube(double radius) { +static void DrawLovelyRoundCube(double radius) { vector3d p1(1, 1, 1); vector3d p2(-1, 1, 1); vector3d p3(-1, -1, 1); @@ -363,8 +365,6 @@ static GasGiantDef_t ggdefs[] = { }, }; -static GasGiantDef_t &ggdef = ggdefs[0]; - #define PLANET_AMBIENT 0.1 static void SetMaterialColor(const float col[4]) { @@ -377,10 +377,134 @@ static void SetMaterialColor(const float col[4]) { glMaterialfv(GL_FRONT, GL_DIFFUSE, col); } -static void DrawGasGiant(void) { - MTRand rng((int)L3D::GetGameTime()); +/* 1980's graphics. ^.^ */ +#define GEOSPLIT 4 +#define GEOROUGHNESS 0.7 +static const float _yes[] = { 1.0, 0.5, 0.25, 0.126, 0.0625, 0.03125 }; +static void SubdivideTriangularContinent2(std::vector& verts, + int sidx, int eidx, int depth, MTRand& rng) { + vector3d& v1 = verts[sidx]; + vector3d& v2 = verts[eidx]; + if(depth > 0) { + int midx = (sidx+eidx)>>1; + vector3d c = vector3d::Normalize(vector3d::Cross(v2-v1, v1)); + c *= rng(1.0); + verts[midx] = vector3d::Normalize(v1+v2+0.7*_yes[GEOSPLIT-depth]*c); + SubdivideTriangularContinent2(verts, sidx, midx, depth-1, rng); + SubdivideTriangularContinent2(verts, midx, eidx, depth-1, rng); + } +} + +static void SubdivideVeryLongTri(vector3d& tip, vector3d& v1, vector3d& v2, int bits) { + vector3d v; + vector3d tip2v1 = v1-tip; + vector3d tip2v2 = v2-tip; + + tip2v1 *= 1.0/bits; + tip2v2 *= 1.0/bits; + + /* Tip triangle. */ + glBegin(GL_TRIANGLES); + glNormal3dv(&tip.x); + glVertex3dv(&tip.x); + v = vector3d::Normalize(tip+tip2v1); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + v = vector3d::Normalize(tip+tip2v2); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + glEnd(); + + glBegin(GL_QUADS); + for(int i = 1; i < bits; i++) { + v = vector3d::Normalize(tip+(tip2v1*i)); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + v = vector3d::Normalize(tip+(tip2v1*(i+1))); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + v = vector3d::Normalize(tip+(tip2v2*(i+1))); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + v = vector3d::Normalize(tip+(tip2v2*i)); + glNormal3dv(&v.x); + glVertex3dv(&v.x); + } + glEnd(); +} + +static void MakeContinent(matrix4x4d& rot, float scale, MTRand& rng) { + const int nvps = exp2(GEOSPLIT); + const int numVertices = nvps*3 + 1; + /* + * This is a continent centered on the north pole, of size roughly 45 + * degrees in each direction (although it is based on a triangle, so + * the actual shape will be a load of rubbish. + */ + vector3d v1(0, 1, scale*1); + vector3d v2(scale*sin(2*M_PI/3.0), 1, scale*cos(2*M_PI/3.0)); + vector3d v3(-scale*sin(2*M_PI/3.0), 1, scale*cos(2*M_PI/3.0)); + v1 = rot*v1; + v2 = rot*v2; + v3 = rot*v3; + v1.Normalize(); + v2.Normalize(); + v3.Normalize(); + std::vector edgeVerts(numVertices); + edgeVerts[0] = v1; + edgeVerts[nvps] = v2; + edgeVerts[2*nvps] = v3; + edgeVerts[3*nvps] = v1; + SubdivideTriangularContinent2(edgeVerts, 0, nvps, GEOSPLIT, rng); + SubdivideTriangularContinent2(edgeVerts, nvps, 2*nvps, GEOSPLIT, rng); + SubdivideTriangularContinent2(edgeVerts, 2*nvps, 3*nvps, GEOSPLIT, rng); + + vector3d center = vector3d::Normalize(v1+v2+v3); + for(unsigned int i = 0; i < edgeVerts.size()-1; i++) { + SubdivideVeryLongTri(center, edgeVerts[i], edgeVerts[i+1], 16); + } +} + +void Planet::DrawRockyPlanet(void) { + //MTRand rng((int)L3D::GetGameTime()); + MTRand rng(sbody.seed); + float blue[4] = { .2, .2, 1, 1 }; + float green[4] = { .2, .8, .2, 1 }; + float white[4] = { 1, 1, 1, 1 }; + + SetMaterialColor(blue); + DrawLovelyRoundCube(1.0f); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + + matrix4x4d rot; + int n = rng(3, 10); + while(n--) { + SetMaterialColor(green); + rot = matrix4x4d::RotateXMatrix(-M_PI/2+rng.drange(-M_PI/3, M_PI/3)); + rot.RotateZ(rng(M_PI*2)); + MakeContinent(rot, rng.drange(0.1, 0.5), rng); + } + /* Poles. */ + SetMaterialColor(white); + rot = matrix4x4d::Identity(); + MakeContinent(rot, 0.25, rng); + rot = matrix4x4d::RotateXMatrix(M_PI); + MakeContinent(rot, 0.25, rng); + + glEnable(GL_DEPTH_TEST); + glDisable(GL_NORMALIZE); +} + +void Planet::DrawGasGiant(void) { + //MTRand rng((int)L3D::GetGameTime()); + MTRand rng(sbody.seed+9); float col[4]; + /* Just use a random gas giant flavour for the moment. */ + GasGiantDef_t& ggdef = ggdefs[rng(0,3)]; + ggdef.bodyCol.GenCol(col, rng); SetMaterialColor(col); DrawLovelyRoundCube(1.0f); @@ -426,7 +550,7 @@ static void DrawGasGiant(void) { void Planet::Render(const Frame* a_camFrame) { glPushMatrix(); - double rad = m_radius; + double rad = radius; vector3d fpos = GetPositionRelTo(a_camFrame); double apparent_size = rad / fpos.Length(); @@ -450,15 +574,20 @@ void Planet::Render(const Frame* a_camFrame) { glEnable(GL_LIGHTING); } else { glScalef(rad, rad, rad); - DrawGasGiant(); + /* This is a rather brittle test.. */ + if(sbody.type < StarSystem::TYPE_PLANET_DWARF) { + DrawGasGiant(); + } else { + DrawRockyPlanet(); + } glClear(GL_DEPTH_BUFFER_BIT); } glPopMatrix(); } void Planet::SetFrame(Frame* f) { - if(GetFrame()) GetFrame()->RemoveGeom(m_geom); + if(GetFrame()) GetFrame()->RemoveGeom(geom); Body::SetFrame(f); - if(f) f->AddGeom(m_geom); + if(f) f->AddGeom(geom); } diff --git a/src/planet.h b/src/planet.h index 43b28cb..cff2fa1 100644 --- a/src/planet.h +++ b/src/planet.h @@ -5,19 +5,22 @@ class Frame; class Planet : public Body { public: - Planet(StarSystem::SBody::SubType); + Planet(StarSystem::SBody*); virtual ~Planet(void); virtual void SetPosition(vector3d p); virtual vector3d GetPosition(void); void SetRadius(double radius); - double GetRadius(void) { return m_radius; } + double GetRadius(void) { return radius; } virtual void Render(const Frame* camFrame); virtual void SetFrame(Frame* f); virtual bool OnCollision(Body* b, Uint32 flags) { return true; } private: - vector3d m_pos; - double m_radius; - dGeomID m_geom; - StarSystem::SBody::SubType m_subtype; + void DrawRockyPlanet(void); + void DrawGasGiant(void); + + vector3d pos; + double radius; + dGeomID geom; + StarSystem::SBody sbody; }; diff --git a/src/sector.cpp b/src/sector.cpp index cbf1d39..679c410 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -23,19 +23,19 @@ Sector::Sector(int x, int y) { float spec = rand(1.0); /* Frequences are from our friends over at wikipedia. ^.^ */ if(spec < 0.0000003) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_O; + s.primaryStarClass = StarSystem::TYPE_STAR_O; } else if(spec < 0.0013) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_B; + s.primaryStarClass = StarSystem::TYPE_STAR_B; } else if(spec < 0.0073) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_A; + s.primaryStarClass = StarSystem::TYPE_STAR_A; } else if(spec < 0.0373) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_F; + s.primaryStarClass = StarSystem::TYPE_STAR_F; } else if(spec < 0.1133) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_G; + s.primaryStarClass = StarSystem::TYPE_STAR_G; } else if(spec < 0.2343) { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_K; + s.primaryStarClass = StarSystem::TYPE_STAR_K; } else { - s.primaryStarClass = StarSystem::SBody::SUBTYPE_STAR_M; + s.primaryStarClass = StarSystem::TYPE_STAR_M; } m_systems.push_back(s); diff --git a/src/sector.h b/src/sector.h index ae1f041..6b09794 100644 --- a/src/sector.h +++ b/src/sector.h @@ -15,7 +15,7 @@ public: struct System { std::string name; vector3f p; - StarSystem::SBody::SubType primaryStarClass; + StarSystem::BodyType primaryStarClass; }; std::vectorm_systems; diff --git a/src/space.cpp b/src/space.cpp index 172025b..f2a0128 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -43,13 +43,13 @@ void Space::Clear(void) { void Space::GenBody(StarSystem* system, StarSystem::SBody* sbody, Frame* f) { Body* b; - if(sbody->type == StarSystem::SBody::TYPE_STAR) { - Star* star = new Star(sbody->subtype); + if(sbody->supertype == StarSystem::SUPERTYPE_STAR) { + Star* star = new Star(sbody->type); star->SetRadius(sbody->radius); b = star; } else { - Planet* planet = new Planet(sbody->subtype); - planet->SetRadius(sbody->radius); + Planet* planet = new Planet(sbody); + //planet->SetRadius(sbody->radius); b = planet; } b->SetLabel(sbody->name.c_str()); diff --git a/src/space.h b/src/space.h index ebf33f3..725d592 100644 --- a/src/space.h +++ b/src/space.h @@ -22,11 +22,11 @@ public: static dWorldID world; static std::list bodies; typedef std::list::iterator bodiesIter_t; + static Frame* rootFrame; private: static void UpdateFramesOfReference(void); static void CollideFrame(Frame* f); static void PruneCorpses(void); - static Frame* rootFrame; //static std::list rootFrames; static std::list corpses; }; diff --git a/src/star.cpp b/src/star.cpp index 131fff6..53739e1 100644 --- a/src/star.cpp +++ b/src/star.cpp @@ -2,18 +2,18 @@ #include "star.h" #include "l3d.h" -Star::Star(StarSystem::SBody::SubType subtype): Body() { - m_subtype = subtype; - m_radius = 6378135.0; - m_pos = vector3d(0,0,0); +Star::Star(StarSystem::BodyType type): Body() { + this->type = type; + radius = 6378135.0; + pos = vector3d(0,0,0); } vector3d Star::GetPosition(void) { - return m_pos; + return pos; } void Star::SetPosition(vector3d p) { - m_pos = p; + pos = p; } void Star::Render(const Frame* a_camFrame) { @@ -22,7 +22,7 @@ void Star::Render(const Frame* a_camFrame) { glPushMatrix(); /* TODO duplicates code from Planet.cpp, not good. */ - double rad = m_radius; + double rad = radius; vector3d fpos = GetPositionRelTo(a_camFrame); double len = fpos.Length(); @@ -34,7 +34,7 @@ void Star::Render(const Frame* a_camFrame) { glTranslatef(fpos.x, fpos.y, fpos.z); - glColor3fv(StarSystem::starColors[m_subtype]); + glColor3fv(StarSystem::starColors[type]); gluSphere(L3D::gluQuadric, rad, 100, 100); glPopMatrix(); glEnable(GL_DEPTH_TEST); diff --git a/src/star.h b/src/star.h index 4513ef9..077e502 100644 --- a/src/star.h +++ b/src/star.h @@ -6,17 +6,17 @@ class Frame; class Star: public Body { public: - Star(StarSystem::SBody::SubType subtype); + Star(StarSystem::BodyType type); virtual ~Star(void) { }; virtual void SetPosition(vector3d p); virtual vector3d GetPosition(void); - void SetRadius(double radius) { m_radius = radius; } - double GetRadius(void) { return m_radius; } + void SetRadius(double radius) { this->radius = radius; } + double GetRadius(void) { return radius; } virtual void Render(const Frame* camFrame); private: - StarSystem::SBody::SubType m_subtype; - vector3d m_pos; - double m_radius; + StarSystem::BodyType type; + vector3d pos; + double radius; }; diff --git a/src/star_system.cpp b/src/star_system.cpp index 12eacaa..94bbefd 100644 --- a/src/star_system.cpp +++ b/src/star_system.cpp @@ -3,7 +3,7 @@ #define CELSIUS 273.15 -/* Indexed by enum subtype. */ +/* Indexed by enum type. */ float StarSystem::starColors[7][3] = { { 1.0, 0.2, 0.0 }, /* M */ { 1.0, 0.6, 0.1 }, /* K */ @@ -20,7 +20,7 @@ static const struct SBodySubTypeInfo { const char *description; const char *icon; float tempMin, tempMax; -} subTypeInfo[StarSystem::SBody::SUBTYPE_MAX] = { +} bodyTypeInfo[StarSystem::TYPE_MAX] = { { 0.4, 0.5, "Type 'M' red star", "icons/object_star_m.png", @@ -119,11 +119,11 @@ static const struct SBodySubTypeInfo { }; const char* StarSystem::SBody::GetAstroDescription(void) { - return subTypeInfo[subtype].description; + return bodyTypeInfo[type].description; } const char* StarSystem::SBody::GetIcon(void) { - return subTypeInfo[subtype].icon; + return bodyTypeInfo[type].icon; } static const double boltzman_const = 5.6704e-8; @@ -247,17 +247,17 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) { /* Primary. */ SBody* primary = new SBody; - StarSystem::SBody::SubType subtype = s.m_systems[system_idx].primaryStarClass; - primary->subtype = subtype; - primary->parent = NULL; - primary->radius = SOL_RADIUS*subTypeInfo[subtype].radius; - primary->mass = SOL_MASS*subTypeInfo[subtype].mass; - primary->type = SBody::TYPE_STAR; - primary->averageTemp = rand((int)subTypeInfo[subtype].tempMin, - (int)subTypeInfo[subtype].tempMax); + StarSystem::BodyType type = s.m_systems[system_idx].primaryStarClass; + primary->type = type; + primary->parent = NULL; + primary->radius = SOL_RADIUS*bodyTypeInfo[type].radius; + primary->mass = SOL_MASS*bodyTypeInfo[type].mass; + primary->supertype = SUPERTYPE_STAR; + primary->averageTemp = rand((int)bodyTypeInfo[type].tempMin, + (int)bodyTypeInfo[type].tempMax); rootBody = primary; - int disc_size = rand(6, 100) + rand(60,140)*primary->subtype*primary->subtype; + int disc_size = rand(6, 100) + rand(60,140)*primary->type*primary->type; //printf("disc_size %.1fAU\n", disc_size/10.0); std::vector* disc = AccreteDisc(disc_size, 0.1+rand(1.5), rand); @@ -266,7 +266,8 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) { if(mass == 0) continue; SBody* planet = new SBody; - planet->subtype = SBody::SUBTYPE_PLANET_DWARF; + planet->type = TYPE_PLANET_DWARF; + planet->seed = rand.Int32(); planet->temp = 0; planet->parent = primary; planet->radius = EARTH_RADIUS; @@ -352,22 +353,22 @@ void StarSystem::SBody::L3DckPlanetType(SBody* star, double distToPrimary, MTRan if(emass > 317.8*13) { /* More than 13 jupiter masses can fuse deuterium - is a brown dwarf. */ - subtype = SBody::SUBTYPE_BROWN_DWARF; + type = TYPE_BROWN_DWARF; /* TODO Should prevent mass exceeding 65 jupiter masses or so, * when it becomes a star. */ } else if(emass > 300) { - subtype = SBody::SUBTYPE_PLANET_LARGE_GAS_GIANT; + type = TYPE_PLANET_LARGE_GAS_GIANT; } else if(emass > 90) { - subtype = SBody::SUBTYPE_PLANET_MEDIUM_GAS_GIANT; + type = TYPE_PLANET_MEDIUM_GAS_GIANT; } else if(emass > 6) { - subtype = SBody::SUBTYPE_PLANET_SMALL_GAS_GIANT; + type = TYPE_PLANET_SMALL_GAS_GIANT; } else { /* Terrestrial planets. */ if(emass < 0.02) { - subtype = SBody::SUBTYPE_PLANET_DWARF; + type = TYPE_PLANET_DWARF; } else if((emass < 0.2) && (globalwarming < 0.05)) { - subtype = SBody::SUBTYPE_PLANET_SMALL; + type = TYPE_PLANET_SMALL; } else if(emass < 3) { if((averageTemp > CELSIUS-10) && (averageTemp < CELSIUS+70)) { /* Try for life.. */ @@ -375,24 +376,24 @@ void StarSystem::SBody::L3DckPlanetType(SBody* star, double distToPrimary, MTRan double maxTemp = calcSurfaceTemp(star->radius, star->averageTemp, radMin, albedo, globalwarming); if((minTemp > CELSIUS-10) && (minTemp < CELSIUS+70) && (maxTemp > CELSIUS-10) && (maxTemp < CELSIUS+70)) { - subtype = SBody::SUBTYPE_PLANET_INDIGENOUS_LIFE; + type = TYPE_PLANET_INDIGENOUS_LIFE; } else { - subtype = SBody::SUBTYPE_PLANET_WATER; + type = TYPE_PLANET_WATER; } } else { - if(rand(0,1)) subtype = SBody::SUBTYPE_PLANET_CO2; - else subtype = SBody::SUBTYPE_PLANET_METHANE; + if(rand(0,1)) type = TYPE_PLANET_CO2; + else type = TYPE_PLANET_METHANE; } } else { /* 3 < emass < 6 */ if((averageTemp > CELSIUS-10) && (averageTemp < CELSIUS+70)) { - subtype = SBody::SUBTYPE_PLANET_WATER_THICK_ATMOS; + type = TYPE_PLANET_WATER_THICK_ATMOS; } else { - if(rand(0,1)) subtype = SBody::SUBTYPE_PLANET_CO2_THICK_ATMOS; - else subtype = SBody::SUBTYPE_PLANET_METHANE_THICK_ATMOS; + if(rand(0,1)) type = TYPE_PLANET_CO2_THICK_ATMOS; + else type = TYPE_PLANET_METHANE_THICK_ATMOS; } } /* Kinda crappy. */ - if((emass > 0.8) && (!rand(0,15))) subtype = SBody::SUBTYPE_PLANET_HIGHLY_VOLCANIC; + if((emass > 0.8) && (!rand(0,15))) type = TYPE_PLANET_HIGHLY_VOLCANIC; } /* Generate moons. */ if(genMoons) { @@ -401,8 +402,9 @@ void StarSystem::SBody::L3DckPlanetType(SBody* star, double distToPrimary, MTRan float mass = (*disc)[i]; if(mass == 0) continue; - SBody* moon = new SBody; - moon->subtype = SBody::SUBTYPE_PLANET_DWARF; + SBody* moon = new SBody; + moon->type = TYPE_PLANET_DWARF; + moon->seed = rand.Int32(); moon->temp = 0; moon->parent = this; moon->radius = EARTH_RADIUS; diff --git a/src/star_system.h b/src/star_system.h index 56b9659..8ba77b4 100644 --- a/src/star_system.h +++ b/src/star_system.h @@ -39,51 +39,62 @@ public: matrix4x4d rotMatrix; }; + enum BodyType { + TYPE_STAR_M, + TYPE_STAR_K, + TYPE_STAR_G, + TYPE_STAR_F, + TYPE_STAR_A, + TYPE_STAR_B, + TYPE_STAR_O, + TYPE_BROWN_DWARF, + TYPE_PLANET_SMALL_GAS_GIANT, + TYPE_PLANET_MEDIUM_GAS_GIANT, + TYPE_PLANET_LARGE_GAS_GIANT, + TYPE_PLANET_VERY_LARGE_GAS_GIANT, + TYPE_PLANET_DWARF, + TYPE_PLANET_SMALL, + TYPE_PLANET_WATER, + TYPE_PLANET_CO2, + TYPE_PLANET_METHANE, + TYPE_PLANET_WATER_THICK_ATMOS, + TYPE_PLANET_CO2_THICK_ATMOS, + TYPE_PLANET_METHANE_THICK_ATMOS, + TYPE_PLANET_HIGHLY_VOLCANIC, + TYPE_PLANET_INDIGENOUS_LIFE, + TYPE_MAX + /* TODO: Need larger atmosphereless thing. */ + }; + + enum BodySuperType { + SUPERTYPE_STAR, SUPERTYPE_ROCKY_PLANET, SUPERTYPE_GAS_GIANT + }; + + struct BodyStats { + + }; + struct SBody { ~SBody(void); void EliminateBadChildren(void); /* :D */ void L3DckPlanetType(SBody*, double distToPrimary, MTRand& drand, bool genMoons); SBody* parent; std::vector children; - Orbit orbit; const char* GetAstroDescription(void); const char* GetIcon(void); int temp; + Orbit orbit; + int seed; /* planet.cpp can use to generate terrain. */ std::string name; double radius; double mass; double radMin, radMax; double averageTemp; - enum { TYPE_STAR, TYPE_ROCKY_PLANET, TYPE_GAS_GIANT } type; - - enum SubType { - SUBTYPE_STAR_M, - SUBTYPE_STAR_K, - SUBTYPE_STAR_G, - SUBTYPE_STAR_F, - SUBTYPE_STAR_A, - SUBTYPE_STAR_B, - SUBTYPE_STAR_O, - SUBTYPE_BROWN_DWARF, - SUBTYPE_PLANET_SMALL_GAS_GIANT, - SUBTYPE_PLANET_MEDIUM_GAS_GIANT, - SUBTYPE_PLANET_LARGE_GAS_GIANT, - SUBTYPE_PLANET_VERY_LARGE_GAS_GIANT, - SUBTYPE_PLANET_DWARF, - SUBTYPE_PLANET_SMALL, - SUBTYPE_PLANET_WATER, - SUBTYPE_PLANET_CO2, - SUBTYPE_PLANET_METHANE, - SUBTYPE_PLANET_WATER_THICK_ATMOS, - SUBTYPE_PLANET_CO2_THICK_ATMOS, - SUBTYPE_PLANET_METHANE_THICK_ATMOS, - SUBTYPE_PLANET_HIGHLY_VOLCANIC, - SUBTYPE_PLANET_INDIGENOUS_LIFE, - SUBTYPE_MAX - /* TODO: Need larger atmospherless things. */ - } subtype; + + BodySuperType supertype; + BodyType type; }; SBody* rootBody;