//---------------------------------------------------------------------------- void Selection::_UpdateSelect() { mCenter = APoint::ORIGIN; mBoundRadius = 0.0f; APoint pos; Bound bound; int firstBound = true; int numObjects = (int)mObjects.size(); for (int i = 0; i < numObjects; i++) { Object *obj = mObjects[i]; Movable *mov = DynamicCast<Movable>(obj); if (mov) { pos += mov->WorldTransform.GetTranslate(); if (0.0f != mov->WorldBound.GetRadius()) { if (firstBound) { bound = mov->WorldBound; firstBound = false; } else { bound.GrowToContain(mov->WorldBound); } } } } if (numObjects > 0) { mCenter = pos / (float)numObjects; mBoundRadius = bound.GetRadius(); } }
//---------------------------------------------------------------------------- void BoundCtrl::UpdateCtrl() { mCtrlsGroup->SetActiveChild(1); int numObjscts = PX2_SELECTION.GetNumObjects(); if (numObjscts > 0) { Bound bound; int firstBound = true; APoint pos; for (int i = 0; i < numObjscts; i++) { Object *obj = PX2_SELECTION.GetObjectAt(i); Actor *actor = DynamicCast<Actor>(obj); Movable *movable = DynamicCast<Movable>(obj); if (movable) { mCtrlsGroup->SetActiveChild(0); pos += movable->WorldTransform.GetTranslate(); if (0.0f != movable->WorldBound.GetRadius()) { if (firstBound) { bound = movable->WorldBound; firstBound = false; } else { bound.GrowToContain(movable->WorldBound); } } } } pos = pos / (float)numObjscts; float radius = bound.GetRadius(); if (0.0f == radius) { radius = 1.0f; mCtrlsGroup->WorldTransform.SetUniformScale(radius); mCtrlsGroup->WorldTransform.SetTranslate(pos); } else { mCtrlsGroup->WorldTransform.SetUniformScale(radius); mCtrlsGroup->WorldTransform.SetTranslate(bound.GetCenter()); } } else { mCtrlsGroup->SetActiveChild(1); } mCtrlsGroup->Update(Time::GetTimeInSeconds(), false); }