Skip to content

Commit

Permalink
A better 'moon hack' (for performance). Scaled Moon distance to be fu…
Browse files Browse the repository at this point in the history
…rther away from Earth
  • Loading branch information
aromanro committed Jun 21, 2020
1 parent f308783 commit a7aef1c
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 19 deletions.
2 changes: 1 addition & 1 deletion SolarSystem/BodyProperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#endif

BodyProperties::BodyProperties()
: isSun(false), isMoon(false), color(0), tilt(0), scale(1.), scaleDistance(1.), texture(NULL), transparentTexture(NULL), shadowTexture(NULL), specularTexture(NULL), transparentTextureAlpha(false)
: isSun(false), isMoon(false), color(0), tilt(0), scale(1.), scaleDistance(1.), texture(NULL), transparentTexture(NULL), shadowTexture(NULL), specularTexture(NULL), transparentTextureAlpha(false), parentIndex(-1)
{
}

Expand Down
2 changes: 2 additions & 0 deletions SolarSystem/BodyProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class BodyProperties

bool transparentTextureAlpha;

int parentIndex; // just an index for the body where the moon belongs

BodyProperties();
~BodyProperties();
bool LoadTexture();
Expand Down
3 changes: 3 additions & 0 deletions SolarSystem/Constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ const double translateDistStep = 2.;
const double cameraAngle = 45. * M_PI / 180.;
const GLuint SHADOW_WIDTH = 2048, SHADOW_HEIGHT = 2048;

const double AGLU = (149597870700. / 100.);



2 changes: 1 addition & 1 deletion SolarSystem/SolarSystem.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Body Name="Mercury" Radius="2439700" Mass="3.3011E23" XPosition="57909050000" YVelocity="47362" R="128" G="128" B="128" skin="Textures\\mercurymap.jpg" RotationPeriod="58.646" Scale="1000"/>
<Body Name="Venus" Radius="6051800" Mass="4.8675E24" XPosition="108208000000" YVelocity="35020" R="128" G="128" B="128" skin="Textures\\venusmap.jpg" Tilt="2.64" RotationPeriod="-243.025" Scale="1000"/>
<Body Name="Earth" Radius="6971000" Mass="5.97237E24" XPosition="149598023000" YVelocity="29780" R="0" G="0" B="255" skin="Textures\\land_ocean_ice_2048.jpg" transparentSkin="Textures\\cloud_combined_2048.png" shadowSkin="Textures\\earth_lights_lrg.jpg" specularSkin="Textures\\earthspec1k.jpg" Tilt="23.44" RotationPeriod="0.99726968" Scale="1000"/>
<Body Name="Moon" Radius="1731100" Mass="7.342E22" XPosition="149982422000" YVelocity="30902" R="255" G="255" B="0" skin="Textures\\moonmap4k.jpg" IsMoon="Yes" Tilt="6.687" RotationPeriod="27.321661" Scale="1000" ScaleDistance="30"/>
<Body Name="Moon" Radius="1731100" Mass="7.342E22" XPosition="149982422000" YVelocity="30902" R="255" G="255" B="0" skin="Textures\\moonmap4k.jpg" IsMoon="Yes" Tilt="6.687" RotationPeriod="27.321661" Scale="1000" ScaleDistance="45"/>
<Body Name="Mars" Radius="3389500" Mass="6.4171E23" XPosition="227939200000" YVelocity="24077" R="255" G="0" B="0" skin="Textures\\marsmap1k.jpg" Tilt="25.19" RotationPeriod="1.025957" Scale="1000"/>
<Body Name="Phobos" Radius="11266" Mass="1.0659E16" XPosition="227948576000" YVelocity="26215" R="255" G="255" B="0" skin="Textures\\phobosbump.jpg" IsMoon="Yes" Tilt="0" RotationPeriod="1.025957" Scale="20000" ScaleDistance="600"/>
<Body Name="Deimos" Radius="6200" Mass="1.4762E15" XPosition="227962663000" YVelocity="25428" R="255" G="255" B="0" skin="Textures\\deimosbump.jpg" IsMoon="Yes" Tilt="0" RotationPeriod="1.025957" Scale="20000" ScaleDistance="600"/>
Expand Down
2 changes: 2 additions & 0 deletions SolarSystem/SolarSystemBodies.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ void SolarSystemBodies::LoadTextures()
body.transparentTexture->GenerateMipmaps();
if (body.shadowTexture)
body.shadowTexture->GenerateMipmaps();
if (body.specularTexture)
body.specularTexture->GenerateMipmaps();
}
}
}
34 changes: 34 additions & 0 deletions SolarSystem/SolarSystemDoc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include "SolarSystemDoc.h"
#include "SolarSystemView.h"

#include "Constants.h"

#include <propkey.h>


Expand Down Expand Up @@ -333,6 +335,38 @@ void CSolarSystemDoc::LoadFile(const CString& fileName)
m_SolarSystem.clear();

LoadXmlFile(fileName);

auto pit = m_SolarSystem.m_BodyProperties.begin();
for (auto it = m_SolarSystem.m_Bodies.begin(); it != m_SolarSystem.m_Bodies.end(); ++it, ++pit)
{
glm::mat4 modelMat(1);
glm::vec3 pos = glm::vec3(it->m_Position.X / AGLU, it->m_Position.Y / AGLU, it->m_Position.Z / AGLU);

// THIS IS A HACK TO NICELY DISPLAY THE SOLAR SYSTEM
// if the moon is inside the planet because of the scaling, the distance from the planet to it is scaled up, too

if (pit->isMoon && pit->scaleDistance != 1.)
{

auto pmit = m_SolarSystem.m_BodyProperties.begin();

int index = 0;
for (auto mit = m_SolarSystem.m_Bodies.begin(); mit != m_SolarSystem.m_Bodies.end(); ++mit, ++pmit, ++index)
{
if (pmit->isMoon || pmit->isSun) continue; // ignore a collision with another moon or with the sun

const glm::vec3 mpos = glm::vec3(mit->m_Position.X / AGLU, mit->m_Position.Y / AGLU, mit->m_Position.Z / AGLU);
const glm::vec3 fromvec = pos - mpos;
const double dist = glm::length(fromvec);

if (dist <= 1.05 * (mit->m_Radius * pmit->scale + it->m_Radius * pit->scale) / AGLU)
{
pit->parentIndex = index;
break;
}
}
}
}
}

void CSolarSystemDoc::StartThread()
Expand Down
31 changes: 14 additions & 17 deletions SolarSystem/SolarSystemView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,6 @@
#endif



const double AGLU = (149597870700. / 100.);


CSolarSystemView::Uniforms::Uniforms(SolarSystemBodies& m_SolarSystem, SolarSystemGLProgram& program, unsigned int nrlights)
{
USES_CONVERSION;
Expand Down Expand Up @@ -314,21 +310,22 @@ void CSolarSystemView::MoonHack(BodyPropList::iterator& pit, BodyList::iterator&
{
CSolarSystemDoc *doc = GetDocument();

auto pmit = doc->m_SolarSystem.m_BodyProperties.begin();
for (auto mit = doc->m_SolarSystem.m_Bodies.begin(); mit != doc->m_SolarSystem.m_Bodies.end(); ++mit, ++pmit)
{
if (pmit->isMoon || pmit->isSun) continue; // ignore a collision with another moon or with the sun
if (-1 == pit->parentIndex)
return;

const glm::vec3 mpos = glm::vec3(mit->m_Position.X / AGLU, mit->m_Position.Y / AGLU, mit->m_Position.Z / AGLU);
const glm::vec3 fromvec = pos - mpos;
const double dist = glm::length(fromvec);
const MolecularDynamics::Body& parent = doc->m_SolarSystem.m_Bodies[pit->parentIndex];
const BodyProperties& parentProps = doc->m_SolarSystem.m_BodyProperties[pit->parentIndex];

if (dist <= (mit->m_Radius * pmit->scale + it->m_Radius * pit->scale) / AGLU)
{
pos = mpos + glm::vec3(fromvec.x*pit->scaleDistance, fromvec.y*pit->scaleDistance, fromvec.z*pit->scaleDistance);
break;
}
}
// should not happen, but be safe
if (parentProps.isMoon || parentProps.isSun)
return;

const glm::vec3 mpos = glm::vec3(parent.m_Position.X / AGLU, parent.m_Position.Y / AGLU, parent.m_Position.Z / AGLU);
const glm::vec3 fromvec = pos - mpos;
const double dist = glm::length(fromvec);

if (dist <= (parent.m_Radius * parentProps.scale + it->m_Radius * pit->scale) / AGLU)
pos = mpos + glm::vec3(fromvec.x * pit->scaleDistance, fromvec.y * pit->scaleDistance, fromvec.z * pit->scaleDistance);
}

void CSolarSystemView::RenderScene()
Expand Down

0 comments on commit a7aef1c

Please sign in to comment.