- Timestamp:
- Dec 22, 2008, 10:23:29 PM (16 years ago)
- Location:
- code/branches/presentation/src/orxonox/objects/worldentities
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/presentation/src/orxonox/objects/worldentities/Camera.cc
r2500 r2527 109 109 float coeff = min(1.0f, 15.0f * dt); 110 110 111 Vector3 offset = this->get Node()->getWorldPosition() - this->cameraNode_->getWorldPosition();111 Vector3 offset = this->getWorldPosition() - this->cameraNode_->getWorldPosition(); 112 112 this->cameraNode_->translate(coeff * offset); 113 113 -
code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.cc
r2501 r2527 71 71 this->physicalBody_ = 0; 72 72 this->bPhysicsActive_ = false; 73 this->bPhysicsActiveSynchronised_ = false; 74 this->bPhysicsActiveBeforeAttaching_ = false; 73 75 this->collisionShape_ = new CompoundCollisionShape(this); 74 76 // Note: CompoundCollisionShape is a Synchronisable, but must not be synchronised. … … 251 253 void WorldEntity::attach(WorldEntity* object) 252 254 { 253 // check first whether attaching is even allowed254 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 else277 {278 object->deactivatePhysics();279 }280 }281 282 255 if (object == this) 283 256 { … … 286 259 } 287 260 288 if ( object->getParent())289 object->detachFromParent();261 if (!object->notifyBeingAttached(this)) 262 return; 290 263 291 264 this->attachNode(object->node_); 292 293 265 this->children_.insert(object); 294 object->parent_ = this; 295 object->parentID_ = this->getObjectID(); 296 297 // collision shapes 266 298 267 this->attachCollisionShape(object->getCollisionShape()); 299 268 // mass … … 302 271 } 303 272 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 304 318 void WorldEntity::detach(WorldEntity* object) 305 319 { 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 306 326 // collision shapes 307 327 this->detachCollisionShape(object->getCollisionShape()); 328 308 329 // mass 309 330 if (object->getMass() > 0.0f) … … 315 336 this->detachNode(object->node_); 316 337 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 } 322 357 } 323 358 … … 351 386 void WorldEntity::attachCollisionShape(CollisionShape* shape) 352 387 { 353 this->collisionShape_->a ddChildShape(shape);388 this->collisionShape_->attach(shape); 354 389 // Note: this->collisionShape_ already notifies us of any changes. 355 390 } … … 357 392 void WorldEntity::detachCollisionShape(CollisionShape* shape) 358 393 { 359 this->collisionShape_-> removeChildShape(shape);394 this->collisionShape_->detach(shape); 360 395 // Note: this->collisionShape_ already notifies us of any changes. 361 396 } … … 363 398 CollisionShape* WorldEntity::getAttachedCollisionShape(unsigned int index) const 364 399 { 365 return this->collisionShape_->get ChildShape(index);400 return this->collisionShape_->getAttachedShape(index); 366 401 } 367 402 -
code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.h
r2485 r2527 244 244 CollisionShape* getAttachedCollisionShape(unsigned int index) const; 245 245 246 inline CompoundCollisionShape* getCollisionShape() 246 inline CompoundCollisionShape* getCollisionShape() const 247 247 { return this->collisionShape_; } 248 inline btRigidBody* getPhysicalBody() 248 inline btRigidBody* getPhysicalBody() const 249 249 { return this->physicalBody_; } 250 250 … … 259 259 inline void disableCollisionCallback() 260 260 { this->bCollisionCallbackActive_ = false; this->collisionCallbackActivityChanged(); } 261 inline bool isCollisionCallbackActive() 261 inline bool isCollisionCallbackActive() const 262 262 { return this->bCollisionCallbackActive_; } 263 263 … … 271 271 void recalculateMassProps(); 272 272 void resetPhysicsProps(); 273 274 bool notifyBeingAttached(WorldEntity* newParent); 275 void notifyDetached(); 273 276 274 277 // network callbacks … … 293 296 bool bPhysicsActive_; 294 297 bool bPhysicsActiveSynchronised_; 298 bool bPhysicsActiveBeforeAttaching_; 295 299 CompoundCollisionShape* collisionShape_; 296 300 btScalar mass_;
Note: See TracChangeset
for help on using the changeset viewer.