[Orxonox-commit 2010] r6727 - in code/branches/hudelements/src: modules/objects/triggers modules/overlays/hud orxonox orxonox/interfaces orxonox/worldentities/pawns
scheusso at orxonox.net
scheusso at orxonox.net
Wed Apr 14 19:54:41 CEST 2010
Author: scheusso
Date: 2010-04-14 19:54:41 +0200 (Wed, 14 Apr 2010)
New Revision: 6727
Modified:
code/branches/hudelements/src/modules/objects/triggers/CheckPoint.cc
code/branches/hudelements/src/modules/overlays/hud/HUDRadar.cc
code/branches/hudelements/src/modules/overlays/hud/HUDRadar.h
code/branches/hudelements/src/orxonox/Radar.cc
code/branches/hudelements/src/orxonox/Radar.h
code/branches/hudelements/src/orxonox/interfaces/RadarListener.h
code/branches/hudelements/src/orxonox/interfaces/RadarViewable.cc
code/branches/hudelements/src/orxonox/interfaces/RadarViewable.h
code/branches/hudelements/src/orxonox/worldentities/pawns/Pawn.cc
Log:
HUDRadar now working again
Modified: code/branches/hudelements/src/modules/objects/triggers/CheckPoint.cc
===================================================================
--- code/branches/hudelements/src/modules/objects/triggers/CheckPoint.cc 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/modules/objects/triggers/CheckPoint.cc 2010-04-14 17:54:41 UTC (rev 6727)
@@ -37,7 +37,9 @@
{
CreateFactory(CheckPoint);
- CheckPoint::CheckPoint(BaseObject* creator) : DistanceTrigger(creator)
+ CheckPoint::CheckPoint(BaseObject* creator)
+ : DistanceTrigger(creator)
+ , RadarViewable(creator)
{
RegisterObject(CheckPoint);
Modified: code/branches/hudelements/src/modules/overlays/hud/HUDRadar.cc
===================================================================
--- code/branches/hudelements/src/modules/overlays/hud/HUDRadar.cc 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/modules/overlays/hud/HUDRadar.cc 2010-04-14 17:54:41 UTC (rev 6727)
@@ -39,6 +39,8 @@
#include "tools/TextureGenerator.h"
#include "worldentities/WorldEntity.h"
#include "worldentities/pawns/Pawn.h"
+#include "Scene.h"
+#include "Radar.h"
namespace orxonox
{
@@ -71,10 +73,10 @@
if (this->isInitialized())
{
Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->marker_);
- for (std::vector<Ogre::PanelOverlayElement*>::iterator it = this->radarDots_.begin();
- it != this->radarDots_.end(); ++it)
+ for (std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it = this->radarObjects_.begin();
+ it != this->radarObjects_.end(); ++it)
{
- Ogre::OverlayManager::getSingleton().destroyOverlayElement(*it);
+ Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second);
}
}
}
@@ -88,81 +90,107 @@
XMLPortParam(HUDRadar, "maximumDotSize", setMaximumDotSize, getMaximumDotSize, xmlElement, mode);
}
- void HUDRadar::displayObject(RadarViewable* object, bool bIsMarked)
+ void HUDRadar::addObject(RadarViewable* object)
{
- if (object == static_cast<RadarViewable*>(this->owner_))
+ if (object == dynamic_cast<RadarViewable*>(this->owner_))
return;
- const WorldEntity* wePointer = object->getWorldEntity();
+ // Make sure the object hasn't been added yet
+ assert( this->radarObjects_.find(object) == this->radarObjects_.end() );
- // Just to be sure that we actually have a WorldEntity.
- // We could do a dynamic_cast, but that would be a lot slower.
- if (!wePointer || !this->owner_)
+ // Create everything needed to display the object on the radar and add it to the map
+ Ogre::PanelOverlayElement* panel;
+ panel = static_cast<Ogre::PanelOverlayElement*>(
+ Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberString()));
+ this->overlay_->add2D(panel);
+ // get right material
+ panel->setMaterialName(TextureGenerator::getMaterialName(
+ shapeMaterials_[object->getRadarObjectShape()], object->getRadarObjectColour()));
+ this->radarObjects_[object] = panel;
+ }
+
+ void HUDRadar::removeObject(RadarViewable* object)
+ {
+ // If object was added at all then remove it
+ std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it;
+ it = this->radarObjects_.find( object );
+ if( it != this->radarObjects_.end() )
{
- if (!wePointer)
- CCOUT(2) << "Cannot display a non-WorldEntitiy on the radar" << std::endl;
- if (!this->owner_)
- CCOUT(2) << "No owner defined" << std::endl;
- return;
+ delete it->second;
+ this->radarObjects_.erase(it);
}
+ }
- // try to find a panel already created
- Ogre::PanelOverlayElement* panel;
- //std::map<RadarViewable*, Ogre::PanelOverlayElement*>::iterator it = this->radarDots_.find(object);
- if (itRadarDots_ == this->radarDots_.end())
+ void HUDRadar::objectChanged( RadarViewable* rv )
+ {
+ assert( this->radarObjects_.find(rv) != this->radarObjects_.end() );
+ Ogre::PanelOverlayElement* panel = this->radarObjects_[rv];
+ panel->setMaterialName(TextureGenerator::getMaterialName(
+ shapeMaterials_[rv->getRadarObjectShape()], rv->getRadarObjectColour()));
+ }
+
+ void HUDRadar::gatherObjects()
+ {
+ const std::set<RadarViewable*>& objectSet = this->getCreator()->getScene()->getRadar()->getRadarObjects();
+ std::set<RadarViewable*>::const_iterator it;
+ for( it=objectSet.begin(); it!=objectSet.end(); ++it )
+ this->addObject(*it);
+ }
+
+ void HUDRadar::radarTick(float dt)
+ {
+ // Make sure the owner of the radar was defined
+ if( !this->owner_ )
{
- // we have to create a new entry
- panel = static_cast<Ogre::PanelOverlayElement*>(
- Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberString()));
- radarDots_.push_back(panel);
- // get right material
- panel->setMaterialName(TextureGenerator::getMaterialName(
- shapeMaterials_[object->getRadarObjectShape()], object->getRadarObjectColour()));
- this->overlay_->add2D(panel);
- this->itRadarDots_ = this->radarDots_.end();
+ CCOUT(0) << "No owner defined" << std::endl;
+ assert(0);
}
- else
+
+ this->marker_->hide(); // in case that no object is in focus
+ // get the focus object
+ Radar* radar = this->getOwner()->getScene()->getRadar();
+ const RadarViewable* focusObject = radar->getFocus();
+
+ // update the distances for all objects
+ std::map<RadarViewable*,Ogre::PanelOverlayElement*>::iterator it;
+ for( it = this->radarObjects_.begin(); it != this->radarObjects_.end(); ++it )
{
- panel = *itRadarDots_;
- ++itRadarDots_;
- const std::string& materialName = TextureGenerator::getMaterialName(
- shapeMaterials_[object->getRadarObjectShape()], object->getRadarObjectColour());
- if (materialName != panel->getMaterialName())
- panel->setMaterialName(materialName);
- }
- panel->show();
+ // Make sure the object really is a WorldEntity
+ const WorldEntity* wePointer = it->first->getWorldEntity();
+ if( !wePointer )
+ {
+ CCOUT(0) << "Cannot display a non-WorldEntitiy on the radar" << std::endl;
+ assert(0);
+ }
+ bool isFocus = (it->first == focusObject);
+ // set size to fit distance...
+ float distance = (wePointer->getWorldPosition() - this->owner_->getPosition()).length();
+ // calculate the size with 1/distance dependency for simplicity (instead of exp(-distance * lambda)
+ float size = maximumDotSize_ * halfDotSizeDistance_ / (halfDotSizeDistance_ + distance);
+ it->second->setDimensions(size, size);
- // set size to fit distance...
- float distance = (wePointer->getWorldPosition() - this->owner_->getPosition()).length();
- // calculate the size with 1/distance dependency for simplicity (instead of exp(-distance * lambda)
- float size = maximumDotSize_ * halfDotSizeDistance_ / (halfDotSizeDistance_ + distance);
- panel->setDimensions(size, size);
+ // calc position on radar...
+ Vector2 coord = get2DViewcoordinates(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, this->owner_->getOrientation() * WorldEntity::UP, wePointer->getWorldPosition());
+ coord *= Ogre::Math::PI / 3.5f; // small adjustment to make it fit the texture
+ it->second->setPosition((1.0f + coord.x - size) * 0.5f, (1.0f - coord.y - size) * 0.5f);
+ it->second->show();
- // calc position on radar...
- Vector2 coord = get2DViewcoordinates(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, this->owner_->getOrientation() * WorldEntity::UP, wePointer->getWorldPosition());
- coord *= Ogre::Math::PI / 3.5f; // small adjustment to make it fit the texture
- panel->setPosition((1.0f + coord.x - size) * 0.5f, (1.0f - coord.y - size) * 0.5f);
-
- if (bIsMarked)
- {
- this->marker_->show();
- this->marker_->setDimensions(size * 1.5f, size * 1.5f);
- this->marker_->setPosition((1.0f + coord.x - size * 1.5f) * 0.5f, (1.0f - coord.y - size * 1.5f) * 0.5f);
+ // if this object is in focus, then set the focus marker
+ if (isFocus)
+ {
+ this->marker_->setDimensions(size * 1.5f, size * 1.5f);
+ this->marker_->setPosition((1.0f + coord.x - size * 1.5f) * 0.5f, (1.0f - coord.y - size * 1.5f) * 0.5f);
+ this->marker_->show();
+ }
}
}
- void HUDRadar::radarTick(float dt)
- {
- for (itRadarDots_ = radarDots_.begin(); itRadarDots_ != radarDots_.end(); ++itRadarDots_)
- (*itRadarDots_)->hide();
- this->itRadarDots_ = this->radarDots_.begin();
- this->marker_->hide();
- }
-
void HUDRadar::changedOwner()
{
SUPER(HUDRadar, changedOwner);
this->owner_ = orxonox_cast<Pawn*>(this->getOwner());
+ assert(this->radarObjects_.size()==0);
+ this->gatherObjects();
}
}
Modified: code/branches/hudelements/src/modules/overlays/hud/HUDRadar.h
===================================================================
--- code/branches/hudelements/src/modules/overlays/hud/HUDRadar.h 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/modules/overlays/hud/HUDRadar.h 2010-04-14 17:54:41 UTC (rev 6727)
@@ -64,13 +64,18 @@
void setRadarSensitivity(float sensitivity) { this->sensitivity_ = sensitivity; }
// RadarListener interface
- void displayObject(RadarViewable* viewable, bool bIsMarked);
+ virtual void addObject(RadarViewable* viewable);
+ virtual void removeObject(RadarViewable* viewable);
+ virtual void objectChanged( RadarViewable* rv );
void radarTick(float dt);
+
+ void gatherObjects();
std::map<RadarViewable::Shape, std::string> shapeMaterials_;
- std::vector<Ogre::PanelOverlayElement*> radarDots_;
- std::vector<Ogre::PanelOverlayElement*>::iterator itRadarDots_;
+// std::vector<Ogre::PanelOverlayElement*> radarDots_;
+// std::vector<Ogre::PanelOverlayElement*>::iterator itRadarDots_;
+ std::map<RadarViewable*, Ogre::PanelOverlayElement*> radarObjects_;
Ogre::PanelOverlayElement* marker_;
float halfDotSizeDistance_;
Modified: code/branches/hudelements/src/orxonox/Radar.cc
===================================================================
--- code/branches/hudelements/src/orxonox/Radar.cc 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/Radar.cc 2010-04-14 17:54:41 UTC (rev 6727)
@@ -76,6 +76,28 @@
{
}
+ void Radar::addRadarObject(RadarViewable* rv)
+ {
+ assert( this->radarObjects_.find(rv) == this->radarObjects_.end() );
+ this->radarObjects_.insert(rv);
+ // iterate through all radarlisteners and notify them
+ for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
+ {
+ (*itListener)->addObject(rv);
+ }
+ }
+
+ void Radar::removeRadarObject(RadarViewable* rv)
+ {
+ assert( this->radarObjects_.find(rv) != this->radarObjects_.end() );
+ this->radarObjects_.erase(rv);
+ // iterate through all radarlisteners and notify them
+ for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
+ {
+ (*itListener)->removeObject(rv);
+ }
+ }
+
const RadarViewable* Radar::getFocus()
{
if (this->itFocus_)
@@ -108,13 +130,6 @@
for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
{
(*itListener)->radarTick(dt);
-
- for (ObjectList<RadarViewable>::iterator itElement = ObjectList<RadarViewable>::begin(); itElement; ++itElement)
- {
- if ((*itElement)->getRadarVisibility())
- if ((*itListener)->getRadarSensitivity() > (*itElement)->getRadarObjectCamouflage())
- (*itListener)->displayObject(*itElement, *itElement == this->focus_);
- }
}
}
@@ -187,4 +202,12 @@
COUT(3) << i++ << ": " << (*it)->getRVWorldPosition() << std::endl;
}
}
+
+ void Radar::radarObjectChanged(RadarViewable* rv)
+ {
+ for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
+ {
+ (*itListener)->objectChanged(rv);
+ }
+ }
}
Modified: code/branches/hudelements/src/orxonox/Radar.h
===================================================================
--- code/branches/hudelements/src/orxonox/Radar.h 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/Radar.h 2010-04-14 17:54:41 UTC (rev 6727)
@@ -37,6 +37,7 @@
#include "OrxonoxPrereqs.h"
#include <map>
+#include <set>
#include <string>
#include "core/ObjectListIterator.h"
@@ -47,6 +48,7 @@
{
class _OrxonoxExport Radar : public Tickable
{
+ friend class RadarViewable;
public:
Radar();
virtual ~Radar();
@@ -57,6 +59,8 @@
RadarViewable::Shape addObjectDescription(const std::string& name);
void listObjects() const;
+ const std::set<RadarViewable*>& getRadarObjects() const
+ { return this->radarObjects_; }
void releaseFocus();
void cycleFocus();
@@ -65,10 +69,14 @@
Radar(Radar& instance);
void updateFocus();
+ void addRadarObject(RadarViewable* rv);
+ void removeRadarObject(RadarViewable* rv);
+ void radarObjectChanged(RadarViewable* rv);
ObjectListIterator<RadarViewable> itFocus_;
RadarViewable* focus_;
std::map<std::string, RadarViewable::Shape> objectTypes_;
+ std::set<RadarViewable*> radarObjects_;
int objectTypeCounter_;
};
}
Modified: code/branches/hudelements/src/orxonox/interfaces/RadarListener.h
===================================================================
--- code/branches/hudelements/src/orxonox/interfaces/RadarListener.h 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/interfaces/RadarListener.h 2010-04-14 17:54:41 UTC (rev 6727)
@@ -40,7 +40,9 @@
RadarListener();
virtual ~RadarListener() { }
- virtual void displayObject(RadarViewable* viewable, bool bIsMarked) = 0;
+ virtual void addObject(RadarViewable* viewable) = 0;
+ virtual void removeObject(RadarViewable* viewable) = 0;
+ virtual void objectChanged(RadarViewable* viewable) = 0;
virtual float getRadarSensitivity() const = 0;
virtual void radarTick(float dt) = 0;
};
Modified: code/branches/hudelements/src/orxonox/interfaces/RadarViewable.cc
===================================================================
--- code/branches/hudelements/src/orxonox/interfaces/RadarViewable.cc 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/interfaces/RadarViewable.cc 2010-04-14 17:54:41 UTC (rev 6727)
@@ -39,9 +39,11 @@
/**
@brief Constructor.
*/
- RadarViewable::RadarViewable()
+ RadarViewable::RadarViewable(BaseObject* creator)
: isHumanShip_(false)
, bVisibility_(true)
+ , bInitialized_(false)
+ , creator_(creator)
, radarObjectCamouflage_(0.0f)
, radarObjectShape_(Dot)
, radarObjectDescription_("staticObject")
@@ -49,24 +51,28 @@
RegisterRootObject(RadarViewable);
this->uniqueId_=getUniqueNumberString();
+ this->creator_->getScene()->getRadar()->addRadarObject(this);
+ this->bInitialized_ = true;
}
RadarViewable::~RadarViewable()
{
+ if( this->bInitialized_ )
+ this->creator_->getScene()->getRadar()->removeRadarObject(this);
}
- void RadarViewable::setRadarObjectDescription(const std::string& str)
- {
- Radar* radar = this->getWorldEntity()->getScene()->getRadar();
- if (radar)
- this->radarObjectShape_ = radar->addObjectDescription(str);
- else
- {
- CCOUT(2) << "Attempting to access the radar, but the radar is non existent." << std::endl;
- }
- this->radarObjectDescription_ = str;
- }
+// void RadarViewable::setRadarObjectDescription(const std::string& str)
+// {
+// Radar* radar = this->getWorldEntity()->getScene()->getRadar();
+// if (radar)
+// this->radarObjectShape_ = radar->addObjectDescription(str);
+// else
+// {
+// CCOUT(2) << "Attempting to access the radar, but the radar is non existent." << std::endl;
+// }
+// this->radarObjectDescription_ = str;
+// }
const Vector3& RadarViewable::getRVWorldPosition() const
{
@@ -90,4 +96,9 @@
assert(0);
}
}
+
+ void RadarViewable::settingsChanged()
+ {
+ this->creator_->getScene()->getRadar()->radarObjectChanged(this);
+ }
}
Modified: code/branches/hudelements/src/orxonox/interfaces/RadarViewable.h
===================================================================
--- code/branches/hudelements/src/orxonox/interfaces/RadarViewable.h 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/interfaces/RadarViewable.h 2010-04-14 17:54:41 UTC (rev 6727)
@@ -39,6 +39,8 @@
namespace orxonox
{
+ class BaseObject;
+
/**
@brief Interface for receiving window events.
*/
@@ -54,25 +56,43 @@
public:
- RadarViewable();
+ RadarViewable(BaseObject* creator);
virtual ~RadarViewable();
inline void setRadarObjectCamouflage(float camouflage)
- { this->radarObjectCamouflage_ = camouflage; }
+ {
+ if( this->radarObjectCamouflage_ != camouflage )
+ {
+ this->radarObjectCamouflage_ = camouflage;
+ this->settingsChanged();
+ }
+ }
inline float getRadarObjectCamouflage() const
{ return this->radarObjectCamouflage_; }
inline void setRadarObjectColour(const ColourValue& colour)
- { this->radarObjectColour_ = colour; }
+ {
+ if(this->radarObjectColour_ != colour)
+ {
+ this->radarObjectColour_ = colour;
+ this->settingsChanged();
+ }
+ }
inline const ColourValue& getRadarObjectColour() const
{ return this->radarObjectColour_; }
- void setRadarObjectDescription(const std::string& str);
- inline const std::string& getRadarObjectDescription() const
- { return this->radarObjectDescription_; }
+// void setRadarObjectDescription(const std::string& str);
+// inline const std::string& getRadarObjectDescription() const
+// { return this->radarObjectDescription_; }
inline void setRadarVisibility(bool b)
- { this->bVisibility_ = b; }
+ {
+ if(b!=this->bVisibility_)
+ {
+ this->bVisibility_ = b;
+ this->settingsChanged();
+ }
+ }
inline bool getRadarVisibility() const
{ return this->bVisibility_; }
@@ -82,9 +102,16 @@
Vector3 getRVOrientedVelocity() const;
inline void setRadarObjectShape(Shape shape)
- { this->radarObjectShape_ = shape; }
+ {
+ if( this->radarObjectShape_ != shape )
+ {
+ this->radarObjectShape_ = shape;
+ this->settingsChanged();
+ }
+ }
inline Shape getRadarObjectShape() const
{ return this->radarObjectShape_; }
+ void settingsChanged();
bool isHumanShip_;
@@ -97,8 +124,10 @@
private:
void validate(const WorldEntity* object) const;
bool bVisibility_;
+ bool bInitialized_;
//Map
std::string uniqueId_;
+ BaseObject* creator_;
//Radar
Modified: code/branches/hudelements/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/hudelements/src/orxonox/worldentities/pawns/Pawn.cc 2010-04-14 12:19:32 UTC (rev 6726)
+++ code/branches/hudelements/src/orxonox/worldentities/pawns/Pawn.cc 2010-04-14 17:54:41 UTC (rev 6727)
@@ -52,7 +52,9 @@
{
CreateFactory(Pawn);
- Pawn::Pawn(BaseObject* creator) : ControllableEntity(creator)
+ Pawn::Pawn(BaseObject* creator)
+ : ControllableEntity(creator)
+ , RadarViewable(creator)
{
RegisterObject(Pawn);
More information about the Orxonox-commit
mailing list