From 0143d8d7d740858938456db31fbdc878d3430c1b Mon Sep 17 00:00:00 2001 From: Jb win Date: Wed, 30 Apr 2025 13:47:42 +0700 Subject: [PATCH] FT - PostStep Update as a Delegate + Can be used to finely control actuators between mj_steps --- .../Private/Actors/MujocoVolumeActor.cpp | 12 ++++++++++++ .../Public/Actors/MujocoVolumeActor.h | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Plugins/LuckyMujoco/Source/LuckyMujoco/Private/Actors/MujocoVolumeActor.cpp b/Plugins/LuckyMujoco/Source/LuckyMujoco/Private/Actors/MujocoVolumeActor.cpp index 2aa1ba5e..d2c585b0 100644 --- a/Plugins/LuckyMujoco/Source/LuckyMujoco/Private/Actors/MujocoVolumeActor.cpp +++ b/Plugins/LuckyMujoco/Source/LuckyMujoco/Private/Actors/MujocoVolumeActor.cpp @@ -109,6 +109,12 @@ template void AMujocoVolumeActor::AssignComponentsToArr } } +template +void AMujocoVolumeActor::BindPostPhysicDelegate(UserClass* Object, void(UserClass::* Func)(float)) +{ + PostPhysicUpdateDelegate.BindUObject(Object, Func); +} + void AMujocoVolumeActor::InitializeMujoco() { if (!Options) @@ -391,11 +397,17 @@ void AMujocoVolumeActor::Tick(float DeltaTime) { if (MujocoData) { + // TODO rename FrameSkip -> SimStepsPerGameFrame - Min 1 - Default 16 + // TODO timestep default .001 (1ms) + // TODO mj_step only inside the for loop + mj_step(MujocoModel.Get(), MujocoData.Get()); + PostPhysicUpdateDelegate.ExecuteIfBound(MujocoData->time); for (int32 Frame = 0; Frame < FrameSkip; ++Frame) { mj_step(MujocoModel.Get(), MujocoData.Get()); + PostPhysicUpdateDelegate.ExecuteIfBound(MujocoData->time); } for (int32 i = 1; i < BodyComponents.Num(); ++i) diff --git a/Plugins/LuckyMujoco/Source/LuckyMujoco/Public/Actors/MujocoVolumeActor.h b/Plugins/LuckyMujoco/Source/LuckyMujoco/Public/Actors/MujocoVolumeActor.h index 12b041e8..8140dcc2 100644 --- a/Plugins/LuckyMujoco/Source/LuckyMujoco/Public/Actors/MujocoVolumeActor.h +++ b/Plugins/LuckyMujoco/Source/LuckyMujoco/Public/Actors/MujocoVolumeActor.h @@ -21,6 +21,10 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnMujocoCompileBegin); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMujocoCompileError, FString, Error); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnMujocoCompileSuccess); +// To be called after mj_step +DECLARE_DELEGATE_OneParam(FPostPhysicUpdate, float); + + UCLASS(Blueprintable, BlueprintType) class LUCKYMUJOCO_API AMujocoVolumeActor : public AActor { @@ -76,6 +80,20 @@ public: UPROPERTY(BlueprintAssignable, Category = "Mujoco | Events") FOnMujocoCompileSuccess OnMujocoCompileSuccess; + // --------------------------- + // ------- POST UPDATE ------- + // --------------------------- +private: + FPostPhysicUpdate PostPhysicUpdateDelegate; +public: + /** + * @description Register a delegate to be executed after mj_step + * @param Object + */ + template + void BindPostPhysicDelegate(UserClass* Object, void (UserClass::*Func)(float)); + + UFUNCTION(BlueprintCallable, Category = "Mujoco") void SetActuatorValue(const FString& ActuatorName, double Value);