Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 29, 2012, 4:22:11 PM (12 years ago)
Author:
mottetb
Message:

Oct 29th, works pretty well!

Location:
code/branches/spaceNavigation/src/modules/overlays/hud
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • code/branches/spaceNavigation/src/modules/overlays/hud/CMakeLists.txt

    r9400 r9421  
    11ADD_SOURCE_FILES(OVERLAYS_SRC_FILES
    2   HUDAimAssistant.cc
    32  HUDBar.cc
    43  HUDNavigation.cc
  • code/branches/spaceNavigation/src/modules/overlays/hud/HUDNavigation.cc

    r9400 r9421  
    5555namespace orxonox
    5656{
    57     static bool compareDistance(std::pair<RadarViewable*, unsigned int> a, std::pair<RadarViewable*, unsigned int> b)
     57    static bool compareDistance(std::pair<RadarViewable*, unsigned int> a,
     58            std::pair<RadarViewable*, unsigned int> b)
    5859    {
    5960        return a.second < b.second;
    6061    }
    61 
    6262    CreateFactory ( HUDNavigation );
    6363
    64     HUDNavigation::HUDNavigation(BaseObject* creator) : OrxonoxOverlay(creator)
    65     {
    66         RegisterObject(HUDNavigation);
    67         this->setConfigValues();
     64    HUDNavigation::HUDNavigation(BaseObject* creator) :
     65        OrxonoxOverlay(creator)
     66    {
     67        RegisterObject(HUDNavigation)
     68;        this->setConfigValues();
    6869
    6970        // Set default values
     
    7273        this->setNavMarkerSize(0.05f);
    7374        this->setDetectionLimit(10000.0f);
     75        this->currentMunitionSpeed_ = 2500.0f;
     76
     77        Pawn* ship = orxonox_cast<Pawn*>(this->getOwner());
     78        if(ship != NULL)
     79            this->ship_ = ship;
    7480    }
    7581
     
    7985        {
    8086            for (std::map<RadarViewable*, ObjectInfo>::iterator it = this->activeObjectList_.begin(); it != this->activeObjectList_.end();)
    81                 removeObject((it++)->first);
     87            removeObject((it++)->first);
    8288        }
    8389        this->sortedObjectList_.clear();
     
    94100        SUPER(HUDNavigation, XMLPort, xmlelement, mode);
    95101
    96         XMLPortParam(HUDNavigation, "font",           setFont,           getFont,          xmlelement, mode);
    97         XMLPortParam(HUDNavigation, "textSize",       setTextSize,       getTextSize,      xmlelement, mode);
    98         XMLPortParam(HUDNavigation, "navMarkerSize",  setNavMarkerSize,  getNavMarkerSize, xmlelement, mode);
     102        XMLPortParam(HUDNavigation, "font", setFont, getFont, xmlelement, mode);
     103        XMLPortParam(HUDNavigation, "textSize", setTextSize, getTextSize, xmlelement, mode);
     104        XMLPortParam(HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlelement, mode);
    99105        XMLPortParam(HUDNavigation, "detectionLimit", setDetectionLimit, getDetectionLimit, xmlelement, mode);
    100106    }
     
    112118        {
    113119            if (it->second.text_ != NULL)
    114                 it->second.text_->setFontName(this->fontName_);
     120            it->second.text_->setFontName(this->fontName_);
    115121        }
    116122    }
     
    132138        {
    133139            if (it->second.text_)
    134                 it->second.text_->setCharHeight(size);
     140            it->second.text_->setCharHeight(size);
    135141        }
    136142    }
     
    144150    {
    145151        if (dist < 600)
    146             dist = 600;
     152        dist = 600;
    147153        return this->getActualSize().x * 900 * this->navMarkerSize_ / dist;
    148154    }
     
    151157    {
    152158        if (dist < 600)
    153             dist = 600;
     159        dist = 600;
    154160        return this->getActualSize().y * 900 * this->navMarkerSize_ / dist;
    155161    }
     
    158164    {
    159165        SUPER(HUDNavigation, tick, dt);
    160 
    161         orxout() << "hello world" << std::endl;
    162166
    163167        Camera* cam = CameraManager::getInstance().getActiveCamera();
    164168        if (cam == NULL)
    165             return;
     169        return;
    166170        const Matrix4& camTransform = cam->getOgreCamera()->getProjectionMatrix() * cam->getOgreCamera()->getViewMatrix();
    167171
    168 
    169172        for (std::list<std::pair<RadarViewable*, unsigned int> >::iterator listIt = this->sortedObjectList_.begin(); listIt != this->sortedObjectList_.end(); ++listIt)
    170             listIt->second = (int)((listIt->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition()).length() + 0.5f);
     173        listIt->second = (int)((listIt->first->getRVWorldPosition() - HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition()).length() + 0.5f);
    171174
    172175        this->sortedObjectList_.sort(compareDistance);
     
    180183            closeEnough = listIt->second < this->detectionLimit_;
    181184            // display radarviewables on HUD if the marker limit and max-distance is not exceeded
    182             if (markerCount < this->markerLimit_ && (closeEnough ||  this->detectionLimit_ < 0))
     185            if (markerCount < this->markerLimit_ && (closeEnough || this->detectionLimit_ < 0))
    183186            {
    184187                // Get Distance to HumanController and save it in the TextAreaOverlayElement.
     
    213216                }
    214217                else
    215                     outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
     218                outOfView = pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0;
    216219
    217220                if (outOfView)
     
    224227                        it->second.panel_->setMaterialName(TextureGenerator::getMaterialName("arrows.png", it->first->getRadarObjectColour()));
    225228                        it->second.wasOutOfView_ = true;
     229                        it->second.target_->hide();
    226230                    }
    227231
     
    294298                    it->second.panel_->setTop((-pos.y + 1.0f - it->second.panel_->getHeight()) * 0.5f);
    295299
     300                    // TODO : Target marker
     301                    Vector3* targetPos = this->toAimPosition(it->first);
     302                    Vector3 screenPos = camTransform * *targetPos;
     303                    // Check if the target marker is in view too
     304                    if(screenPos.z > 1 || screenPos.x < -1.0 || screenPos.x > 1.0
     305                            || screenPos.y < -1.0 || screenPos.y > 1.0)
     306                    {
     307                        it->second.target_->hide();
     308                    }
     309                    else
     310                    {
     311                        it->second.target_->show();
     312                        it->second.target_->setLeft((screenPos.x + 1.0f - it->second.target_->getWidth()) * 0.5f);
     313                        it->second.target_->setTop((-screenPos.y + 1.0f - it->second.target_->getHeight()) * 0.5f);
     314                    }
     315
     316                    orxout() << targetPos->x << endl;
     317                    delete targetPos;
     318
    296319                    // Position text
    297320                    it->second.text_->setLeft((pos.x + 1.0f + it->second.panel_->getWidth()) * 0.5f);
     
    304327            }
    305328            else // do not display on HUD
     329
    306330            {
    307331                it->second.panel_->hide();
    308332                it->second.text_->hide();
     333                it->second.target_->hide(); // TODO :
    309334            }
    310335        }
     
    312337
    313338    /** Overridden method of OrxonoxOverlay.
    314     @details
    315         Usually the entire overlay scales with scale().
    316         Here we obviously have to adjust this.
    317     */
     339     @details
     340     Usually the entire overlay scales with scale().
     341     Here we obviously have to adjust this.
     342     */
    318343    void HUDNavigation::sizeChanged()
    319344    {
     
    328353            if (it->second.text_ != NULL)
    329354                it->second.text_->setCharHeight(it->second.text_->getCharHeight() * yScale);
     355            if (it->second.target_ != NULL)
     356                it->second.target_->setDimensions(this->navMarkerSize_ * xScale, this->navMarkerSize_ * yScale);
     357            // TODO : targetMarkerSize_ ???
    330358        }
    331359    }
     
    334362    {
    335363        if (showObject(object) == false)
    336             return;
     364        return;
    337365
    338366        if (this->activeObjectList_.size() >= this->markerLimit_)
    339             if (object == NULL)
    340                 return;
     367        if (object == NULL)
     368        return;
    341369
    342370        // Object hasn't been added yet (we know that)
     
    351379        // Create arrow/marker
    352380        Ogre::PanelOverlayElement* panel = static_cast<Ogre::PanelOverlayElement*>( Ogre::OverlayManager::getSingleton()
    353                                            .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
     381                .createOverlayElement("Panel", "HUDNavigation_navMarker_" + getUniqueNumberString()));
    354382        //panel->setMaterialName("Orxonox/NavTDC");
    355383        panel->setMaterialName(TextureGenerator::getMaterialName("tdc.png", object->getRadarObjectColour()));
     
    357385        //panel->setColour(object->getRadarObjectColour());
    358386
     387        // Create target marker
     388        Ogre::PanelOverlayElement* target = static_cast<Ogre::PanelOverlayElement*>(Ogre::OverlayManager::getSingleton()
     389                .createOverlayElement("Panel", "HUDNavigation_targetMarker_" + getUniqueNumberString()));
     390        target->setMaterialName(TextureGenerator::getMaterialName("target.png" /* TODO : create the target picture */, object->getRadarObjectColour()));
     391        target->setDimensions(this->navMarkerSize_ * xScale, this->navMarkerSize_ * yScale);
     392
     393        // Create text
    359394        Ogre::TextAreaOverlayElement* text = static_cast<Ogre::TextAreaOverlayElement*>( Ogre::OverlayManager::getSingleton()
    360                                              .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
     395                .createOverlayElement("TextArea", "HUDNavigation_navText_" + getUniqueNumberString()));
    361396        text->setFontName(this->fontName_);
    362397        text->setCharHeight(text->getCharHeight() * yScale);
     
    364399
    365400        panel->hide();
     401        target->hide();
    366402        text->hide();
    367403
    368         ObjectInfo tempStruct = {panel, text, false /*, TODO: initialize wasOutOfView_ */};
     404        ObjectInfo tempStruct =
     405        {   panel, target, text, false /*, TODO: initialize wasOutOfView_ */};
    369406        this->activeObjectList_[object] = tempStruct;
    370407
    371408        this->background_->addChild(panel);
     409        this->background_->addChild(target);
    372410        this->background_->addChild(text);
    373411
     
    383421            // Detach overlays
    384422            this->background_->removeChild(it->second.panel_->getName());
     423            this->background_->removeChild(it->second.target_->getName());
    385424            this->background_->removeChild(it->second.text_->getName());
    386425            // Properly destroy the overlay elements (do not use delete!)
    387426            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.panel_);
     427            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.target_);
    388428            Ogre::OverlayManager::getSingleton().destroyOverlayElement(it->second.text_);
    389429            // Remove from the list
     
    411451    {
    412452        if (rv == orxonox_cast<RadarViewable*>(this->getOwner()))
    413             return false;
     453        return false;
    414454        assert(rv->getWorldEntity());
    415455        if (rv->getWorldEntity()->isVisible() == false || rv->getRadarVisibility() == false)
    416             return false;
     456        return false;
    417457        return true;
    418458    }
     
    424464        {
    425465            if (!(*it)->isHumanShip_)
    426                 this->addObject(*it);
    427         }
     466            this->addObject(*it);
     467        }
     468    }
     469
     470    Vector3* HUDNavigation::toAimPosition(RadarViewable* target) const
     471    {
     472        Vector3 wePosition = HumanController::getLocalControllerSingleton()->getControllableEntity()->getWorldPosition();
     473        Vector3 targetPosition = target->getRVWorldPosition();
     474        Vector3 targetSpeed = target->getRVOrientedVelocity();
     475
     476        // munSpeed*time = lengthBetween(wePosition, targetPosition + targetSpeed*time)
     477        // from this we extract:
     478        float a = pow(targetSpeed.length(),2) - pow(this->currentMunitionSpeed_,2);
     479        float b = 2*((targetPosition.x - wePosition.x)*targetSpeed.x
     480                    +(targetPosition.y - wePosition.y)*targetSpeed.y
     481                    +(targetPosition.z - wePosition.z)*targetSpeed.z);
     482        float c = pow((targetPosition-wePosition).length(),2);
     483
     484        // calculate smallest time solution, in case it exists
     485        if(pow(b,2) - 4*a*c < 0)
     486            return NULL;
     487        float time = (-b - sqrt(pow(b,2) - 4*a*c))/(2*a);
     488        if(time < 0)
     489            time = (-b + sqrt(pow(b,2) - 4*a*c))/(2*a);
     490        if(time < 0)
     491            return NULL;
     492        Vector3* result = new Vector3(targetPosition + targetSpeed * time);
     493        return result;
    428494    }
    429495}
  • code/branches/spaceNavigation/src/modules/overlays/hud/HUDNavigation.h

    r9348 r9421  
    7575            {
    7676                Ogre::PanelOverlayElement* panel_;
     77                Ogre::PanelOverlayElement* target_;
    7778                Ogre::TextAreaOverlayElement* text_;
    7879                bool outOfView_;
     
    104105            float getArrowSizeY(int dist) const;
    105106
     107            Vector3* toAimPosition(RadarViewable* target) const;
     108
    106109            std::map<RadarViewable*, ObjectInfo> activeObjectList_;
    107110            std::list<std::pair<RadarViewable*, unsigned int> > sortedObjectList_;
     
    112115            bool showDistance_;
    113116
     117            static const float LIGHTNING_GUN_SPEED_ = 700.0f;
     118            static const float HSW01_SPEED_ = 2500.0f;
     119
     120            float currentMunitionSpeed_;
     121
     122            Pawn* ship_;
     123
    114124            unsigned int markerLimit_;
    115125            float detectionLimit_; //!< Objects that are more far away than detectionLimit_ are not displayed on the HUD. 10000.0f is the default value.
Note: See TracChangeset for help on using the changeset viewer.