void CollisionShape::SetCylinder(float diameter, float height, const Vector3& position, const Quaternion& rotation) { if (model_) UnsubscribeFromEvent(model_, E_RELOADFINISHED); shapeType_ = SHAPE_CYLINDER; size_ = Vector3(diameter, height, diameter); position_ = position; rotation_ = rotation; model_.Reset(); customGeometryID_ = 0; UpdateShape(); NotifyRigidBody(); MarkNetworkUpdate(); }
void CollisionShape::SetBox(const Vector3& size, const Vector3& position, const Quaternion& rotation) { if (model_) UnsubscribeFromEvent(model_, E_RELOADFINISHED); shapeType_ = SHAPE_BOX; size_ = size; position_ = position; rotation_ = rotation; model_.Reset(); customGeometryID_ = 0; UpdateShape(); NotifyRigidBody(); MarkNetworkUpdate(); }
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 CollisionShape::SetTerrain() { Terrain* terrain = GetComponent<Terrain>(); if (!terrain) { LOGERROR("No terrain component, can not set terrain shape"); return; } if (model_) UnsubscribeFromEvent(model_, E_RELOADFINISHED); shapeType_ = SHAPE_TERRAIN; UpdateShape(); NotifyRigidBody(); MarkNetworkUpdate(); }
void CollisionShape::SetConvexHull(Model* model, unsigned lodLevel, const Vector3& scale, const Vector3& position, const Quaternion& rotation) { if (!model) { LOGERROR("Null model, can not set convex hull"); return; } if (model_) UnsubscribeFromEvent(model_, E_RELOADFINISHED); shapeType_ = SHAPE_CONVEXHULL; model_ = model; lodLevel_ = lodLevel; size_ = scale; position_ = position; rotation_ = rotation; customGeometryID_ = 0; UpdateShape(); NotifyRigidBody(); MarkNetworkUpdate(); }
void CollisionShape::OnSetEnabled() { NotifyRigidBody(); }