FCollisionShape UBoxComponent::GetCollisionShape(float Inflation) const { FVector Extent = GetScaledBoxExtent() + Inflation; if (Inflation < 0.f) { // Don't shrink below zero size. Extent = Extent.ComponentMax(FVector::ZeroVector); } return FCollisionShape::MakeBox(Extent); }
static void UnpackRelativeBox(const FVector& InRefOrigin, const FVector& InRefExtent, uint32 InPackedRelBox, FVector& OutOrigin, FVector& OutExtent) { const uint32 PackedMinX = InPackedRelBox & 31; const uint32 PackedMinY = (InPackedRelBox >> 5) & 31; const uint32 PackedMinZ = (InPackedRelBox >> 10) & 63; const uint32 PackedMaxX = (InPackedRelBox >> 16) & 31; const uint32 PackedMaxY = (InPackedRelBox >> 21) & 31; const uint32 PackedMaxZ = (InPackedRelBox >> 26) & 63; const FVector RefMin = InRefOrigin - InRefExtent; // 15.5 and 31.5 have the / 2 scale included const FVector UnpackScale = InRefExtent.ComponentMax(FVector(KINDA_SMALL_NUMBER, KINDA_SMALL_NUMBER, KINDA_SMALL_NUMBER)) / FVector(15.5f, 15.5f, 31.5f); const FVector Min = FVector((float)PackedMinX, (float)PackedMinY, (float)PackedMinZ) * UnpackScale + RefMin; const FVector Max = FVector((float)PackedMaxX, (float)PackedMaxY, (float)PackedMaxZ) * UnpackScale + RefMin; OutOrigin = .5 * (Min + Max); OutExtent = .5 * (Max - Min); }
static uint32 PackRelativeBox(const FVector& RefOrigin, const FVector& RefExtent, const FVector& Origin, const FVector& Extent) { const FVector RefMin = RefOrigin - RefExtent; // 15.5 and 31.5 have the / 2 scale included const FVector PackScale = FVector(15.5f, 15.5f, 31.5f) / RefExtent.ComponentMax(FVector(KINDA_SMALL_NUMBER, KINDA_SMALL_NUMBER, KINDA_SMALL_NUMBER)); const FVector Min = Origin - Extent; const FVector Max = Origin + Extent; const FVector RelMin = (Min - RefMin) * PackScale; const FVector RelMax = (Max - RefMin) * PackScale; const uint32 PackedMinX = (uint32)FMath::Clamp<int32>(FMath::FloorToInt(RelMin.X), 0, 31); const uint32 PackedMinY = (uint32)FMath::Clamp<int32>(FMath::FloorToInt(RelMin.Y), 0, 31); const uint32 PackedMinZ = (uint32)FMath::Clamp<int32>(FMath::FloorToInt(RelMin.Z), 0, 63); const uint32 PackedMaxX = (uint32)FMath::Clamp<int32>(FMath::CeilToInt(RelMax.X), 0, 31); const uint32 PackedMaxY = (uint32)FMath::Clamp<int32>(FMath::CeilToInt(RelMax.Y), 0, 31); const uint32 PackedMaxZ = (uint32)FMath::Clamp<int32>(FMath::CeilToInt(RelMax.Z), 0, 63); return PackedMinX | (PackedMinY << 5) | (PackedMinZ << 10) | (PackedMaxX << 16) | (PackedMaxY << 21) | (PackedMaxZ << 26); }