[Add] Rudimentary work on small rocky planetoid rendering.
This commit is contained in:
parent
92590d2136
commit
236d683a81
@ -59,7 +59,8 @@ void ObjectViewerView::Update(void) {
|
|||||||
viewingDist = CLAMP(viewingDist, 10, 1e10);
|
viewingDist = CLAMP(viewingDist, 10, 1e10);
|
||||||
|
|
||||||
char buf[128];
|
char buf[128];
|
||||||
snprintf(buf, sizeof(buf), "View dist: %.2f", viewingDist);
|
Body* body = L3D::player->GetNavTarget();
|
||||||
|
snprintf(buf, sizeof(buf), "View dist: %.2f Object: %s", viewingDist, (body ? body->GetLabel().c_str() : "<none>"));
|
||||||
m_infoLabel->SetText(buf);
|
m_infoLabel->SetText(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
146
src/planet.cpp
146
src/planet.cpp
@ -434,6 +434,9 @@ static void SubdivideVeryLongTri(vector3d& tip, vector3d& v1, vector3d& v2, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void MakeContinent(matrix4x4d& rot, float scale, MTRand& rng) {
|
static void MakeContinent(matrix4x4d& rot, float scale, MTRand& rng) {
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
|
||||||
const int nvps = exp2(GEOSPLIT);
|
const int nvps = exp2(GEOSPLIT);
|
||||||
const int numVertices = nvps*3 + 1;
|
const int numVertices = nvps*3 + 1;
|
||||||
/*
|
/*
|
||||||
@ -463,38 +466,141 @@ static void MakeContinent(matrix4x4d& rot, float scale, MTRand& rng) {
|
|||||||
for(unsigned int i = 0; i < edgeVerts.size()-1; i++) {
|
for(unsigned int i = 0; i < edgeVerts.size()-1; i++) {
|
||||||
SubdivideVeryLongTri(center, edgeVerts[i], edgeVerts[i+1], 16);
|
SubdivideVeryLongTri(center, edgeVerts[i], edgeVerts[i+1], 16);
|
||||||
}
|
}
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_NORMALIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw at north pole. */
|
||||||
|
void DrawCircle(float rad) {
|
||||||
|
glPushAttrib(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
|
glVertex3d(0, 1, 0);
|
||||||
|
for(double theta = 0; theta < M_PI * 2; theta += 0.1) {
|
||||||
|
vector3d v(rad*sin(theta), 1, rad*cos(theta));
|
||||||
|
v.Normalize();
|
||||||
|
glNormal3dv(&v.x);
|
||||||
|
glVertex3dv(&v.x);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
vector3d v(0, 1, rad);
|
||||||
|
v.Normalize();
|
||||||
|
glNormal3dv(&v.x);
|
||||||
|
glVertex3dv(&v.x);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_NORMALIZE);
|
||||||
|
glPopAttrib();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draws at north pole. */
|
||||||
|
void DrawHollowCircle(float rad1, float rad2) {
|
||||||
|
glPushAttrib(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glBegin(GL_TRIANGLE_STRIP);
|
||||||
|
for(double theta = 0; theta < 2*M_PI; theta += 0.1) {
|
||||||
|
vector3d v(rad1*sin(theta), 1, rad1*cos(theta));
|
||||||
|
v.Normalize();
|
||||||
|
glNormal3dv(&v.x);
|
||||||
|
glVertex3dv(&v.x);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
vector3d v(0, 1, rad1);
|
||||||
|
v.Normalize();
|
||||||
|
glNormal3dv(&v.x);
|
||||||
|
glVertex3dv(&v.x);
|
||||||
|
|
||||||
|
v = vector3d(0, 1, rad2);
|
||||||
|
v.Normalize();
|
||||||
|
glNormal3dv(&v.x);
|
||||||
|
glVertex3dv(&v.x);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_NORMALIZE);
|
||||||
|
glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Planet::DrawRockyPlanet(void) {
|
void Planet::DrawRockyPlanet(void) {
|
||||||
|
int n;
|
||||||
|
float r;
|
||||||
|
matrix4x4d rot;
|
||||||
|
float col[4];
|
||||||
//MTRand rng((int)L3D::GetGameTime());
|
//MTRand rng((int)L3D::GetGameTime());
|
||||||
MTRand rng(sbody.seed);
|
MTRand rng(sbody.seed);
|
||||||
float blue[4] = { .2, .2, 1, 1 };
|
float blue[4] = { .2, .2, 1, 1 };
|
||||||
float green[4] = { .2, .8, .2, 1 };
|
float green[4] = { .2, .8, .2, 1 };
|
||||||
float white[4] = { 1, 1, 1, 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 };
|
||||||
|
|
||||||
SetMaterialColor(blue);
|
switch(sbody.type) {
|
||||||
DrawLovelyRoundCube(1.0f);
|
case StarSystem::TYPE_PLANET_DWARF:
|
||||||
|
barrenBodyCol.GenCol(col, rng);
|
||||||
|
SetMaterialColor(col);
|
||||||
|
DrawLovelyRoundCube(1.0f);
|
||||||
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
n = rng(3, 10);
|
||||||
glEnable(GL_NORMALIZE);
|
barrenContCol.GenCol(col, rng);
|
||||||
|
SetMaterialColor(col);
|
||||||
|
while(n--) {
|
||||||
|
rot = matrix4x4d::RotateXMatrix(rng(M_PI/2));
|
||||||
|
rot.RotateZ(rng(M_PI*2));
|
||||||
|
MakeContinent(rot, rng.drange(0.1, 0.5), rng);
|
||||||
|
}
|
||||||
|
|
||||||
matrix4x4d rot;
|
n = rng(10, 30);
|
||||||
int n = rng(3, 10);
|
while(n--) {
|
||||||
while(n--) {
|
r = rng.drange(0.02, 0.1);
|
||||||
SetMaterialColor(green);
|
glPushMatrix();
|
||||||
rot = matrix4x4d::RotateXMatrix(-M_PI/2+rng.drange(-M_PI/3, M_PI/3));
|
glRotatef(rng.drange(0, 360), 1, 0, 0);
|
||||||
rot.RotateZ(rng(M_PI*2));
|
glRotatef(rng.drange(0, 360), 0, 0, 1);
|
||||||
MakeContinent(rot, rng.drange(0.1, 0.5), rng);
|
DrawCircle(r);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case StarSystem::TYPE_PLANET_INDIGENOUS_LIFE:
|
||||||
|
SetMaterialColor(blue);
|
||||||
|
DrawLovelyRoundCube(1.0f);
|
||||||
|
|
||||||
|
n = rng(3, 10);
|
||||||
|
while(n--) {
|
||||||
|
SetMaterialColor(green);
|
||||||
|
rot = matrix4x4d::RotateXMatrix(-M_PI/2+rng.drange(-M_PI/3, M_PI/3));
|
||||||
|
rot.RotateZ(rng(M_PI*2));
|
||||||
|
MakeContinent(rot, rng.drange(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;
|
||||||
|
default:
|
||||||
|
barrenBodyCol.GenCol(col, rng);
|
||||||
|
SetMaterialColor(col);
|
||||||
|
DrawLovelyRoundCube(1.0f);
|
||||||
}
|
}
|
||||||
/* Poles. */
|
|
||||||
SetMaterialColor(white);
|
|
||||||
rot = matrix4x4d::Identity();
|
|
||||||
MakeContinent(rot, 0.25, rng);
|
|
||||||
rot = matrix4x4d::RotateXMatrix(M_PI);
|
|
||||||
MakeContinent(rot, 0.25, rng);
|
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_NORMALIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Planet::DrawGasGiant(void) {
|
void Planet::DrawGasGiant(void) {
|
||||||
|
Loading…
Reference in New Issue
Block a user