/*============================================================================= ApexDestructibleActor.uc: PhysX APEX integration. Destructible Actor Copyright 2008-2009 NVIDIA Corporation. =============================================================================*/ /*** This class defines a single instance of a destructible asset */ class ApexDestructibleActor extends Actor dependson(ApexDestructibleAsset) dependson(LightComponent) native(Mesh) placeable config(Engine); /** Expose LightEnvironment to the user */ var() DynamicLightEnvironmentComponent LightEnvironment; /** If set, use this actor's fracture materials instead of the asset's fracture materials. */ var() bool bFractureMaterialOverride; /** Fracture effects for each fracture level. Used only if Fracture Material Override is set. */ var() const editfixedsize array FractureMaterials; /** If checked, only a single effect from FractureMaterials is played within the bounding box of all fractured chunks. The effect chosen will be the one corresponding to the destructible's SupportDepth. */ var() const bool bPlaySingleFractureMaterialEffect; /** The destructible static component. */ var() const editconst ApexStaticDestructibleComponent StaticDestructibleComponent; /** LOD setting. LOD < 0 enables automatic LOD. LOD >= 0 forces an LOD setting. */ var() const int LOD; /** Defines an array that designates which of the destructible chunks are visible */ var init array VisibilityFactors; /** Cached sounds for fractures. */ var transient array FractureSounds; /** Cached particle effects for fractures. */ var transient array FractureParticleEffects; event SpawnFractureEmitter(ParticleSystem EmitterTemplate, vector SpawnLocation, vector SpawnDirection) { local ParticleSystemComponent PSC; local LightingChannelContainer Lights; PSC = WorldInfo.MyEmitterPool.SpawnEmitter( EmitterTemplate, SpawnLocation, rotator(SpawnDirection) ); Lights = PSC.LightingChannels; // TODO: Modify Lights here according to FractureMaterial Lights.Dynamic = TRUE; Lights.bInitialized = TRUE; PSC.SetLightingChannels(Lights); } /** Initialize FractureSounds and FractureParticleEffects */ native function CacheFractureEffects(); simulated event PostBeginPlay() { Super.PostBeginPlay(); CacheFractureEffects(); } /** Declares the TakeDamage script function */ simulated native function TakeDamage ( int Damage, /* The amount of Damage to apply */ Controller EventInstigator, /* The instigator of this event */ vector HitLocation, /* The location where the impact occured */ vector Momentum, /* The momentum of the impact */ class DamageType, /* The type of damage to apply */ optional TraceHitInfo HitInfo, /* The detailed hit information for this damage event */ optional Actor DamageCauser /* The actor which caused the damage */ ); /** Declares the radius damage script function */ simulated native function TakeRadiusDamage ( Controller InstigatedBy, /* The instigator for this radius damage */ float BaseDamage, /* The base damage amount */ float DamageRadius, /* The radius of the damage */ class DamageType, /* The type of damage to apply */ float Momentum, /* The momentum of the damage */ vector HurtOrigin, /* The origin of the damage */ bool bFullDamage, /* Whether or not to apply full damage or attenuated damage */ Actor DamageCauser, /* The actor which caused the damage */ optional float DamageFalloffExponent=1.f, optional bool bAdjustRadiusDamage=true ); function OnSetMaterial(SeqAct_SetMaterial Action) { StaticDestructibleComponent.SetMaterial( Action.MaterialIndex, Action.NewMaterial ); } cpptext { // Function to check whether Actor still has chunks, if it doesn't destroy actor. virtual void TickAuthoritative( FLOAT DeltaSeconds ); /** Synchronizes this actor to all rigid body components **/ virtual void SyncActorToRBPhysics(); /*** Sets the physics on this actor * @param NewPhysics : Use PHYS_None for a static destructible, PHYS_RigidBody for a dynamic destructible. * @param NewFloor : Not used. * @param NewFloorV : Not used. */ virtual void setPhysics(BYTE NewPhysics, AActor *NewFloor, FVector NewFloorV); /** Process a property change event. * @param PropertyThatChanged : The property value which changed */ virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent); /** Process an edit move event. * * @param : bFinished : True if the move is complete. */ virtual void PostEditMove(UBOOL bFinished); /** Notification of the post load event. */ virtual void PostLoad(); /** * Called by MirrorActors to perform a mirroring operation on the actor. Overridden since * APEX destructible actors can't handle mirror transforms. */ virtual void EditorApplyMirror(const FVector& MirrorScale, const FVector& PivotLocation); /** Loads the editor parameters from the asset */ void LoadEditorParametersFromAsset(); /** Update old actors. Only has an effect when called from the editor. */ void FixupActor(); /** Spawn fracture effects at the given location & given direction for the given fracture depth. */ void SpawnFractureEffects(FVector& Location, FVector& Direction, INT Depth); /** Customize Apex Destructible's physRigidBody so that it checks the collision with volumes. */ virtual void physRigidBody(FLOAT DeltaTime); /** Overrides the damage for a DamageCauser, if such is specified * @param BaseDamage: Output base damage * @param DamageRadius: Output damage radius * @param Momentum: Output momentum * @param DamageCauser: DamageCauser for the override lookup */ virtual void OverrideDamageParams(FLOAT& BaseDamage, FLOAT& DamageRadius, FLOAT& Momentum, const AActor* DamageCauser) const; // AActor interface virtual UBOOL ShouldTrace(UPrimitiveComponent* Primitive, AActor *SourceActor, DWORD TraceFlags); } defaultproperties { bEdShouldSnap=TRUE bCollideActors=TRUE bBlockActors=TRUE bProjTarget=TRUE bGameRelevant=TRUE bRouteBeginPlayEvenIfStatic=FALSE bCollideWhenPlacing=FALSE bStatic=FALSE bMovable=TRUE bNoDelete=TRUE bNoEncroachCheck=TRUE bWorldGeometry=FALSE bCanBeDamaged=TRUE LOD=-1 Begin Object Class=DynamicLightEnvironmentComponent Name=LightEnvironment0 bEnabled=FALSE End Object Components.Add(LightEnvironment0) LightEnvironment = LightEnvironment0 Begin Object Class=ApexStaticDestructibleComponent Name=DestructibleComponent0 bAllowApproximateOcclusion=TRUE bCastDynamicShadow=FALSE bForceDirectLightMap=TRUE BlockRigidBody=TRUE bAcceptsDecals=FALSE LightEnvironment=LightEnvironment0 End Object CollisionComponent=DestructibleComponent0 StaticDestructibleComponent=DestructibleComponent0 Components.Add(DestructibleComponent0) // Begin Object Class=ApexDynamicDestructibleComponent Name=DestructibleComponent1 // bAllowApproximateOcclusion=TRUE // bCastDynamicShadow=FALSE // bForceDirectLightMap=TRUE // BlockRigidBody=TRUE // bAcceptsDecals=FALSE // LightEnvironment=LightEnvironment0 // End Object // DynamicDestructibleComponent=DestructibleComponent1 // Components.Add(DestructibleComponent1) }