[Add] Preliminary atmospheres.
This commit is contained in:
parent
018909ebf4
commit
70ef1701cf
113
src/planet.cpp
113
src/planet.cpp
@ -592,6 +592,7 @@ void Planet::DrawRockyPlanet(void) {
|
||||
float col[4], col2[4];
|
||||
//MTRand rng((int)L3D::GetGameTime());
|
||||
MTRand rng(sbody.seed);
|
||||
float darkblue[4] = { .05, .05, .2, 1 };
|
||||
float blue[4] = { .2, .2, 1, 1 };
|
||||
float green[4] = { .2, .8, .2, 1 };
|
||||
float white[4] = { 1, 1, 1, 1 };
|
||||
@ -601,6 +602,7 @@ void Planet::DrawRockyPlanet(void) {
|
||||
|
||||
switch(sbody.type) {
|
||||
case StarSystem::TYPE_PLANET_DWARF:
|
||||
case StarSystem::TYPE_PLANET_SMALL:
|
||||
barrenBodyCol.GenCol(col2, rng);
|
||||
SetMaterialColor(col2);
|
||||
DrawLovelyRoundCube(1.0f);
|
||||
@ -644,6 +646,27 @@ void Planet::DrawRockyPlanet(void) {
|
||||
glPopMatrix();
|
||||
}
|
||||
break;
|
||||
|
||||
case StarSystem::TYPE_PLANET_WATER:
|
||||
case StarSystem::TYPE_PLANET_WATER_THICK_ATMOS:
|
||||
SetMaterialColor(darkblue);
|
||||
DrawLovelyRoundCube(1.0f);
|
||||
|
||||
n = rng.Int32(3, 10);
|
||||
while(n--) {
|
||||
barrenBodyCol.GenCol(col2, rng);
|
||||
SetMaterialColor(col2);
|
||||
rot = matrix4x4d::RotateXMatrix(-M_PI/2+rng.Double(-M_PI/3, M_PI/3));
|
||||
rot.RotateZ(rng.Double(M_PI*2));
|
||||
MakeContinent(rot, rng.Double(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);
|
||||
break;
|
||||
case StarSystem::TYPE_PLANET_INDIGENOUS_LIFE:
|
||||
SetMaterialColor(blue);
|
||||
DrawLovelyRoundCube(1.0f);
|
||||
@ -719,6 +742,91 @@ void Planet::DrawGasGiant(void) {
|
||||
}
|
||||
}
|
||||
|
||||
static void _DrawAtmosphere(double rad1, double rad2, vector3d& pos, const float col[4]) {
|
||||
glPushMatrix();
|
||||
/* Face the camera damn you! */
|
||||
vector3d zaxis = vector3d::Normalize(-pos);
|
||||
vector3d xaxis = vector3d::Normalize(vector3d::Cross(zaxis, vector3d(0, 1, 0)));
|
||||
vector3d yaxis = vector3d::Cross(zaxis, xaxis);
|
||||
matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).InverseOf();
|
||||
glMultMatrixd(&rot[0]);
|
||||
|
||||
const double angStep = M_PI/32;
|
||||
/* Find angle player -> center -> tangent point. */
|
||||
/* Tangent is from player to surface of sphere. */
|
||||
float tanAng = acos(rad1 / pos.Length());
|
||||
|
||||
/* Then we can put the atmosphere on the horizon. */
|
||||
vector3d r1(0.0, 0.0, rad1);
|
||||
vector3d r2(0.0, 0.0, rad2);
|
||||
rot = matrix4x4d::RotateYMatrix(tanAng);
|
||||
r1 = rot*r1;
|
||||
r2 = rot*r2;
|
||||
|
||||
rot = matrix4x4d::RotateZMatrix(angStep);
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glEnable(GL_BLEND);
|
||||
glDisable(GL_CULL_FACE);
|
||||
glBegin(GL_TRIANGLE_STRIP);
|
||||
for(float ang = 0; ang < 2*M_PI; ang += angStep) {
|
||||
glColor4fv(col);
|
||||
glVertex3dv(&r1.x);
|
||||
glColor4f(0,0,0,0);
|
||||
glVertex4dv(&r2.x);
|
||||
r1 = rot*r1;
|
||||
r2 = rot*r2;
|
||||
}
|
||||
glColor4fv(col);
|
||||
glVertex3dv(&r1.x);
|
||||
glColor4f(0,0,0,0);
|
||||
glVertex3dv(&r2.x);
|
||||
glEnd();
|
||||
glEnable(GL_CULL_FACE);
|
||||
glDisable(GL_BLEND);
|
||||
glEnable(GL_LIGHTING);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
void Planet::DrawAtmosphere(double rad, vector3d& pos) {
|
||||
if(sbody.type == StarSystem::TYPE_PLANET_SMALL) {
|
||||
const float c[4] = { .2, .2, .3, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_CO2_THICK_ATMOS) {
|
||||
const float c[4] = { .8, .8, .8, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.1, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_CO2) {
|
||||
const float c[4] = { .5, .5, .5, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_METHANE_THICK_ATMOS) {
|
||||
const float c[4] = { .2, .6, .3, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.1, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_METHANE) {
|
||||
const float c[4] = { .2, .6, .3, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_HIGHLY_VOLCANIC) {
|
||||
const float c[4] = { .5, .2, .2, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_WATER_THICK_ATMOS) {
|
||||
const float c[4] = { .8, .8, .8, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.1, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_WATER) {
|
||||
const float c[4] = { .2, .2, .4, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
else if(sbody.type == StarSystem::TYPE_PLANET_INDIGENOUS_LIFE) {
|
||||
const float c[4] = { .2, .2, .5, .8 };
|
||||
_DrawAtmosphere(rad*0.99, rad*1.05, pos, c);
|
||||
}
|
||||
}
|
||||
|
||||
void Planet::Render(const Frame* a_camFrame) {
|
||||
glPushMatrix();
|
||||
|
||||
@ -760,8 +868,13 @@ void Planet::Render(const Frame* a_camFrame) {
|
||||
}
|
||||
glEndList();
|
||||
}
|
||||
glPushMatrix();
|
||||
glScalef(rad, rad, rad);
|
||||
glCallList(crudDList);
|
||||
glPopMatrix();
|
||||
|
||||
DrawAtmosphere(rad, fpos);
|
||||
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
glPopMatrix();
|
||||
|
@ -17,6 +17,7 @@ public:
|
||||
private:
|
||||
void DrawRockyPlanet(void);
|
||||
void DrawGasGiant(void);
|
||||
void DrawAtmosphere(double rad, vector3d& pos);
|
||||
|
||||
vector3d pos;
|
||||
dGeomID geom;
|
||||
|
Loading…
Reference in New Issue
Block a user