bool UDebugSkelMeshComponent::CheckIfBoundsAreCorrrect() { if (GetPhysicsAsset()) { bool bWasUsingInGameBounds = IsUsingInGameBounds(); FTransform TempTransform = FTransform::Identity; UseInGameBounds(true); FBoxSphereBounds InGameBounds = CalcBounds(TempTransform); UseInGameBounds(false); FBoxSphereBounds PreviewBounds = CalcBounds(TempTransform); UseInGameBounds(bWasUsingInGameBounds); // calculate again to have bounds as requested CalcBounds(TempTransform); // if in-game bounds are of almost same size as preview bounds or bigger, it seems to be fine if (! InGameBounds.GetSphere().IsInside(PreviewBounds.GetSphere(), PreviewBounds.GetSphere().W * 0.1f) && // for spheres: A.IsInside(B) checks if A is inside of B ! PreviewBounds.GetBox().IsInside(InGameBounds.GetBox().ExpandBy(PreviewBounds.GetSphere().W * 0.1f))) // for boxes: A.IsInside(B) checks if B is inside of A { return true; } } return false; }
bool UPostProcessComponent::EncompassesPoint(FVector Point, float SphereRadius/*=0.f*/, float* OutDistanceToPoint) { UShapeComponent* ParentShape = Cast<UShapeComponent>(GetAttachParent()); if (ParentShape != nullptr) { #if WITH_PHYSX FVector ClosestPoint; float Distance = ParentShape->GetDistanceToCollision(Point, ClosestPoint); #else FBoxSphereBounds Bounds = ParentShape->CalcBounds(ParentShape->ComponentToWorld); float Distance = 0; if (ParentShape->IsA<USphereComponent>()) { const FSphere& Sphere = Bounds.GetSphere(); const FVector& Dist = Sphere.Center - Point; Distance = FMath::Max(0.0f, Dist.Size() - Sphere.W); } else // UBox or UCapsule shape (approx). { Distance = FMath::Sqrt(Bounds.GetBox().ComputeSquaredDistanceToPoint(Point)); } #endif if (OutDistanceToPoint) { *OutDistanceToPoint = Distance; } return Distance >= 0.f && Distance <= SphereRadius; } if (OutDistanceToPoint != nullptr) { *OutDistanceToPoint = 0; } return true; }