#include <simgear_config.h>
#endif
-#include <simgear/compiler.h>
-
-#include <simgear/scene/util/SGSceneUserData.hxx>
-#include <simgear/scene/util/SGUpdateVisitor.hxx>
-
#include "placement.hxx"
+#include <simgear/compiler.h>
+#include <simgear/scene/util/OsgMath.hxx>
+#include <simgear/scene/util/SGSceneUserData.hxx>
\f
////////////////////////////////////////////////////////////////////////
_pitch_deg(0),
_heading_deg(0),
_selector(new osg::Switch),
- _transform(new SGPlacementTransform)
+ _transform(new osg::PositionAttitudeTransform)
{
+ _selector->addChild(_transform.get());
}
SGModelPlacement::~SGModelPlacement ()
void
SGModelPlacement::init( osg::Node * model )
{
+ // remove previous models (in case of reinit)
+ _transform->removeChild(0, _transform->getNumChildren());
if (model != 0) {
_transform->addChild(model);
}
- _selector->addChild(_transform.get());
_selector->setValue(0, 1);
}
+void
+SGModelPlacement::add( osg::Node* model )
+{
+ if (model != 0) {
+ _transform->addChild(model);
+ }
+}
+
+void SGModelPlacement::clear()
+{
+ _selector = NULL;
+ _transform = NULL;
+}
+
void
SGModelPlacement::update()
{
// The cartesian position
SGVec3d position = SGVec3d::fromGeod(_position);
+ _transform->setPosition(toOsg(position));
// The orientation, composed from the horizontal local orientation and the
// orientation wrt the horizontal local frame
// the y axis 180 degrees.
orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
- _transform->setTransform(position, orient);
+ _transform->setAttitude(toOsg(orient));
}
bool
_selector->setValue(0, visible);
}
-void
-SGModelPlacement::setLongitudeDeg (double lon_deg)
-{
- _position.setLongitudeDeg(lon_deg);
-}
-
-void
-SGModelPlacement::setLatitudeDeg (double lat_deg)
-{
- _position.setLatitudeDeg(lat_deg);
-}
-
-void
-SGModelPlacement::setElevationFt (double elev_ft)
-{
- _position.setElevationFt(elev_ft);
-}
-
-void
-SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
-{
- _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
-}
-
void
SGModelPlacement::setPosition(const SGGeod& position)
{
SGModelPlacement::setReferenceTime(const double& referenceTime)
{
SGSceneUserData* userData;
- userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
+ userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
vel->referenceTime = referenceTime;
}
SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
{
SGSceneUserData* userData;
- userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
+ userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
}
SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
{
SGSceneUserData* userData;
- userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
+ userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);
}