1
0
KF2-Dev-Scripts/KFGame/Classes/KFAnimNotify_Decal.uc

113 lines
3.7 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
//=============================================================================
// KFAnimNotify_Decal
//=============================================================================
// Based on GOW3 GearAnimNotify_GearDecal
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFAnimNotify_Decal extends AnimNotify
native(Anim);
struct native DecalData
{
/** Used internally for validate the struct contains useful data */
var bool bIsValid;
/** Material and any other properties that are needed for impact decals */
var() MaterialInterface DecalMaterial;
/** Width of the decal **/
var() float Width;
/** Height of the decal **/
var() float Height;
/** Thickness of the decal (used to calculate the nearplane/farplane values) **/
var() float Thickness;
/** Whether to skip this decal entirely when perf is slow */
var() bool bSkip_ForSlowPerf;
structdefaultproperties
{
Width=6.0f
Height=6.0f
Thickness=10.0f
}
};
// Optimization
var() bool bIgnoreIfActorHidden;
/** BoneName or SocketName to use */
var() Name BoneOrSocketName;
/** Relative Location for Trace Direction */
var() Vector RelativeLocation;
/** Relative Rotation for Trace Direction */
var() Rotator RelativeRotation;
/** How far to trace in the specified direction */
var() float TraceDistance;
/** The material to use for the decal */
var() DecalData Decal;
/** Will only trace straight down regardless of bone or socket orientation */
var() bool bOnlyTraceDown;
/** Arrow Component to visualize in editor */
var editoronly ArrowComponent MyArrowComponent;
cpptext
{
// AnimNotify interface.
virtual void Notify( class UAnimNodeSequence* NodeSeq );
virtual FString GetEditorComment() { return TEXT("Decal"); }
}
event SpawnDecal( Actor Owner, vector TraceLocation, vector TraceDir )
{
local Actor HitActor;
local vector HitLocation, HitNormal;
local TraceHitInfo HitInfo;
//Owner.DrawDebugLine( TraceLocation, TraceLocation + TraceDir * TraceDistance, 0, 255, 0, TRUE );
if( Owner.WorldInfo.MyDecalManager != none && (!Owner.WorldInfo.bDropDetail || !Decal.bSkip_ForSlowPerf) )
{
//Owner.DrawDebugSphere( TraceLocation, 24, 8, 0, 255, 0, TRUE );
if( bOnlyTraceDown )
{
TraceDir.X = 0;
TraceDir.Y = 0;
TraceDir.Z = -1;
}
//Owner.DrawDebugSphere( TraceLocation, 32, 8, 255, 0, 0, true );
//Owner.DrawDebugLine( TraceLocation, TraceLocation + TraceDir * TraceDistance, 0, 255, 0, true );
HitActor = Owner.Trace(HitLocation, HitNormal, TraceLocation + TraceDir * TraceDistance, TraceLocation, false,, HitInfo);
if( HitActor != None )
{
CreateDecal( Owner, Decal, HitActor, HitLocation, HitNormal, HitInfo );
}
}
}
/** Helper for SpawnExplosionDecal() to perform the actual creation of the object */
simulated function DecalComponent CreateDecal(Actor Owner, const out DecalData outDecalData, Actor HitActor, vector HitLocation, vector HitNormal, const out TraceHitInfo HitInfo)
{
local DecalComponent DC;
if( Owner.WorldInfo.MyDecalManager != none )
{
DC = Owner.WorldInfo.MyDecalManager.SpawnDecal( outDecalData.DecalMaterial, HitLocation, rotator(-HitNormal), outDecalData.Width, outDecalData.Height, outDecalData.Thickness, true);
}
return DC;
}
defaultproperties
{
bIgnoreIfActorHidden=true
TraceDistance=128.f
bOnlyTraceDown=true
// To visualize in editor
Begin Object Class=ArrowComponent Name=ArrowComponent0
bTreatAsASprite=True
HiddenGame=true
End Object
MyArrowComponent=ArrowComponent0
}