Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 1564


Ignore:
Timestamp:
Jun 8, 2008, 5:46:52 AM (17 years ago)
Author:
landauf
Message:
  • several small changes in most of the HUD classes (code cleanup): removed obsolete variables, privatized all member variables, removed resizing functioncalls from tick, destroying overlayelements, added some const qualifiers.
  • moved calculation functions for RadarObject-position to Math.h and changed the phi/right/radius format to Vector2. the functions are used too by SpaceShipAI.
  • cycleNavigationFocus takes the nearest object if focus was NULL
  • BarOverlayElement works in both directions (left to right and right to left)
  • fixed bug causing SpaceShipAI to not stop shooting when losing target - this also speeds up orxonox a lot, because there are less projectiles

####################################

!! UPDATE YOUR MEDIA REPOSITORY !!

####################################
…or the BarOverlayElement will look strange

Location:
code/trunk/src
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/orxonox/GraphicsEngine.cc

    r1563 r1564  
    5353
    5454#include "console/InGameConsole.h"
     55#include "hud/HUD.h"
    5556#include "tools/ParticleInterface.h"
    5657#include "Settings.h"
     
    455456    InputManager::setWindowExtents(w, h);
    456457    InGameConsole::getInstance().resize();
     458    HUD::getSingleton().resize();
    457459  }
    458460
  • code/trunk/src/orxonox/OrxonoxPrereqs.h

    r1563 r1564  
    114114  // hud
    115115  class BarOverlayElement;
     116  class BarOverlayElementFactory;
    116117  class HUD;
    117118  class Navigation;
    118119  class RadarObject;
    119120  class RadarOverlayElement;
     121  class RadarOverlayElementFactory;
    120122
    121123  //console
  • code/trunk/src/orxonox/hud/BarOverlayElement.cc

    r1505 r1564  
    3131#include <OgreOverlayManager.h>
    3232#include "GraphicsEngine.h"
     33#include "util/Math.h"
    3334
    3435namespace orxonox
     
    3637    using namespace Ogre;
    3738
    38     BarOverlayElement::BarOverlayElement(const String& name):PanelOverlayElement(name){
     39    BarOverlayElement::BarOverlayElement(const String& name) : PanelOverlayElement(name)
     40    {
    3941        name_ = name;
     42        widthratio_ = 100.0f / 800.0f; // calculates the ratio (backgroundwidth - barwidth) / backgroundwidth
    4043    }
    4144
    42     BarOverlayElement::~BarOverlayElement(){}
     45    BarOverlayElement::~BarOverlayElement()
     46    {
     47        OverlayManager::getSingleton().destroyOverlayElement(this->background_);
     48    }
    4349
    4450    void BarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, OverlayContainer* container){
    4551        // init some values...
    46         container_ = container;
    47         om = &OverlayManager::getSingleton();
    4852        value_ = 0;
    49         color_ = 2;
    50         autoColor_ = true;
    51         left2Right = false;     // default is right to left progress
     53        colour_ = 2;
     54        autoColour_ = true;
     55        right2Left_ = false; // default is left to right progress
    5256        leftRel_ = leftRel;
    5357        topRel_ = topRel;
     
    5559
    5660        // create background...
    57         background_ = static_cast<OverlayContainer*>(om->createOverlayElement("Panel", name_+"container"));
     61        background_ = static_cast<OverlayContainer*>(OverlayManager::getSingleton().createOverlayElement("Panel", name_+"container"));
    5862        background_->show();
    59         container_->addChild(background_);
     63        container->addChild(background_);
    6064        background_->setMetricsMode(GMM_PIXELS);
    6165        background_->setMaterialName("Orxonox/BarBackground");
     
    7175
    7276    void BarOverlayElement::resize(){
    73         windowW_ = GraphicsEngine::getSingleton().getWindowWidth();
    74         windowH_ = GraphicsEngine::getSingleton().getWindowHeight();
    7577        // calculate new absolute coordinates...
    76         left_ = (int) (leftRel_ * windowW_);
    77         top_ = (int) (topRel_ * windowH_);
    78         width_ = (int) (dimRel_ * windowW_);
    79         height_ = (int) (0.1*width_);   // the texture has dimensions height:length = 1:10
     78        left_ = (int) (leftRel_ * GraphicsEngine::getSingleton().getWindowWidth());
     79        top_ = (int) (topRel_ * GraphicsEngine::getSingleton().getWindowHeight());
     80        width_ = (int) (dimRel_ * GraphicsEngine::getSingleton().getWindowWidth());
     81        height_ = (int) (0.1 * width_); // the texture has dimensions height:length = 1:10
     82        offset_ = (int) (width_ * widthratio_ * 0.5);
     83        barwidth_ = (int) (width_ * (1.0f - widthratio_));
     84
    8085        // adapt background
    8186        background_->setPosition(left_, top_);
     
    8691
    8792    void BarOverlayElement::setValue(float value){
    88         value_ = value;
    89         // set color, if nescessary
    90         if(autoColor_){
    91             if (value_>0.5) {setColor(BarOverlayElement::GREEN);}
    92             else if (value_>0.25) {setColor(BarOverlayElement::YELLOW);}
    93             else setColor(BarOverlayElement::RED);
     93        value_ = clamp<float>(value, 0, 1);
     94        // set colour, if nescessary
     95        if(autoColour_){
     96            if (value_>0.5) {setColour(BarOverlayElement::GREEN);}
     97            else if (value_>0.25) {setColour(BarOverlayElement::YELLOW);}
     98            else setColour(BarOverlayElement::RED);
    9499        }
     100
    95101        // set value
    96         if(left2Right){ // backward case
    97             setPosition(0+width_-width_*value_, 0);
    98             setDimensions(width_*value_,height_);
     102        if(right2Left_){ // backward case
     103            setPosition(offset_ + barwidth_ * (1 - value_), 0);
     104            setDimensions(barwidth_ * value_, height_);
    99105        }else{          // default case
    100             setPosition(0, 0);
    101             setDimensions(width_*value_,height_);
     106            setPosition(offset_, 0);
     107            setDimensions(barwidth_ * value_, height_);
    102108        }
    103109        if(value_ != 0) setTiling(value_, 1.0);
    104110    }
    105111
    106     void BarOverlayElement::setColor(int color){
    107         color_ = color;
    108         switch(color){
     112    void BarOverlayElement::setColour(int colour){
     113        colour_ = colour;
     114        switch(colour){
    109115        case 0:
    110116            setMaterialName("Orxonox/Red");
     
    117123        }
    118124    }
    119 
    120     float BarOverlayElement::getValue(){
    121         return(value_);
    122     }
    123 
    124     int BarOverlayElement::getBarColor(){
    125         return(color_);
    126     }
    127125}
  • code/trunk/src/orxonox/hud/BarOverlayElement.h

    r1505 r1564  
    3939  class _OrxonoxExport BarOverlayElement : public Ogre::PanelOverlayElement
    4040  {
     41    public:
     42      BarOverlayElement(const Ogre::String& name);
     43      virtual ~BarOverlayElement();
     44
     45      void init(Real leftRel, Real topRel, Real dimRel, Ogre::OverlayContainer* container);
     46      void resize();
     47      void setValue(float value);
     48      void setColour(int colour);
     49
     50      inline void setRightToLeft(bool r2l)
     51        { this->right2Left_ = r2l; }
     52      inline bool getRightToLeft() const
     53        { return this->right2Left_; }
     54      inline float getValue() const
     55        { return this->value_; }
     56      inline int getBarColour() const
     57        { return this->colour_; }
     58
    4159    private:
    42       bool autoColor_;                    // whether bar changes color automatically
     60      static const int RED = 0;           // predefined colours
     61      static const int YELLOW = 1;
     62      static const int GREEN = 2;
     63
     64      bool right2Left_;
     65      bool autoColour_;                   // whether bar changes colour automatically
    4366      float value_;                       // progress of bar
    44       int color_;
     67      int colour_;
    4568      int left_;
    4669      int top_;
    4770      int width_;
    4871      int height_;
    49       int windowW_, windowH_;
     72      float widthratio_;
     73      int offset_;
     74      int barwidth_;
    5075      Ogre::Real leftRel_;
    5176      Ogre::Real topRel_;
    5277      Ogre::Real dimRel_;
    53       Ogre::OverlayManager* om;           // our overlay manager
    54       Ogre::OverlayContainer* container_; // our parent container to attach to
    5578      Ogre::OverlayContainer* background_;
    5679      Ogre::String name_;
    57 
    58     public:
    59       bool left2Right;
    60       static const int RED = 0;           // predefined colors
    61       static const int YELLOW = 1;
    62       static const int GREEN = 2;
    63 
    64       BarOverlayElement(const Ogre::String& name);
    65       virtual ~BarOverlayElement();
    66       void init(Real leftRel, Real topRel, Real dimRel, Ogre::OverlayContainer* container);
    67       void resize();
    68       void setValue(float value);
    69       void setColor(int color);
    70       float getValue();
    71       int getBarColor();
    7280    };
    7381}
  • code/trunk/src/orxonox/hud/HUD.cc

    r1562 r1564  
    4040#include "core/ConsoleCommand.h"
    4141#include "objects/SpaceShip.h"
     42#include "objects/WorldEntity.h"
    4243#include "GraphicsEngine.h"
    4344#include "BarOverlayElement.h"
     
    5051{
    5152    SetConsoleCommandShortcut(HUD, cycleNavigationFocus).setAccessLevel(AccessLevel::User);
     53    SetConsoleCommandShortcut(HUD, releaseNavigationFocus).setAccessLevel(AccessLevel::User);
    5254    SetConsoleCommandShortcut(HUD, toggleFPS).setAccessLevel(AccessLevel::User);
    5355    SetConsoleCommandShortcut(HUD, toggleRenderTime).setAccessLevel(AccessLevel::User);
     
    5557    using namespace Ogre;
    5658
    57     HUD::HUD(){
    58         om = &Ogre::OverlayManager::getSingleton();
    59         sm = GraphicsEngine::getSingleton().getSceneManager();
    60         showFPS = true;
    61         showRenderTime = true;
     59    HUD::HUD()
     60    {
     61        showFPS_ = true;
     62        showRenderTime_ = true;
    6263
    6364        // create Factories
    64         BarOverlayElementFactory *barOverlayElementFactory = new BarOverlayElementFactory();
    65         om->addOverlayElementFactory(barOverlayElementFactory);
    66         RadarOverlayElementFactory *radarOverlayElementFactory = new RadarOverlayElementFactory();
    67         om->addOverlayElementFactory(radarOverlayElementFactory);
    68 
    69         orxonoxHUD = om->create("Orxonox/HUD");
    70         container = static_cast<Ogre::OverlayContainer*>(om->createOverlayElement("Panel", "Orxonox/HUD/container"));
     65        barOverlayElementFactory_ = new BarOverlayElementFactory();
     66        Ogre::OverlayManager::getSingleton().addOverlayElementFactory(barOverlayElementFactory_);
     67        radarOverlayElementFactory_ = new RadarOverlayElementFactory();
     68        Ogre::OverlayManager::getSingleton().addOverlayElementFactory(radarOverlayElementFactory_);
     69
     70        orxonoxHUD_ = Ogre::OverlayManager::getSingleton().create("Orxonox/HUD");
     71        container_ = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "Orxonox/HUD/container"));
    7172
    7273        // creating text to display fps
    73         fpsText = static_cast<TextAreaOverlayElement*>(om->createOverlayElement("TextArea", "fpsText"));
    74         fpsText->show();
    75         fpsText->setMetricsMode(Ogre::GMM_PIXELS);
    76         fpsText->setDimensions(0.001, 0.001);
    77         fpsText->setPosition(10, 10);
    78         fpsText->setFontName("Console");
    79         fpsText->setCharHeight(20);
    80         fpsText->setCaption("init");
     74        fpsText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "fpsText"));
     75        fpsText_->show();
     76        fpsText_->setMetricsMode(Ogre::GMM_PIXELS);
     77        fpsText_->setDimensions(0.001, 0.001);
     78        fpsText_->setPosition(10, 10);
     79        fpsText_->setFontName("Console");
     80        fpsText_->setCharHeight(20);
     81        fpsText_->setCaption("init");
    8182
    8283        // creating text to display render time ratio
    83         rTRText = static_cast<TextAreaOverlayElement*>(om->createOverlayElement("TextArea", "rTRText"));
    84         rTRText->show();
    85         rTRText->setMetricsMode(Ogre::GMM_PIXELS);
    86         rTRText->setDimensions(0.001, 0.001);
    87         rTRText->setPosition(10, 30);
    88         rTRText->setFontName("Console");
    89         rTRText->setCharHeight(20);
    90         rTRText->setCaption("init");
     84        rTRText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", "rTRText"));
     85        rTRText_->show();
     86        rTRText_->setMetricsMode(Ogre::GMM_PIXELS);
     87        rTRText_->setDimensions(0.001, 0.001);
     88        rTRText_->setPosition(10, 30);
     89        rTRText_->setFontName("Console");
     90        rTRText_->setCharHeight(20);
     91        rTRText_->setCaption("init");
    9192
    9293        // create energy bar
    93         energyBar = static_cast<BarOverlayElement*>(om->createOverlayElement("Bar", "energyBar"));
    94         energyBar->show();
     94        energyBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "energyBar"));
     95        energyBar_->show();
    9596        // create speedo bar
    96         speedoBar = static_cast<BarOverlayElement*>(om->createOverlayElement("Bar", "speedoBar"));
    97         speedoBar->show();
     97        speedoBar_ = static_cast<BarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Bar", "speedoBar"));
     98        speedoBar_->show();
    9899        // create radar
    99         radar = static_cast<RadarOverlayElement*>(om->createOverlayElement("Radar", "radar"));
    100         radar->show();
     100        radar_ = static_cast<RadarOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Radar", "radar"));
     101        radar_->show();
    101102
    102103        // create Navigation
    103         nav = new Navigation(container);
     104        nav_ = new Navigation(container_);
    104105
    105106        // set up screen-wide container
    106         container->show();
    107 
    108         orxonoxHUD->add2D(container);
    109         orxonoxHUD->show();
    110         container->setLeft(0.0);
    111         container->setTop(0.0);
    112         container->setWidth(1.0);
    113         container->setHeight(1.0);
    114         container->setMetricsMode(Ogre::GMM_RELATIVE);
    115         container->addChild(fpsText);
    116         container->addChild(rTRText);
    117 
    118         energyBar->init(0.01, 0.94, 0.4, container);
    119         energyBar->setValue(1);
    120 
    121         speedoBar->init(0.01, 0.90, 0.4, container);
    122 
    123         radar->init(0.5, 0.9, 0.2, container);
    124         SceneNode* node;
    125         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));
    132         addRadarObject(node);
    133     }
    134 
    135     HUD::~HUD(){
    136         //todo: clean up objects
     107        container_->show();
     108
     109        orxonoxHUD_->add2D(container_);
     110        orxonoxHUD_->show();
     111        container_->setLeft(0.0);
     112        container_->setTop(0.0);
     113        container_->setWidth(1.0);
     114        container_->setHeight(1.0);
     115        container_->setMetricsMode(Ogre::GMM_RELATIVE);
     116        container_->addChild(fpsText_);
     117        container_->addChild(rTRText_);
     118
     119        energyBar_->init(0.01, 0.94, 0.4, container_);
     120        energyBar_->setValue(1);
     121
     122        speedoBar_->init(0.01, 0.90, 0.4, container_);
     123
     124        radar_->init(0.5, 0.9, 0.2, container_);
     125
     126        WorldEntity* object;
     127        object = new WorldEntity();
     128        object->setPosition(2000.0, 0.0, 0.0);
     129        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
     130        object = new WorldEntity();
     131        object->setPosition(0.0, 2000.0, 0.0);
     132        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
     133        object = new WorldEntity();
     134        object->setPosition(0.0, 0.0, 2000.0);
     135        addRadarObject(object, ColourValue(0.5, 0, 0, 1));
     136        object = new WorldEntity();
     137        object->setPosition(10000.0,16000.0,0.0);
     138        addRadarObject(object);
     139    }
     140
     141    HUD::~HUD()
     142    {
     143        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->container_);
     144        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->fpsText_);
     145        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->rTRText_);
     146        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->energyBar_);
     147        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->speedoBar_);
     148        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->radar_);
     149
     150        delete this->nav_;
     151        delete this->barOverlayElementFactory_;
     152        delete this->radarOverlayElementFactory_;
    137153    }
    138154
    139155    void HUD::tick(float dt)
    140156    {
    141         energyBar->resize();
    142 
    143157        if(!SpaceShip::getLocalShip())
    144158          return;
     159
    145160        float v = SpaceShip::getLocalShip()->getVelocity().length();
    146161        float vmax = SpaceShip::getLocalShip()->getMaxSpeed();
    147         speedoBar->setValue(v/vmax);
    148         speedoBar->resize();
    149 
    150         radar->resize();
    151         radar->update();
    152 
    153         nav->update();
     162        speedoBar_->setValue(v/vmax);
     163
     164        radar_->update();
     165        nav_->update();
    154166
    155167        setFPS();
    156168    }
    157169
     170    void HUD::resize()
     171    {
     172        this->speedoBar_->resize();
     173        this->energyBar_->resize();
     174        this->radar_->resize();
     175    }
     176
    158177    void HUD::setRenderTimeRatio(float ratio)
    159178    {
    160         if(showRenderTime){
    161             rTRText->setCaption("Render time ratio: " + Ogre::StringConverter::toString(ratio));
     179        if(showRenderTime_){
     180            rTRText_->setCaption("Render time ratio: " + Ogre::StringConverter::toString(ratio));
    162181        }
    163182        else{
    164             rTRText->setCaption("");
     183            rTRText_->setCaption("");
    165184            return;
    166185        }
     
    168187
    169188    void HUD::setFPS(){
    170         if(showFPS){
     189        if(showFPS_){
    171190            float fps = GraphicsEngine::getSingleton().getAverageFPS();
    172             fpsText->setCaption("FPS: " + Ogre::StringConverter::toString(fps));
     191            fpsText_->setCaption("FPS: " + Ogre::StringConverter::toString(fps));
    173192        }
    174193        else{
    175             fpsText->setCaption("");
     194            fpsText_->setCaption("");
    176195            return;
    177196        }
    178197    }
    179198
    180     void HUD::addRadarObject(SceneNode* node, const ColourValue& colour){
    181         RadarObject* obj = new RadarObject(container, node, colour);
    182         roSet.insert(obj);
     199    void HUD::addRadarObject(WorldEntity* object, const ColourValue& colour){
     200        RadarObject* obj = new RadarObject(container_, object, colour);
     201        roSet_.insert(roSet_.end(), obj);
    183202//        // check if this is the first RadarObject to create
    184203//        if(firstRadarObject == NULL){
    185 //            firstRadarObject = new RadarObject(container, node, colour);
     204//            firstRadarObject = new RadarObject(container_, object, colour);
    186205//            lastRadarObject = firstRadarObject;
    187206//        }
    188207//        else{ // if not, append to list
    189 //            lastRadarObject->next = new RadarObject(container, node, colour);
     208//            lastRadarObject->next = new RadarObject(container_, object, colour);
    190209//            lastRadarObject = lastRadarObject->next;
    191210//        }
    192211    }
    193212
    194     void HUD::removeRadarObject(Ogre::SceneNode* node){
    195         for(std::set<RadarObject*>::iterator it=roSet.begin(); it!=roSet.end(); ++it){
    196             if ((*it)->getNode() == node)
     213    void HUD::removeRadarObject(WorldEntity* object){
     214        for(std::list<RadarObject*>::iterator it=roSet_.begin(); it!=roSet_.end(); ++it){
     215            if ((*it)->getObject() == object)
    197216            {
    198                 if (this->nav->focus_ == (*it))
    199                 {
    200                     this->nav->cycleFocus();
    201                     if (this->nav->focus_ == (*it))
    202                         this->nav->focus_ = 0;
    203                 }
     217                if (this->nav_->getFocus() == (*it))
     218                    this->nav_->setFocus(0);
     219
    204220                delete (*it);
    205                 roSet.erase(it);
     221                roSet_.erase(it);
    206222                return;
    207223            }
     
    215231
    216232    /*static*/ void HUD::setEnergy(float value){
    217         HUD::getSingleton().energyBar->setValue(value);
     233        HUD::getSingleton().energyBar_->setValue(value);
    218234    }
    219235
    220236    /*static*/ void HUD::cycleNavigationFocus(){
    221         HUD::getSingleton().nav->cycleFocus();
     237        HUD::getSingleton().nav_->cycleFocus();
     238    }
     239
     240    /*static*/ void HUD::releaseNavigationFocus(){
     241        HUD::getSingleton().nav_->setFocus(0);
    222242    }
    223243
    224244    /*static*/ void HUD::toggleFPS(){
    225         HUD::getSingleton().showFPS = !HUD::getSingleton().showFPS;
     245        HUD::getSingleton().showFPS_ = !HUD::getSingleton().showFPS_;
    226246    }
    227247
    228248    /*static*/ void HUD::toggleRenderTime(){
    229         HUD::getSingleton().showRenderTime = !HUD::getSingleton().showRenderTime;
     249        HUD::getSingleton().showRenderTime_ = !HUD::getSingleton().showRenderTime_;
    230250    }
    231251}
    232 
    233 
    234 
    235 
    236 
    237 
  • code/trunk/src/orxonox/hud/HUD.h

    r1562 r1564  
    3535#include <OgrePrerequisites.h>
    3636#include <OgreTextAreaOverlayElement.h>
    37 #include <OgreSceneNode.h>
    3837#include "objects/Tickable.h"
    3938#include "util/Math.h"
     
    4342    class _OrxonoxExport HUD : public TickableReal
    4443    {
    45       private:
    46         HUD();
    47         HUD(HUD& instance);
    48         ~HUD();
    49         Ogre::OverlayManager* om;
    50         Ogre::SceneManager* sm;
    51         Ogre::Overlay* orxonoxHUD;
    52         Ogre::OverlayContainer* container;
    53         Ogre::TextAreaOverlayElement* fpsText;
    54         Ogre::TextAreaOverlayElement* rTRText;
    55         BarOverlayElement* energyBar;
    56         BarOverlayElement* speedoBar;
    57         RadarOverlayElement* radar;
    58         Navigation* nav;
     44      public:
     45        static HUD& getSingleton();
     46        virtual void tick(float);
    5947
    60         bool showFPS;
    61         bool showRenderTime;
    62 
    63       public:
    64         virtual void tick(float);
    65         void addRadarObject(Ogre::SceneNode* node, const ColourValue& colour = ColourValue(0.5, 0.5, 0.5, 1));
    66         void removeRadarObject(Ogre::SceneNode* node);
     48        void resize();
     49        void addRadarObject(WorldEntity* object, const ColourValue& colour = ColourValue(0.5, 0.5, 0.5, 1));
     50        void removeRadarObject(WorldEntity* object);
    6751        void setRenderTimeRatio(float ratio);
    6852        void setFPS();
    6953
    70         std::set<RadarObject*> roSet;
     54        inline std::list<RadarObject*>& getRadarObjects()
     55            { return this->roSet_; }
     56
     57        static void setEnergy(float value);
     58        static void cycleNavigationFocus();
     59        static void releaseNavigationFocus();
     60        static void toggleFPS();
     61        static void toggleRenderTime();
     62
     63      private:
     64        HUD();
     65        HUD(const HUD& instance);
     66        ~HUD();
    7167
    7268        static HUD* instance_s;
    73         static HUD& getSingleton();
    74         static void setEnergy(float value);
    75         static void cycleNavigationFocus();
    76         static void toggleFPS();
    77         static void toggleRenderTime();
     69
     70        std::list<RadarObject*> roSet_;
     71        Ogre::Overlay* orxonoxHUD_;
     72        Ogre::OverlayContainer* container_;
     73        BarOverlayElementFactory* barOverlayElementFactory_;
     74        RadarOverlayElementFactory* radarOverlayElementFactory_;
     75        Ogre::TextAreaOverlayElement* fpsText_;
     76        Ogre::TextAreaOverlayElement* rTRText_;
     77        BarOverlayElement* energyBar_;
     78        BarOverlayElement* speedoBar_;
     79        RadarOverlayElement* radar_;
     80        Navigation* nav_;
     81
     82        bool showFPS_;
     83        bool showRenderTime_;
    7884    };
    7985}
  • code/trunk/src/orxonox/hud/Navigation.cc

    r1562 r1564  
    4141#include "HUD.h"
    4242#include "core/Debug.h"
     43#include "util/Math.h"
    4344
    4445namespace orxonox
     
    5859    }
    5960
     61    Navigation::~Navigation()
     62    {
     63        OverlayManager::getSingleton().destroyOverlayElement(this->navText_);
     64        OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_);
     65        OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_);
     66    }
     67
    6068    void Navigation::init(){
    61         om = &OverlayManager::getSingleton();
    62         navCam_ = NULL;
    6369        // create nav text
    64         navText_ = static_cast<TextAreaOverlayElement*>(om->createOverlayElement("TextArea", "navText"));
     70        navText_ = static_cast<TextAreaOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("TextArea", "navText"));
    6571        navText_->show();
    6672        navText_->setMetricsMode(Ogre::GMM_PIXELS);
     
    7076        navText_->setCharHeight(20);
    7177        navText_->setCaption("");
     78        navText_->hide();
    7279        container_->addChild(navText_);
    7380
    7481
    7582        // create nav marker ...
    76         navMarker_ = static_cast<PanelOverlayElement*>(om->createOverlayElement("Panel", "NavMarker"));
     83        navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "NavMarker"));
     84        aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "aimMarker"));
    7785        navMarker_->setMetricsMode(GMM_PIXELS);
     86        aimMarker_->setMetricsMode(GMM_PIXELS);
    7887        navMarker_->hide();
    79         navText_->hide();
     88        aimMarker_->hide();
    8089        container_->addChild(navMarker_);
     90        container_->addChild(aimMarker_);
    8191    }
    8292
    8393    void Navigation::update(){
    84         if(focus_ == NULL) return;
    85         navCamPos_ = SpaceShip::getLocalShip()->getPosition();
    86         currentDir_ = SpaceShip::getLocalShip()->getDir();
    87         currentOrth_ = SpaceShip::getLocalShip()->getOrth();
    88 
    89         windowW_ = GraphicsEngine::getSingleton().getWindowWidth();
    90         windowH_ = GraphicsEngine::getSingleton().getWindowHeight();
     94        if (!focus_)
     95            return;
     96
    9197        updateMarker();
    9298    }
    9399
    94100    void Navigation::updateMarker(){
     101        int windowW = GraphicsEngine::getSingleton().getWindowWidth();
     102        int windowH = GraphicsEngine::getSingleton().getWindowHeight();
     103
    95104        // set text
    96105        int dist = (int) getDist2Focus()/100;
    97106        navText_->setCaption(Ogre::StringConverter::toString(dist));
    98107
    99         if(navCam_ == NULL) navCam_ = SpaceShip::getLocalShip()->getCamera()->cam_;
    100108        Vector3 pos = focus_->getPosition();
     109        Ogre::Camera* navCam = SpaceShip::getLocalShip()->getCamera()->cam_;
    101110        // transform to screen coordinates
    102         pos = navCam_->getProjectionMatrix()*navCam_->getViewMatrix()*pos;
     111        pos = navCam->getProjectionMatrix() * navCam->getViewMatrix() * pos;
     112
    103113        float xPosRel = 0.5*pos.x+0.5;
    104114        float yPosRel = 1-(0.5*pos.y+0.5);
    105         int xPos = (int) (xPosRel*windowW_);
    106         int yPos = (int) (yPosRel*windowH_);
    107         int xFromCenter = xPos-windowW_/2;
    108         int yFromCenter = yPos-windowH_/2;
     115        int xPos = (int) (xPosRel*windowW);
     116        int yPos = (int) (yPosRel*windowH);
     117        int xFromCenter = xPos-windowW/2;
     118        int yFromCenter = yPos-windowH/2;
     119
    109120        // is object in view?
    110         float radius = RadarOverlayElement::calcRadius(navCamPos_, currentDir_, currentOrth_, focus_);
    111         bool isRight = (currentDir_.crossProduct(currentOrth_)).dotProduct(focus_->getPosition() - navCamPos_)>0;
    112         bool isAbove = currentOrth_.dotProduct(focus_->getPosition() - navCamPos_)>0;
     121        Vector3 navCamPos = SpaceShip::getLocalShip()->getPosition();
     122        Vector3 currentDir = SpaceShip::getLocalShip()->getDir();
     123        Vector3 currentOrth = SpaceShip::getLocalShip()->getOrth();
     124        float radius = getAngle(navCamPos, currentDir, focus_->getPosition());
     125        bool isRight = (currentDir.crossProduct(currentOrth)).dotProduct(focus_->getPosition() - navCamPos)>0;
     126        bool isAbove = currentOrth.dotProduct(focus_->getPosition() - navCamPos)>0;
    113127        bool outOfView = (xPosRel<0 || xPosRel>1 || yPosRel<0 || yPosRel>1);
    114128        // if object is behind us, it is out of view anyway:
    115         if(!outOfView && radius>3.14/2) outOfView = true;
     129        if(!outOfView && radius > Ogre::Math::PI / 2) outOfView = true;
    116130
    117131        if(outOfView){
     
    119133            navMarker_->setMaterialName("Orxonox/NavArrows");
    120134            navMarker_->setDimensions(16,16);
    121             float phiUpperCorner = atan((float)(windowW_)/(float)(windowH_));
     135            float phiUpperCorner = atan((float)(windowW)/(float)(windowH));
    122136            // from the angle we find out on which edge to draw the marker
    123137            // and which of the four arrows to take
     
    128142                if(-phiNav<phiUpperCorner){
    129143                    //COUT(3) << "arrow up\n";
    130                     navMarker_->setPosition(-tan(phiNav)*windowH_/2+windowW_/2, 0);
     144                    navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
    131145                    navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
    132146                    navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
     
    135149                else {
    136150                    //COUT(3) << "arrow right\n";
    137                     navMarker_->setPosition(windowW_-16, tan((3.14-2*phiNav)/2)*windowW_/2+windowH_/2);
     151                    navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    138152                    navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
    139153                    navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth());
     
    145159                if(phiNav<phiUpperCorner) {
    146160                    //COUT(3) << "arrow down\n";
    147                     navMarker_->setPosition(tan(phiNav)*windowH_/2+windowW_/2, windowH_-16);
     161                    navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
    148162                    navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
    149163                    navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
     
    152166                else {
    153167                    //COUT(3) << "arrow right\n";
    154                     navMarker_->setPosition(windowW_-16, tan((3.14-2*phiNav)/2)*windowW_/2+windowH_/2);
     168                    navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    155169                    navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
    156170                    navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth());
     
    162176                if(phiNav<phiUpperCorner){
    163177                    //COUT(3) << "arrow up\n";
    164                     navMarker_->setPosition(-tan(phiNav)*windowH_/2+windowW_/2, 0);
     178                    navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
    165179                    navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
    166180                    navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
     
    169183                else {
    170184                    //COUT(3) << "arrow left\n";
    171                     navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW_/2+windowH_/2);
     185                    navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    172186                    navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
    173187                    navText_->setLeft(navMarker_->getWidth());
     
    179193                if(phiNav>-phiUpperCorner) {
    180194                    //COUT(3) << "arrow down\n";
    181                     navMarker_->setPosition(tan(phiNav)*windowH_/2+windowW_/2, windowH_-16);
     195                    navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
    182196                    navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
    183197                    navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
     
    186200                else {
    187201                    //COUT(3) << "arrow left\n";
    188                     navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW_/2+windowH_/2);
     202                    navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    189203                    navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
    190204                    navText_->setLeft(navMarker_->getWidth());
     
    205219    void Navigation::cycleFocus(){
    206220        if(focus_ == NULL){
    207             it_ = HUD::getSingleton().roSet.begin();
    208             focus_ = *it_;
    209             ++it_;
     221            // Get closest object
     222            float distance = (unsigned int) -1;
     223            Vector3 shipPos = SpaceShip::getLocalShip()->getPosition();
     224            it_ = HUD::getSingleton().getRadarObjects().begin();
     225
     226            for (std::list<RadarObject*>::iterator it = HUD::getSingleton().getRadarObjects().begin(); it != HUD::getSingleton().getRadarObjects().end(); ++it)
     227            {
     228                float newdist = (*it)->getPosition().squaredDistance(shipPos);
     229                if (newdist < distance)
     230                {
     231                    distance = newdist;
     232                    it_ = it;
     233                }
     234            }
     235
     236            if (it_ != HUD::getSingleton().getRadarObjects().end())
     237            {
     238                focus_ = *it_;
     239
     240                // move the focused object to the begin of the list, so we will iterate through all other objects when cycling
     241                HUD::getSingleton().getRadarObjects().erase(it_);
     242                HUD::getSingleton().getRadarObjects().insert(HUD::getSingleton().getRadarObjects().begin(), focus_);
     243                it_ = HUD::getSingleton().getRadarObjects().begin();
     244                ++it_;
     245            }
    210246        }
    211247        else{
    212248            focus_->resetMaterial();
    213             if(it_ != HUD::getSingleton().roSet.end()){
     249            if(it_ != HUD::getSingleton().getRadarObjects().end()){
    214250                focus_ = *it_;
    215251                ++it_;
     
    217253            else focus_ = NULL;
    218254        }
     255        updateFocus();
     256    }
     257
     258    void Navigation::updateFocus(){
    219259        if(focus_ == NULL){
    220260            navMarker_->hide();
     
    228268    }
    229269
    230     float Navigation::getDist2Focus(){
     270    float Navigation::getDist2Focus() const {
    231271        if(focus_ == NULL) return(0.0);
    232272        return((focus_->getPosition()-SpaceShip::getLocalShip()->getPosition()).length());
  • code/trunk/src/orxonox/hud/Navigation.h

    r1505 r1564  
    3535#include <OgreTextAreaOverlayElement.h>
    3636#include <OgrePanelOverlayElement.h>
    37 #include "util/Math.h"
    3837
    3938namespace orxonox
    4039{
    41 
    4240    class _OrxonoxExport Navigation
    4341    {
    44       private:
    45         Ogre::OverlayManager* om;                                           // our one and only overlay manager
    46         Ogre::OverlayContainer* container_;
    47         Ogre::PanelOverlayElement* navMarker_;      // the panel used to show the arrow
    48         Ogre::TextAreaOverlayElement* navText_;     // displaying distance
    49         Ogre::Camera* navCam_;
    50         Vector3 navCamPos_;                         // position of ship
    51         Vector3 currentDir_;
    52         Vector3 currentOrth_;
    53         std::set<RadarObject*>::iterator it_;
    54         int windowW_, windowH_;
    55         void init();
    56         void updateMarker();
    57 
    5842      public:
    5943        Navigation(Ogre::OverlayContainer* container);
    6044        Navigation(Ogre::OverlayContainer* container, RadarObject* focus);
    6145        ~Navigation();
    62         RadarObject* focus_;                        // next pointer of linked list
    6346
    6447        void update();
    6548        void cycleFocus();
    66         float getDist2Focus();
     49        float getDist2Focus() const;
     50
     51        inline RadarObject* getFocus() const
     52            { return this->focus_; }
     53        inline void setFocus(RadarObject* object)
     54            { this->focus_ = object; this->updateFocus(); }
     55
     56      private:
     57        void init();
     58        void updateMarker();
     59        void updateFocus();
     60
     61        Ogre::OverlayContainer* container_;
     62        Ogre::PanelOverlayElement* navMarker_;      // the panel used to show the arrow
     63        Ogre::PanelOverlayElement* aimMarker_;
     64        Ogre::TextAreaOverlayElement* navText_;     // displaying distance
     65        std::list<RadarObject*>::iterator it_;
     66        RadarObject* focus_;                        // next pointer of linked list
    6767  };
    6868}
  • code/trunk/src/orxonox/hud/OverlayElementFactories.h

    r1505 r1564  
    3939#include "RadarOverlayElement.h"
    4040
    41 namespace orxonox{
     41namespace orxonox
     42{
    4243    class _OrxonoxExport BarOverlayElementFactory : public Ogre::OverlayElementFactory{
    4344      public:
  • code/trunk/src/orxonox/hud/RadarObject.cc

    r1563 r1564  
    2323 *      Felix Schulthess
    2424 *   Co-authors:
    25  *      ...
     25 *      Fabian 'x3n' Landau
    2626 *
    2727 */
     
    3535
    3636#include "GraphicsEngine.h"
     37#include "objects/WorldEntity.h"
    3738#include "util/Convert.h"
    3839
     
    4344    {
    4445        public:
    45             bool operator()(const orxonox::ColourValue& __x, const orxonox::ColourValue& __y)
     46            bool operator()(const orxonox::ColourValue& __x, const orxonox::ColourValue& __y) const
    4647            {
    4748                if (__x.r == __y.r)
     
    6869    std::map<std::string, std::map<ColourValue, std::string> > RadarObject::materials_s;
    6970
    70     RadarObject::RadarObject(Ogre::OverlayContainer* container, Ogre::SceneNode* node, const ColourValue& colour, const std::string& texturename)
     71    RadarObject::RadarObject(Ogre::OverlayContainer* container, WorldEntity* object, const ColourValue& colour, const std::string& texturename)
    7172    {
    7273        this->colour_ = colour;
    7374        this->texturename_ = texturename;
    7475
    75         this->container_ = container;
    76         this->node_ = node;
     76        this->object_ = object;
    7777
    78         this->panel_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarObject" + getConvertedValue<unsigned int, std::string>(RadarObject::count_s)));
     78        this->panel_ = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "RadarObject" + getConvertedValue<unsigned int, std::string>(RadarObject::count_s++)));
    7979        this->setMaterial(colour, texturename);
    8080
    81         this->panel_->setDimensions(3,3);
     81        this->panel_->setDimensions(3, 3);
    8282        this->panel_->setMetricsMode(Ogre::GMM_PIXELS);
    8383        this->panel_->show();
    8484
    85         this->index_ = count_s++;
    86         this->container_->addChild(panel_);
     85        container->addChild(panel_);
    8786    }
    8887
    8988    RadarObject::~RadarObject()
    9089    {
    91         delete panel_;
     90        Ogre::OverlayManager::getSingleton().destroyOverlayElement(this->panel_);
    9291    }
    9392
     
    116115    }
    117116
    118     Vector3 RadarObject::getPosition()
     117    const Vector3& RadarObject::getPosition() const
    119118    {
    120         return node_->getPosition();
     119        return this->object_->getPosition();
    121120    }
    122121
    123     Ogre::SceneNode* RadarObject::getNode()
     122    const Vector3& RadarObject::getVelocity() const
    124123    {
    125         return node_;
     124        return this->object_->getVelocity();
    126125    }
    127126}
  • code/trunk/src/orxonox/hud/RadarObject.h

    r1563 r1564  
    2323 *      Felix Schulthess
    2424 *   Co-authors:
    25  *      ...
     25 *      Fabian 'x3n' Landau
    2626 *
    2727 */
     
    3030#define _RadarObject_H__
    3131
     32#include "OrxonoxPrereqs.h"
     33
    3234#include <map>
     35#include <OgrePanelOverlayElement.h>
    3336
    34 #include <OgrePrerequisites.h>
    35 #include <OgreSceneNode.h>
    36 #include <OgrePanelOverlayElement.h>
    37 #include "OrxonoxPrereqs.h"
    3837#include "util/Math.h"
    3938
     
    4342    {
    4443      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");
     44        RadarObject(Ogre::OverlayContainer* container, WorldEntity* object, const ColourValue& colour = ColourValue(0.5, 0.5, 0.5, 1), const std::string& texturename = "white.tga");
    4645        ~RadarObject();
    4746
     
    5453            { this->setMaterial(this->colour_, this->texturename_); }
    5554
    56         Vector3 getPosition();
    57         Ogre::SceneNode* getNode();
     55        const Vector3& getPosition() const;
     56        const Vector3& getVelocity() const;
    5857
    59         bool right_;
    60         int index_;                             // index number of object
    61         Ogre::OverlayContainer* container_;
    62         Ogre::PanelOverlayElement* panel_;              // the panel used to show the dot
     58        inline WorldEntity* getObject() const
     59            { return this->object_; }
     60        inline Ogre::PanelOverlayElement* getPanel() const
     61            { return this->panel_; }
    6362
    6463      private:
     
    6665        static unsigned int count_s;
    6766        static unsigned int materialcount_s;
    68         Ogre::SceneNode* node_;                                 // node of object
     67
     68        WorldEntity* object_;                                   // the object
    6969        ColourValue colour_;
    7070        std::string texturename_;
    71   };
     71
     72        Ogre::PanelOverlayElement* panel_;              // the panel used to show the dot
     73    };
    7274}
    7375
  • code/trunk/src/orxonox/hud/RadarOverlayElement.cc

    r1535 r1564  
    3434#include <OgreStringConverter.h>
    3535
    36 #include "GraphicsEngine.h"
    3736#include "core/ConsoleCommand.h"
    3837#include "objects/Tickable.h"
    3938#include "objects/SpaceShip.h"
     39#include "util/Math.h"
     40
     41#include "GraphicsEngine.h"
    4042#include "RadarObject.h"
    4143#include "HUD.h"
     
    5355    void RadarOverlayElement::init(Real leftRel, Real topRel, Real dimRel, OverlayContainer* container){
    5456        // some initial data
    55         om = &OverlayManager::getSingleton();
    5657        dimRel_ = dimRel;
    5758        leftRel_ = leftRel;
    5859        topRel_ = topRel;
    59         container_ = container;
    6060
    6161        setMetricsMode(GMM_PIXELS);
     
    6363        resize();
    6464
    65         container_->addChild(this);
     65        container->addChild(this);
    6666    }
    6767
    6868    void RadarOverlayElement::resize() {
    6969        // if window is resized, we must adapt these...
    70         windowW_ = GraphicsEngine::getSingleton().getWindowWidth();
    71         windowH_ = GraphicsEngine::getSingleton().getWindowHeight();
    72         dim_ = (int) (dimRel_*windowH_);
    73         left_ = (int) (leftRel_*windowW_-dim_/2);
    74         top_ = (int) (topRel_*windowH_-dim_/2);
     70        dim_ = (int) (dimRel_*GraphicsEngine::getSingleton().getWindowHeight());
     71        left_ = (int) (leftRel_*GraphicsEngine::getSingleton().getWindowWidth()-dim_/2);
     72        top_ = (int) (topRel_*GraphicsEngine::getSingleton().getWindowHeight()-dim_/2);
    7573        setPosition(left_, top_);
    7674        setDimensions(dim_,dim_);
     
    7876
    7977    void RadarOverlayElement::update() {
    80         shipPos_ = SpaceShip::getLocalShip()->getPosition();
    81         currentDir_ = SpaceShip::getLocalShip()->getDir();
    82         currentOrth_ = SpaceShip::getLocalShip()->getOrth();
    8378        // iterate through all RadarObjects
    84         for(std::set<RadarObject*>::iterator it=HUD::getSingleton().roSet.begin(); it!=HUD::getSingleton().roSet.end(); it++){
    85         // calc position on radar...
    86             float radius = calcRadius(shipPos_, currentDir_, currentOrth_, (*it));
    87             float phi = calcPhi(shipPos_, currentDir_, currentOrth_, (*it));
    88             bool right = calcRight(shipPos_, currentDir_, currentOrth_, (*it));
     79        for(std::list<RadarObject*>::iterator it=HUD::getSingleton().getRadarObjects().begin(); it!=HUD::getSingleton().getRadarObjects().end(); it++)
     80        {
     81            // calc position on radar...
     82            // set size to fit distance...
     83            float distance = ((*it)->getPosition() - SpaceShip::getLocalShip()->getPosition()).length();
     84            if (distance > 20000) (*it)->getPanel()->setDimensions(1, 1);
     85            else if (distance > 10000) (*it)->getPanel()->setDimensions(2, 2);
     86            else if (distance > 5000) (*it)->getPanel()->setDimensions(3, 3);
     87            else if (distance > 2500) (*it)->getPanel()->setDimensions(4, 4);
     88            else if (distance > 1000) (*it)->getPanel()->setDimensions(5, 5);
     89            else (*it)->getPanel()->setDimensions(6,6);
    8990
    90             // set size to fit distance...
    91             float d = ((*it)->getPosition()-shipPos_).length();
    92             if(d<10000) (*it)->panel_->setDimensions(4,4);
    93             else if(d<20000) (*it)->panel_->setDimensions(3,3);
    94             else (*it)->panel_->setDimensions(2,2);
    95 
    96             if (right){
    97                 (*it)->panel_->setPosition(sin(phi)*radius/
    98                     3.5*dim_/2+dim_/2+left_-2,-cos(phi)*radius/3.5*dim_/2+dim_/2+top_-2);
    99             }
    100             else {
    101                 (*it)->panel_->setPosition(-sin(phi)*radius/
    102                     3.5*dim_/2+dim_/2+left_-2,-cos(phi)*radius/3.5*dim_/2+dim_/2+top_-2);
    103             }
     91            Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), (*it)->getPosition());
     92            coord = coord * Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture
     93            float dimfactor = dim_ / 2.0;
     94            (*it)->getPanel()->setPosition((1 + coord.x) * dimfactor + left_ - 2,
     95                                           (1 - coord.y) * dimfactor + top_ - 2);
    10496        }
    10597    }
    10698
    107     void RadarOverlayElement::listObjects(){
     99    void RadarOverlayElement::listObjects() const {
    108100        int i = 0;
    109101        COUT(3) << "List of RadarObjects:\n";
    110102        // iterate through all Radar Objects
    111         for(std::set<RadarObject*>::iterator it=HUD::getSingleton().roSet.begin(); it!=HUD::getSingleton().roSet.end(); it++){
     103        for(std::list<RadarObject*>::const_iterator it=HUD::getSingleton().getRadarObjects().begin(); it!=HUD::getSingleton().getRadarObjects().end(); ++it){
    112104            COUT(3) << i++ << ": " << (*it)->getPosition() << std::endl;
    113105        }
    114106    }
    115 
    116     float RadarOverlayElement::calcRadius(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){
    117         return(acos((dir.dotProduct(obj->getPosition() - pos))/
    118         ((obj->getPosition() - pos).length()*dir.length())));
    119     }
    120 
    121     float RadarOverlayElement::calcPhi(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){
    122         // project difference vector on our plane...
    123         Vector3 proj = Plane(dir, pos).projectVector(obj->getPosition() - pos);
    124         // ...and find out the angle
    125         return(acos((orth.dotProduct(proj))/
    126               (orth.length()*proj.length())));
    127     }
    128 
    129     bool RadarOverlayElement::calcRight(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj){
    130         if((dir.crossProduct(orth)).dotProduct(obj->getPosition() - pos) > 0)
    131             return true;
    132         else return false;
    133     }
    134107}
  • code/trunk/src/orxonox/hud/RadarOverlayElement.h

    r1505 r1564  
    4040    class _OrxonoxExport RadarOverlayElement : public Ogre::PanelOverlayElement
    4141    {
    42       private:
    43         Ogre::OverlayManager* om;               // our one and only overlay manager
    44         Ogre::OverlayContainer* container_;     // pointer to the container we're in
    45         Vector3 currentDir_;
    46         Vector3 currentOrth_;
    47         Vector3 shipPos_;                       // position of ship
    48 
    49         Ogre::Real leftRel_, topRel_, dimRel_;  // relative position/dimension
    50         int left_, top_, dim_;                  // absolute position/dimension
    51         int windowW_, windowH_;                   // absolute window dimensions
    52 
    5342      public:
    5443        RadarOverlayElement(const Ogre::String& name);
     
    5746        void resize();
    5847        void update();
    59         void listObjects();
     48        void listObjects() const;
    6049
    61         static float calcRadius(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj);
    62         static float calcPhi(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj);
    63         static bool calcRight(Vector3 pos, Vector3 dir, Vector3 orth, RadarObject* obj);
     50      private:
     51        Ogre::Real leftRel_, topRel_, dimRel_;  // relative position/dimension
     52        int left_, top_, dim_;                  // absolute position/dimension
    6453  };
    6554}
  • code/trunk/src/orxonox/objects/SpaceShip.cc

    r1563 r1564  
    152152
    153153            if (!this->myShip_)
    154                 HUD::getSingleton().removeRadarObject(this->getNode());
     154                HUD::getSingleton().removeRadarObject(this);
    155155        }
    156156    }
     
    161161          myShip_=true;
    162162        else
    163           HUD::getSingleton().addRadarObject(this->getNode(), this->getProjectileColour());
     163          HUD::getSingleton().addRadarObject(this, this->getProjectileColour());
    164164      }
    165165      if(Model::create())
     
    508508          this->mouseXRotation_ = Radian(0);
    509509          this->mouseYRotation_ = Radian(0);
    510           this->bLMousePressed_ = false;
    511510        }/*else
    512511          COUT(4) << "not steering ship: " << objectID << " our ship: " << network::Client::getSingleton()->getShipID() << std::endl;*/
     512
     513          this->bLMousePressed_ = false;
    513514    }
    514515
  • code/trunk/src/orxonox/objects/SpaceShipAI.cc

    r1563 r1564  
    226226            this->moveToTargetPosition(dt);
    227227
    228         if (this->bShooting_ && this->isCloseAtTarget(2500) && this->isLookingAtTarget(Ogre::Math::PI / 10))
     228        if (this->bShooting_ && this->isCloseAtTarget(2500) && this->isLookingAtTarget(Ogre::Math::PI / 20.0))
    229229            this->doFire();
    230230
     
    234234    void SpaceShipAI::moveToTargetPosition(float dt)
    235235    {
    236         Vector3 proj = Ogre::Plane(this->getDir(), this->getPosition()).projectVector(this->targetPosition_ - this->getPosition());
    237         float angle = acos((this->getOrth().dotProduct(proj)) / (this->getOrth().length()*proj.length()));
    238 
    239         if ((this->getDir().crossProduct(this->getOrth())).dotProduct(this->targetPosition_ - this->getPosition()) > 0)
    240             this->setMoveYaw(sgn(sin(angle)));
    241         else
    242             this->setMoveYaw(-sgn(sin(angle)));
    243         this->setMovePitch(sgn(cos(angle)));
     236        Vector2 coord = get2DViewdirection(this->getPosition(), this->getDir(), this->getOrth(), this->targetPosition_);
     237        this->setMoveYaw(0.8 * sgn(coord.x));
     238        this->setMovePitch(0.8 * sgn(coord.y));
    244239
    245240        if ((this->targetPosition_ - this->getPosition()).length() > 300)
    246             this->setMoveLongitudinal(1);
     241            this->setMoveLongitudinal(0.8);
    247242
    248243        if (this->isCloseAtTarget(300) && this->target_)
    249244        {
    250245            if (this->getVelocity().length() > this->target_->getVelocity().length())
    251                 this->setMoveLongitudinal(-1);
     246                this->setMoveLongitudinal(-0.5);
    252247        }
    253248    }
     
    319314    bool SpaceShipAI::isLookingAtTarget(float angle)
    320315    {
    321         Vector3 dist = this->targetPosition_ - this->getPosition();
    322         return (acos((this->getDir().dotProduct(dist)) / (dist.length() * this->getDir().length())) < angle);
     316        return (getAngle(this->getPosition(), this->getDir(), this->targetPosition_) < angle);
    323317    }
    324318
  • code/trunk/src/util/Math.cc

    r1505 r1564  
    2626 *
    2727 */
     28
     29#include <OgrePlane.h>
    2830
    2931#include "Math.h"
     
    6870    return in;
    6971}
     72
     73
     74float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition)
     75{
     76    orxonox::Vector3 distance = otherposition - myposition;
     77    return acos(mydirection.dotProduct(distance) / distance.length());
     78}
     79
     80orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition)
     81{
     82    orxonox::Vector3 distance = otherposition - myposition;
     83
     84    // project difference vector on our plane
     85    orxonox::Vector3 projection = Ogre::Plane(mydirection, myposition).projectVector(distance);
     86    float angle = acos(myorthonormal.dotProduct(projection) / projection.length());
     87
     88    if ((mydirection.crossProduct(myorthonormal)).dotProduct(distance) > 0)
     89        return orxonox::Vector2(sin(angle), cos(angle));
     90    else
     91        return orxonox::Vector2(-sin(angle), cos(angle));
     92}
     93
     94orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition)
     95{
     96    orxonox::Vector3 distance = otherposition - myposition;
     97
     98    // project difference vector on our plane
     99    orxonox::Vector3 projection = Ogre::Plane(mydirection, myposition).projectVector(distance);
     100    float angle = acos(myorthonormal.dotProduct(projection) / projection.length());
     101    float radius = acos(mydirection.dotProduct(distance) / distance.length()) / Ogre::Math::PI;
     102
     103    if ((mydirection.crossProduct(myorthonormal)).dotProduct(distance) > 0)
     104        return orxonox::Vector2(sin(angle) * radius, cos(angle) * radius);
     105    else
     106        return orxonox::Vector2(-sin(angle) * radius, cos(angle) * radius);
     107}
  • code/trunk/src/util/Math.h

    r1505 r1564  
    5858_UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Degree& degree);
    5959_UtilExport std::istream& operator>>(std::istream& in, orxonox::Degree& degree);
     60
     61_UtilExport float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition);
     62_UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
     63_UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
    6064
    6165template <typename T>
Note: See TracChangeset for help on using the changeset viewer.