Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 12, 2008, 12:57:45 AM (16 years ago)
Author:
rgrieder
Message:

svn save, just in case our house burns down over night…

File:
1 edited

Legend:

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

    r1580 r1590  
    2323 *      Felix Schulthess
    2424 *   Co-authors:
    25  *      ...
     25 *      Reto Grieder
    2626 *
    2727 */
     
    3333#include <OgreStringConverter.h>
    3434
    35 #include "GraphicsEngine.h"
     35//#include "GraphicsEngine.h"
    3636// TODO: remove the SpaceShip and CameraHandler dependencies
    3737#include "objects/SpaceShip.h"
    3838#include "objects/Projectile.h"
    3939#include "objects/CameraHandler.h"
     40#include "HUD.h"
    4041#include "RadarObject.h"
    4142#include "RadarOverlayElement.h"
    42 #include "HUD.h"
    4343#include "core/Debug.h"
    44 #include "util/Math.h"
     44#include "core/CoreIncludes.h"
    4545
    4646namespace orxonox
    4747{
     48    CreateFactory(Navigation);
     49
    4850    using namespace Ogre;
    4951
    50     Navigation::Navigation(OverlayContainer* container)
    51     {
    52         container_ = container;
    53         focus_ = NULL;
    54         init();
     52    Navigation::Navigation()
     53      : container_(0)
     54      , navMarker_(0)
     55      , aimMarker_(0)
     56      , focus_(0)
     57    {
     58        RegisterObject(Navigation);
    5559    }
    5660
    5761    Navigation::~Navigation()
    5862    {
    59         OverlayManager::getSingleton().destroyOverlayElement(this->navText_);
    60         OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_);
    61         OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_);
    62     }
    63 
    64     void Navigation::init()
    65     {
    66         // create nav text
    67         navText_ = static_cast<TextAreaOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("TextArea", "navText"));
    68         navText_->show();
    69         navText_->setMetricsMode(Ogre::GMM_PIXELS);
    70         navText_->setDimensions(0.001, 0.001);
    71         navText_->setPosition(0.02, 0.02);
    72         navText_->setFontName("Console");
    73         navText_->setCharHeight(20);
    74         navText_->setCaption("");
    75         navText_->hide();
    76         container_->addChild(navText_);
    77 
    78 
    79         // create nav marker ...
    80         navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "NavMarker"));
    81         aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", "aimMarker"));
    82         navMarker_->setMetricsMode(GMM_PIXELS);
    83         aimMarker_->setMetricsMode(GMM_PIXELS);
    84         navMarker_->hide();
    85         aimMarker_->hide();
    86         aimMarker_->setMaterialName("Orxonox/NavCrosshair");
    87         aimMarker_->setDimensions(20, 20);
    88         aimMarker_->setUV(0.0, 0.0, 1.0, 1.0);
    89         container_->addChild(navMarker_);
    90         container_->addChild(aimMarker_);
    91     }
    92 
    93     void Navigation::update()
     63        if (this->isInitialized())
     64        {
     65            if (this->container_)
     66                OverlayManager::getSingleton().destroyOverlayElement(this->container_);
     67            if (this->navMarker_)
     68                OverlayManager::getSingleton().destroyOverlayElement(this->navMarker_);
     69            if (this->navText_)
     70                OverlayManager::getSingleton().destroyOverlayElement(this->navText_);
     71            if (this->aimMarker_)
     72                OverlayManager::getSingleton().destroyOverlayElement(this->aimMarker_);
     73        }
     74    }
     75
     76    void Navigation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     77    {
     78        HUDOverlay::XMLPort(xmlElement, mode);
     79
     80        if (mode == XMLPort::LoadObject)
     81        {
     82            // create container
     83            this->container_ = static_cast<OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navContainer"));
     84            this->container_->setMetricsMode(Ogre::GMM_RELATIVE);
     85            this->container_->setLeft(0.0);
     86            this->container_->setTop(0.0);
     87            this->container_->setWidth(1.0);
     88            this->container_->setHeight(1.0);
     89
     90            // create nav text
     91            this->navText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", getName() + "_navText"));
     92            this->navText_->setMetricsMode(Ogre::GMM_RELATIVE);
     93            this->navText_->setPosition(0.0f, 0.0f);
     94            this->navText_->setCharHeight(0.05f);
     95            this->navText_->setFontName("Monofur");
     96
     97            // create nav marker
     98            navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navMarker"));
     99            navMarker_->setMetricsMode(GMM_RELATIVE);
     100            navMarker_->setDimensions(0.05f, 0.05f);
     101            navMarker_->setMaterialName("Orxonox/NavArrows");
     102            this->wasOutOfView_ = true; // just a to ensure the material is changed right the first time..
     103
     104            // create aim marker
     105            aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_aimMarker"));
     106            aimMarker_->setMetricsMode(GMM_RELATIVE);
     107            aimMarker_->setDimensions(0.05f, 0.05f);
     108            aimMarker_->setMaterialName("Orxonox/NavCrosshair");
     109           
     110            container_->addChild(navMarker_);
     111            container_->addChild(aimMarker_);
     112            container_->addChild(navText_);
     113            container_->show();
     114
     115            this->overlay_->add2D(container_);
     116            this->overlay_->hide();
     117        }
     118
     119        XMLPortParam(Navigation, "font", setFont, getFont, xmlElement, mode);
     120        XMLPortParam(Navigation, "textsize", setTextSize, getTextSize, xmlElement, mode);
     121        XMLPortParam(Navigation, "navmarkersize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
     122        XMLPortParam(Navigation, "aimmarkersize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode);
     123    }
     124
     125    void Navigation::setNavMarkerSize(Vector2 size)
     126    {
     127        if (this->navMarker_ && size.squaredLength() >= 0.0f)
     128            this->navMarker_->setDimensions(size.x, size.y);
     129    }
     130
     131    Vector2 Navigation::getNavMarkerSize() const
     132    {
     133        if (this->navMarker_)
     134            return Vector2(navMarker_->getWidth(), navMarker_->getHeight());
     135        else
     136            return Vector2::ZERO;
     137    }
     138
     139    void Navigation::setAimMarkerSize(Vector2 size)
     140    {
     141        if (this->aimMarker_ && size.squaredLength() >= 0.0f)
     142            this->aimMarker_->setDimensions(size.x, size.y);
     143    }
     144
     145    Vector2 Navigation::getAimMarkerSize() const
     146    {
     147        if (this->aimMarker_)
     148            return Vector2(aimMarker_->getWidth(), aimMarker_->getHeight());
     149        else
     150            return Vector2::ZERO;
     151    }
     152
     153    void Navigation::setFont(const std::string& font)
     154    {
     155        if (this->navText_ && font != "")
     156            this->navText_->setFontName(font);
     157    }
     158
     159    std::string Navigation::getFont() const
     160    {
     161        if (this->navText_)
     162            return this->navText_->getFontName();
     163        else
     164            return "";
     165    }
     166
     167    void Navigation::setTextSize(float size)
     168    {
     169        if (this->navText_ && size >= 0.0f)
     170            this->navText_->setCharHeight(size);
     171    }
     172
     173    float Navigation::getTextSize() const
     174    {
     175        if (this->navText_)
     176            return this->navText_->getCharHeight();
     177        else
     178            return 0.0f;
     179    }
     180
     181    void Navigation::tick(float dt)
    94182    {
    95183        if (!focus_)
     
    101189    void Navigation::updateMarker()
    102190    {
    103         int windowW = GraphicsEngine::getSingleton().getWindowWidth();
    104         int windowH = GraphicsEngine::getSingleton().getWindowHeight();
    105 
    106191        // set text
    107         int dist = (int) getDist2Focus()/100;
    108         navText_->setCaption(Ogre::StringConverter::toString(dist));
     192        int dist = (int) getDist2Focus()/100.0f;
     193        navText_->setCaption(convertToString(dist));
     194        float textLength = convertToString(dist).size() * navText_->getCharHeight() * 0.3;
    109195
    110196        Ogre::Camera* navCam = SpaceShip::getLocalShip()->getCamera()->cam_;
     197        Matrix4 transformationMatrix = navCam->getProjectionMatrix() * navCam->getViewMatrix();
    111198        // transform to screen coordinates
    112         Vector3 pos = navCam->getProjectionMatrix() * navCam->getViewMatrix() * focus_->getPosition();
    113         Vector3 aimpos = navCam->getProjectionMatrix() * navCam->getViewMatrix() * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(), Projectile::getSpeed(), focus_->getPosition(), focus_->getOrientedVelocity());
    114 
    115         float xPosRel = 0.5*pos.x+0.5;
    116         float yPosRel = 1-(0.5*pos.y+0.5);
    117         float xAimPosRel = 0.5*aimpos.x+0.5;
    118         float yAimPosRel = 1-(0.5*aimpos.y+0.5);
    119         int xPos = (int) (xPosRel*windowW);
    120         int yPos = (int) (yPosRel*windowH);
    121         int xAimPos = (int) (xAimPosRel*windowW);
    122         int yAimPos = (int) (yAimPosRel*windowH);
    123         int xFromCenter = xPos-windowW/2;
    124         int yFromCenter = yPos-windowH/2;
    125 
    126         // is object in view?
    127         Vector3 navCamPos = SpaceShip::getLocalShip()->getPosition();
    128         Vector3 currentDir = SpaceShip::getLocalShip()->getDir();
    129         Vector3 currentOrth = SpaceShip::getLocalShip()->getOrth();
    130         float radius = getAngle(navCamPos, currentDir, focus_->getPosition());
    131         bool isRight = (currentDir.crossProduct(currentOrth)).dotProduct(focus_->getPosition() - navCamPos)>0;
    132         bool isAbove = currentOrth.dotProduct(focus_->getPosition() - navCamPos)>0;
    133         bool outOfView = (xPosRel<0 || xPosRel>1 || yPosRel<0 || yPosRel>1);
    134 
    135         // if object is behind us, it is out of view anyway:
    136         if (!outOfView && radius > Ogre::Math::PI / 2)
     199        Vector3 pos = transformationMatrix * focus_->getPosition();
     200
     201        bool outOfView;
     202        if (pos.z > 1.0)
     203        {
     204            // z > 1.0 means that the object is behind the camera
    137205            outOfView = true;
     206            // we have to switch all coordinates (if you don't know why,
     207            // try linear algebra lectures, because I can't explain..)
     208            pos.x = -pos.x;
     209            pos.y = -pos.y;
     210            pos.z = -pos.z;
     211        }
     212        else
     213            outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
    138214
    139215        if (outOfView)
    140216        {
    141217            // object is not in view
    142             navMarker_->setMaterialName("Orxonox/NavArrows");
    143             navMarker_->setDimensions(16,16);
    144218            aimMarker_->hide();
    145             float phiUpperCorner = atan((float)(windowW)/(float)(windowH));
    146             // from the angle we find out on which edge to draw the marker
    147             // and which of the four arrows to take
    148             float phiNav = atan((float) xFromCenter / (float) yFromCenter);
    149 
    150             if (isAbove && isRight)
    151             {
    152                 // top right quadrant
    153                 if (-phiNav < phiUpperCorner)
    154                 {
    155                     //COUT(3) << "arrow up\n";
    156                     navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
     219
     220            if (!wasOutOfView_)
     221            {
     222                navMarker_->setMaterialName("Orxonox/NavArrows");
     223                wasOutOfView_ = true;
     224            }
     225
     226            if (pos.x < pos.y)
     227            {
     228                if (pos.y > -pos.x)
     229                {
     230                    // up
     231                    float position = pos.x / pos.y + 1.0;
     232                    navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 0.0);
    157233                    navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
    158                     navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
     234                    navText_->setLeft((position - textLength) * 0.5);
    159235                    navText_->setTop(navMarker_->getHeight());
    160236                }
    161237                else
    162238                {
    163                     //COUT(3) << "arrow right\n";
    164                     navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
     239                    // left
     240                    float position = pos.y / pos.x + 1.0;
     241                    navMarker_->setPosition(0.0, (position - navMarker_->getWidth()) * 0.5);
     242                    navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
     243                    navText_->setLeft(navMarker_->getWidth() + 0.01);
     244                    navText_->setTop((position - navText_->getCharHeight()) * 0.5);
     245                }
     246            }
     247            else
     248            {
     249                if (pos.y < -pos.x)
     250                {
     251                    // down
     252                    float position = -pos.x / pos.y + 1.0;
     253                    navMarker_->setPosition((position - navMarker_->getWidth()) * 0.5, 1.0 - navMarker_->getHeight());
     254                    navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
     255                    navText_->setLeft((position - textLength) * 0.5);
     256                    navText_->setTop(1.0 - navMarker_->getHeight() - navText_->getCharHeight());
     257                }
     258                else
     259                {
     260                    // right
     261                    float position = -pos.y / pos.x + 1.0;
     262                    navMarker_->setPosition(1.0 - navMarker_->getWidth(), (position - navMarker_->getHeight()) * 0.5);
    165263                    navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
    166                     navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth());
    167                     navText_->setTop(navMarker_->getTop()+navMarker_->getHeight());
    168                 }
    169             }
    170             if (!isAbove && isRight)
    171             {
    172                 // bottom right quadrant
    173                 if (phiNav < phiUpperCorner)
    174                 {
    175                     //COUT(3) << "arrow down\n";
    176                     navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
    177                     navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
    178                     navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
    179                     navText_->setTop(navMarker_->getTop()-navMarker_->getHeight());
    180                 }
    181                 else
    182                 {
    183                     //COUT(3) << "arrow right\n";
    184                     navMarker_->setPosition(windowW-16, tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    185                     navMarker_->setUV(0.5, 0.5, 1.0, 1.0);
    186                     navText_->setLeft(navMarker_->getLeft()-navMarker_->getWidth());
    187                     navText_->setTop(navMarker_->getTop()+navMarker_->getHeight());
    188                 }
    189             }
    190             if (isAbove && !isRight)
    191             {
    192                 // top left quadrant
    193                 if (phiNav<phiUpperCorner)
    194                 {
    195                     //COUT(3) << "arrow up\n";
    196                     navMarker_->setPosition(-tan(phiNav)*windowH/2+windowW/2, 0);
    197                     navMarker_->setUV(0.5, 0.0, 1.0, 0.5);
    198                     navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
    199                     navText_->setTop(navMarker_->getHeight());
    200                 }
    201                 else
    202                 {
    203                     //COUT(3) << "arrow left\n";
    204                     navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    205                     navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
    206                     navText_->setLeft(navMarker_->getWidth());
    207                     navText_->setTop(navMarker_->getTop()+navMarker_->getHeight());
    208                 }
    209             }
    210             if (!isAbove && !isRight)
    211             {
    212                 // bottom left quadrant
    213                 if (phiNav>-phiUpperCorner)
    214                 {
    215                     //COUT(3) << "arrow down\n";
    216                     navMarker_->setPosition(tan(phiNav)*windowH/2+windowW/2, windowH-16);
    217                     navMarker_->setUV(0.0, 0.5, 0.5, 1.0);
    218                     navText_->setLeft(navMarker_->getLeft()+navMarker_->getWidth());
    219                     navText_->setTop(navMarker_->getTop()-navMarker_->getHeight());
    220                 }
    221                 else
    222                 {
    223                     //COUT(3) << "arrow left\n";
    224                     navMarker_->setPosition(0, -tan((3.14-2*phiNav)/2)*windowW/2+windowH/2);
    225                     navMarker_->setUV(0.0, 0.0, 0.5, 0.5);
    226                     navText_->setLeft(navMarker_->getWidth());
    227                     navText_->setTop(navMarker_->getTop()+navMarker_->getHeight());
     264                    navText_->setLeft(1.0 - navMarker_->getWidth() - textLength - 0.01);
     265                    navText_->setTop((position - navText_->getCharHeight()) * 0.5);
    228266                }
    229267            }
     
    232270        {
    233271            // object is in view
    234             navMarker_->setMaterialName("Orxonox/NavTDC");
    235             navMarker_->setDimensions(35, 35);
     272
     273            Vector3 aimpos = transformationMatrix * getPredictedPosition(SpaceShip::getLocalShip()->getPosition(),
     274                    Projectile::getSpeed(), focus_->getPosition(), focus_->getOrientedVelocity());
     275
     276            if (wasOutOfView_)
     277            {
     278                navMarker_->setMaterialName("Orxonox/NavTDC");
     279                wasOutOfView_ = false;
     280            }
     281
     282            // object is in view
    236283            navMarker_->setUV(0.0, 0.0, 1.0, 1.0);
    237             navMarker_->setPosition(xPos-navMarker_->getWidth()/2, yPos-navMarker_->getHeight()/2);
     284            navMarker_->setLeft((pos.x + 1.0 - navMarker_->getWidth()) * 0.5);
     285            navMarker_->setTop((-pos.y + 1.0 - navMarker_->getHeight()) * 0.5);
    238286
    239287            aimMarker_->show();
    240             aimMarker_->setPosition(xAimPos-aimMarker_->getWidth()/2, yAimPos-aimMarker_->getHeight()/2);
    241 
    242             navText_->setPosition(xPos+navMarker_->getWidth()/2, yPos+navMarker_->getHeight()/2);
     288            aimMarker_->setLeft((aimpos.x + 1.0 - aimMarker_->getWidth()) * 0.5);
     289            aimMarker_->setTop((-aimpos.y + 1.0 - aimMarker_->getHeight()) * 0.5);
     290
     291            navText_->setLeft((pos.x + 1.0 + navMarker_->getWidth()) * 0.5);
     292            navText_->setTop((-pos.y + 1.0 + navMarker_->getHeight()) * 0.5);
    243293        }
    244294    }
     
    293343        if (focus_)
    294344        {
    295             navMarker_->show();
    296             navText_->show();
     345            overlay_->show();
    297346            focus_->setColour(ColourValue::White);
    298347        }
    299348        else
    300349        {
    301             navMarker_->hide();
    302             aimMarker_->hide();
    303             navText_->hide();
     350            overlay_->hide();
    304351        }
    305352    }
     
    318365            return 0;
    319366    }
     367
     368    void Navigation::windowResized(int newWidth, int newHeight)
     369    {
     370        HUDOverlay::windowResized(newWidth, newHeight);
     371
     372        //if (this->navMarker_)
     373        //    navMarker_->setDimensions(0.05, 0.05);
     374
     375    }
    320376}
Note: See TracChangeset for help on using the changeset viewer.