diff --git a/src/celengine/sensorgeometry.cpp b/src/celengine/sensorgeometry.cpp new file mode 100644 index 000000000..daa5ee31b --- /dev/null +++ b/src/celengine/sensorgeometry.cpp @@ -0,0 +1,87 @@ +// sensorgeometry.cpp +// +// Copyright (C) 2010, Celestia Development Team +// Original version by Chris Laurel +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +#include "sensorgeometry.h" +#include "rendcontext.h" +#include "texmanager.h" +#include "astro.h" +#include "body.h" +#include +#include +#include + +using namespace Eigen; +using namespace std; + + +SensorGeometry::SensorGeometry() : + m_observer(NULL), + m_target(NULL), + m_range(0.0) +{ +} + + +SensorGeometry::~SensorGeometry() +{ +} + + +bool +SensorGeometry::pick(const Ray3d& /* r */, double& /* distance */) const +{ + return false; +} + + +void +SensorGeometry::render(RenderContext& rc, double tsec) +{ + if (m_target == NULL || m_observer == NULL) + { + return; + } + + double jd = astro::secsToDays(tsec) + astro::J2000; + + UniversalCoord obsPos = m_observer->getPosition(jd); + UniversalCoord targetPos = m_target->getPosition(jd); + + Vector3d pos = targetPos.offsetFromKm(obsPos); + + if (pos.norm() > m_range) + { + pos = pos.normalized() * m_range; + } + + glDisable(GL_LIGHTING); + + glColor4f(1.0f, 0.0f, 0.0f, 1.0f); + glBegin(GL_LINES); + glVertex3d(0.0, 0.0, 0.0); + glVertex3dv(pos.data()); + glEnd(); + + glEnable(GL_LIGHTING); +} + + +bool +SensorGeometry::isOpaque() const +{ + return false; +} + + +bool +SensorGeometry::isNormalized() const +{ + return true; +} diff --git a/src/celengine/sensorgeometry.h b/src/celengine/sensorgeometry.h new file mode 100644 index 000000000..013105125 --- /dev/null +++ b/src/celengine/sensorgeometry.h @@ -0,0 +1,69 @@ +// sensorgeometry.h +// +// Copyright (C) 2010, Celestia Development Team +// Original version by Chris Laurel +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +#ifndef _CELENGINE_SENSOR_GEOMETRY_H_ +#define _CELENGINE_SENSOR_GEOMETRY_H_ + +#include "geometry.h" +#include + +class Body; + +class SensorGeometry : public Geometry +{ + public: + SensorGeometry(); + ~SensorGeometry(); + + virtual bool pick(const Ray3d& r, double& distance) const; + + //! Render the model in the current OpenGL context + virtual void render(RenderContext&, double t = 0.0); + + virtual bool isOpaque() const; + virtual bool isNormalized() const; + + Body* observer() const + { + return m_observer; + } + + void setObserver(Body* observer) + { + m_observer = observer; + } + + Body* target() const + { + return m_target; + } + + void setTarget(Body* target) + { + m_target = target; + } + + double range() const + { + return m_range; + } + + void setRange(double range) + { + m_range = range; + } + + private: + Body* m_observer; + Body* m_target; + double m_range; +}; + +#endif // !_CELENGINE_SENSOR_GEOMETRY_H_ diff --git a/src/celengine/solarsys.cpp b/src/celengine/solarsys.cpp index d4cdbdee4..de8d60f9c 100644 --- a/src/celengine/solarsys.cpp +++ b/src/celengine/solarsys.cpp @@ -29,6 +29,7 @@ #include "parser.h" #include "texmanager.h" #include "meshmanager.h" +#include "sensorgeometry.h" #include "universe.h" #include "multitexture.h" #include "parseobject.h" @@ -894,6 +895,43 @@ static Body* CreateBody(const string& name, body->setGeometry(geometryHandle); body->setGeometryScale(geometryScale); } + else if (planetData->getValue("Sensor")) + { + Hash* sensorData = planetData->getValue("Sensor")->getHash(); + if (sensorData) + { + SensorGeometry* sensor = new SensorGeometry(); + sensor->setObserver(body); + + string targetName; + if (sensorData->getString("Target", targetName)) + { + Body* target = universe.findPath(targetName).body(); + if (target) + { + sensor->setTarget(target); + } + else + { + cerr << "Can't find target for sensor.\n"; + } + } + else + { + cerr << "No target specified for sensor.\n"; + } + + sensor->setRange(30000.0); + + string resName = string("sensor") + targetName + body->getName(); + GeometryInfo info(resName, path, Vector3f::Zero(), 1.0f, false); + info.resource = sensor; + info.state = ResourceLoaded; + ResourceHandle geometryHandle = GetGeometryManager()->getHandle(info); + body->setGeometry(geometryHandle); + body->setGeometryScale(1.0f); + } + } } // Read the atmosphere