Files
UnrealEngine/Engine/Plugins/ChaosClothAssetEditor/Source/ChaosClothAssetDataflowNodes/Public/ChaosClothAsset/SimulationSolverConfigNode.h
2025-05-18 13:04:45 +08:00

92 lines
3.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "ChaosClothAsset/SimulationBaseConfigNode.h"
#include "SimulationSolverConfigNode.generated.h"
/** Solver properties configuration node. */
USTRUCT(Meta = (DataflowCloth))
struct FChaosClothAssetSimulationSolverConfigNode : public FChaosClothAssetSimulationBaseConfigNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FChaosClothAssetSimulationSolverConfigNode, "SimulationSolverConfig", "Cloth", "Cloth Simulation Solver Config")
public:
/**
* The number of time step dependent solver iterations. This sets iterations at 60fps.
* NumIterations can never be bigger than MaxNumIterations.
* At lower fps up to MaxNumIterations may be used instead. At higher fps as low as one single iteration might be used.
* Higher number of iterations will increase the stiffness of all constraints and improve convergence, but will also increase the CPU cost of the simulation.
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (UIMin = "1", UIMax = "10", ClampMin = "0", ClampMax = "100", InteractorName = "NumIterations"))
int32 NumIterations = 1;
/**
* The maximum number of solver iterations.
* This is the upper limit of the number of iterations set in solver, when the frame rate is lower than 60fps.
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (UIMin = "1", UIMax = "10", ClampMin = "1", ClampMax = "100", InteractorName = "MaxNumIterations"))
int32 MaxNumIterations = 6;
/**
* The number of solver substeps.
* This will increase the precision of the collision inputs and help with constraint resolutions but will increase the CPU cost.
*/
UPROPERTY(EditAnywhere, Category = Simulation, DisplayName = "Num Substeps", meta = (UIMin = "1", UIMax = "10", ClampMin = "1", ClampMax = "100", InteractorName = "NumSubsteps"))
FChaosClothAssetImportedIntValue NumSubstepsImported = {UE::Chaos::ClothAsset::FDefaultSolver::SubSteps};
/**
* Enable dynamic substepping.
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (InlineEditConditionToggle))
bool bEnableDynamicSubstepping = false;
/**
* Choose the number of substeps based on a target substep delta time in milliseconds. Substeps are clamped to [1, NumSubsteps].
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (UIMin = "1", UIMax = "30", ClampMin = "0", ClampMax = "1000", EditCondition = "bEnableDynamicSubstepping", InteractorName = "DynamicSubstepDeltaTime"))
float DynamicSubstepDeltaTime = 16.67f;
/**
* Enable setting separate SelfCollisionSubsteps. Otherwise, self collisions will be detected every substep.
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (InteractorName = "EnableNumSelfCollisionSubsteps"))
bool bEnableNumSelfCollisionSubsteps = false;
/**
* Set a separate number of self collision substeps. Lower this number to increase speed at the expense of lower self collision accuracy.
* Actual value always clamped between [1, NumSubsteps].
*/
UPROPERTY(EditAnywhere, Category = Simulation, meta = (UIMin = "1", UIMax = "10", ClampMin = "1", ClampMax = "100", EditCondition = "bEnableNumSelfCollisionSubsteps", InteractorName = "NumSelfCollisionSubsteps"))
int32 NumSelfCollisionSubsteps = 1;
FChaosClothAssetSimulationSolverConfigNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid());
virtual void Serialize(FArchive& Ar) override;
private:
// Deprecated properties
#if WITH_EDITORONLY_DATA
UPROPERTY()
int32 NumSubsteps_DEPRECATED = UE::Chaos::ClothAsset::FDefaultSolver::SubSteps;
UPROPERTY()
bool bEnableForceBasedSolver_DEPRECATED = false;
UPROPERTY()
int32 NumNewtonIterations_DEPRECATED = 0;
UPROPERTY()
int32 MaxNumCGIterations_DEPRECATED = 50;
UPROPERTY()
float CGResidualTolerance_DEPRECATED = 1e-4;
UPROPERTY()
bool bDoQuasistatics_DEPRECATED = false;
#endif
virtual void AddProperties(FPropertyHelper& PropertyHelper) const override;
};