Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 20, 2008, 12:05:12 AM (16 years ago)
Author:
rgrieder
Message:
  • Radar now working like before
  • but more of a svn save..

There is class called Radar which takes care of the focus and all objects that can be displayed on a Radar.
The actual visual implementation is in HUDRadar.
To make a object radar viewable, simply implement RadarViewable and set the WorldEntitiy pointer in the constructor (assertation will fail otherwise!).
You can also set a camouflage value between 0 and 1 that tells how good a radar can see an object.
The HUDRadar (or another one) on the other side has a sensitivity between 0 and 1. So only if the sensitivity is higher than the camouflage value, the object gets displayed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/hud/src/orxonox/overlays/hud/HUDRadar.cc

    r1609 r1613  
    3737#include "objects/SpaceShip.h"
    3838#include "objects/WorldEntity.h"
     39#include "tools/TextureGenerator.h"
    3940#include "RadarViewable.h"
    4041
     
    4243{
    4344    CreateFactory(HUDRadar);
    44     CreateFactory(RadarColour);
    4545    CreateFactory(RadarShape);
    46 
    47     HUDRadar* HUDRadar::instance_s = 0;
    4846
    4947    using namespace Ogre;
     
    5149    HUDRadar::HUDRadar()
    5250      : background_(0)
     51      , marker_(0)
     52      , sensitivity_(1.0f)
    5353    {
    5454        RegisterObject(HUDRadar);
    55 
    56         assert(instance_s == 0);
    57         instance_s = this;
    5855    }
    5956
     
    6259        if (this->isInitialized())
    6360        {
    64             if (this->background_)
     61            /*if (this->background_)
    6562                OverlayManager::getSingleton().destroyOverlayElement(this->background_);
    6663            while (this->radarDots_.size() > 0)
     
    6865                OverlayManager::getSingleton().destroyOverlayElement(this->radarDots_[this->radarDots_.size() - 1]);
    6966                this->radarDots_.pop_back();
    70             }
    71         }
    72 
    73         instance_s = 0;
     67            }*/
     68        }
    7469    }
    7570
     
    7873        OrxonoxOverlay::XMLPort(xmlElement, mode);
    7974
    80         XMLPortObject(HUDRadar, RadarColour, "shapes", addShape, getShape, xmlElement, mode, false, true);
     75        if (mode == XMLPort::LoadObject)
     76        {
     77            this->sensitivity_ = 1.0f;
     78            this->halfDotSizeDistance_ = 3000.0f;
     79            this->maximumDotSize_ = 0.1;
     80        }
     81
     82        XMLPortParam(HUDRadar, "sensitivity", setRadarSensitivity, getRadarSensitivity, xmlElement, mode);
     83        XMLPortParam(HUDRadar, "halfDotSizeDistance", setHalfDotSizeDistance, getHalfDotSizeDistance, xmlElement, mode);
     84        XMLPortParam(HUDRadar, "maximumDotSize", setMaximumDotSize, getMaximumDotSize, xmlElement, mode);
     85
     86        shapeMaterials_[RadarViewable::Dot]      = "RadarSquare.tga";
     87        shapeMaterials_[RadarViewable::Triangle] = "RadarSquare.tga";
     88        shapeMaterials_[RadarViewable::Square]   = "RadarSquare.tga";
    8189
    8290        if (mode == XMLPort::LoadObject)
     
    8694            overlay_->add2D(background_);
    8795
    88             // create an array of all possible materials
    89             unsigned int iMaterial = 0;
    90             for (std::map<unsigned int, RadarShape*>::const_iterator itShape = shapes_.begin(); itShape != shapes_.end(); ++itShape)
    91             {
    92                 Ogre::MaterialPtr originalMaterial = (Ogre::MaterialPtr)(Ogre::MaterialManager::getSingleton().getByName((*itShape).second->getAttribute()));
    93                 for (std::map<unsigned int, RadarColour*>::const_iterator itColour = colours_.begin(); itColour != colours_.end(); ++itColour)
    94                 {
    95                     Ogre::MaterialPtr newMaterial = originalMaterial->clone((*itShape).second->getAttribute() + convertToString(iMaterial++));
    96                     newMaterial->getTechnique(0)->getPass(0)->setAmbient((*itColour).second->getAttribute());
    97                     materialNames_[(*itShape).first + ((*itColour).first << 8)] = newMaterial->getName();
    98                 }
    99             }
    100 
    101             /*WorldEntity* object;
    102             object = new WorldEntity();
    103             object->setPosition(2000.0, 0.0, 0.0);
    104             addRadarObject(object, ColourValue(0.5, 0, 0, 1));
    105             object = new WorldEntity();
    106             object->setPosition(0.0, 2000.0, 0.0);
    107             addRadarObject(object, ColourValue(0.5, 0, 0, 1));
    108             object = new WorldEntity();
    109             object->setPosition(0.0, 0.0, 2000.0);
    110             addRadarObject(object, ColourValue(0.5, 0, 0, 1));
    111             object = new WorldEntity();
    112             object->setPosition(10000.0,16000.0,0.0);
    113             addRadarObject(object);*/
    114         }
    115     }
    116 
    117     void HUDRadar::addColour(RadarColour* colour)
    118     {
    119         this->colours_[colour->getIndex()] = colour;
    120     }
    121 
    122     RadarColour* HUDRadar::getColour(unsigned int index) const
    123     {
    124         if (index < this->colours_.size())
    125         {
    126             std::map<unsigned int, RadarColour*>::const_iterator it = colours_.begin();
    127             for (unsigned int i = 0; i != index; ++it, ++i)
    128                 ;
    129             return (*it).second;
    130         }
    131         else
    132             return 0;
    133     }
    134 
    135     void HUDRadar::addShape(RadarShape* shape)
     96            marker_ = (Ogre::PanelOverlayElement*)Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_Marker");
     97            marker_->setMaterialName("Orxonox/RadarMarker");
     98            overlay_->add2D(marker_);
     99            marker_->hide();
     100        }
     101    }
     102
     103    /*void HUDRadar::addShape(RadarShape* shape)
    136104    {
    137105        this->shapes_[shape->getIndex()] = shape;
     
    149117        else
    150118            return 0;
    151     }
    152 
    153     void HUDRadar::tick(float dt)
     119    }*/
     120
     121    void HUDRadar::displayObject(RadarViewable* object, bool bIsMarked)
     122    {
     123        const WorldEntity* wePointer = object->getWorldEntity();
     124
     125        // Just to be sure that we actually have a WorldEntity
     126        // We could do a dynamic_cast, but that's a lot slower
     127        if (!wePointer)
     128        {
     129            CCOUT(4) << "Cannot display a non-WorldEntitiy on the radar" << std::endl;
     130            return;
     131        }
     132
     133        /*static int counter = 0;
     134        if (++counter < 1120 && counter > 120)
     135        {
     136            // we have to create a new entry
     137            Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>(
     138                Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberStr()));
     139            // get right material
     140            panel->setMaterialName("Orxonox/RadarSquare");
     141            panel->setDimensions(0.03, 0.03);
     142            panel->setPosition((1.0 + (rand() & 0xFF) / 256.0 - 0.001) * 0.5, (1.0 - (rand() & 0xFF) / 256.0 - 0.001) * 0.5);
     143            panel->show();
     144            this->overlay_->add2D(panel);
     145            this->overlay_->show();
     146        }*/
     147
     148        // try to find a panel already created
     149        Ogre::PanelOverlayElement* panel;
     150        std::map<RadarViewable*, Ogre::PanelOverlayElement*>::iterator it = this->radarDots_.find(object);
     151        if (it == this->radarDots_.end())
     152        {
     153            // we have to create a new entry
     154            panel = static_cast<Ogre::PanelOverlayElement*>(
     155                Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + getUniqueNumberStr()));
     156            radarDots_[object] = panel;
     157            // get right material
     158            panel->setMaterialName(TextureGenerator::getMaterialName(
     159                shapeMaterials_[object->getRadarObjectType()], object->getRadarObjectColour()));
     160            this->overlay_->add2D(panel);
     161        }
     162        else
     163            panel = (*it).second;
     164
     165        // set size to fit distance...
     166        float distance = (wePointer->getWorldPosition() - SpaceShip::getLocalShip()->getPosition()).length();
     167        // calculate the size with 1/distance dependency for simplicity (instead of exp(-distance * lambda)
     168        float size = maximumDotSize_ * halfDotSizeDistance_ / (halfDotSizeDistance_ + distance);
     169        panel->setDimensions(size, size);
     170
     171        // calc position on radar...
     172        Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), wePointer->getWorldPosition());
     173        coord *= Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture
     174        panel->setPosition((1.0 + coord.x - size) * 0.5, (1.0 - coord.y - size) * 0.5);
     175
     176        if (bIsMarked)
     177        {
     178            this->marker_->show();
     179            this->marker_->setDimensions(size * 1.2, size * 1.2);
     180            this->marker_->setPosition((1.0 + coord.x - size * 1.2) * 0.5, (1.0 - coord.y - size * 1.2) * 0.5);
     181        }
     182    }
     183
     184    void HUDRadar::radarTick(float dt)
     185    {
     186    }
     187
     188    /*void HUDRadar::tick(float dt)
    154189    {
    155190        // iterate through all RadarObjects
     
    159194            if ((*it)->isVisibleOnRadar())
    160195            {
    161                 WorldEntity* object = (*it)->getWorldEntity();
    162                 // Just to be sure that we actually have a WorldEntity
    163                 // We could do a dynamic_cast, but that's a lot slower
    164                 assert(object);
    165 
    166                 // set size to fit distance...
    167                 float size = 1.0/((object->getWorldPosition() - SpaceShip::getLocalShip()->getPosition()).length());
    168                 size = clamp(size * 100.0f, 0.02f, 0.12f);
    169                 if (i == radarDots_.size())
    170                 {
    171                     // we have to create a new panel
    172                     radarDots_.push_back(static_cast<Ogre::PanelOverlayElement*>(
    173                         Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarDot" + convertToString(i))));
    174                 }
    175                 radarDots_[i]->setDimensions(size, size);
    176 
    177                 // calc position on radar...
    178                 Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), object->getWorldPosition());
    179                 coord *= Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture
    180                 radarDots_[i]->setPosition((1.0 + coord.x) * 0.5, (1.0 - coord.y) * 0.5);
    181 
    182                 // apply the right material
    183                 RadarPoint description = (*it)->getDescription();
    184                 radarDots_[i]->setMaterialName(materialNames_[description.shape_ + (description.colour_ << 8)]);
    185196            }
    186197        }
    187     }
    188 
    189     void HUDRadar::listObjects()
     198    }*/
     199
     200    /*void HUDRadar::listObjects()
    190201    {
    191202        COUT(3) << "List of RadarObjects:\n";
     
    196207            COUT(3) << i++ << ": " << (*it)->getWorldEntity()->getWorldPosition() << std::endl;
    197208        }
    198     }
    199 
    200     /*static*/ HUDRadar& HUDRadar::getInstance()
    201     {
    202         assert(instance_s);
    203         return *instance_s;
    204     }
     209    }*/
    205210}
Note: See TracChangeset for help on using the changeset viewer.