[Add] Ejecta crater flavour. ^.^
This commit is contained in:
parent
849c723d6a
commit
8b8f2606ca
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user