[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