void ABlockingVolume::PostEditChangeChainProperty(FPropertyChangedChainEvent& PropertyChangedEvent) { Super::PostEditChangeChainProperty(PropertyChangedEvent); // Get 'deepest' property name we changed. const FName TailPropName = PropertyChangedEvent.PropertyChain.GetTail()->GetValue()->GetFName(); static FName Mobility_NAME(TEXT("Mobility")); if( TailPropName == Mobility_NAME ) { // If the collision profile is one of the 'default' ones for a BlockingVolume, make sure it is the correct one // If user has changed it to something else, don't touch it FName CurrentProfileName = GetBrushComponent()->GetCollisionProfileName(); if( CurrentProfileName == InvisibleWall_NAME || CurrentProfileName == InvisibleWallDynamic_NAME ) { if(GetBrushComponent()->Mobility == EComponentMobility::Movable) { GetBrushComponent()->SetCollisionProfileName(InvisibleWallDynamic_NAME); } else { GetBrushComponent()->SetCollisionProfileName(InvisibleWall_NAME); } } } }
ACullDistanceVolume::ACullDistanceVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetBrushComponent()->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); GetBrushComponent()->bAlwaysCreatePhysicsState = true; CullDistances.Add(FCullDistanceSizePair(0,0)); CullDistances.Add(FCullDistanceSizePair(10000,0)); bEnabled = true; }
AAudioVolume::AAudioVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetBrushComponent()->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); GetBrushComponent()->bAlwaysCreatePhysicsState = true; bColored = true; BrushColor = FColor(255, 255, 0, 255); bEnabled = true; }
ALevelStreamingVolume::ALevelStreamingVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetBrushComponent()->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); GetBrushComponent()->bAlwaysCreatePhysicsState = true; bColored = true; BrushColor.R = 255; BrushColor.G = 165; BrushColor.B = 0; BrushColor.A = 255; StreamingUsage = SVB_LoadingAndVisibility; }
void ANavModifierVolume::GetNavigationData(FNavigationRelevantData& Data) const { if (Brush && AreaClass && AreaClass != UNavigationSystem::GetDefaultWalkableArea()) { FAreaNavModifier AreaMod(GetBrushComponent(), AreaClass); Data.Modifiers.Add(AreaMod); } }
AProceduralFoliageBlockingVolume::AProceduralFoliageBlockingVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { if (UBrushComponent* BrushComponent = GetBrushComponent()) { BrushComponent->SetCollisionObjectType(ECC_WorldStatic); BrushComponent->SetCollisionResponseToAllChannels(ECR_Ignore); } }
void ABlockingVolume::LoadedFromAnotherClass(const FName& OldClassName) { Super::LoadedFromAnotherClass(OldClassName); if(GetLinkerUE4Version() < VER_UE4_REMOVE_DYNAMIC_VOLUME_CLASSES) { static FName DynamicBlockingVolume_NAME(TEXT("DynamicBlockingVolume")); if(OldClassName == DynamicBlockingVolume_NAME) { GetBrushComponent()->Mobility = EComponentMobility::Movable; if(GetBrushComponent()->GetCollisionProfileName() == InvisibleWall_NAME) { GetBrushComponent()->SetCollisionProfileName(InvisibleWallDynamic_NAME); } } } }
ALightmassCharacterIndirectDetailVolume::ALightmassCharacterIndirectDetailVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetBrushComponent()->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); bColored = true; BrushColor.R = 155; BrushColor.G = 185; BrushColor.B = 25; BrushColor.A = 255; }
APhysicsVolume::APhysicsVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { static FName CollisionProfileName(TEXT("OverlapAllDynamic")); GetBrushComponent()->SetCollisionProfileName(CollisionProfileName); FluidFriction = UPhysicsSettings::Get()->DefaultFluidFriction; TerminalVelocity = UPhysicsSettings::Get()->DefaultTerminalVelocity; bAlwaysRelevant = true; NetUpdateFrequency = 0.1f; bReplicateMovement = false; }
ATriggerVolume::ATriggerVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { static FName CollisionProfileName(TEXT("Trigger")); GetBrushComponent()->SetCollisionProfileName(CollisionProfileName); bColored = true; BrushColor.R = 100; BrushColor.G = 255; BrushColor.B = 100; BrushColor.A = 255; }
ABxtAsteroidSpawner::ABxtAsteroidSpawner(const FObjectInitializer& objectInitializer) : Super(objectInitializer) { PrimaryActorTick.bCanEverTick = true; UBrushComponent* brushComponent = GetBrushComponent(); if (brushComponent) { brushComponent->bGenerateOverlapEvents = false; brushComponent->bAlwaysCreatePhysicsState = false; brushComponent->SetCollisionProfileName("NoCollision"); } }
void ATriggerVolume::LoadedFromAnotherClass(const FName& OldClassName) { Super::LoadedFromAnotherClass(OldClassName); if(GetLinkerUE4Version() < VER_UE4_REMOVE_DYNAMIC_VOLUME_CLASSES) { static FName DynamicTriggerVolume_NAME(TEXT("DynamicTriggerVolume")); if(OldClassName == DynamicTriggerVolume_NAME) { GetBrushComponent()->Mobility = EComponentMobility::Movable; } } }
// Sets default values AJumpPadVolume::AJumpPadVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // Too lazy to make my own profile so we just use the TriggerVolume profile :3 static FName CollisionProfileName(TEXT("Trigger")); GetBrushComponent()->SetCollisionProfileName(CollisionProfileName); OnActorBeginOverlap.AddDynamic(this, &AJumpPadVolume::OnActorEnteredVolume); bColored = true; BrushColor.R = 20; BrushColor.G = 255; BrushColor.B = 20; BrushColor.A = 255; }
AProceduralFoliageVolume::AProceduralFoliageVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { ProceduralComponent = ObjectInitializer.CreateDefaultSubobject<UProceduralFoliageComponent>(this, TEXT("ProceduralFoliageComponent")); ProceduralComponent->SetSpawningVolume(this); if (UBrushComponent* BrushComponent = GetBrushComponent()) { BrushComponent->SetCollisionObjectType(ECC_WorldStatic); BrushComponent->SetCollisionResponseToAllChannels(ECR_Ignore); // This is important because the volume overlaps with all procedural foliage // That means during streaming we'll get a huge hitch for UpdateOverlaps BrushComponent->bGenerateOverlapEvents = false; } }
void ACullDistanceVolume::GetPrimitiveMaxDrawDistances(TMap<UPrimitiveComponent*,float>& OutCullDistances) { // Nothing to do if there is no brush component or no cull distances are set if (GetBrushComponent() && CullDistances.Num() > 0 && bEnabled) { for (auto It(OutCullDistances.CreateIterator()); It; ++It) { UPrimitiveComponent* PrimitiveComponent = It.Key(); // Check whether primitive can be affected by cull distance volumes. if( ACullDistanceVolume::CanBeAffectedByVolumes( PrimitiveComponent ) ) { // Check whether primitive supports cull distance volumes and its center point is being encompassed by this volume. if( EncompassesPoint( PrimitiveComponent->GetComponentLocation() ) ) { // Find best match in CullDistances array. float PrimitiveSize = PrimitiveComponent->Bounds.SphereRadius * 2; float CurrentError = FLT_MAX; float CurrentCullDistance = 0; for( int32 CullDistanceIndex=0; CullDistanceIndex<CullDistances.Num(); CullDistanceIndex++ ) { const FCullDistanceSizePair& CullDistancePair = CullDistances[CullDistanceIndex]; if( FMath::Abs( PrimitiveSize - CullDistancePair.Size ) < CurrentError ) { CurrentError = FMath::Abs( PrimitiveSize - CullDistancePair.Size ); CurrentCullDistance = CullDistancePair.CullDistance; } } float& CullDistance = It.Value(); // LD or other volume specified cull distance, use minimum of current and one used for this volume. if (CullDistance > 0) { CullDistance = FMath::Min(CullDistance, CurrentCullDistance); } // LD didn't specify cull distance, use current setting directly. else { CullDistance = CurrentCullDistance; } } } } } }
ABlockingVolume::ABlockingVolume(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetBrushComponent()->SetCanEverAffectNavigation(true); GetBrushComponent()->SetCollisionProfileName(InvisibleWall_NAME); }