diff --git a/icons/object_planet_co2.png b/icons/object_planet_co2.png new file mode 100644 index 0000000..d8c1183 Binary files /dev/null and b/icons/object_planet_co2.png differ diff --git a/icons/object_planet_dwarf.png b/icons/object_planet_dwarf.png index 9e8cfdc..0ad6b80 100644 Binary files a/icons/object_planet_dwarf.png and b/icons/object_planet_dwarf.png differ diff --git a/icons/object_planet_large_gas_giant.png b/icons/object_planet_large_gas_giant.png index bb2d8d1..13e6f7a 100644 Binary files a/icons/object_planet_large_gas_giant.png and b/icons/object_planet_large_gas_giant.png differ diff --git a/icons/object_planet_medium_gas_giant.png b/icons/object_planet_medium_gas_giant.png index 108c35b..90c424a 100644 Binary files a/icons/object_planet_medium_gas_giant.png and b/icons/object_planet_medium_gas_giant.png differ diff --git a/icons/object_planet_methane.png b/icons/object_planet_methane.png new file mode 100644 index 0000000..24f6e62 Binary files /dev/null and b/icons/object_planet_methane.png differ diff --git a/icons/object_planet_small.png b/icons/object_planet_small.png index 41c5b1e..ee4ae2f 100644 Binary files a/icons/object_planet_small.png and b/icons/object_planet_small.png differ diff --git a/icons/object_planet_small_gas_giant.png b/icons/object_planet_small_gas_giant.png index e94ca63..0699b7c 100644 Binary files a/icons/object_planet_small_gas_giant.png and b/icons/object_planet_small_gas_giant.png differ diff --git a/icons/object_planet_volcanic.png b/icons/object_planet_volcanic.png new file mode 100644 index 0000000..3febd57 Binary files /dev/null and b/icons/object_planet_volcanic.png differ diff --git a/icons/object_planet_water_n2.png b/icons/object_planet_water_n2.png new file mode 100644 index 0000000..c104f3f Binary files /dev/null and b/icons/object_planet_water_n2.png differ diff --git a/src/body.h b/src/body.h index 18c5c45..d04b925 100644 --- a/src/body.h +++ b/src/body.h @@ -15,6 +15,7 @@ public: virtual Object::Type GetType(void) { return Object::BODY; } virtual void SetPosition(vector3d p) = 0; virtual vector3d GetPosition(void) = 0; /* Within frame. */ + virtual double GetRadius(void) const = 0 ; virtual void Render(const Frame* camFrame) = 0; virtual void SetFrame(Frame* f) { m_frame = f; } /* return true if to we do collision response and apply damage. */ diff --git a/src/libs.h b/src/libs.h index 0681a54..aa24c19 100644 --- a/src/libs.h +++ b/src/libs.h @@ -7,6 +7,7 @@ #include #include #include +#include #ifdef _WIN32 #include diff --git a/src/main.cpp b/src/main.cpp index 1bcc534..d1dd989 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -154,7 +154,7 @@ void L3D::HandleEvents(void) { case SDL_KEYDOWN: if(event.key.keysym.sym == SDLK_q) L3D::Quit(); if(event.key.keysym.sym == SDLK_F11) SDL_WM_ToggleFullScreen(L3D::scrSurface); - if(event.key.keysym.sym == SDLK_F12) L3D::SetView(L3D::objectViewerView); + if(event.key.keysym.sym == SDLK_F10) L3D::SetView(L3D::objectViewerView); L3D::keyState[event.key.keysym.sym] = 1; L3D::onKeyPress.emit(&event.key.keysym); break; diff --git a/src/model_body.cpp b/src/model_body.cpp index 0cbaea7..4a40e5f 100644 --- a/src/model_body.cpp +++ b/src/model_body.cpp @@ -62,6 +62,32 @@ vector3d ModelBody::GetPosition(void) { return vector3d(pos[0], pos[1], pos[2]); } +double ModelBody::GetRadius(void) const { + /* Calculate single AABB containing all geoms. */ + dReal aabbAll[6] = { + std::numeric_limits::max(), + std::numeric_limits::min(), + std::numeric_limits::max(), + std::numeric_limits::min(), + std::numeric_limits::max(), + std::numeric_limits::min() + }; + + for(size_t i = 0; i < geoms.size(); ++i) { + dReal aabbGeom[6]; + dGeomGetAABB(geoms[i], aabbGeom); + aabbAll[0] = std::min(aabbAll[0], aabbGeom[0]); + aabbAll[1] = std::max(aabbAll[1], aabbGeom[1]); + aabbAll[2] = std::min(aabbAll[2], aabbGeom[2]); + aabbAll[3] = std::max(aabbAll[3], aabbGeom[3]); + aabbAll[4] = std::min(aabbAll[4], aabbGeom[4]); + aabbAll[5] = std::max(aabbAll[5], aabbGeom[5]); + } + + /* Return size of largest dimension. */ + return std::max(aabbAll[1] - aabbAll[0], std::max(aabbAll[3] - aabbAll[2], aabbAll[5] - aabbAll[4])); +} + void ModelBody::SetRotation(const matrix4x4d& r) { dMatrix3 _m; r.SaveToOdeMatrix(_m); diff --git a/src/model_body.h b/src/model_body.h index ea7b9e1..d772ba6 100644 --- a/src/model_body.h +++ b/src/model_body.h @@ -15,6 +15,7 @@ public: virtual void SetRotation(const matrix4x4d& r); /* Not valid to SetVelocity on these. If you want them to move, use a DynamicBody. */ vector3d GetPosition(void); + virtual double GetRadius(void) const; void TransformToModelCoords(const Frame* camFrame); void ViewingRotation(void); void GetRotMatrix(matrix4x4d& m); diff --git a/src/object_viewer_view.cpp b/src/object_viewer_view.cpp index a7a5152..70f1f61 100644 --- a/src/object_viewer_view.cpp +++ b/src/object_viewer_view.cpp @@ -60,6 +60,11 @@ void ObjectViewerView::Update(void) { char buf[128]; Body* body = L3D::player->GetNavTarget(); + if(body && body != lastTarget) { + /* Reset view distance for new target. */ + viewingDist = body->GetRadius() * 2.0f; + lastTarget = body; + } snprintf(buf, sizeof(buf), "View dist: %.2f Object: %s", viewingDist, (body ? body->GetLabel().c_str() : "")); m_infoLabel->SetText(buf); } diff --git a/src/object_viewer_view.h b/src/object_viewer_view.h index cad105b..c2dfae7 100644 --- a/src/object_viewer_view.h +++ b/src/object_viewer_view.h @@ -15,5 +15,6 @@ private: matrix4x4d viewingRotation; float viewingDist; Gui::Label* m_infoLabel; + const Body* lastTarget; }; diff --git a/src/planet.h b/src/planet.h index a66fc28..218b59b 100644 --- a/src/planet.h +++ b/src/planet.h @@ -10,7 +10,7 @@ public: virtual void SetPosition(vector3d p); virtual vector3d GetPosition(void); void SetRadius(double radius); - double GetRadius(void) { return sbody.radius; } + virtual double GetRadius(void) const { return sbody.radius; } virtual void Render(const Frame* camFrame); virtual void SetFrame(Frame* f); virtual bool OnCollision(Body* b, Uint32 flags) { return true; } diff --git a/src/star.h b/src/star.h index 077e502..5251dc0 100644 --- a/src/star.h +++ b/src/star.h @@ -11,7 +11,7 @@ public: virtual void SetPosition(vector3d p); virtual vector3d GetPosition(void); void SetRadius(double radius) { this->radius = radius; } - double GetRadius(void) { return radius; } + virtual double GetRadius(void) const { return radius; } virtual void Render(const Frame* camFrame); private: