- Timestamp:
- Jan 1, 2009, 7:34:44 PM (16 years ago)
- Location:
- code/branches/presentation/src/orxonox/objects/collisionshapes
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/presentation/src/orxonox/objects/collisionshapes/CMakeLists.txt
r2486 r2562 6 6 PlaneCollisionShape.cc 7 7 SphereCollisionShape.cc 8 WorldEntityCollisionShape.cc 8 9 ) 9 10 -
code/branches/presentation/src/orxonox/objects/collisionshapes/CollisionShape.cc
r2527 r2562 37 37 #include "tools/BulletConversions.h" 38 38 39 #include "objects/worldentities/WorldEntity.h" 39 40 #include "CompoundCollisionShape.h" 40 #include " objects/worldentities/WorldEntity.h"41 #include "WorldEntityCollisionShape.h" 41 42 42 43 namespace orxonox … … 85 86 void CollisionShape::parentChanged() 86 87 { 87 CompoundCollisionShape* parent = dynamic_cast<CompoundCollisionShape*>(Synchronisable::getSynchronisable(this->parentID_)); 88 if (parent) 89 parent->attach(this); 88 Synchronisable* parent = Synchronisable::getSynchronisable(this->parentID_); 89 // Parent can either be a WorldEntity or a CompoundCollisionShape. The reason is that the 90 // internal collision shape (which is compound) of a WE doesn't get synchronised. 91 CompoundCollisionShape* parentCCS = dynamic_cast<CompoundCollisionShape*>(parent); 92 if (parentCCS) 93 parentCCS->attach(this); 94 else 95 { 96 WorldEntity* parentWE = dynamic_cast<WorldEntity*>(parent); 97 if (parentWE) 98 parentWE->attachCollisionShape(this); 99 } 100 } 101 102 bool CollisionShape::notifyBeingAttached(CompoundCollisionShape* newParent) 103 { 104 if (this->parent_) 105 this->parent_->detach(this); 106 107 this->parent_ = newParent; 108 109 WorldEntityCollisionShape* parentWECCS = dynamic_cast<WorldEntityCollisionShape*>(newParent); 110 if (parentWECCS) 111 this->parentID_ = parentWECCS->getWorldEntityOwner()->getObjectID(); 112 else 113 this->parentID_ = newParent->getObjectID(); 114 115 return true; 116 } 117 118 void CollisionShape::notifyDetached() 119 { 120 this->parent_ = 0; 121 this->parentID_ = OBJECTID_UNKNOWN; 90 122 } 91 123 -
code/branches/presentation/src/orxonox/objects/collisionshapes/CollisionShape.h
r2515 r2562 75 75 bool hasTransform() const; 76 76 77 inline void setParent(CompoundCollisionShape* shape, unsigned int ID)78 { this->parent_ = shape; this->parentID_ = ID; }77 bool notifyBeingAttached(CompoundCollisionShape* newParent); 78 void notifyDetached(); 79 79 80 80 protected: … … 85 85 btCollisionShape* collisionShape_; 86 86 CompoundCollisionShape* parent_; 87 unsigned int parentID_; 87 88 88 89 private: … … 90 91 Quaternion orientation_; 91 92 Vector3 scale_; 92 unsigned int parentID_;93 93 }; 94 94 } -
code/branches/presentation/src/orxonox/objects/collisionshapes/CompoundCollisionShape.cc
r2527 r2562 36 36 #include "core/XMLPort.h" 37 37 #include "tools/BulletConversions.h" 38 #include "objects/worldentities/WorldEntity.h"39 38 40 39 namespace orxonox … … 47 46 48 47 this->compoundShape_ = new btCompoundShape(); 49 this->worldEntityParent_ = 0;50 48 } 51 49 … … 59 57 { 60 58 // make sure that the child doesn't want to detach itself --> speedup because of the missing update 61 it->first-> setParent(0, OBJECTID_UNKNOWN);59 it->first->notifyDetached(); 62 60 delete it->first; 63 61 } … … 74 72 } 75 73 76 void CompoundCollisionShape::setWorldEntityParent(WorldEntity* parent)77 {78 // suppress synchronisation79 this->setObjectMode(0x0);80 81 this->worldEntityParent_ = parent;82 }83 84 74 void CompoundCollisionShape::attach(CollisionShape* shape) 85 75 { … … 91 81 return; 92 82 } 83 84 if (!shape->notifyBeingAttached(this)) 85 return; 86 93 87 this->attachedShapes_[shape] = shape->getCollisionShape(); 94 88 … … 101 95 this->updatePublicShape(); 102 96 } 103 104 // network synchro105 if (this->worldEntityParent_)106 {107 // This compound collision shape belongs to a WE and doesn't get synchronised108 // So set our parent to be the WE109 shape->setParent(this, this->worldEntityParent_->getObjectID());110 }111 else112 shape->setParent(this, this->getObjectID());113 97 } 114 98 … … 117 101 if (this->attachedShapes_.find(shape) != this->attachedShapes_.end()) 118 102 { 119 shape->setParent(0, OBJECTID_UNKNOWN);120 103 this->attachedShapes_.erase(shape); 121 104 if (shape->getCollisionShape()) 122 105 this->compoundShape_->removeChildShape(shape->getCollisionShape()); 106 shape->notifyDetached(); 123 107 124 108 this->updatePublicShape(); … … 197 181 } 198 182 199 void CompoundCollisionShape::updateParent()200 {201 if (this->parent_)202 this->parent_->updateAttachedShape(this);203 if (this->worldEntityParent_)204 this->worldEntityParent_->notifyCollisionShapeChanged();205 }206 207 void CompoundCollisionShape::parentChanged()208 {209 if (!this->worldEntityParent_)210 CollisionShape::parentChanged();211 }212 213 183 CollisionShape* CompoundCollisionShape::getAttachedShape(unsigned int index) const 214 184 { -
code/branches/presentation/src/orxonox/objects/collisionshapes/CompoundCollisionShape.h
r2527 r2562 53 53 void updateAttachedShape(CollisionShape* shape); 54 54 55 void setWorldEntityParent(WorldEntity* parent);56 57 protected:58 virtual void updateParent();59 60 55 private: 61 56 void updatePublicShape(); 62 void parentChanged();63 57 inline virtual btCollisionShape* createNewShape() const 64 58 { assert(false); return 0; } … … 66 60 btCompoundShape* compoundShape_; 67 61 std::map<CollisionShape*, btCollisionShape*> attachedShapes_; 68 WorldEntity* worldEntityParent_;69 62 }; 70 63 }
Note: See TracChangeset
for help on using the changeset viewer.