void SpaceStation::Render(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { Body *b = GetFrame()->GetBody(); assert(b); if (!b->IsType(Object::PLANET)) { // orbital spaceport -- don't make city turds or change lighting based on atmosphere RenderModel(r, camera, viewCoords, viewTransform); r->GetStats().AddToStatCount(Graphics::Stats::STAT_SPACESTATIONS, 1); } else { // don't render city if too far away if (viewCoords.LengthSqr() >= SQRMAXCITYDIST) { return; } std::vector<Graphics::Light> oldLights; Color oldAmbient; SetLighting(r, camera, oldLights, oldAmbient); if (!m_adjacentCity) { m_adjacentCity = new CityOnPlanet(static_cast<Planet*>(b), this, m_sbody->GetSeed()); } m_adjacentCity->Render(r, camera->GetContext()->GetFrustum(), this, viewCoords, viewTransform); RenderModel(r, camera, viewCoords, viewTransform, false); ResetLighting(r, oldLights, oldAmbient); r->GetStats().AddToStatCount(Graphics::Stats::STAT_GROUNDSTATIONS, 1); } }
// Renders space station and adjacent city if applicable // For orbital starports: renders as normal // For surface starports: // Lighting: Calculates available light for model and splits light between directly and ambiently lit // Lighting is done by manipulating global lights or setting uniforms in atmospheric models shader void SpaceStation::Render(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { Body *b = GetFrame()->GetBody(); assert(b); if (!b->IsType(Object::PLANET)) { // orbital spaceport -- don't make city turds or change lighting based on atmosphere RenderModel(r, camera, viewCoords, viewTransform); } else { std::vector<Graphics::Light> oldLights; Color oldAmbient; SetLighting(r, camera, oldLights, oldAmbient); Planet *planet = static_cast<Planet*>(b); /* don't render city if too far away */ if (viewCoords.Length() < 1000000.0){ if (!m_adjacentCity) { m_adjacentCity = new CityOnPlanet(planet, this, m_sbody->seed); } m_adjacentCity->Render(r, camera, this, viewCoords, viewTransform); } RenderModel(r, camera, viewCoords, viewTransform, false); ResetLighting(r, oldLights, oldAmbient); } }
void ModelBody::RenderModel(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform, const bool setLighting) { std::vector<Graphics::Light> oldLights; Color oldAmbient; if (setLighting) SetLighting(r, camera, oldLights, oldAmbient); matrix4x4d m2 = GetInterpOrient(); m2.SetTranslate(GetInterpPosition()); matrix4x4d t = viewTransform * m2; glPushMatrix(); // Otherwise newmodels leave a dirty matrix matrix4x4f trans; for (int i=0; i<12; i++) trans[i] = float(t[i]); trans[12] = viewCoords.x; trans[13] = viewCoords.y; trans[14] = viewCoords.z; trans[15] = 1.0f; m_model->Render(trans); glPopMatrix(); if (setLighting) ResetLighting(r, oldLights, oldAmbient); }