Files
UnrealEngineUWP/Engine/Source/Runtime/AnimGraphRuntime/Public/BoneControllers/AnimNode_AnimDynamics.h
Max Chen 41e5062f30 Copying //UE4/Dev-Sequencer to //UE4/Main (Source: //UE4/Dev-Sequencer @ 2945541)
==========================
MAJOR FEATURES + CHANGES
==========================

Change 2837601 on 2016/01/20 by Thomas.Sarkanen

	Sequencer: Exposed bool, byte, event, fade, float, slomo, and visibility section keys in context menu

Change 2840895 on 2016/01/23 by Thomas.Sarkanen

	Sequencer: Moved key proxy handling from section into key area; added support for grouped keys; exposed color properties in context menu.

Change 2901092 on 2016/03/09 by Thomas.Sarkanen

	Sequencer: Fixed ensure() and crash when exiting PIE & then playing back in editor

	Made sure that instances that are playing that have active montages can re-connect to a playing montage if it is already active. We dont stop/start preview/non-
preview playback when switching modes right now so I've just made the system robust to the switch when playing back animation.
	Ensured that instances are kept up to date by hooking into EndPlayMapDelegate. This fires slightly later than OnEndPIE, so it allows us to pick up when instances
have been deleted from the world. OnEndPIE is fired before the worlds are shutdown so instances can still be bound to valid (but nearly dead) actors at this point.

	#jira UE-27898
	#jira UE-27899

Change 2901159 on 2016/03/09 by Chris.Bunner

	Allow EXR frames from SaveHighResScreenshot to be uncompressed (r.SaveUncompressedEXRFrames).

Change 2903123 on 2016/03/10 by Max.Chen

	Sequencer: Add snapping for the in/out range.

Change 2903126 on 2016/03/10 by Max.Chen

	Sequencer: Fix split and trim for cinematic shot sections so that the start offset value is set.

Change 2903132 on 2016/03/10 by Max.Chen

	Sequencer: Create camera here and set it as the current camera cut.

Change 2903138 on 2016/03/10 by Max.Chen

	Sequencer: Improve mechanism for adding objects to Sequencer. Hold down shift while dragging from content browser to add as a spawnable. Hold down ctrl while
dragging from content browser to add as a possessable.

Change 2903143 on 2016/03/10 by Max.Chen

	Sequencer: Add 4k to movie capture dialog.

	#jira UE-28147

Change 2903157 on 2016/03/10 by Max.Chen

	Sequencer: Pop out of locked camera when popping out of the sequence.

	#jira UE-27662

Change 2908097 on 2016/03/14 by Andrew.Rodham

	Sequencer: Added default viewport type onto the viewport types menu
	  - The activation command for a given viewport type no longer toggles it if it's already active, it will just do nothing.
	  - Switching back to the default viewport type can be achieved with SHIFT+D

Change 2911869 on 2016/03/16 by Max.Preussner

	Editor: Caching device proxy manager, so the UI doesn't constantly poll for the TargetDeviceServices module

Change 2917943 on 2016/03/22 by Thomas.Sarkanen

	Sequence Recording: Added "Record New Sequence From Current Player" to sub-sequence track menu

	This option is only available in PIE. When selected it primes a new seciton for recording against the pawn that is currently being controlled by the player.

Change 2917946 on 2016/03/22 by Max.Chen

	Sequencer: Automatically add and attach a cine camera when dropping a crane or rail.

Change 2917954 on 2016/03/22 by Thomas.Sarkanen

	Fix anim dynamics going crazy on time skips

	Added new API to FAnimNode_Base: NeedsDynamicReset and ResetDynamics.
	This allows nodes that subscribe to this interface to be reset on teleport/time skips.
	Call through to ResetDynamics on zero timestep (ie. skips) in the preview path in Sequencer.

Change 2917961 on 2016/03/22 by Frank.Fella

	Sequencer - Sequencer - Update the color track code to match the behavior in matinee, also remove empty light color tracks from the sequence, and add a missing
particle parameter track.

Change 2917984 on 2016/03/22 by Max.Chen

	Sequencer: Fix crash on deleting object binding nodes multiple times.

Change 2917986 on 2016/03/22 by Max.Chen

	Sequencer: Fix if adding multiple camera cuts at the same time with the same duration as an existing camera cut. The camera is replaced in this case.

Change 2917994 on 2016/03/22 by Jeff.Farris

	Support for scene depth picker. Used for focus depth sampling in cine cams.

Change 2918003 on 2016/03/22 by Max.Chen

	Sequencer - Fix selection issues related to keying an undo by moving the selection clear on rebuild to after the tree selection state has been cached by path.

Change 2920371 on 2016/03/23 by Max.Preussner

	UnrealEd: Added a file import path that doesn't load the entire file into memory prior to importing

	UFactory::StaticImport will now call FactoryCreateFile for both text and binary files. The default implementation will load the file into a buffer/string and call
FactoryCreateBinary/FactoryCreateText to preserve legacy behavior. New factories may override FactoryCreateFile to perform their own file processing instead.

Change 2923359 on 2016/03/25 by Max.Preussner

	UnrealEd: Refactored out StaticImportObject code into ImportObject

Change 2924887 on 2016/03/28 by Jeff.Farris

	Sequencer: Camera Anim and Camera Shake tracks now support PostProcess changes in the CameraAnim

Change 2927283 on 2016/03/30 by Max.Chen

	Sequencer: Fix crash resetting default in audio track in sequencer. Fix audio track rename when adding another audio.

	#jira UE-28836, UE-28859

Change 2928290 on 2016/03/30 by Max.Preussner

	ContentBrowser: Disabling 'Show in Explorer' context menu option for newly created/unsaved asset(s)

Change 2928480 on 2016/03/30 by Max.Preussner

	AssetTools: Added built-in type category for Media assets

Change 2928498 on 2016/03/30 by Max.Preussner

	AssetTools: Sorting asset type categories alphabetically

Change 2932326 on 2016/04/04 by Frank.Fella

	Sequencer - Add "paste from matinee" support for audio tracks, and add volume support to audio sections in sequencer.

Change 2933917 on 2016/04/05 by Max.Preussner

	Core: Added microseconds support to FTimespan

Change 2933920 on 2016/04/05 by Max.Preussner

	Sockets: Simplified socket timeout assignments

Change 2935434 on 2016/04/06 by Max.Chen

	Sequencer: Deselect possessable before converting it to a spawnable and deleting it. Also, make sure the newly converted spawnables are selected. This fixes a bug
where the transform gizmo remains after adding a spawnable.

	Also, consolidate code for adding possessables to sequencer so that the newly added possessable node will be selected in the widget tree.

	#jira UE-28215

Change 2935590 on 2016/04/06 by Jeff.Farris

	Made crane rig preview mesh at the tip move as expected and appear in a reasonable place.

Change 2936082 on 2016/04/07 by Max.Chen

	Sequencer: Attach should use default attach component of the actor if it exists. This fixes a bug where trying to attach to a camera crane rig attaches to the
proper component.

Change 2936118 on 2016/04/07 by Max.Chen

	Sequencer: Adding crane/rail with shift now adds the crane/rig as a spawnable and the attached cine camera as a spawnable. An attach track is created for the cine
camera spawnable.

	#jira UE-28308

Change 2937226 on 2016/04/07 by Max.Chen

	Sequencer: Add invalidation when levels are added or removed.This fixes a bug were if you have a level sequence open and then add a sublevel that the level
sequence operates on, it correctly updates the actors from the new sub level.

	#jira UE-27595

Change 2937263 on 2016/04/07 by Frank.Fella

	Sequencer - Changed the matinee to sequencer conversion tools so that curve keys set to "clamped auto" import as user tangents since we don't support clamped auto
in sequencer.

Change 2937273 on 2016/04/07 by Max.Chen

	Sequencer: No longer experimental/betal and now enabled by default.

	#jira UETOOl-625

Change 2937694 on 2016/04/08 by Max.Chen

	Curve Editor: Separate out input and output snapping.

	#jira UE-27209

Change 2937852 on 2016/04/08 by Andrew.Rodham

	Sequencer: Spawnables no longer use generated classes

	  - Spawnables now store a template actor instance, rather than a generated class
	  - All relevant code has been converted to use this new approach
	  - Spawnable defaults are now harvested directly from any spawned instances when the movie scene is saved, or when the object is de-spawned. We only do this for
spawnables *in the currently active sequence instance*. This approach ensures that instance components and other properties persist.
	    - Currently we don't mark the package as dirty when the defaults are changed. This needs to be addressed.
	  - Some fixes have been made to AActor and Actor Iterators to ensure that actors not contained within a level do not crash.
	  - Spawning optimisations to follow

Change 2937956 on 2016/04/08 by Max.Preussner

	Sequencer: Added selection range commands to general toolbar menu

Change 2937981 on 2016/04/08 by Max.Preussner

	Sequencer: Refactored GetKeyHandles to take a time range for filtering keys

Change 2938007 on 2016/04/08 by Max.Preussner

	Sequencer: Implemented selection range key selection

Change 2938184 on 2016/04/08 by Max.Chen

	Sequencer: Find in Content Browser is now in the top level menubar.

	#jira UE-21598

Change 2938665 on 2016/04/08 by Frank.Fella

	UMG - Add support for material animation.

Change 2939048 on 2016/04/10 by Max.Chen

	CineCamera: Change current position on rail to normalize position.

Change 2939067 on 2016/04/10 by Max.Chen

	Sequencer: Add paste color from matinee

Change 2939587 on 2016/04/11 by Andrew.Rodham

	Sequencer: Fixes to spawnable rework
	  - Removed commented out code.
	  - Fixed particle system components not disabling auto activate.
	  - Instance Components are now correctly registered on spawn.
	  - Removed ability to set the editable flag on actors in favor of a delegate assigned to SActorDetails to disable property editing on actors spawned from outside
of the currently focused sequence.

Change 2939666 on 2016/04/11 by Andrew.Rodham

	Sequencer: Fixed active sequence ID not being set on creation

Change 2940663 on 2016/04/12 by Andrew.Rodham

	Sequencer: Spawnable object templates now always have the RF_ArchetypeObject flag

	#jira UE-29337, UE-29339

Change 2940742 on 2016/04/12 by Thomas.Sarkanen

	Improvements to sequence recording API

	Sequence recording is now more extensible.
	Moved the majority of recorders into a seperate module.
	Cleaned up recorder API, removed bRecord that was only really used once.
	Added factory class as a modular feature that allows users to register and implement their own recorders.
	Recorders can supply their own settings classes. These are incorporated into the UI via a details customization so they appear to be seamlessly integrated.
	Exposed components to record as an advanced setting. Users can use this to gate the components and actors that are recorded.

	#jira UE-28850 - Update sequence recording API for better extensibility

Change 2940828 on 2016/04/12 by Max.Chen

	Level Editor: Clear the camera preview if the level viewport is locked to the same camera.

	#jira UE-27489

Change 2941090 on 2016/04/12 by Frank.Fella

	Sequencer - Fix inconsistencies with the level visibility track.
	+ Add an option to update a track instance when it stops playing due to it's parent movie scene being deactivated as a sub-scene.
	+ Reset level visibility state when the section ends, or when it's parent subsection ends.

Change 2941427 on 2016/04/12 by Andrew.Rodham

	Sequencer: Fixes for recorded dynamic components
	  - Dynamic components are now named uniquely within their owner actor, and are no longer re-bound to new object tracks when detached/re-attached
	  - New dynamic components are created every time a new component is detected on an actor, regardless of whether it was once attached before. This affords
recording externally managed components from a component pool.
	  - Section recorders for components that are no longer attached to the actor are now disabled correctly.

Change 2941760 on 2016/04/12 by Max.Preussner

	Editor: Setting up correct material expresions when creating material from normal map texture

Change 2941819 on 2016/04/13 by Max.Chen

	Sequencer: Fire named events in all sublevels.

	#jira UE-28843

Change 2942052 on 2016/04/13 by Andrew.Rodham

	Sequencer: Fixed not being able to add dynamic material parameter tracks to spawnables when the object is not spawned

	#jira UE-24287

Change 2942223 on 2016/04/13 by Max.Preussner

	Editor: Using built-in function to assign sampler format

Change 2942833 on 2016/04/13 by Max.Chen

	Sequencer: More copy matinee helpers.

	- Make some sections infinite.
	- Fix FindPossessableObjectId
	- Expose FindGroupByName

Change 2942944 on 2016/04/13 by Max.Chen

	Sequencer: Fix anim copy so that it doesn't create an animation clip longer than the next clip's start position.

Change 2943313 on 2016/04/14 by Max.Chen

	Sequencer: Initial matinee to level sequence asset converter. Right click on a matinee actor in the level and choose "Convert to Level Sequence"

	Current supports:
	 - movement tracks
	 - generic property tracks
	 - particle tracks
	 - anim control tracks
	 - event tracks
	 - audio tracks
	 - visibility track
	 - director track (fade, slomo, camera cuts)

	Possible todos:
	- Relative scale3D
	- Option to create spawnables instead of possessables
	- Create shots per director track camera cut instead of a direct translation to the camera cut track

	#jira UETOOL-467

Change 2943596 on 2016/04/14 by Andrew.Rodham

	Editor: Fixed placement mode scrollbar visibility not working for custom content

	#jira UE-27191

Change 2943651 on 2016/04/14 by Max.Chen

	Sequencer: Invalidate the audio waveform when the source changes.

	#jira UE-29394

Change 2943674 on 2016/04/14 by Max.Chen

	Sequencer: Store/restore playback state when rebuilding.

	#jira UE-29452

Change 2943993 on 2016/04/14 by Max.Chen

	Sequencer: Convert slot name from matinee to level sequence.

Change 2944156 on 2016/04/14 by Frank.Fella

	Sequencer - Fix undo when moving items into folders, and when deleting folder.

	#jira UE-27368

Change 2944227 on 2016/04/14 by Max.Chen

	Sequencer: Show curves in the curve editor if one of the parent nodes is selected. For example, if Location is selected, show Location.X, Location.Y, and
Location.Z

Change 2945057 on 2016/04/15 by Andrew.Rodham

	Editor: Fixed placement mode scrollbar visibility not working for custom content

	#jira UE-27191

#lockdown nick.penwarden

[CL 2945551 by Max Chen in Main branch]
2016-04-15 14:50:58 -04:00

374 lines
15 KiB
C++

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AnimPhysicsSolver.h"
#include "AnimNode_SkeletalControlBase.h"
#include "AnimNode_AnimDynamics.generated.h"
DECLARE_CYCLE_STAT_EXTERN(TEXT("Anim Dynamics Overall"), STAT_AnimDynamicsOverall, STATGROUP_Physics, ANIMGRAPHRUNTIME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Anim Dynamics Wind Data Update"), STAT_AnimDynamicsWindData, STATGROUP_Physics, ANIMGRAPHRUNTIME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Anim Dynamics Bone Evaluation"), STAT_AnimDynamicsBoneEval, STATGROUP_Physics, ANIMGRAPHRUNTIME_API);
DECLARE_DWORD_COUNTER_STAT_EXTERN(TEXT("Anim Dynamics Sub-Steps"), STAT_AnimDynamicsSubSteps, STATGROUP_Physics, ANIMGRAPHRUNTIME_API);
/** Supported angular constraint types */
UENUM()
enum class AnimPhysAngularConstraintType : uint8
{
Angular,
Cone
};
/** Supported linear axis constraints */
UENUM()
enum class AnimPhysLinearConstraintType : uint8
{
Free,
Limited,
};
UENUM()
enum class AnimPhysSimSpaceType : uint8
{
Component UMETA(ToolTip = "Sim origin is the location/orientation of the skeletal mesh component."),
Actor UMETA(ToolTip = "Sim origin is the location/orientation of the actor containing the skeletal mesh component."),
World UMETA(ToolTip = "Sim origin is the world origin. Teleporting characters is not recommended in this mode."),
RootRelative UMETA(ToolTip = "Sim origin is the location/orientation of the root bone."),
BoneRelative UMETA(ToolTip = "Sim origin is the location/orientation of the bone specified in RelativeSpaceBone"),
};
/** Helper mapping a rigid body to a bone reference */
struct FAnimPhysBoneRigidBody
{
FAnimPhysBoneRigidBody(TArray<FAnimPhysShape>& Shapes, const FVector& Position, const FBoneReference& LinkedBone)
: PhysBody(Shapes, Position)
, BoundBone(LinkedBone)
{}
FAnimPhysRigidBody PhysBody;
FBoneReference BoundBone;
};
/** Helper describing a body linked to an optional parent (can be nullptr) */
struct FAnimPhysLinkedBody
{
FAnimPhysLinkedBody(TArray<FAnimPhysShape>& Shapes, const FVector& Position, const FBoneReference& LinkedBone)
: RigidBody(Shapes, Position, LinkedBone)
, ParentBody(nullptr)
{}
FAnimPhysBoneRigidBody RigidBody;
FAnimPhysBoneRigidBody* ParentBody;
};
/** Constraint setup struct, holds data required to build a physics constraint */
USTRUCT()
struct FAnimPhysConstraintSetup
{
GENERATED_BODY()
FAnimPhysConstraintSetup()
: LinearXLimitType(AnimPhysLinearConstraintType::Limited)
, LinearYLimitType(AnimPhysLinearConstraintType::Limited)
, LinearZLimitType(AnimPhysLinearConstraintType::Limited)
, AngularConstraintType(AnimPhysAngularConstraintType::Angular)
, TwistAxis(AnimPhysTwistAxis::AxisX)
, ConeAngle(0.0f)
, AngularXAngle_DEPRECATED(0.0f)
, AngularYAngle_DEPRECATED(0.0f)
, AngularZAngle_DEPRECATED(0.0f)
{}
/** Whether to limit the linear X axis */
UPROPERTY(EditAnywhere, Category = Linear)
AnimPhysLinearConstraintType LinearXLimitType;
/** Whether to limit the linear Y axis */
UPROPERTY(EditAnywhere, Category = Linear)
AnimPhysLinearConstraintType LinearYLimitType;
/** Whether to limit the linear Z axis */
UPROPERTY(EditAnywhere, Category = Linear)
AnimPhysLinearConstraintType LinearZLimitType;
/** Minimum linear movement per-axis (Set zero here and in the max limit to lock) */
UPROPERTY(EditAnywhere, Category = Linear, meta = (UIMax = "0", ClampMax = "0"))
FVector LinearAxesMin;
/** Maximum linear movement per-axis (Set zero here and in the min limit to lock) */
UPROPERTY(EditAnywhere, Category = Linear, meta = (UIMin = "0", ClampMin = "0"))
FVector LinearAxesMax;
/** Method to use when constraining angular motion */
UPROPERTY(EditAnywhere, Category = Angular)
AnimPhysAngularConstraintType AngularConstraintType;
/** Axis to consider for twist when constraining angular motion (forward axis) */
UPROPERTY(EditAnywhere, Category = Angular)
AnimPhysTwistAxis TwistAxis;
/** Angle to use when constraining using a cone */
UPROPERTY(EditAnywhere, Category = Angular, meta = (UIMin = "0", UIMax = "90", ClampMin = "0", ClampMax = "90"))
float ConeAngle;
/** X-axis limit for angular motion when using the "Angular" constraint type (Set to 0 to lock, or 180 to remain free) */
UPROPERTY()
float AngularXAngle_DEPRECATED;
/** Y-axis limit for angular motion when using the "Angular" constraint type (Set to 0 to lock, or 180 to remain free) */
UPROPERTY()
float AngularYAngle_DEPRECATED;
/** Z-axis limit for angular motion when using the "Angular" constraint type (Set to 0 to lock, or 180 to remain free) */
UPROPERTY()
float AngularZAngle_DEPRECATED;
UPROPERTY(EditAnywhere, Category = Angular, meta = (UIMin = "-180", UIMax = "180", ClampMin = "-180", ClampMax = "180"))
FVector AngularLimitsMin;
UPROPERTY(EditAnywhere, Category = Angular, meta = (UIMin = "-180", UIMax = "180", ClampMin = "-180", ClampMax = "180"))
FVector AngularLimitsMax;
/** Axis on body1 to match to the angular target direction. */
UPROPERTY(EditAnywhere, Category = Angular)
AnimPhysTwistAxis AngularTargetAxis;
/** Target direction to face for body1 (in body0 local space) */
UPROPERTY(EditAnywhere, Category = Angular)
FVector AngularTarget;
/** The values below are calculated on initialisation and used when building the limits */
/** If all axes are locked we can use 3 linear limits instead of the 6 needed for limited axes */
UPROPERTY()
bool bLinearFullyLocked;
};
USTRUCT()
struct FAnimPhysPlanarLimit
{
GENERATED_BODY();
/** When using a driving bone, the plane transform will be relative to the bone transform */
UPROPERTY(EditAnywhere, Category=PlanarLimit)
FBoneReference DrivingBone;
/** Transform of the plane, this is either in component-space if no DrivinBone is specified
* or in bone-space if a driving bone is present.
*/
UPROPERTY(EditAnywhere, Category=PlanarLimit)
FTransform PlaneTransform;
};
USTRUCT()
struct ANIMGRAPHRUNTIME_API FAnimNode_AnimDynamics : public FAnimNode_SkeletalControlBase
{
GENERATED_BODY();
FAnimNode_AnimDynamics();
/** The space used to run the simulation */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
AnimPhysSimSpaceType SimulationSpace;
/** When in BoneRelative sim space, the simulation will use this bone as the origin */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
FBoneReference RelativeSpaceBone;
/** Set to true to use the solver to simulate a connected chain */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
bool bChain;
/** The bone to attach the physics body to, if bChain is true this is the top of the chain */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
FBoneReference BoundBone;
/** If bChain is true this is the bottom of the chain, otherwise ignored */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup, meta=(EditCondition = bChain))
FBoneReference ChainEnd;
/** Extents of the box to use for simulation */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
FVector BoxExtents;
/** Vector relative to the body being simulated to attach the constraint to */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
FVector LocalJointOffset;
/** Scale for gravity, higher values increase forces due to gravity */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
float GravityScale;
/** If true the body will attempt to spring back to its initial position */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
bool bLinearSpring;
/** If true the body will attempt to align itself with the specified angular target */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
bool bAngularSpring;
/** Spring constant to use when calculating linear springs, higher values mean a stronger spring.*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
float LinearSpringConstant;
/** Spring constant to use when calculating angular springs, higher values mean a stronger spring */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Setup)
float AngularSpringConstant;
/** Whether or not wind is enabled for the bodies in this simulation */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Wind)
bool bEnableWind;
/** Scale to apply to calculated wind velocities in the solver */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Wind)
float WindScale;
/** If true, the override value will be used for linear damping */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
bool bOverrideLinearDamping;
/** Overridden linear damping value */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
float LinearDampingOverride;
/** If true, the override value will be used for angular damping */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
bool bOverrideAngularDamping;
/** Overridden angular damping value */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
float AngularDampingOverride;
/** If true we will perform physics update, otherwise skip - allows visualisation of the initial state of the bodies */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
bool bDoUpdate;
/** If true we will perform bone transform evaluation, otherwise skip - allows visualisation of the initial anim state compared to the physics sim */
UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = Setup)
bool bDoEval;
/** Number of update passes on the linear and angular limits before we solve the position of the bodies recommended to be four times the value of NumSolverIterationsPostUpdate */
UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Setup)
int32 NumSolverIterationsPreUpdate;
/** Number of update passes on the linear and angular limits after we solve the position of the bodies, recommended to be around a quarter of NumSolverIterationsPreUpdate */
UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Setup)
int32 NumSolverIterationsPostUpdate;
/** Data describing the constraints we will apply to the body */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Constraint)
FAnimPhysConstraintSetup ConstraintSetup;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=PlanarLimit)
bool bUsePlanarLimit;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=PlanarLimit)
TArray<FAnimPhysPlanarLimit> PlanarLimits;
/** Resolution method for planar limits */
UPROPERTY(EditAnywhere, Category = PlanarLimit)
AnimPhysCollisionType CollisionType;
/** Radius to use if CollisionType is set to CustomSphere */
UPROPERTY(EditAnywhere, Category = PlanarLimit, meta = (UIMin = "1", ClampMin = "1"))
float SphereCollisionRadius;
/** An external force to apply to all bodies in the simulation when ticked, specified in world space */
UPROPERTY(EditAnywhere, Category = Forces, meta = (PinShownByDefault))
FVector ExternalForce;
// FAnimNode_SkeletalControlBase interface
virtual void Initialize(const FAnimationInitializeContext& Context) override;
virtual void UpdateInternal(const FAnimationUpdateContext& Context) override;
virtual void EvaluateBoneTransforms(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases, TArray<FBoneTransform>& OutBoneTransforms) override;
virtual void GatherDebugData(FNodeDebugData& DebugData) override;
virtual bool HasPreUpdate() const override { return true; }
virtual void PreUpdate(const UAnimInstance* InAnimInstance) override;
virtual bool NeedsDynamicReset() const { return true; }
virtual void ResetDynamics() { RequestInitialise(); }
// End of FAnimNode_SkeletalControlBase interface
void RequestInitialise() { bRequiresInit = true; }
void InitPhysics(USkeletalMeshComponent* Component, FCSPose<FCompactPose>& MeshBases);
void TermPhysics();
void UpdateLimits(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases);
int32 GetNumBodies() const;
const FAnimPhysRigidBody& GetPhysBody(int32 BodyIndex) const;
#if WITH_EDITOR
// Accessors for editor code (mainly for visualization functions)
FVector GetBodyLocalJointOffset(int32 BodyIndex) const;
// Gets the number of currently bound bones (always 1 unless using a chain)
int32 GetNumBoundBones() const;
// Gets the specified bound bone reference
const FBoneReference* GetBoundBoneReference(int32 Index) const;
#endif
protected:
// FAnimNode_SkeletalControlBase protected interface
virtual void InitializeBoneReferences(const FBoneContainer& RequiredBones) override;
virtual bool IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones);
// End of FAnimNode_SkeletalControlBase protected interface
private:
// Given a bone index, get it's transform in the currently selected simulation space
FTransform GetBoneTransformInSimSpace(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases, const FCompactPoseBoneIndex& BoneIndex);
// Given a transform in simulation space, convert it back to component space
FTransform GetComponentSpaceTransformFromSimSpace(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases, const FCompactPoseBoneIndex& BoneIndex, const FTransform& InSimTransform);
// Given a world-space vector, convert it into the current simulation space
FVector TransformWorldVectorToSimSpace(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases, const FVector& InVec);
// We can't get clean bone positions unless we are in the evaluate step.
// Requesting an init or reinit sets this flag for us to pick up during evaluate
bool bRequiresInit;
// Maximum time to consider when accumulating time debt to avoid spiraling
static const float MaxTimeDebt;
// Cached timestep from the update phase (needed in evaluate phase)
float NextTimeStep;
// Current amount of time debt
float TimeDebt;
// Current time dilation
float CurrentTimeDilation;
// Cached physics settings. We cache these on initialise to avoid the cost of accessing UPhysicsSettings a lot each frame
float MaxPhysicsDeltaTime;
float MaxSubstepDeltaTime;
int32 MaxSubsteps;
//////////////////////////////////////////////////////////////////////////
// Active body list
TArray<FAnimPhysLinkedBody> Bodies;
// Pointers back to the base bodies to pass to the simulation
TArray<FAnimPhysRigidBody*> BaseBodyPtrs;
// List of current linear limits built for the current frame
TArray<FAnimPhysLinearLimit> LinearLimits;
// List of current angular limits built for the current frame
TArray<FAnimPhysAngularLimit> AngularLimits;
// List of spring force generators created for this frame
TArray<FAnimPhysSpring> Springs;
// Local space offsets for each body
TArray<FVector> JointOffsets;
// List of bone references for all bodies in this node
TArray<FBoneReference> BoundBoneReferences;
// Gravity direction in sim space
FVector SimSpaceGravityDirection;
};