FBox FKBoxElem::CalcAABB(const FTransform& BoneTM, float Scale) const { FTransform ElemTM = GetTransform(); ElemTM.ScaleTranslation( FVector(Scale) ); ElemTM *= BoneTM; FVector Extent(0.5f * Scale * X, 0.5f * Scale * Y, 0.5f * Scale * Z); FBox LocalBox(-Extent, Extent); return LocalBox.TransformBy(ElemTM); }
void UGeometryCacheComponent::UpdateLocalBounds() { FBox LocalBox(0); for (const FTrackRenderData& Section : TrackSections) { // Use World matrix per section for correct bounding box LocalBox += (Section.MeshData->BoundingBox.TransformBy(Section.WorldMatrix)); } LocalBounds = LocalBox.IsValid ? FBoxSphereBounds(LocalBox) : FBoxSphereBounds(FVector(0, 0, 0), FVector(0, 0, 0), 0); // fallback to reset box sphere bounds UpdateBounds(); }
FBoxSphereBounds UTextRenderComponent::CalcBounds(const FTransform& LocalToWorld) const { if(!Text.IsEmpty() && Font) { FVector2D Size(FLT_MIN, 0); FVector2D LeftTop(FLT_MAX, FLT_MAX); float FirstLineHeight = -1; FTextIterator It(*Text.ToString()); float AdjustedXScale = WorldSize * XScale * InvDefaultSize; float AdjustedYScale = WorldSize * YScale * InvDefaultSize; while (It.NextLine()) { FVector2D LineSize = ComputeTextSize(It, Font, AdjustedXScale, AdjustedYScale, HorizSpacingAdjust); float LineLeft = ComputeHorizontalAlignmentOffset(LineSize, HorizontalAlignment); Size.X = FMath::Max(LineSize.X, Size.X); Size.Y += LineSize.Y > 0 ? LineSize.Y : Font->GetMaxCharHeight(); LeftTop.X = FMath::Min(LeftTop.X, LineLeft); if (FirstLineHeight < 0) { FirstLineHeight = LineSize.Y; } int32 Ch; while (It.NextCharacterInLine(Ch)); } LeftTop.Y = ComputeVerticalAlignmentOffset(Size.Y, VerticalAlignment, FirstLineHeight); FBox LocalBox(FVector(0, -LeftTop.X, -LeftTop.Y), FVector(0, -(LeftTop.X + Size.X), -(LeftTop.Y + Size.Y))); FBoxSphereBounds Ret(LocalBox.TransformBy(LocalToWorld)); Ret.BoxExtent *= BoundsScale; Ret.SphereRadius *= BoundsScale; return Ret; } else { return FBoxSphereBounds(ForceInit); } }