Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 1562


Ignore:
Timestamp:
Jun 7, 2008, 3:39:48 PM (16 years ago)
Author:
landauf
Message:
  • AI ships are now displayed with a point with its teamcolour on the radar.
  • It's now possible to assign an arbitrary colour (and even a texture) to a RadarObject. But be aware the system has to create a new material for every colour (not for every object), so please use deterministic colours to reduce the amount of used materials to a bearable number.
Location:
code/trunk/src/orxonox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/orxonox/hud/HUD.cc

    r1505 r1562  
    124124        SceneNode* node;
    125125        node = sm->getRootSceneNode()->createChildSceneNode("tomato1", Vector3(2000.0, 0.0, 0.0));
     126        addRadarObject(node, ColourValue(0.5, 0, 0, 1));
     127        node = sm->getRootSceneNode()->createChildSceneNode("tomato2", Vector3(0.0, 2000.0, 0.0));
     128        addRadarObject(node, ColourValue(0.5, 0, 0, 1));
     129        node = sm->getRootSceneNode()->createChildSceneNode("tomato3", Vector3(0.0, 0.0, 2000.0));
     130        addRadarObject(node, ColourValue(0.5, 0, 0, 1));
     131        node = sm->getRootSceneNode()->createChildSceneNode("station", Vector3(10000.0,16000.0,0.0));
    126132        addRadarObject(node);
    127         node = sm->getRootSceneNode()->createChildSceneNode("tomato2", Vector3(0.0, 2000.0, 0.0));
    128         addRadarObject(node);
    129         node = sm->getRootSceneNode()->createChildSceneNode("tomato3", Vector3(0.0, 0.0, 2000.0));
    130         addRadarObject(node);
    131         node = sm->getRootSceneNode()->createChildSceneNode("station", Vector3(10000.0,16000.0,0.0));
    132         addRadarObject(node, 3);
    133133    }
    134134
     
    178178    }
    179179
    180     void HUD::addRadarObject(SceneNode* node, int colour){
     180    void HUD::addRadarObject(SceneNode* node, const ColourValue& colour){
    181181        RadarObject* obj = new RadarObject(container, node, colour);
    182182        roSet.insert(obj);
     
    193193
    194194    void HUD::removeRadarObject(Ogre::SceneNode* node){
    195       COUT(3) << "blabla" << std::endl;
    196         for(std::set<RadarObject*>::iterator it=roSet.begin(); it!=roSet.end(); it++){
    197             if((*it)->getNode() == node) {
     195        for(std::set<RadarObject*>::iterator it=roSet.begin(); it!=roSet.end(); ++it){
     196            if ((*it)->getNode() == node)
     197            {
     198                if (this->nav->focus_ == (*it))
     199                {
     200                    this->nav->cycleFocus();
     201                    if (this->nav->focus_ == (*it))
     202                        this->nav->focus_ = 0;
     203                }
    198204                delete (*it);
    199205                roSet.erase(it);
     206                return;
    200207            }
    201208        }
  • code/trunk/src/orxonox/hud/HUD.h

    r1535 r1562  
    6363      public:
    6464        virtual void tick(float);
    65         void addRadarObject(Ogre::SceneNode* node, int colour = 0);
     65        void addRadarObject(Ogre::SceneNode* node, const ColourValue& colour = ColourValue(0.5, 0.5, 0.5, 1));
    6666        void removeRadarObject(Ogre::SceneNode* node);
    6767        void setRenderTimeRatio(float ratio);
  • code/trunk/src/orxonox/hud/Navigation.cc

    r1505 r1562  
    210210        }
    211211        else{
    212             focus_->resetColour();
     212            focus_->resetMaterial();
    213213            if(it_ != HUD::getSingleton().roSet.end()){
    214214                focus_ = *it_;
     
    224224            navMarker_->show();
    225225            navText_->show();
    226             focus_->setColour(RadarObject::WHITE);
     226            focus_->setColour(ColourValue::White);
    227227        }
    228228    }
  • code/trunk/src/orxonox/hud/RadarObject.cc

    r1505 r1562  
    3131
    3232#include <OgreOverlayManager.h>
    33 #include <OgreStringConverter.h>
     33#include <OgreMaterialManager.h>
     34#include <OgreTechnique.h>
     35
    3436#include "GraphicsEngine.h"
     37#include "util/Convert.h"
     38
     39namespace std
     40{
     41    template <>
     42    class less<orxonox::ColourValue>
     43    {
     44        public:
     45            bool operator()(const orxonox::ColourValue& __x, const orxonox::ColourValue& __y)
     46            {
     47                if (__x.r == __y.r)
     48                {
     49                    if (__x.g == __y.g)
     50                    {
     51                        if (__x.b == __y.b)
     52                        {
     53                            return __x.a < __y.a;
     54                        }
     55                        return __x.b < __y.b;
     56                    }
     57                    return __x.g < __y.g;
     58                }
     59                return __x.r < __y.r;
     60            }
     61    };
     62}
    3563
    3664namespace orxonox
    3765{
    38     using namespace Ogre;
     66    unsigned int RadarObject::count_s = 0;
     67    std::map<std::string, std::map<ColourValue, std::string> > RadarObject::materials_s;
    3968
    40     int RadarObject::count = 0;         // initialize static variable
     69    RadarObject::RadarObject(Ogre::OverlayContainer* container, Ogre::SceneNode* node, const ColourValue& colour, const std::string& texturename)
     70    {
     71        this->colour_ = colour;
     72        this->texturename_ = texturename;
    4173
    42     RadarObject::RadarObject(OverlayContainer* container, SceneNode* node, int colour){
    43         container_ = container;
    44         node_ = node;
    45         colour_ = colour;
    46         om = &OverlayManager::getSingleton();
    47         panel_ = static_cast<PanelOverlayElement*>(om->createOverlayElement("Panel",
    48             "Object"+StringConverter::toString(count)));
    49         setColour(colour_);
    50         panel_->setDimensions(3,3);
    51         panel_->setMetricsMode(Ogre::GMM_PIXELS);
    52         panel_->show();
    53         index_ = count;
    54         count++;
    55         container_->addChild(panel_);
     74        this->container_ = container;
     75        this->node_ = node;
     76
     77        this->panel_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarObject" + getConvertedValue<unsigned int, std::string>(RadarObject::count_s)));
     78        this->setMaterial(colour, texturename);
     79
     80        this->panel_->setDimensions(3,3);
     81        this->panel_->setMetricsMode(Ogre::GMM_PIXELS);
     82        this->panel_->show();
     83
     84        this->index_ = count_s++;
     85        this->container_->addChild(panel_);
    5686    }
    5787
    58     RadarObject::~RadarObject(){
     88    RadarObject::~RadarObject()
     89    {
    5990        delete panel_;
    6091    }
    6192
    62     void RadarObject::setColour(int colour){
    63         switch(colour){
    64         case RED: panel_->setMaterialName("Orxonox/RedDot"); break;
    65         case YELLOW: panel_->setMaterialName("Orxonox/YellowDot"); break;
    66         case GREEN: panel_->setMaterialName("Orxonox/GreenDot"); break;
    67         case BLUE: panel_->setMaterialName("Orxonox/BlueDot"); break;
    68         case WHITE: panel_->setMaterialName("Orxonox/WhiteDot"); break;
    69         default: panel_->setMaterialName("Orxonox/RedDot"); break;
     93    void RadarObject::setMaterial(const ColourValue& colour, const std::string& texturename)
     94    {
     95        std::map<ColourValue, std::string>& colourmap = this->materials_s[texturename];
     96        std::map<ColourValue, std::string>::const_iterator it = colourmap.find(colour);
     97        std::string materialname;
     98
     99        if (it == colourmap.end())
     100        {
     101            materialname = "radarmaterial" + getConvertedValue<unsigned int, std::string>(RadarObject::count_s);
     102            Ogre::MaterialPtr material = (Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton().create(materialname, "General");
     103            Ogre::TextureUnitState* textureunitstate = material->getTechnique(0)->getPass(0)->createTextureUnitState();
     104            textureunitstate->setTextureName(texturename);
     105            textureunitstate->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, colour);
     106            colourmap[colour] = materialname;
    70107        }
     108        else
     109        {
     110            materialname = (*it).second;
     111        }
     112
     113        this->panel_->setMaterialName(materialname);
    71114    }
    72115
    73     void RadarObject::resetColour(){
    74         setColour(colour_);
    75     }
    76 
    77     Vector3 RadarObject::getPosition(){
     116    Vector3 RadarObject::getPosition()
     117    {
    78118        return node_->getPosition();
    79119    }
    80120
    81     SceneNode* RadarObject::getNode(){
     121    Ogre::SceneNode* RadarObject::getNode()
     122    {
    82123        return node_;
    83124    }
  • code/trunk/src/orxonox/hud/RadarObject.h

    r1505 r1562  
    3030#define _RadarObject_H__
    3131
     32#include <map>
     33
    3234#include <OgrePrerequisites.h>
    3335#include <OgreSceneNode.h>
     
    4042    class _OrxonoxExport RadarObject
    4143    {
    42       private:
    43         Ogre::OverlayManager* om;                               // our one and only overlay manager
    44         Ogre::SceneNode* node_;                                 // node of object
    45         int colour_;
     44      public:
     45        RadarObject(Ogre::OverlayContainer* container, Ogre::SceneNode* node, const ColourValue& colour = ColourValue(0.5, 0.5, 0.5, 1), const std::string& texturename = "white.tga");
     46        ~RadarObject();
    4647
    47       public:
    48         RadarObject(Ogre::OverlayContainer* container, Ogre::SceneNode* node, int colour = 0);
    49         ~RadarObject();
    50         void setColour(int colour);
    51         void resetColour();
     48        void setMaterial(const ColourValue& colour, const std::string& texturename);
     49        inline void setColour(const ColourValue& colour)
     50            { this->setMaterial(colour, this->texturename_); }
     51        inline void setTexture(const std::string& texturename)
     52            { this->setMaterial(this->colour_, texturename); }
     53        inline void resetMaterial()
     54            { this->setMaterial(this->colour_, this->texturename_); }
     55
    5256        Vector3 getPosition();
    5357        Ogre::SceneNode* getNode();
     
    5862        Ogre::PanelOverlayElement* panel_;              // the panel used to show the dot
    5963
    60         static int count;
    61         static const int RED = 0;
    62         static const int YELLOW = 1;
    63         static const int GREEN = 2;
    64         static const int BLUE = 3;
    65         static const int WHITE = 99;            // used if object got nav focus
     64      private:
     65        static std::map<std::string, std::map<ColourValue, std::string> > materials_s;
     66        unsigned static int count_s;
     67        Ogre::SceneNode* node_;                                 // node of object
     68        ColourValue colour_;
     69        std::string texturename_;
    6670  };
    6771}
  • code/trunk/src/orxonox/objects/SpaceShip.cc

    r1559 r1562  
    151151                delete this->cam_;
    152152
    153             if (!myShip_ && &HUD::getSingleton()!=NULL)
    154               HUD::getSingleton().removeRadarObject(this->getNode());
     153            if (!this->myShip_)
     154                HUD::getSingleton().removeRadarObject(this->getNode());
    155155        }
    156156    }
     
    161161          myShip_=true;
    162162        else
    163           HUD::getSingleton().addRadarObject(this->getNode(), 3);
     163          HUD::getSingleton().addRadarObject(this->getNode(), this->getProjectileColour());
    164164      }
    165165      if(Model::create())
     
    282282    void SpaceShip::setCamera(const std::string& camera)
    283283    {
     284      myShip_=true; // TODO: this is only a hack
    284285      camName_=camera;
    285286      // change camera attributes here, if you want to ;)
     
    353354        XMLPortParamLoadOnly(SpaceShip, "transDamp", setTransDamp, xmlelement, mode);
    354355        XMLPortParamLoadOnly(SpaceShip, "rotDamp", setRotDamp, xmlelement, mode);
    355         myShip_=true; // TODO: this is only a hack
    356356
    357357        SpaceShip::create();
  • code/trunk/src/orxonox/objects/SpaceShipAI.cc

    r1558 r1562  
    8080        SpaceShip::XMLPort(xmlelement, mode);
    8181
    82         this->myShip_=true;
    8382        this->actionTimer_.setTimer(ACTION_INTERVAL, true, this, createExecutor(createFunctor(&SpaceShipAI::action)));
    8483    }
Note: See TracChangeset for help on using the changeset viewer.