From 8a16f3c0dbbf1c5a61a1a5bafbace81b2f0f5bb9 Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Tue, 21 Nov 2017 19:28:44 +0000
Subject: [PATCH] [Add?] Some work in progress planet drawing. Nothing to pay
 attention to. :P

---
 src/planet.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 108 insertions(+), 1 deletion(-)

diff --git a/src/planet.cpp b/src/planet.cpp
index f83ddbd..22e994c 100644
--- a/src/planet.cpp
+++ b/src/planet.cpp
@@ -2,6 +2,7 @@
 #include "planet.h"
 #include "frame.h"
 #include "l3d.h"
+#include "world_view.h"
 
 Planet::Planet(StarSystem::SBody::SubType subtype) : Body() {
   m_radius  = 6378135.0;
@@ -34,6 +35,110 @@ void Planet::SetRadius(double radius) {
   dGeomSphereSetRadius(m_geom, radius);
 }
 
+void subdivide(vector3d& v1, vector3d& v2, vector3d& v3, vector3d& v4, int depth) {
+  if(depth) {
+    depth--;
+    vector3d v5 = v1+v2;
+    vector3d v6 = v2+v3;
+    vector3d v7 = v3+v4;
+    vector3d v8 = v4+v1;
+    vector3d v9 = v1+v2+v3+v4;
+
+    v5.Normalize();
+    v6.Normalize();
+    v7.Normalize();
+    v8.Normalize();
+    v9.Normalize();
+
+    /* XXX WRONG, need to do projection stuff! */
+#if 0
+    /* Front-facing. */
+    bool ff1, ff2, ff3, ff4, ff5, ff6, ff7, ff8, ff9;
+    const matrix4x4d& r = L3D::world_view->viewingRotation;
+
+    ff1 = (r*v1).z > 0;
+    ff2 = (r*v2).z > 0;
+    ff3 = (r*v3).z > 0;
+    ff4 = (r*v4).z > 0;
+    ff5 = (r*v5).z > 0;
+    ff6 = (r*v6).z > 0;
+    ff7 = (r*v7).z > 0;
+    ff8 = (r*v8).z > 0;
+    ff9 = (r*v9).z > 0;
+#endif
+
+    subdivide(v1, v5, v8, v8, depth);
+    subdivide(v5, v2, v6, v9, depth);
+    subdivide(v9, v6, v3, v7, depth);
+    subdivide(v8, v9, v7, v4, depth);
+  } else {
+    glBegin(GL_TRIANGLE_STRIP);
+      glNormal3dv(&v1.x);
+      glVertex3dv(&v1.x);
+      glNormal3dv(&v2.x);
+      glVertex3dv(&v2.x);
+      glNormal3dv(&v4.x);
+      glVertex3dv(&v4.x);
+      glNormal3dv(&v3.x);
+      glVertex3dv(&v3.x);
+    glEnd();
+  }
+}
+
+void DrawLovelyRoundCube(double radius) {
+  const float mdiff[]     = { 0.8, 0.8, 0.5, 1.0 };
+  const float mambient[]  = { 0.02, 0.02, 0.01, 1.0 };
+  const float mdiff2[]    = { 0.2, 0.2, 0.8, 0.5 };
+  const float mambient2[] = { 0.01, 0.01, 0.04, 0.5 };
+  glMaterialfv(GL_FRONT, GL_AMBIENT, mambient);
+  glMaterialfv(GL_FRONT, GL_DIFFUSE, mdiff);
+
+  vector3d p1(1, 1, 1);
+  vector3d p2(-1, 1, 1);
+  vector3d p3(-1, -1, 1);
+  vector3d p4(1, -1, 1);
+
+  vector3d p5(1, 1, -1);
+  vector3d p6(-1, 1, -1);
+  vector3d p7(-1, -1, -1);
+  vector3d p8(1, -1, -1);
+
+  p1.Normalize();
+  p2.Normalize();
+  p3.Normalize();
+  p4.Normalize();
+  p5.Normalize();
+  p6.Normalize();
+  p7.Normalize();
+  p8.Normalize();
+
+  //p1 *= radius;
+  //p2 *= radius;
+  //p3 *= radius;
+  //p4 *= radius;
+  //p5 *= radius;
+  //p6 *= radius;
+  //p7 *= radius;
+  //p8 *= radius;
+
+  //glDisable(GL_CULL_FACE);
+  glEnable(GL_NORMALIZE);
+  subdivide(p1, p2, p3, p3, 3);
+  subdivide(p4, p3, p7, p8, 3);
+  subdivide(p1, p4, p8, p5, 3);
+  subdivide(p2, p1, p5, p6, 3);
+  subdivide(p3, p2, p6, p7, 3);
+  subdivide(p8, p7, p6, p5, 3);
+
+  glEnable(GL_BLEND);
+  glMaterialfv(GL_FRONT, GL_AMBIENT, mambient2);
+  glMaterialfv(GL_FRONT, GL_DIFFUSE, mdiff2);
+  subdivide(p1, p2, p3, p4, 3);
+  glDisable(GL_BLEND);
+
+  glDisable(GL_NORMALIZE);
+}
+
 void Planet::Render(const Frame* a_camFrame) {
   glPushMatrix();
   glDisable(GL_DEPTH_TEST);
@@ -61,7 +166,9 @@ void Planet::Render(const Frame* a_camFrame) {
     glEnd();
     glEnable(GL_LIGHTING);
   } else {
-    gluSphere(L3D::gluQuadric, rad, 100, 100);
+    glScalef(rad, rad, rad);
+    DrawLovelyRoundCube(1.0f);
+    //gluSphere(L3D::gluQuadric, rad, 100, 100);
   }
   glEnable(GL_DEPTH_TEST);
   glPopMatrix();