[Add] Preliminary atmospheres.

This commit is contained in:
Rtch90 2017-12-23 19:27:31 +00:00
parent 018909ebf4
commit 70ef1701cf
2 changed files with 114 additions and 0 deletions

View File

@ -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();

View File

@ -17,6 +17,7 @@ public:
private:
void DrawRockyPlanet(void);
void DrawGasGiant(void);
void DrawAtmosphere(double rad, vector3d& pos);
vector3d pos;
dGeomID geom;