diff --git a/src/custom_starsystems.cpp b/src/custom_starsystems.cpp index 5f1fa6b..3d0f75b 100644 --- a/src/custom_starsystems.cpp +++ b/src/custom_starsystems.cpp @@ -9,67 +9,67 @@ const CustomSBody sol_system[] = { { "Mercury", StarSystem::TYPE_PLANET_SMALL, 0, fixed(38, 100), fixed(55, 1000), 340, - fixed(387,1000), fixed(205,1000), DEG2RAD(7.0) + fixed(387,1000), fixed(205,1000), DEG2RAD(7.0), fixed(59, 1) }, { "Venus", StarSystem::TYPE_PLANET_CO2_THICK_ATMOS, 0, fixed(95,100), fixed(815,1000), 735, - fixed(723,1000), fixed(7,1000), DEG2RAD(3.39) + fixed(723,1000), fixed(7,1000), DEG2RAD(3.39), fixed(243, 1) }, { "Earth", StarSystem::TYPE_PLANET_INDIGENOUS_LIFE, 0, fixed(1,1), fixed(1,1), 288, - fixed(1,1), fixed(167,10000), + fixed(1,1), fixed(167,10000), 0, fixed(1,1) }, { "Moon", StarSystem::TYPE_PLANET_DWARF, 3, fixed(273,1000), fixed(12,1000), 220, - fixed(257,100000), fixed(549,10000), DEG2RAD(5.145) + fixed(257,100000), fixed(549,10000), DEG2RAD(5.145), fixed(273, 10) }, { "Mars", StarSystem::TYPE_PLANET_SMALL, 0, fixed(533,1000), fixed(107,1000), 227, - fixed(152,100), fixed(933,10000), DEG2RAD(1.85) + fixed(152,100), fixed(933,10000), DEG2RAD(1.85), fixed(1027, 1000) }, { "Jupiter", StarSystem::TYPE_PLANET_LARGE_GAS_GIANT, 0, fixed(11,1), fixed(3178,10), 165, - fixed(5204,1000), fixed(488,10000), DEG2RAD(1.305) + fixed(5204,1000), fixed(488,10000), DEG2RAD(1.305), fixed(4, 10) }, { "Saturn", StarSystem::TYPE_PLANET_MEDIUM_GAS_GIANT, 0, fixed(9,1), fixed(95152,100), 134, - fixed(9582,1000), fixed(557,10000), DEG2RAD(2.485) + fixed(9582,1000), fixed(557,10000), DEG2RAD(2.485), fixed(4, 10) }, { "Uranus", StarSystem::TYPE_PLANET_SMALL_GAS_GIANT, 0, fixed(4,1), fixed(145,10), 76, - fixed(19229,1000), fixed(444,10000), DEG2RAD(0.772) + fixed(19229,1000), fixed(444,10000), DEG2RAD(0.772), fixed(7, 10) }, { "Neptune", StarSystem::TYPE_PLANET_SMALL_GAS_GIANT, 0, fixed(38,10), fixed(17147,100), 72, - fixed(30104,1000), fixed(112, 10000), DEG2RAD(1.768) + fixed(30104,1000), fixed(112, 10000), DEG2RAD(1.768), fixed(75, 100) }, /* Moons of jupiter. */ { "Io", StarSystem::TYPE_PLANET_HIGHLY_VOLCANIC, 6, fixed(286,1000), fixed(15,1000), 130, - fixed(282,100000), fixed(41,10000), DEG2RAD(2.21) + fixed(282,100000), fixed(41,10000), DEG2RAD(2.21), fixed(177, 10) }, { "Europa", StarSystem::TYPE_PLANET_WATER, 6, fixed(245,1000), fixed(8,1000), 102, - fixed(441,100000), fixed(9,1000), 0.0 + fixed(441,100000), fixed(9,1000), 0.0, fixed(355, 10) }, { 0 } }; diff --git a/src/custom_starsystems.h b/src/custom_starsystems.h index aeab42a..0efe08f 100644 --- a/src/custom_starsystems.h +++ b/src/custom_starsystems.h @@ -12,6 +12,7 @@ struct CustomSBody { fixed semiMajorAxis; /* In AUs. */ fixed eccentricity; float inclination; /* Radians. */ + fixed rotationPeriod; /* In days. */ }; struct CustomSystem { diff --git a/src/dynamic_body.cpp b/src/dynamic_body.cpp index 503fc04..97f299e 100644 --- a/src/dynamic_body.cpp +++ b/src/dynamic_body.cpp @@ -44,7 +44,6 @@ void DynamicBody::SetMassDistributionFromCollMesh(const CollMesh* m) { max.z = MAX(m->pVertex[i+2], max.z); } float size = ((max.x-min.x) + (max.y-min.y) + (max.z-min.z)) / 6.0f; - printf("size %f\n", size); dMassSetSphere(&m_mass, 1, size); /* Boxes go mental after a while due to inertia tensor being fishy. */ //dMassSetBox(&m_mass, 1, max.x-min.x, max.y-min.y, max.z-min.z); diff --git a/src/main.cpp b/src/main.cpp index d4f6d46..2de6a10 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -202,8 +202,8 @@ void L3D::MainLoop(void) { StarSystem s(0, 0, 0); HyperspaceTo(&s); - const float zpos = EARTH_RADIUS * 1; - Frame* pframe = *(Space::rootFrame->m_children.begin()); + const float zpos = EARTH_RADIUS * 3; + Frame* pframe = *(++(++(Space::rootFrame->m_children.begin()))); Frame* stationFrame = new Frame(pframe, "Station frame.."); stationFrame->SetRadius(5000); @@ -244,7 +244,7 @@ void L3D::MainLoop(void) { infoView = new InfoView(); SetView(world_view); - //player->SetDockedWith(station); + player->SetDockedWith(station); Uint32 last_stats = SDL_GetTicks(); int frame_stat = 0; diff --git a/src/space.cpp b/src/space.cpp index a4ef3f1..fc61156 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -57,6 +57,43 @@ void Space::MoveOrbitingObjectFrames(Frame* f) { } } +static Frame* MakeFrameFor(StarSystem::SBody* sbody, Body* b, Frame* f) { + Frame* orbFrame, *rotFrame; + + if(!sbody->parent) { + b->SetFrame(f); + return f; + } + + switch(sbody->GetSuperType()) { + /* + * For planets we want a non-rotating frame for a few radii + * and a rotating frame in the same position but with maybe 1.1*radius, + * which actually contains the object. + */ + case StarSystem::SUPERTYPE_GAS_GIANT: + case StarSystem::SUPERTYPE_ROCKY_PLANET: + orbFrame = new Frame(f, sbody->name.c_str()); + orbFrame->sBody = sbody; + orbFrame->SetRadius(10*sbody->GetRadius()); + + assert(sbody->GetRotationPeriod() != 0); + rotFrame = new Frame(orbFrame, sbody->name.c_str()); + rotFrame->SetRadius(1.1*sbody->GetRadius()); + rotFrame->SetAngVelocity(vector3d(0,2*M_PI/sbody->GetRotationPeriod(), 0)); + b->SetFrame(rotFrame); + return orbFrame; + /* Stars want a single small non-rotating frame. */ + case StarSystem::SUPERTYPE_STAR: + default: + orbFrame = new Frame(f, sbody->name.c_str()); + orbFrame->sBody = sbody; + orbFrame->SetRadius(1.2*sbody->GetRadius()); + b->SetFrame(orbFrame); + return orbFrame; + } +} + void Space::GenBody(StarSystem::SBody* sbody, Frame* f) { Body* b; @@ -71,19 +108,8 @@ void Space::GenBody(StarSystem::SBody* sbody, Frame* f) { } b->SetLabel(sbody->name.c_str()); - Frame* myframe; - if(sbody->parent) { - myframe = new Frame(f, sbody->name.c_str()); - myframe->SetRadius(10*sbody->GetRadius()); - myframe->sBody = sbody; - b->SetFrame(myframe); - } else { - b->SetFrame(f); - myframe = f; - } - f = myframe; - b->SetPosition(vector3d(0, 0, 0)); + f = MakeFrameFor(sbody, b, f); AddBody(b); diff --git a/src/star_system.cpp b/src/star_system.cpp index c814a40..e7ad7cf 100644 --- a/src/star_system.cpp +++ b/src/star_system.cpp @@ -331,6 +331,7 @@ void StarSystem::CustomGetChildOf(SBody* parent, const CustomSBody* customDef, c child->mass = c->mass; child->averageTemp = c->averageTemp; child->name = c->name; + child->rotationPeriod = c->rotationPeriod; child->orbit.eccentricity = c->eccentricity.ToDouble(); child->orbit.semiMajorAxis = c->semiMajorAxis.ToDouble() * AU; @@ -486,6 +487,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) { planet->parent = primary; //planet->radius = EARTH_RADIUS*bodyTypeInfo[type].radius; planet->mass = mass; + planet->rotationPeriod = fixed(rand.Int32(1,200), 24); fixed ecc = rand.NFixed(3); fixed semiMajorAxis = fixed(i+1, 10); /* In AUs. */ @@ -623,6 +625,8 @@ void StarSystem::SBody::PickPlanetType(SBody* star, const fixed distToPrimary, M moon->tmp = 0; moon->parent = this; //moon->radius = EARTH_RADIUS*bodyTypeInfo[type].radius; + moon->rotationPeriod = fixed(rand.Int32(1,200), 24); + moon->mass = mass; fixed ecc = rand.NFixed(3); fixed semiMajorAxis = fixed(i+2, 2000); diff --git a/src/star_system.h b/src/star_system.h index 2ac4cad..206fe6f 100644 --- a/src/star_system.h +++ b/src/star_system.h @@ -100,6 +100,10 @@ public: else return mass.ToDouble() * EARTH_MASS; } + /* Returned in seconds. */ + double GetRotationPeriod(void) const { + return rotationPeriod.ToDouble()*60*60*24; + } int tmp; Orbit orbit; @@ -108,6 +112,7 @@ public: fixed radius; fixed mass; /* Earth masses if planet, solar masses if star. */ fixed radMin, radMax; /* In AU's. */ + fixed rotationPeriod; /* In days. */ int averageTemp; BodySuperType supertype;