126 lines
4.2 KiB
Ucode
126 lines
4.2 KiB
Ucode
|
//=============================================================================
|
||
|
// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
||
|
//=============================================================================
|
||
|
class InteractiveFoliageActor extends StaticMeshActor
|
||
|
native(Foliage)
|
||
|
placeable;
|
||
|
|
||
|
/** Collision cylinder */
|
||
|
var private{private} CylinderComponent CylinderComponent;
|
||
|
|
||
|
/**
|
||
|
* Position of the last actor to enter the collision cylinder.
|
||
|
* This currently does not handle multiple actors affecting the foliage simultaneously.
|
||
|
*/
|
||
|
var private{private} transient vector TouchingActorEntryPosition;
|
||
|
|
||
|
/** Simulated physics state */
|
||
|
var private{private} transient vector FoliageVelocity;
|
||
|
var private{private} transient vector FoliageForce;
|
||
|
var private{private} transient vector FoliagePosition;
|
||
|
|
||
|
/** Scales forces applied from damage events. */
|
||
|
var(FoliagePhysics) float FoliageDamageImpulseScale;
|
||
|
|
||
|
/** Scales forces applied from touch events. */
|
||
|
var(FoliagePhysics) float FoliageTouchImpulseScale;
|
||
|
|
||
|
/** Determines how strong the force that pushes toward the spring's center will be. */
|
||
|
var(FoliagePhysics) float FoliageStiffness;
|
||
|
|
||
|
/**
|
||
|
* Same as FoliageStiffness, but the strength of this force increases with the square of the distance to the spring's center.
|
||
|
* This force is used to prevent the spring from extending past a certain point due to touch and damage forces.
|
||
|
*/
|
||
|
var(FoliagePhysics) float FoliageStiffnessQuadratic;
|
||
|
|
||
|
/**
|
||
|
* Determines the amount of energy lost by the spring as it oscillates.
|
||
|
* This force is similar to air friction.
|
||
|
*/
|
||
|
var(FoliagePhysics) float FoliageDamping;
|
||
|
|
||
|
/** Clamps the magnitude of each damage force applied. */
|
||
|
var(FoliagePhysics) float MaxDamageImpulse;
|
||
|
|
||
|
/** Clamps the magnitude of each touch force applied. */
|
||
|
var(FoliagePhysics) float MaxTouchImpulse;
|
||
|
|
||
|
/** Clamps the magnitude of combined forces applied each update. */
|
||
|
var(FoliagePhysics) float MaxForce;
|
||
|
|
||
|
//@todo - hook this up
|
||
|
var float Mass;
|
||
|
|
||
|
cpptext
|
||
|
{
|
||
|
protected:
|
||
|
void SetupCollisionCylinder();
|
||
|
public:
|
||
|
virtual void TickSpecial(FLOAT DeltaSeconds);
|
||
|
virtual void Spawned();
|
||
|
virtual void PostLoad();
|
||
|
};
|
||
|
|
||
|
native simulated event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser);
|
||
|
native simulated event Touch( Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal );
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
Begin Object Class=InteractiveFoliageComponent Name=FoliageMeshComponent0
|
||
|
bAllowApproximateOcclusion=TRUE
|
||
|
bForceDirectLightMap=TRUE
|
||
|
bUsePrecomputedShadows=TRUE
|
||
|
// Foliage actors are usually animated using vertex position offset, which does not work correctly with decals
|
||
|
bAcceptsStaticDecals=FALSE
|
||
|
bAcceptsDynamicDecals=FALSE
|
||
|
End Object
|
||
|
StaticMeshComponent=FoliageMeshComponent0
|
||
|
Components.Remove(StaticMeshComponent0)
|
||
|
Components.Add(FoliageMeshComponent0)
|
||
|
|
||
|
// Needs to receive Touch and TakeDamage
|
||
|
bCollideActors=true
|
||
|
// Don't want to block actors, just be notified when they are touching
|
||
|
bBlockActors=false
|
||
|
// Block bullets so we can receive TakeDamage from them, the damage will be passed through with PassThroughDamage
|
||
|
bProjTarget=true
|
||
|
BlockRigidBody=false
|
||
|
|
||
|
// Add a cylinder component to be used for collision
|
||
|
Begin Object Class=CylinderComponent Name=CollisionCylinder
|
||
|
// These get overwritten on load or spawn
|
||
|
CollisionRadius=+00060.000000
|
||
|
CollisionHeight=+00200.000000
|
||
|
CollideActors=true
|
||
|
BlockActors=false
|
||
|
// Don't want the cylinder to block bullets
|
||
|
BlockZeroExtent=false
|
||
|
BlockNonZeroExtent=true
|
||
|
End Object
|
||
|
CollisionComponent=CollisionCylinder
|
||
|
CylinderComponent=CollisionCylinder
|
||
|
Components.Add(CollisionCylinder)
|
||
|
|
||
|
bWorldGeometry=false
|
||
|
// Has to be dynamic to get ticked
|
||
|
bStatic=false
|
||
|
bMovable=false
|
||
|
bNoDelete=true
|
||
|
// Visual effects should tick during async work
|
||
|
TickGroup=TG_DuringAsyncWork
|
||
|
|
||
|
FoliageDamageImpulseScale=20
|
||
|
FoliageTouchImpulseScale=10
|
||
|
FoliageStiffness=10
|
||
|
FoliageStiffnessQuadratic=.3
|
||
|
FoliageDamping=2
|
||
|
MaxDamageImpulse=100000
|
||
|
MaxTouchImpulse=1000
|
||
|
MaxForce=100000
|
||
|
Mass=1
|
||
|
`if(`__TW_PERFORMANCE_)
|
||
|
bSkipPostTickComponentUpdate=TRUE
|
||
|
`endif
|
||
|
}
|