1
0
KF2-Dev-Scripts/Engine/Classes/PhysicalMaterial.uc
2020-12-13 18:01:13 +03:00

183 lines
5.9 KiB
Ucode

/**
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class PhysicalMaterial extends Object
native(Physics)
collapsecategories
hidecategories(Object);
// Used internally by physics engine.
var private{private} native transient pointer PhysXMaterial{class PxMaterial};
var transient int MaterialIndex;
// Surface properties
var() float Friction;
var() float Restitution;
var() bool bForceConeFriction;
// Anisotropic friction support
/** Enable support for different friction in different directions. */
var(Advanced) bool bEnableAnisotropicFriction;
/** Direction (in physics object local space) for FrictionV to be applied. */
var(Advanced) vector AnisoFrictionDir;
/** Friction to be applied in AnisoFrictionDir - Friction will be used for the other direction. */
var(Advanced) float FrictionV;
// Object properties
var() float Density;
var() float AngularDamping;
var() float LinearDamping;
var() float MagneticResponse;
var() float WindResponse;
// This impact/slide system is temporary. We need a system that looks at both PhysicalMaterials, but that is something for the future.
// Impact effects
/** How hard an impact must be to trigger effect/sound */
var(Impact) float ImpactThreshold;
/** Min time between effect/sound being triggered */
var(Impact) float ImpactReFireDelay;
/** Particle effect to play at impact location */
var(Impact) ParticleSystem ImpactEffect;
/** Sound to play */
var(Impact) AkBaseSoundObject ImpactSound;
// Slide effects
/** How fast an object must slide to trigger effect/sound */
var(Slide) float SlideThreshold;
/** How long since last slide before sound/effect can be re-triggered */
var(Slide) float SlideReFireDelay;
/** Effect to place at contact position and enable while sliding */
var(Slide) ParticleSystem SlideEffect;
/** Looping sound to play while objects are sliding */
var(Slide) AkBaseSoundObject SlideSound;
// Fracture effects
/** Sound cue to play when multiple fracture parts are dislodged from a mesh */
var(Fracture) AkBaseSoundObject FractureSoundExplosion;
/** Sound cue to play when a single piece is removed from mesh. */
var(Fracture) AkBaseSoundObject FractureSoundSingle;
`if(`__TW_)
/** If set, line of sight traces will pass through this object (StaticMesh only) */
var() bool bCanSeeThrough;
`endif
/**
* The PhysicalMaterial objects now have a parent reference / pointer. This allows
* you to make single inheritance hierarchies of PhysicalMaterials. Specifically
* this allows one to set default data and then have subclasses over ride that data.
* (e.g. For all materials in the game we are going to say the default Impact Sound
* is SoundA. Now for a Tin Shed we can make a Metal Physical Material and set its
* parent pointer to the Default Material. And then for our Metal PhysicalMaterial
* we say: Play SoundB for Pistols and Rifles. Leaving everything else blank, our
* code can now traverse up the tree to the Default PhysicalMaterial and read the
* values out of that.
*
* This allows for very specific and interesting behavior that is for the most part
* completely in the hands of your content creators.
*
* A programmer is needed only to create the orig set of parameters and then it is
* all data driven parameterization!
*
**/
var(Parent) PhysicalMaterial Parent;
var(PhysicalProperties) export editinline PhysicalMaterialPropertyBase PhysicalMaterialProperty;
cpptext
{
// UObject interface
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
virtual void FinishDestroy();
#if WITH_PHYSX
class PxMaterial* GetOrCreatePhysXMaterial();
#endif // WITH_PHYSX
/**
* This will fix any old PhysicalMaterials that were created in the PhysMaterial's outer instead
* of correctly inside the PhysMaterial. This will allow "broken" PhysMaterials to be renamed.
**/
virtual UBOOL Rename( const TCHAR* NewName=NULL, UObject* NewOuter=NULL, ERenameFlags Flags=REN_None );
}
/** Enum to differentiate between impact and slide effects. */
enum EPhysEffectType
{
EPMET_Impact,
EPMET_Slide
};
/** Walk up the PhysMat heirarchy to fill in the supplied PhysEffectInfo struct. */
function native PhysEffectInfo FindPhysEffectInfo(EPhysEffectType Type);
/** Look up PhysicalMaterial heriarchy to find fracture sounds */
simulated function FindFractureSounds(out AkBaseSoundObject OutSoundExplosion, out AkBaseSoundObject OutSoundSingle)
{
local PhysicalMaterial TestMat;
OutSoundExplosion = None;
OutSoundSingle = None;
// keep looking until we find all sounds or run out of materials
TestMat = self;
while( (OutSoundExplosion == None || OutSoundSingle == None) && TestMat != None )
{
// For each empty slot, atempt to fill from this phys material
if(OutSoundSingle == None)
{
OutSoundSingle = TestMat.FractureSoundSingle;
}
if(OutSoundExplosion == None)
{
OutSoundExplosion = TestMat.FractureSoundExplosion;
}
TestMat = TestMat.Parent;
}
return;
}
/** finds a physical material property of the desired class, querying the parent if this material doesn't have it
* @param DesiredClass the class of physical material property to search for
* @return a PhysicalMaterialPropertyBase matching the desired class, or none if there isn't one
*/
simulated function PhysicalMaterialPropertyBase GetPhysicalMaterialProperty(class<PhysicalMaterialPropertyBase> DesiredClass)
{
if (PhysicalMaterialProperty != None && ClassIsChildOf(PhysicalMaterialProperty.Class, DesiredClass))
{
return PhysicalMaterialProperty;
}
else if (Parent != None)
{
return Parent.GetPhysicalMaterialProperty(DesiredClass);
}
else
{
return None;
}
}
defaultproperties
{
Friction=0.7
Restitution=0.3
Density=1.0
AngularDamping=0.0
LinearDamping=0.01
MagneticResponse=0.0
WindResponse=0.0
}