You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
========================== 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]
374 lines
15 KiB
C++
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;
|
|
}; |