void CollisionShape::OnMarkedDirty(Node* node) { Vector3 newWorldScale = node_->GetWorldScale(); if (HasWorldScaleChanged(cachedWorldScale_, newWorldScale) && shape_) { // Physics operations are not safe from worker threads Scene* scene = GetScene(); if (scene && scene->IsThreadedUpdate()) { scene->DelayedMarkedDirty(this); return; } switch (shapeType_) { case SHAPE_BOX: case SHAPE_SPHERE: case SHAPE_CYLINDER: case SHAPE_CAPSULE: case SHAPE_CONE: shape_->setLocalScaling(ToBtVector3(newWorldScale)); break; case SHAPE_TRIANGLEMESH: case SHAPE_CONVEXHULL: shape_->setLocalScaling(ToBtVector3(newWorldScale * size_)); break; case SHAPE_TERRAIN: { HeightfieldData* heightfield = static_cast<HeightfieldData*>(geometry_.Get()); shape_->setLocalScaling(ToBtVector3(Vector3(heightfield->spacing_.x_, 1.0f, heightfield->spacing_.z_) * newWorldScale * size_)); } break; default: break; } NotifyRigidBody(); cachedWorldScale_ = newWorldScale; } }
void Constraint::OnMarkedDirty(Node* node) { /// \todo This does not catch the connected body node's scale changing if (HasWorldScaleChanged(cachedWorldScale_, node->GetWorldScale())) ApplyFrames(); }