Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 17, 2008, 11:38:23 PM (17 years ago)
Author:
rgrieder
Message:

svn save, just in case…
(doesn't compile at all!)

File:
1 edited

Legend:

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

    r1604 r1609  
    3232#include <assert.h>
    3333#include <OgreOverlayManager.h>
     34#include <OgreMaterialManager.h>
    3435
    3536#include "core/ConsoleCommand.h"
    36 #include "util/Math.h"
    3737#include "objects/SpaceShip.h"
    3838#include "objects/WorldEntity.h"
    39 #include "RadarObject.h"
     39#include "RadarViewable.h"
    4040
    4141namespace orxonox
    4242{
    4343    CreateFactory(HUDRadar);
     44    CreateFactory(RadarColour);
     45    CreateFactory(RadarShape);
    4446
    4547    HUDRadar* HUDRadar::instance_s = 0;
     
    6264            if (this->background_)
    6365                OverlayManager::getSingleton().destroyOverlayElement(this->background_);
     66            while (this->radarDots_.size() > 0)
     67            {
     68                OverlayManager::getSingleton().destroyOverlayElement(this->radarDots_[this->radarDots_.size() - 1]);
     69                this->radarDots_.pop_back();
     70            }
    6471        }
    6572
     
    7077    {
    7178        OrxonoxOverlay::XMLPort(xmlElement, mode);
     79
     80        XMLPortObject(HUDRadar, RadarColour, "shapes", addShape, getShape, xmlElement, mode, false, true);
    7281
    7382        if (mode == XMLPort::LoadObject)
     
    7786            overlay_->add2D(background_);
    7887
    79             WorldEntity* object;
     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;
    80102            object = new WorldEntity();
    81103            object->setPosition(2000.0, 0.0, 0.0);
     
    89111            object = new WorldEntity();
    90112            object->setPosition(10000.0,16000.0,0.0);
    91             addRadarObject(object);
    92         }
    93 
     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)
     136    {
     137        this->shapes_[shape->getIndex()] = shape;
     138    }
     139
     140    RadarShape* HUDRadar::getShape(unsigned int index) const
     141    {
     142        if (index < this->shapes_.size())
     143        {
     144            std::map<unsigned int, RadarShape*>::const_iterator it = shapes_.begin();
     145            for (unsigned int i = 0; i != index; ++it, ++i)
     146                ;
     147            return (*it).second;
     148        }
     149        else
     150            return 0;
    94151    }
    95152
     
    97154    {
    98155        // iterate through all RadarObjects
    99         for(std::list<RadarObject*>::iterator it = getRadarObjects().begin(); it!= getRadarObjects().end(); it++)
    100         {
    101             // calc position on radar...
    102             // set size to fit distance...
    103             float size = 1.0/(((*it)->getPosition() - SpaceShip::getLocalShip()->getPosition()).length());
    104             size = clamp(size * 100.0f, 0.02f, 0.12f);
    105             (*it)->getPanel()->setDimensions(size, size);
    106 
    107             Vector2 coord = get2DViewcoordinates(SpaceShip::getLocalShip()->getPosition(), SpaceShip::getLocalShip()->getDir(), SpaceShip::getLocalShip()->getOrth(), (*it)->getPosition());
    108             coord *= Ogre::Math::PI / 3.5; // small adjustment to make it fit the texture
    109             (*it)->getPanel()->setPosition((1.0 + coord.x) * 0.5, (1.0 - coord.y) * 0.5);
     156        unsigned int i = 0;
     157        for (Iterator<RadarViewable> it = ObjectList<RadarViewable>::start(); it; ++it, ++i)
     158        {
     159            if ((*it)->isVisibleOnRadar())
     160            {
     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)]);
     185            }
    110186        }
    111187    }
     
    113189    void HUDRadar::listObjects()
    114190    {
    115         int i = 0;
    116191        COUT(3) << "List of RadarObjects:\n";
    117192        // iterate through all Radar Objects
    118         for(std::list<RadarObject*>::const_iterator it = getRadarObjects().begin(); it != getRadarObjects().end(); ++it)
    119         {
    120             COUT(3) << i++ << ": " << (*it)->getPosition() << std::endl;
    121         }
    122     }
    123 
    124     void HUDRadar::addRadarObject(WorldEntity* object, const ColourValue& colour)
    125     {
    126         RadarObject* obj = new RadarObject(overlay_, object, colour);
    127         roSet_.insert(roSet_.end(), obj);
    128     }
    129 
    130     void HUDRadar::removeRadarObject(WorldEntity* object)
    131     {
    132         for(std::list<RadarObject*>::iterator it=roSet_.begin(); it!=roSet_.end(); ++it)
    133         {
    134             if ((*it)->getObject() == object)
    135             {
    136                 /*if (this->nav_ && this->nav_->getFocus() == (*it))
    137                     this->nav_->releaseFocus();*/
    138 
    139                 delete (*it);
    140                 roSet_.erase(it);
    141                 return;
    142             }
     193        unsigned int i = 0;
     194        for (Iterator<RadarViewable> it = ObjectList<RadarViewable>::start(); it; ++it, ++i)
     195        {
     196            COUT(3) << i++ << ": " << (*it)->getWorldEntity()->getWorldPosition() << std::endl;
    143197        }
    144198    }
Note: See TracChangeset for help on using the changeset viewer.