From d1f8112c26ed4eb91646079745b632a7ce1526ca Mon Sep 17 00:00:00 2001 From: LSBOSS Date: Wed, 15 Jul 2020 13:31:01 +0200 Subject: [PATCH] Fixes #2854: [UE4] simGetSegmentationObjectID will always return -1 --- .../Plugins/AirSim/Source/AirBlueprintLib.cpp | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/Unreal/Plugins/AirSim/Source/AirBlueprintLib.cpp b/Unreal/Plugins/AirSim/Source/AirBlueprintLib.cpp index e1f62ce1f3..1e9af5c09f 100644 --- a/Unreal/Plugins/AirSim/Source/AirBlueprintLib.cpp +++ b/Unreal/Plugins/AirSim/Source/AirBlueprintLib.cpp @@ -324,14 +324,33 @@ bool UAirBlueprintLib::SetMeshStencilID(const std::string& mesh_name, int object int UAirBlueprintLib::GetMeshStencilID(const std::string& mesh_name) { - FString fmesh_name(mesh_name.c_str()); - for (TObjectIterator comp; comp; ++comp) - { - // Access the subclass instance with the * or -> operators. - UMeshComponent *mesh = *comp; - if (mesh->GetName() == fmesh_name) { + // Takes a UStaticMeshComponent, USkinnedMeshComponent or ALandscapeProxy and returns their custom stencil ID if + // their meshes's name or their owner's name (depending on the naming method in mesh_naming_method_) equals mesh_name + auto getCustomStencilForMesh = [&mesh_name](auto mesh) -> int { + const std::string component_mesh_name = common_utils::Utils::toLower(GetMeshName(mesh)); + if (component_mesh_name.compare(mesh_name) == 0) { return mesh->CustomDepthStencilValue; } + return -1; + }; + + for (TObjectIterator comp; comp; ++comp) + { + int id = getCustomStencilForMesh(*comp); + if(id != -1) + return id; + } + for (TObjectIterator comp; comp; ++comp) + { + int id = getCustomStencilForMesh(*comp); + if (id != -1) + return id; + } + for (TObjectIterator comp; comp; ++comp) + { + int id = getCustomStencilForMesh(*comp); + if (id != -1) + return id; } return -1;