diff --git a/Source/URLab/Private/Bridge/MsgpackHelpers.cpp b/Source/URLab/Private/Bridge/MsgpackHelpers.cpp index 38d66034..e00901cc 100644 --- a/Source/URLab/Private/Bridge/MsgpackHelpers.cpp +++ b/Source/URLab/Private/Bridge/MsgpackHelpers.cpp @@ -109,7 +109,8 @@ void PackJsonObjectInner(clmdep_msgpack::packer& Packer, Packer.pack_map(Obj->Values.Num()); for (const auto& Kv : Obj->Values) { - const FString& Key = Kv.Key; + // UE 5.8 keys FJsonObject::Values by TSharedString; *Key works on 5.7 and 5.8. + const FString Key(*Kv.Key); // Keys with kBinSuffix emit real msgpack bin (the suffix is stripped from // the wire field name). The value is either our raw-binary carrier // (EJson::Null, bytes packed directly) or a legacy base64 string (from a diff --git a/Source/URLab/Private/Bridge/RpcHandlers_Camera.cpp b/Source/URLab/Private/Bridge/RpcHandlers_Camera.cpp index a093d5bc..9c1ec341 100644 --- a/Source/URLab/Private/Bridge/RpcHandlers_Camera.cpp +++ b/Source/URLab/Private/Bridge/RpcHandlers_Camera.cpp @@ -305,7 +305,7 @@ TSharedPtr FURLabRpcDispatcher::HandleSetCameraStreaming( // { "zmq": b, "shm": b } -> per-transport; an omitted sub-field is off // UNLESS both are omitted, which means "both on" TMap> Requests; // key -> {zmq, shm} - for (const TPair>& Kv : (*CamObj)->Values) + for (const auto& Kv : (*CamObj)->Values) { if (!Kv.Value.IsValid()) continue; @@ -330,7 +330,7 @@ TSharedPtr FURLabRpcDispatcher::HandleSetCameraStreaming( } // else leave both true (default = enable both) } - Requests.Add(Kv.Key, TPair(bZmq, bShm)); + Requests.Add(FString(*Kv.Key), TPair(bZmq, bShm)); } if (Requests.Num() == 0) @@ -397,7 +397,7 @@ TSharedPtr FURLabRpcDispatcher::HandleSetCameraDelay( // Parse per-camera requests. A bare number means delay_s with defaults; an // object carries delay_s / jitter_s / clock / seed / on_state_change / max_fps. TMap Requests; - for (const TPair>& Kv : (*CamObj)->Values) + for (const auto& Kv : (*CamObj)->Values) { if (!Kv.Value.IsValid()) continue; @@ -435,7 +435,7 @@ TSharedPtr FURLabRpcDispatcher::HandleSetCameraDelay( R.bSetCapture = true; } } - Requests.Add(Kv.Key, R); + Requests.Add(FString(*Kv.Key), R); } if (Requests.Num() == 0) diff --git a/Source/URLab/Private/Bridge/RpcHandlers_Control.cpp b/Source/URLab/Private/Bridge/RpcHandlers_Control.cpp index 6d155ef2..2885634b 100644 --- a/Source/URLab/Private/Bridge/RpcHandlers_Control.cpp +++ b/Source/URLab/Private/Bridge/RpcHandlers_Control.cpp @@ -204,7 +204,7 @@ TSharedPtr FURLabRpcDispatcher::HandleSetUserChannels(const TShared const FString& RejectPrefix) { if (!Channels.IsValid()) return; - for (const TPair>& Pair : Channels->Values) + for (const auto& Pair : Channels->Values) { const FName Channel(*Pair.Key); FMjUserChannel Value; @@ -225,11 +225,11 @@ TSharedPtr FURLabRpcDispatcher::HandleSetUserChannels(const TShared const TSharedPtr* ArtsObj = nullptr; if (Req->TryGetObjectField(TEXT("arts"), ArtsObj)) { - for (const TPair>& ArtPair : (*ArtsObj)->Values) + for (const auto& ArtPair : (*ArtsObj)->Values) { const TSharedPtr* ArtChannels = nullptr; if (ArtPair.Value.IsValid() && ArtPair.Value->TryGetObject(ArtChannels)) - ApplyScope(*ArtChannels, FName(*ArtPair.Key), ArtPair.Key + TEXT("/")); + ApplyScope(*ArtChannels, FName(*ArtPair.Key), FString(*ArtPair.Key) + TEXT("/")); } } diff --git a/Source/URLab/Private/Bridge/RpcHandlers_Step.cpp b/Source/URLab/Private/Bridge/RpcHandlers_Step.cpp index 265f8d2b..22ec28d4 100644 --- a/Source/URLab/Private/Bridge/RpcHandlers_Step.cpp +++ b/Source/URLab/Private/Bridge/RpcHandlers_Step.cpp @@ -168,14 +168,14 @@ static void ParseStepPerArticulation(const TSharedPtr& Req, FString CtlMode; if ((*ArtObj)->TryGetStringField(TEXT("control_mode"), CtlMode)) { - Out.PerArticulationControlMode.Add(Pair.Key, CtlMode); + Out.PerArticulationControlMode.Add(FString(*Pair.Key), CtlMode); } // Positional ctrl array: indexed in articulation actuator order. const TArray>* CtrlList = nullptr; if ((*ArtObj)->TryGetArrayField(TEXT("ctrl"), CtrlList) && CtrlList) { - if (AMjArticulation* Art = Cast(Mgr->GetArticulation(Pair.Key))) + if (AMjArticulation* Art = Cast(Mgr->GetArticulation(FString(*Pair.Key)))) { const TArray Acts = Art->GetActuators(); const FString Prefix = Art->GetCompiledPrefix(); @@ -187,8 +187,7 @@ static void ParseStepPerArticulation(const TSharedPtr& Req, FString LocalName = A->MjName.Get(A->GetName()); if (LocalName.StartsWith(Prefix)) LocalName = LocalName.Mid(Prefix.Len()); - Out.PerArticulationCtrl.FindOrAdd(Pair.Key).Add( - {LocalName, (*CtrlList)[i]->AsNumber()}); + Out.PerArticulationCtrl.FindOrAdd(FString(*Pair.Key)).Add({LocalName, (*CtrlList)[i]->AsNumber()}); } } } @@ -199,8 +198,7 @@ static void ParseStepPerArticulation(const TSharedPtr& Req, { for (auto& KV : (*CtrlMap)->Values) { - Out.PerArticulationCtrl.FindOrAdd(Pair.Key).Add( - {KV.Key, (float)KV.Value->AsNumber()}); + Out.PerArticulationCtrl.FindOrAdd(FString(*Pair.Key)).Add({FString(*KV.Key), (float)KV.Value->AsNumber()}); } } @@ -208,13 +206,13 @@ static void ParseStepPerArticulation(const TSharedPtr& Req, const TSharedPtr* XfrcMap = nullptr; if ((*ArtObj)->TryGetObjectField(TEXT("xfrc_applied"), XfrcMap) && XfrcMap && XfrcMap->IsValid()) { - TMap>& BodyMap = Out.PerArticulationXfrc.FindOrAdd(Pair.Key); + TMap>& BodyMap = Out.PerArticulationXfrc.FindOrAdd(FString(*Pair.Key)); for (auto& KV : (*XfrcMap)->Values) { const TArray>* Arr = nullptr; if (KV.Value->TryGetArray(Arr) && Arr && Arr->Num() == 6) { - TArray& Six = BodyMap.FindOrAdd(KV.Key); + TArray& Six = BodyMap.FindOrAdd(FString(*KV.Key)); Six.SetNum(6); for (int i = 0; i < 6; ++i) Six[i] = (*Arr)[i]->AsNumber(); @@ -265,20 +263,20 @@ void FURLabRpcDispatcher::ParseStepCommon(const TSharedPtr& Req, ECameraInclude E = Mode.Equals(TEXT("sync"), ESearchCase::IgnoreCase) ? ECameraInclude::Sync : ECameraInclude::Latest; - Out.CameraSpec.Add(Kv.Key, E); + Out.CameraSpec.Add(FString(*Kv.Key), E); } else if (Kv.Value->TryGetNumber(Num)) { - Out.CameraSpec.Add(Kv.Key, ECameraInclude::Latest); + Out.CameraSpec.Add(FString(*Kv.Key), ECameraInclude::Latest); if (Num > 0.0) - Out.CameraMinFrameIds.Add(Kv.Key, static_cast(Num)); + Out.CameraMinFrameIds.Add(FString(*Kv.Key), static_cast(Num)); } else if (Kv.Value->TryGetObject(Obj) && Obj && Obj->IsValid()) { - Out.CameraSpec.Add(Kv.Key, ECameraInclude::Latest); + Out.CameraSpec.Add(FString(*Kv.Key), ECameraInclude::Latest); double Fid = 0.0; if ((*Obj)->TryGetNumberField(TEXT("frame_id"), Fid) && Fid > 0.0) - Out.CameraMinFrameIds.Add(Kv.Key, static_cast(Fid)); + Out.CameraMinFrameIds.Add(FString(*Kv.Key), static_cast(Fid)); } } } @@ -363,7 +361,7 @@ TSharedPtr FURLabRpcDispatcher::HandleStep(const TSharedPtrGetArticulation(Pair.Key); + const AMjArticulation* Art = Mgr->GetArticulation(FString(*Pair.Key)); const FName Key(Art ? *Art->GetName() : *Pair.Key); FString CurrentOwner; if (ControlOwnership.CheckWrite(Key, Source, CurrentOwner) @@ -555,7 +553,7 @@ TSharedPtr FURLabRpcDispatcher::HandleReset(const TSharedPtrValues) { - AMjArticulation* Art = Mgr->GetArticulation(APair.Key); + AMjArticulation* Art = Mgr->GetArticulation(FString(*APair.Key)); if (!Art) continue; const TSharedPtr* QObj = nullptr; diff --git a/Source/URLab/Private/Cinematics/MjOrbitCameraActor.cpp b/Source/URLab/Private/Cinematics/MjOrbitCameraActor.cpp index a89d875b..855da82f 100644 --- a/Source/URLab/Private/Cinematics/MjOrbitCameraActor.cpp +++ b/Source/URLab/Private/Cinematics/MjOrbitCameraActor.cpp @@ -120,8 +120,6 @@ void AMjOrbitCameraActor::SetTarget(AMjArticulation* NewTarget) UMjBody* FirstNonDefault = nullptr; for (UMjBody* B : Bodies) { - if (false) - continue; if (!FirstNonDefault) FirstNonDefault = B; diff --git a/Source/URLab/Private/MuJoCo/Convert/MjQuickConvertComponent.cpp b/Source/URLab/Private/MuJoCo/Convert/MjQuickConvertComponent.cpp index e767161a..028c537d 100644 --- a/Source/URLab/Private/MuJoCo/Convert/MjQuickConvertComponent.cpp +++ b/Source/URLab/Private/MuJoCo/Convert/MjQuickConvertComponent.cpp @@ -507,14 +507,14 @@ void UMjQuickConvertComponent::AuthorSceneSpec() // The visual hull is the undecomposed mesh with contact switched // off: it exists so the viewer sees the shape the artist made // rather than the decomposition that collides. - for (const FMjConvertedHull& Hull : ExportHulls(*Smc, Owner->GetName(), false, CoACDThreshold)) + const TArray VisualHulls = ExportHulls(*Smc, Owner->GetName(), false, CoACDThreshold); + if (VisualHulls.Num() > 0) { UMjGeomBase& Visual = - AddGeom(FString::Printf(TEXT("Geom_%d_visual"), MeshIndex), AddMeshAsset(Hull)); + AddGeom(FString::Printf(TEXT("Geom_%d_visual"), MeshIndex), AddMeshAsset(VisualHulls[0])); Visual.Contype = 0; Visual.Conaffinity = 0; Visual.Group = 2; - break; } int32 HullIndex = 0; diff --git a/Source/URLabEditor/Private/MjEditorOpHandlers.cpp b/Source/URLabEditor/Private/MjEditorOpHandlers.cpp index 366886a3..24341269 100644 --- a/Source/URLabEditor/Private/MjEditorOpHandlers.cpp +++ b/Source/URLabEditor/Private/MjEditorOpHandlers.cpp @@ -300,10 +300,9 @@ TSharedPtr HandleEnsureManager(const TSharedPtr& /*Req return MakeJsonError(TEXT("no_world"), TEXT("editor world unavailable")); AAMjManager* Existing = nullptr; - for (TActorIterator It(World); It; ++It) + if (TActorIterator It(World); It) { Existing = *It; - break; } const bool bWasExisting = (Existing != nullptr); diff --git a/Source/URLabEditor/Private/Tests/MjStateCollectorTests.cpp b/Source/URLabEditor/Private/Tests/MjStateCollectorTests.cpp index 8eb30705..a8042590 100644 --- a/Source/URLabEditor/Private/Tests/MjStateCollectorTests.cpp +++ b/Source/URLabEditor/Private/Tests/MjStateCollectorTests.cpp @@ -393,10 +393,9 @@ bool FMjStateSensorRawParity::RunTest(const FString& Parameters) const TArray* IRValues = nullptr; for (const FMjArticulationState& AS : Snap.Articulations) { - for (const FMjSensorState& Sen : AS.Sensors) + if (AS.Sensors.Num() > 0) { - IRValues = &Sen.Values; - break; + IRValues = &AS.Sensors[0].Values; } if (IRValues) break;