Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 30, 2010, 3:46:08 PM (14 years ago)
Author:
scheusso
Message:

some enhancements to lod (can be disabled now in the lodinformation template)

Location:
code/branches/presentation3
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • code/branches/presentation3

  • code/branches/presentation3/src/orxonox/graphics/MeshLodInformation.cc

    r6926 r7020  
    4141
    4242    MeshLodInformation::MeshLodInformation(BaseObject* creator)
    43         : BaseObject(creator), lodLevel_(-1)
     43        : BaseObject(creator), lodLevel_(-1), bEnabled_(true)
    4444    {
    4545        RegisterObject(MeshLodInformation);
     
    5555        XMLPortParam(MeshLodInformation, "mesh", setMeshSource, getMeshSource, xmlelement, mode);
    5656        XMLPortParam(MeshLodInformation, "lodQuality", setLodLevel, getLodLevel, xmlelement, mode);
     57        XMLPortParam(MeshLodInformation, "enabled", setEnabled, getEnabled, xmlelement, mode);
    5758    }
    5859   
  • code/branches/presentation3/src/orxonox/graphics/MeshLodInformation.h

    r6926 r7020  
    4040    class _OrxonoxExport MeshLodInformation : public BaseObject
    4141    {
    42                 private:
    43                         void setLodLevel(float lodLevel);
    44                         void setMeshSource(std::string meshSource);
    45                         std::string getMeshSource();
    46                         std::string meshSource_;
    47                         float lodLevel_;
    48                
    4942        public:
    5043            MeshLodInformation(BaseObject* creator);
    5144            virtual ~MeshLodInformation();
    5245           
    53                         float getLodLevel();
     46            float getLodLevel();
    5447            std::string getMeshName();
     48            bool getEnabled(){ return this->bEnabled_; }
     49           
     50            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
    5551
    56             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
     52        private:
     53            void setLodLevel(float lodLevel);
     54            void setMeshSource(std::string meshSource);
     55            void setEnabled( bool enabled ){ this->bEnabled_ = true; }
     56            std::string getMeshSource();
     57            std::string meshSource_;
     58            float lodLevel_;
     59            bool bEnabled_;
     60
    5761    };
    5862}
  • code/branches/presentation3/src/orxonox/graphics/Model.cc

    r7016 r7020  
    105105                    &&this->meshSrc_!="laserbeam.mesh")
    106106                {
    107                     float volume = this->mesh_.getEntity()->getBoundingBox().volume();
    108                     float scaleFactor = 1;
    109                    
    110                     BaseObject* creatorPtr = this;
    111                    
    112                     while(creatorPtr!=NULL&&orxonox_cast<WorldEntity*>(creatorPtr))
     107                    Level* level = this->getLevel();
     108                 
     109                    assert( level != 0 );
     110                    if( level->getLodInfo(this->meshSrc_)!=0 && level->getLodInfo(this->meshSrc_)->getEnabled() )
    113111                    {
    114                         scaleFactor *= getBiggestScale(((WorldEntity*) creatorPtr)->getScale3D());
    115                         creatorPtr = creatorPtr->getCreator();
    116                     }
    117 //                     COUT(0) << "name: " << this->meshSrc_ << "scaleFactor: " << scaleFactor << ", volume: " << volume << endl;
    118                    
    119                     Level* level = this->getLevel();
    120                    
    121                     assert( level != 0 );
    122                     if( level->getLodInfo(this->meshSrc_)!=0 )
    123112                        setLodLevel(level->getLodInfo(this->meshSrc_)->getLodLevel());
    124                    
    125                     COUT(4) << "Setting lodLevel for " << this->meshSrc_<< " with lodLevel_: " << this->lodLevel_ <<" and scale: "<< scaleFactor << ":" << std::endl;
     113
     114                        float volume = this->mesh_.getEntity()->getBoundingBox().volume();
     115    //                     float scaleFactor = 1;
     116                       
     117    //                     BaseObject* creatorPtr = this;
     118    //                     
     119    //                     while(creatorPtr!=NULL&&orxonox_cast<WorldEntity*>(creatorPtr))
     120    //                     {
     121    //                         scaleFactor *= getBiggestScale(((WorldEntity*) creatorPtr)->getScale3D());
     122    //                         creatorPtr = creatorPtr->getCreator();
     123    //                     }
     124    //                     COUT(0) << "name: " << this->meshSrc_ << "scaleFactor: " << scaleFactor << ", volume: " << volume << endl;
     125                       
     126                        COUT(4) << "Setting lodLevel for " << this->meshSrc_<< " with lodLevel_: " << this->lodLevel_ <<" and volume: "<< volume << ":" << std::endl;
    126127
    127128#if OGRE_VERSION >= 0x010700
    128                     Ogre::Mesh::LodValueList distList;
     129                        Ogre::Mesh::LodValueList distList;
    129130#else
    130                     Ogre::Mesh::LodDistanceList distList;
     131                        Ogre::Mesh::LodDistanceList distList;
    131132#endif
    132133
    133                     if( lodLevel_>0 )
    134                     {
    135 //                         float factor = scaleFactor*5/lodLevel_;
    136                         float factor = volume/3/lodLevel_;
    137                        
    138                         COUT(4)<<"LodLevel set with factor: "<<factor<<std::endl;
     134                        if( lodLevel_>0 )
     135                        {
     136    //                         float factor = scaleFactor*5/lodLevel_;
     137                            float factor = volume/3/lodLevel_;
     138                           
     139                            COUT(4)<<"LodLevel set with factor: "<<factor<<std::endl;
    139140
    140                         distList.push_back(70.0f*factor);
    141                         distList.push_back(140.0f*factor);
    142                         distList.push_back(170.0f*factor);
    143                         distList.push_back(200.0f*factor);
    144                         distList.push_back(230.0f*factor);
    145                         distList.push_back(250.0f*factor);
    146                         distList.push_back(270.0f*factor);
    147                         distList.push_back(290.0f*factor);
    148                         distList.push_back(310.0f*factor);
    149                         distList.push_back(330.0f*factor);
     141                            distList.push_back(70.0f*factor);
     142                            distList.push_back(140.0f*factor);
     143                            distList.push_back(170.0f*factor);
     144                            distList.push_back(200.0f*factor);
     145                            distList.push_back(230.0f*factor);
     146                            distList.push_back(250.0f*factor);
     147                            distList.push_back(270.0f*factor);
     148                            distList.push_back(290.0f*factor);
     149                            distList.push_back(310.0f*factor);
     150                            distList.push_back(330.0f*factor);
    150151
    151                         float reductionValue = 0.15f;
     152                            float reductionValue = 0.15f;
    152153
    153                        
    154                         //Generiert LOD-Levels
    155                         this->mesh_.getEntity()->getMesh()->generateLodLevels(distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL, reductionValue);
    156                     }
    157                     else
    158                     {
    159                         std::string what;
    160                         if(lodLevel_>5)
    161                             what = ">5";
     154                           
     155                            //Generiert LOD-Levels
     156                            this->mesh_.getEntity()->getMesh()->generateLodLevels(distList, Ogre::ProgressiveMesh::VRQ_PROPORTIONAL, reductionValue);
     157                        }
    162158                        else
    163                             what = "<0";
    164                        
    165                         COUT(4)<<"LodLevel not set because lodLevel("<<lodLevel_<<") was "<<what<<"."<<std::endl;
     159                        {
     160                            std::string what;
     161                            if(lodLevel_>5)
     162                                what = ">5";
     163                            else
     164                                what = "<0";
     165                           
     166                            COUT(4)<<"LodLevel not set because lodLevel("<<lodLevel_<<") was "<<what<<"."<<std::endl;
     167                        }
    166168                    }
    167169                }
Note: See TracChangeset for help on using the changeset viewer.