Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 22, 2008, 10:23:29 PM (16 years ago)
Author:
rgrieder
Message:
  • Forgot to account for collision shape position and orientation when attaching WEs
  • addChildShape —> attach in CompoundCollisionShape
  • Fixed an issue which allowed WE's to detach themselves from non-parents.
  • Fixed an issue that occurred when physics was not active before attaching
  • Added some forgotten const in WE (physics)
  • When attaching WE's the child doesn't get modified anymore. Alternative: notifyDetached() and notifyBeingAttached(this) —> the child does the work
Location:
code/branches/presentation/src/orxonox/objects
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • code/branches/presentation/src/orxonox/objects/collisionshapes/CollisionShape.cc

    r2515 r2527  
    6262        // Detach from parent
    6363        if (this->isInitialized() && this->parent_)
    64             this->parent_->removeChildShape(this);
     64            this->parent_->detach(this);
    6565    }
    6666
     
    8787        CompoundCollisionShape* parent = dynamic_cast<CompoundCollisionShape*>(Synchronisable::getSynchronisable(this->parentID_));
    8888        if (parent)
    89             parent->addChildShape(this);
     89            parent->attach(this);
    9090    }
    9191
     
    9393    {
    9494        if (this->parent_)
    95             this->parent_->updateChildShape(this);
     95            this->parent_->updateAttachedShape(this);
    9696    }
    9797
  • code/branches/presentation/src/orxonox/objects/collisionshapes/CompoundCollisionShape.cc

    r2514 r2527  
    5555        {
    5656            // Delete all children
    57             for (std::map<CollisionShape*, btCollisionShape*>::iterator it = this->childShapes_.begin();
    58                 it != this->childShapes_.end(); ++it)
     57            for (std::map<CollisionShape*, btCollisionShape*>::iterator it = this->attachedShapes_.begin();
     58                it != this->attachedShapes_.end(); ++it)
    5959            {
    6060                // make sure that the child doesn't want to detach itself --> speedup because of the missing update
     
    7171        SUPER(CompoundCollisionShape, XMLPort, xmlelement, mode);
    7272        // Attached collision shapes
    73         XMLPortObject(CompoundCollisionShape, CollisionShape, "", addChildShape, getChildShape, xmlelement, mode);
     73        XMLPortObject(CompoundCollisionShape, CollisionShape, "", attach, detach, xmlelement, mode);
    7474    }
    7575
     
    8282    }
    8383
    84     void CompoundCollisionShape::addChildShape(CollisionShape* shape)
     84    void CompoundCollisionShape::attach(CollisionShape* shape)
    8585    {
    8686        if (!shape || static_cast<CollisionShape*>(this) == shape)
    8787            return;
    88         if (this->childShapes_.find(shape) != this->childShapes_.end())
     88        if (this->attachedShapes_.find(shape) != this->attachedShapes_.end())
    8989        {
    9090            CCOUT(2) << "Warning: Attaching a CollisionShape twice is not yet supported." << std::endl;
    9191            return;
    9292        }
    93         this->childShapes_[shape] = shape->getCollisionShape();
     93        this->attachedShapes_[shape] = shape->getCollisionShape();
    9494
    9595        if (shape->getCollisionShape())
     
    113113    }
    114114
    115     void CompoundCollisionShape::removeChildShape(CollisionShape* shape)
    116     {
    117         if (this->childShapes_.find(shape) != this->childShapes_.end())
     115    void CompoundCollisionShape::detach(CollisionShape* shape)
     116    {
     117        if (this->attachedShapes_.find(shape) != this->attachedShapes_.end())
    118118        {
    119119            shape->setParent(0, OBJECTID_UNKNOWN);
    120             this->childShapes_.erase(shape);
     120            this->attachedShapes_.erase(shape);
    121121            if (shape->getCollisionShape())
    122122                this->compoundShape_->removeChildShape(shape->getCollisionShape());
     
    124124            this->updatePublicShape();
    125125        }
    126     }
    127 
    128     void CompoundCollisionShape::removeAllChildShapes()
    129     {
    130         while (this->childShapes_.size() > 0)
    131             this->removeChildShape(this->childShapes_.begin()->first);
    132     }
    133 
    134     void CompoundCollisionShape::updateChildShape(CollisionShape* shape)
     126        else
     127            CCOUT(2) << "Warning: Cannot detach non child collision shape" << std::endl;
     128    }
     129
     130    void CompoundCollisionShape::detachAll()
     131    {
     132        while (this->attachedShapes_.size() > 0)
     133            this->detach(this->attachedShapes_.begin()->first);
     134    }
     135
     136    void CompoundCollisionShape::updateAttachedShape(CollisionShape* shape)
    135137    {
    136138        if (!shape)
    137139            return;
    138         std::map<CollisionShape*, btCollisionShape*>::iterator it = this->childShapes_.find(shape);
    139         if (it == this->childShapes_.end())
     140        std::map<CollisionShape*, btCollisionShape*>::iterator it = this->attachedShapes_.find(shape);
     141        if (it == this->attachedShapes_.end())
    140142        {
    141143            CCOUT(2) << "Warning: Cannot update child shape: Instance not a child." << std::endl;
     
    162164        bool bPrimitive = true;
    163165        bool bEmpty = true;
    164         for (std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->childShapes_.begin(); it != this->childShapes_.end(); ++it)
     166        for (std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->attachedShapes_.begin(); it != this->attachedShapes_.end(); ++it)
    165167        {
    166168            if (it->second)
     
    198200    {
    199201        if (this->parent_)
    200             this->parent_->updateChildShape(this);
     202            this->parent_->updateAttachedShape(this);
    201203        if (this->worldEntityParent_)
    202204            this->worldEntityParent_->notifyCollisionShapeChanged();
     
    209211    }
    210212
    211     CollisionShape* CompoundCollisionShape::getChildShape(unsigned int index) const
     213    CollisionShape* CompoundCollisionShape::getAttachedShape(unsigned int index) const
    212214    {
    213215        unsigned int i = 0;
    214         for (std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->childShapes_.begin(); it != this->childShapes_.end(); ++it)
     216        for (std::map<CollisionShape*, btCollisionShape*>::const_iterator it = this->attachedShapes_.begin(); it != this->attachedShapes_.end(); ++it)
    215217        {
    216218            if (i == index)
  • code/branches/presentation/src/orxonox/objects/collisionshapes/CompoundCollisionShape.h

    r2514 r2527  
    4646            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
    4747
    48             void addChildShape(CollisionShape* shape);
    49             void removeChildShape(CollisionShape* shape);
    50             void removeAllChildShapes();
    51             CollisionShape* getChildShape(unsigned int index) const;
     48            void attach(CollisionShape* shape);
     49            void detach(CollisionShape* shape);
     50            void detachAll();
     51            CollisionShape* getAttachedShape(unsigned int index) const;
    5252
    53             void updateChildShape(CollisionShape* shape);
     53            void updateAttachedShape(CollisionShape* shape);
    5454
    5555            void setWorldEntityParent(WorldEntity* parent);
     
    6565
    6666            btCompoundShape* compoundShape_;
    67             std::map<CollisionShape*, btCollisionShape*> childShapes_;
     67            std::map<CollisionShape*, btCollisionShape*> attachedShapes_;
    6868            WorldEntity* worldEntityParent_;
    6969    };
  • code/branches/presentation/src/orxonox/objects/worldentities/Camera.cc

    r2500 r2527  
    109109            float coeff = min(1.0f, 15.0f * dt);
    110110
    111             Vector3 offset = this->getNode()->getWorldPosition() - this->cameraNode_->getWorldPosition();
     111            Vector3 offset = this->getWorldPosition() - this->cameraNode_->getWorldPosition();
    112112            this->cameraNode_->translate(coeff * offset);
    113113
  • code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.cc

    r2501 r2527  
    7171        this->physicalBody_ = 0;
    7272        this->bPhysicsActive_ = false;
     73        this->bPhysicsActiveSynchronised_ = false;
     74        this->bPhysicsActiveBeforeAttaching_ = false;
    7375        this->collisionShape_ = new CompoundCollisionShape(this);
    7476        // Note: CompoundCollisionShape is a Synchronisable, but must not be synchronised.
     
    251253    void WorldEntity::attach(WorldEntity* object)
    252254    {
    253         // check first whether attaching is even allowed
    254         if (object->hasPhysics())
    255         {
    256             if (!this->hasPhysics())
    257             {
    258                 COUT(2) << "Warning: Cannot attach a physical object to a non physical one." << std::endl;
    259                 return;
    260             }
    261             else if (object->isDynamic())
    262             {
    263                 COUT(2) << "Warning: Cannot attach a dynamic object to a WorldEntity." << std::endl;
    264                 return;
    265             }
    266             else if (object->isKinematic() && this->isDynamic())
    267             {
    268                 COUT(2) << "Warning: Cannot attach a kinematic object to a dynamic one." << std::endl;
    269                 return;
    270             }
    271             else if (object->isKinematic())
    272             {
    273                 COUT(2) << "Warning: Cannot attach a kinematic object to a static or kinematic one: Not yet implemented." << std::endl;
    274                 return;
    275             }
    276             else
    277             {
    278                 object->deactivatePhysics();
    279             }
    280         }
    281 
    282255        if (object == this)
    283256        {
     
    286259        }
    287260
    288         if (object->getParent())
    289             object->detachFromParent();
     261        if (!object->notifyBeingAttached(this))
     262            return;
    290263
    291264        this->attachNode(object->node_);
    292 
    293265        this->children_.insert(object);
    294         object->parent_ = this;
    295         object->parentID_ = this->getObjectID();
    296 
    297         // collision shapes
     266
    298267        this->attachCollisionShape(object->getCollisionShape());
    299268        // mass
     
    302271    }
    303272
     273    bool WorldEntity::notifyBeingAttached(WorldEntity* newParent)
     274    {
     275        // check first whether attaching is even allowed
     276        if (this->hasPhysics())
     277        {
     278            if (!newParent->hasPhysics())
     279            {
     280                COUT(2) << "Warning: Cannot attach a physical object to a non physical one." << std::endl;
     281                return false;
     282            }
     283            else if (this->isDynamic())
     284            {
     285                COUT(2) << "Warning: Cannot attach a dynamic object to a WorldEntity." << std::endl;
     286                return false;
     287            }
     288            else if (this->isKinematic() && newParent->isDynamic())
     289            {
     290                COUT(2) << "Warning: Cannot attach a kinematic object to a dynamic one." << std::endl;
     291                return false;
     292            }
     293            else if (this->isKinematic())
     294            {
     295                COUT(2) << "Warning: Cannot attach a kinematic object to a static or kinematic one: Not yet implemented." << std::endl;
     296                return false;
     297            }
     298        }
     299
     300        if (this->isPhysicsActive())
     301            this->bPhysicsActiveBeforeAttaching_ = true;
     302        this->deactivatePhysics();
     303
     304        if (this->parent_)
     305            this->detachFromParent();
     306
     307        this->parent_ = newParent;
     308        this->parentID_ = newParent->getObjectID();
     309
     310        // apply transform to collision shape
     311        this->collisionShape_->setPosition(this->getPosition());
     312        this->collisionShape_->setOrientation(this->getOrientation());
     313        // TODO: Scale
     314       
     315        return true;
     316    }
     317
    304318    void WorldEntity::detach(WorldEntity* object)
    305319    {
     320        if (this->children_.find(object) == this->children_.end())
     321        {
     322            CCOUT(2) << "Warning: Cannot detach an object that is not a child." << std::endl;
     323            return;
     324        }
     325
    306326        // collision shapes
    307327        this->detachCollisionShape(object->getCollisionShape());
     328
    308329        // mass
    309330        if (object->getMass() > 0.0f)
     
    315336        this->detachNode(object->node_);
    316337        this->children_.erase(object);
    317         object->parent_ = 0;
    318         object->parentID_ = OBJECTID_UNKNOWN;
    319 
    320         // Note: It is possible that the object has physics but was disabled when attaching
    321         object->activatePhysics();
     338
     339        object->notifyDetached();
     340    }
     341
     342    void WorldEntity::notifyDetached()
     343    {
     344        this->parent_ = 0;
     345        this->parentID_ = OBJECTID_UNKNOWN;
     346
     347        // reset orientation of the collisionShape (cannot be set within a WE usually)
     348        this->collisionShape_->setPosition(Vector3::ZERO);
     349        this->collisionShape_->setOrientation(Quaternion::IDENTITY);
     350        // TODO: Scale
     351
     352        if (this->bPhysicsActiveBeforeAttaching_)
     353        {
     354            this->activatePhysics();
     355            this->bPhysicsActiveBeforeAttaching_ = false;
     356        }
    322357    }
    323358
     
    351386    void WorldEntity::attachCollisionShape(CollisionShape* shape)
    352387    {
    353         this->collisionShape_->addChildShape(shape);
     388        this->collisionShape_->attach(shape);
    354389        // Note: this->collisionShape_ already notifies us of any changes.
    355390    }
     
    357392    void WorldEntity::detachCollisionShape(CollisionShape* shape)
    358393    {
    359         this->collisionShape_->removeChildShape(shape);
     394        this->collisionShape_->detach(shape);
    360395        // Note: this->collisionShape_ already notifies us of any changes.
    361396    }
     
    363398    CollisionShape* WorldEntity::getAttachedCollisionShape(unsigned int index) const
    364399    {
    365         return this->collisionShape_->getChildShape(index);
     400        return this->collisionShape_->getAttachedShape(index);
    366401    }
    367402
  • code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.h

    r2485 r2527  
    244244            CollisionShape* getAttachedCollisionShape(unsigned int index) const;
    245245
    246             inline CompoundCollisionShape* getCollisionShape()
     246            inline CompoundCollisionShape* getCollisionShape() const
    247247                { return this->collisionShape_; }
    248             inline btRigidBody* getPhysicalBody()
     248            inline btRigidBody* getPhysicalBody() const
    249249                { return this->physicalBody_; }
    250250
     
    259259            inline void disableCollisionCallback()
    260260                { this->bCollisionCallbackActive_ = false; this->collisionCallbackActivityChanged(); }
    261             inline bool isCollisionCallbackActive()
     261            inline bool isCollisionCallbackActive() const
    262262                { return this->bCollisionCallbackActive_; }
    263263
     
    271271            void recalculateMassProps();
    272272            void resetPhysicsProps();
     273
     274            bool notifyBeingAttached(WorldEntity* newParent);
     275            void notifyDetached();
    273276
    274277            // network callbacks
     
    293296            bool                         bPhysicsActive_;
    294297            bool                         bPhysicsActiveSynchronised_;
     298            bool                         bPhysicsActiveBeforeAttaching_;
    295299            CompoundCollisionShape*      collisionShape_;
    296300            btScalar                     mass_;
Note: See TracChangeset for help on using the changeset viewer.