From 835e86ad19cd7124bb5e64952778182ba6f3ee2b Mon Sep 17 00:00:00 2001 From: curt Date: Fri, 9 May 2003 19:37:10 +0000 Subject: [PATCH] Moved to SimGear from FlightGear/src/Model/ --- simgear/scene/model/placement.cxx | 140 ++++++++++++++++++++++++++++++ simgear/scene/model/placement.hxx | 115 ++++++++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 simgear/scene/model/placement.cxx create mode 100644 simgear/scene/model/placement.hxx diff --git a/simgear/scene/model/placement.cxx b/simgear/scene/model/placement.cxx new file mode 100644 index 00000000..ac856e68 --- /dev/null +++ b/simgear/scene/model/placement.cxx @@ -0,0 +1,140 @@ +// placement.cxx - manage the placment of a 3D model. +// Written by David Megginson, started 2002. +// +// This file is in the Public Domain, and comes with no warranty. + +#include + +#include // for strcmp() + +#include + +#include +#include +#include + +#include + +#include "placement.hxx" + +SG_USING_STD(vector); + + + +//////////////////////////////////////////////////////////////////////// +// Implementation of FGModelPlacement. +//////////////////////////////////////////////////////////////////////// + +FGModelPlacement::FGModelPlacement () + : _lon_deg(0), + _lat_deg(0), + _elev_ft(0), + _roll_deg(0), + _pitch_deg(0), + _heading_deg(0), + _selector(new ssgSelector), + _position(new ssgTransform), + _location(new FGLocation) +{ +} + +FGModelPlacement::~FGModelPlacement () +{ +} + +void +FGModelPlacement::init( ssgBranch * model ) +{ + if (model != 0) { + _position->addKid(model); + } + _selector->addKid(_position); + _selector->clrTraversalMaskBits(SSGTRAV_HOT); +} + +void +FGModelPlacement::update( const Point3D scenery_center ) +{ + _location->setPosition( _lon_deg, _lat_deg, _elev_ft ); + _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg ); + + sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) ); + + sgVec3 trans; + sgCopyVec3(trans, _location->get_view_pos()); + + for(int i = 0; i < 4; i++) { + float tmp = POS[i][3]; + for( int j=0; j<3; j++ ) { + POS[i][j] += (tmp * trans[j]); + } + } + _position->setTransform(POS); +} + +bool +FGModelPlacement::getVisible () const +{ + return (_selector->getSelect() != 0); +} + +void +FGModelPlacement::setVisible (bool visible) +{ + _selector->select(visible); +} + +void +FGModelPlacement::setLongitudeDeg (double lon_deg) +{ + _lon_deg = lon_deg; +} + +void +FGModelPlacement::setLatitudeDeg (double lat_deg) +{ + _lat_deg = lat_deg; +} + +void +FGModelPlacement::setElevationFt (double elev_ft) +{ + _elev_ft = elev_ft; +} + +void +FGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft) +{ + _lon_deg = lon_deg; + _lat_deg = lat_deg; + _elev_ft = elev_ft; +} + +void +FGModelPlacement::setRollDeg (double roll_deg) +{ + _roll_deg = roll_deg; +} + +void +FGModelPlacement::setPitchDeg (double pitch_deg) +{ + _pitch_deg = pitch_deg; +} + +void +FGModelPlacement::setHeadingDeg (double heading_deg) +{ + _heading_deg = heading_deg; +} + +void +FGModelPlacement::setOrientation (double roll_deg, double pitch_deg, + double heading_deg) +{ + _roll_deg = roll_deg; + _pitch_deg = pitch_deg; + _heading_deg = heading_deg; +} + +// end of model.cxx diff --git a/simgear/scene/model/placement.hxx b/simgear/scene/model/placement.hxx new file mode 100644 index 00000000..453353b8 --- /dev/null +++ b/simgear/scene/model/placement.hxx @@ -0,0 +1,115 @@ +// placement.hxx - manage the placment of a 3D model. +// Written by David Megginson, started 2002. +// +// This file is in the Public Domain, and comes with no warranty. + + +#ifndef _SG_PLACEMENT_HXX +#define _SG_PLACEMENT_HXX 1 + +#ifndef __cplusplus +# error This library requires C++ +#endif + +#include + +SG_USING_STD(vector); + +#include +#include + +#include +#include + + +// Don't pull in the headers, since we don't need them here. +class FGLocation; + + +// Has anyone done anything *really* stupid, like making min and max macros? +#ifdef min +#undef min +#endif +#ifdef max +#undef max +#endif + + +//////////////////////////////////////////////////////////////////////// +// Model placement. +//////////////////////////////////////////////////////////////////////// + +/** + * A wrapper for a model with a definite placement. + */ +class FGModelPlacement +{ +public: + + FGModelPlacement (); + virtual ~FGModelPlacement (); + + virtual void FGModelPlacement::init( ssgBranch * model ); + /* virtual void init( const string &fg_root, + const string &path, + SGPropertyNode *prop_root, + double sim_time_sec, int dummy ); */ + virtual void update( const Point3D scenery_center ); + + virtual ssgEntity * getSceneGraph () { return (ssgEntity *)_selector; } + + virtual FGLocation * getFGLocation () { return _location; } + + virtual bool getVisible () const; + virtual void setVisible (bool visible); + + virtual double getLongitudeDeg () const { return _lon_deg; } + virtual double getLatitudeDeg () const { return _lat_deg; } + virtual double getElevationFt () const { return _elev_ft; } + + virtual void setLongitudeDeg (double lon_deg); + virtual void setLatitudeDeg (double lat_deg); + virtual void setElevationFt (double elev_ft); + virtual void setPosition (double lon_deg, double lat_deg, double elev_ft); + + virtual double getRollDeg () const { return _roll_deg; } + virtual double getPitchDeg () const { return _pitch_deg; } + virtual double getHeadingDeg () const { return _heading_deg; } + + virtual void setRollDeg (double roll_deg); + virtual void setPitchDeg (double pitch_deg); + virtual void setHeadingDeg (double heading_deg); + virtual void setOrientation (double roll_deg, double pitch_deg, + double heading_deg); + + // Addition by Diarmuid Tyson for Multiplayer Support + // Allows multiplayer to get players position transform + virtual const sgVec4 *get_POS() { return POS; } + +private: + + // Geodetic position + double _lon_deg; + double _lat_deg; + double _elev_ft; + + // Orientation + double _roll_deg; + double _pitch_deg; + double _heading_deg; + + ssgSelector * _selector; + ssgTransform * _position; + + // Location + FGLocation * _location; + + + // Addition by Diarmuid Tyson for Multiplayer Support + // Moved from update method + // POS for transformation Matrix + sgMat4 POS; + +}; + +#endif // _SG_PLACEMENT_HXX -- 2.39.5