[Add] Ejecta crater flavour. ^.^

This commit is contained in:
Rtch90 2017-11-25 13:03:32 +00:00
parent 849c723d6a
commit 8b8f2606ca

View File

@ -433,11 +433,12 @@ static void SubdivideVeryLongTri(vector3d& tip, vector3d& v1, vector3d& v2, int
glEnd();
}
static int exp2i(int foo) { int n = 2; while(--foo) n*=2; return n; }
static void MakeContinent(matrix4x4d& rot, float scale, MTRand& rng) {
glDisable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
const int nvps = exp2(GEOSPLIT);
const int nvps = exp2i(GEOSPLIT);
const int numVertices = nvps*3 + 1;
/*
* This is a continent centered on the north pole, of size roughly 45
@ -478,6 +479,7 @@ void DrawCircle(float rad) {
glEnable(GL_BLEND);
glBegin(GL_TRIANGLE_FAN);
glNormal3d(0, 1, 0);
glVertex3d(0, 1, 0);
for(double theta = 0; theta < M_PI * 2; theta += 0.1) {
vector3d v(rad*sin(theta), 1, rad*cos(theta));
@ -498,6 +500,43 @@ void DrawCircle(float rad) {
glPopAttrib();
}
/* Draws at north pole. */
static void DrawEjecta(float rad1, float rad2, int points) { /* That's a star shape. */
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_BLEND);
double step = 2*M_PI/points;
for(int p = 0; p < points; p++) {
double ang0 = step*p;
double ang1 = step*(p+1);
double ang2 = (ang0+ang1)*.5;
vector3d v1(rad1*sin(ang0), 1, rad1*cos(ang0));
vector3d v2(rad2*sin(ang2), 1, rad2*cos(ang2));
vector3d v3(rad1*sin(ang1), 1, rad1*cos(ang1));
v1.Normalize();
v2.Normalize();
v3.Normalize();
SubdivideVeryLongTri(v2, v3, v1, 6);
glBegin(GL_TRIANGLES);
/* Tri to center. */
glNormal3dv(&v1.x);
glVertex3dv(&v1.x);
glNormal3dv(&v3.x);
glVertex3dv(&v3.x);
glNormal3d(0, 1, 0);
glVertex3d(0, 1, 0);
glEnd();
}
glDisable(GL_BLEND);
glDisable(GL_NORMALIZE);
glPopAttrib();
}
/* Draws at north pole. */
void DrawHollowCircle(float rad1, float rad2) {
glPushAttrib(GL_DEPTH_BUFFER_BIT);
@ -532,21 +571,21 @@ void DrawHollowCircle(float rad1, float rad2) {
void Planet::DrawRockyPlanet(void) {
int n;
float r;
float r, tmp;
matrix4x4d rot;
float col[4];
float col[4], col2[4];
//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 };
ColRangeObj_t barrenBodyCol = { { .3, .3, .3, 1 }, { 0, 0, 0, 0 }, .3 };
ColRangeObj_t barrenContCol = { { .2, .2, .2, .6 }, { 0, 0, 0, 0 }, .3 };
ColRangeObj_t barrenContCol = { { .2, .2, .2, 1 }, { 0, 0, 0, 0 }, .3 };
switch(sbody.type) {
case StarSystem::TYPE_PLANET_DWARF:
barrenBodyCol.GenCol(col, rng);
SetMaterialColor(col);
barrenBodyCol.GenCol(col2, rng);
SetMaterialColor(col2);
DrawLovelyRoundCube(1.0f);
n = rng(3, 10);
@ -555,26 +594,36 @@ void Planet::DrawRockyPlanet(void) {
while(n--) {
rot = matrix4x4d::RotateXMatrix(rng(M_PI/2));
rot.RotateZ(rng(M_PI*2));
MakeContinent(rot, rng.drange(0.1, 0.5), rng);
MakeContinent(rot, rng.drange(0.05, 0.2), rng);
}
n = rng(10, 30);
SetMaterialColor(col);
n = rng(50, 100);
printf("%d\n", n);
while(n--) {
barrenContCol.GenCol(col, rng);
r = rng.drange(0.02, 0.1);
glPushMatrix();
glRotatef(rng.drange(0, 360), 1, 0, 0);
glRotatef(rng.drange(0, 360), 0, 0, 1);
DrawCircle(r);
glPopMatrix();
}
vector3d rx(rng(1.0)-.5, rng(1.0)-.5, rng(1.0)-.5);
rx.Normalize();
glRotatef(rng.drange(0, 360), rx.x, rx.y, rx.z);
n = rng(10, 30);
while(n--) {
r = rng.drange(0.02, 0.2);
glPushMatrix();
glRotatef(rng.drange(0, 360), 1, 0, 0);
glRotatef(rng.drange(0, 360), 0, 0, 1);
DrawHollowCircle(r, r*1.3);
tmp = rng(1.0);
if(tmp < .46) {
DrawCircle(r);
} else if(tmp < .92) {
//DrawHollowCircle(r, r*1.3);
DrawCircle(r*1.3);
/* Uh.. Yeah. */
SetMaterialColor(col2);
DrawCircle(r);
SetMaterialColor(col);
} else {
SetMaterialColor(col);
DrawEjecta(r*0.6, 3*r, 6);
SetMaterialColor(col2);
DrawCircle(r*0.4);
}
glPopMatrix();
}
break;