diff --git a/LibCarla/source/carla/client/Walker.cpp b/LibCarla/source/carla/client/Walker.cpp index 8275966c7..b96eabad4 100644 --- a/LibCarla/source/carla/client/Walker.cpp +++ b/LibCarla/source/carla/client/Walker.cpp @@ -18,7 +18,7 @@ namespace client { } } - void Walker::ApplyControl(const BoneControl &bone_control) { + void Walker::ApplyControl(const BoneControlIn &bone_control) { GetEpisode().Lock()->ApplyBoneControlToWalker(*this, bone_control); } @@ -27,7 +27,7 @@ namespace client { } // Walker::Control Walker::GetBonesTransform() const { - Walker::BoneControl Walker::GetBonesTransform() { + Walker::BoneControlOut Walker::GetBonesTransform() { return GetEpisode().Lock()->GetBonesTransform(*this); } } // namespace client diff --git a/LibCarla/source/carla/client/Walker.h b/LibCarla/source/carla/client/Walker.h index ea97a5794..59c5fc7b3 100644 --- a/LibCarla/source/carla/client/Walker.h +++ b/LibCarla/source/carla/client/Walker.h @@ -8,7 +8,8 @@ #include "carla/client/Actor.h" #include "carla/rpc/WalkerControl.h" -#include "carla/rpc/WalkerBoneControl.h" +#include "carla/rpc/WalkerBoneControlIn.h" +#include "carla/rpc/WalkerBoneControlOut.h" namespace carla { namespace client { @@ -17,14 +18,15 @@ namespace client { public: using Control = rpc::WalkerControl; - using BoneControl = rpc::WalkerBoneControl; + using BoneControlIn = rpc::WalkerBoneControlIn; + using BoneControlOut = rpc::WalkerBoneControlOut; explicit Walker(ActorInitializer init) : Actor(std::move(init)) {} /// Apply @a control to this Walker. void ApplyControl(const Control &control); - void ApplyControl(const BoneControl &bone_control); + void ApplyControl(const BoneControlIn &bone_control); /// Return the control last applied to this Walker. /// @@ -33,7 +35,7 @@ namespace client { Control GetWalkerControl() const; // Walker::Control GetBonesTransform() const; - BoneControl GetBonesTransform(); + BoneControlOut GetBonesTransform(); private: diff --git a/LibCarla/source/carla/client/detail/Client.cpp b/LibCarla/source/carla/client/detail/Client.cpp index 7f0e1944e..5b01eb548 100644 --- a/LibCarla/source/carla/client/detail/Client.cpp +++ b/LibCarla/source/carla/client/detail/Client.cpp @@ -11,13 +11,14 @@ #include "carla/client/FileTransfer.h" #include "carla/client/TimeoutException.h" #include "carla/rpc/ActorDescription.h" -#include "carla/rpc/BoneTransformData.h" +#include "carla/rpc/BoneTransformDataIn.h" #include "carla/rpc/Client.h" #include "carla/rpc/DebugShape.h" #include "carla/rpc/Response.h" #include "carla/rpc/VehicleControl.h" #include "carla/rpc/VehicleLightState.h" -#include "carla/rpc/WalkerBoneControl.h" +#include "carla/rpc/WalkerBoneControlIn.h" +#include "carla/rpc/WalkerBoneControlOut.h" #include "carla/rpc/WalkerControl.h" #include "carla/streaming/Client.h" @@ -435,12 +436,12 @@ namespace detail { _pimpl->AsyncCall("apply_control_to_walker", walker, control); } - void Client::ApplyBoneControlToWalker(rpc::ActorId walker, const rpc::WalkerBoneControl &control) { + void Client::ApplyBoneControlToWalker(rpc::ActorId walker, const rpc::WalkerBoneControlIn &control) { _pimpl->AsyncCall("apply_bone_control_to_walker", walker, control); } - rpc::WalkerBoneControl Client::GetBonesTransform(rpc::ActorId walker) { - auto res = _pimpl->CallAndWait("get_bones_transform", walker); + rpc::WalkerBoneControlOut Client::GetBonesTransform(rpc::ActorId walker) { + auto res = _pimpl->CallAndWait("get_bones_transform", walker); return res; } diff --git a/LibCarla/source/carla/client/detail/Client.h b/LibCarla/source/carla/client/detail/Client.h index 9b3802ead..de13a5120 100644 --- a/LibCarla/source/carla/client/detail/Client.h +++ b/LibCarla/source/carla/client/detail/Client.h @@ -45,7 +45,8 @@ namespace rpc { class DebugShape; class VehicleControl; class WalkerControl; - class WalkerBoneControl; + class WalkerBoneControlIn; + class WalkerBoneControlOut; } namespace sensor { class SensorData; @@ -269,9 +270,9 @@ namespace detail { void ApplyBoneControlToWalker( rpc::ActorId walker, - const rpc::WalkerBoneControl &control); + const rpc::WalkerBoneControlIn &control); - rpc::WalkerBoneControl GetBonesTransform( + rpc::WalkerBoneControlOut GetBonesTransform( rpc::ActorId walker); void SetTrafficLightState( diff --git a/LibCarla/source/carla/client/detail/Simulator.h b/LibCarla/source/carla/client/detail/Simulator.h index 0680c5c09..1868db786 100644 --- a/LibCarla/source/carla/client/detail/Simulator.h +++ b/LibCarla/source/carla/client/detail/Simulator.h @@ -457,11 +457,11 @@ namespace detail { _client.ApplyControlToWalker(walker.GetId(), control); } - void ApplyBoneControlToWalker(Walker &walker, const rpc::WalkerBoneControl &control) { + void ApplyBoneControlToWalker(Walker &walker, const rpc::WalkerBoneControlIn &control) { _client.ApplyBoneControlToWalker(walker.GetId(), control); } - rpc::WalkerBoneControl GetBonesTransform(Walker &walker) { + rpc::WalkerBoneControlOut GetBonesTransform(Walker &walker) { return _client.GetBonesTransform(walker.GetId()); } diff --git a/LibCarla/source/carla/rpc/BoneTransformData.h b/LibCarla/source/carla/rpc/BoneTransformDataIn.h similarity index 84% rename from LibCarla/source/carla/rpc/BoneTransformData.h rename to LibCarla/source/carla/rpc/BoneTransformDataIn.h index 3a24623ef..0223ea345 100644 --- a/LibCarla/source/carla/rpc/BoneTransformData.h +++ b/LibCarla/source/carla/rpc/BoneTransformDataIn.h @@ -14,7 +14,7 @@ namespace carla { namespace rpc { - using BoneTransformData = std::pair; + using BoneTransformDataIn = std::pair; } // namespace rpc } // namespace carla diff --git a/LibCarla/source/carla/rpc/BoneTransformDataOut.h b/LibCarla/source/carla/rpc/BoneTransformDataOut.h new file mode 100644 index 000000000..818840742 --- /dev/null +++ b/LibCarla/source/carla/rpc/BoneTransformDataOut.h @@ -0,0 +1,43 @@ +// Copyright (c) 2019 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#pragma once + +#include "carla/rpc/Transform.h" + +#include +#include + +namespace carla { +namespace rpc { + + // using BoneTransformDataOut = std::pair; + class BoneTransformDataOut + { + public: + std::string bone_name; + Transform world; + Transform component; + Transform relative; + + bool operator!=(const BoneTransformDataOut &rhs) const { + return + bone_name != rhs.bone_name || + world != rhs.world || + component != rhs.component || + relative != rhs.relative; + } + + bool operator==(const BoneTransformDataOut &rhs) const { + return !(*this != rhs); + } + + + MSGPACK_DEFINE_ARRAY(bone_name, world, component, relative); + }; + +} // namespace rpc +} // namespace carla diff --git a/LibCarla/source/carla/rpc/WalkerBoneControl.h b/LibCarla/source/carla/rpc/WalkerBoneControlIn.h similarity index 68% rename from LibCarla/source/carla/rpc/WalkerBoneControl.h rename to LibCarla/source/carla/rpc/WalkerBoneControlIn.h index 9a9cc0e3a..cf2644945 100644 --- a/LibCarla/source/carla/rpc/WalkerBoneControl.h +++ b/LibCarla/source/carla/rpc/WalkerBoneControlIn.h @@ -7,12 +7,12 @@ #pragma once #include "carla/MsgPack.h" -#include "carla/rpc/BoneTransformData.h" +#include "carla/rpc/BoneTransformDataIn.h" #include "carla/rpc/String.h" #include "carla/rpc/Transform.h" #ifdef LIBCARLA_INCLUDED_FROM_UE4 -# include "Carla/Walker/WalkerBoneControl.h" +# include "Carla/Walker/WalkerBoneControlIn.h" #endif // LIBCARLA_INCLUDED_FROM_UE4 #include @@ -20,19 +20,19 @@ namespace carla { namespace rpc { - class WalkerBoneControl { + class WalkerBoneControlIn { public: - WalkerBoneControl() = default; + WalkerBoneControlIn() = default; - explicit WalkerBoneControl( - std::vector bone_transforms) + explicit WalkerBoneControlIn( + std::vector bone_transforms) : bone_transforms(bone_transforms) {} #ifdef LIBCARLA_INCLUDED_FROM_UE4 - operator FWalkerBoneControl() const { - FWalkerBoneControl Control; + operator FWalkerBoneControlIn() const { + FWalkerBoneControlIn Control; for (auto &bone_transform : bone_transforms) { Control.BoneTransforms.Add(ToFString(bone_transform.first), bone_transform.second); } @@ -41,7 +41,7 @@ namespace rpc { #endif // LIBCARLA_INCLUDED_FROM_UE4 - std::vector bone_transforms; + std::vector bone_transforms; MSGPACK_DEFINE_ARRAY(bone_transforms); }; diff --git a/LibCarla/source/carla/rpc/WalkerBoneControlOut.h b/LibCarla/source/carla/rpc/WalkerBoneControlOut.h new file mode 100644 index 000000000..d5e51c396 --- /dev/null +++ b/LibCarla/source/carla/rpc/WalkerBoneControlOut.h @@ -0,0 +1,38 @@ +// Copyright (c) 2019 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#pragma once + +#include "carla/MsgPack.h" +#include "carla/rpc/BoneTransformDataOut.h" +#include "carla/rpc/String.h" +#include "carla/rpc/Transform.h" + +#ifdef LIBCARLA_INCLUDED_FROM_UE4 +# include "Carla/Walker/WalkerBoneControlOut.h" +#endif // LIBCARLA_INCLUDED_FROM_UE4 + +#include + +namespace carla { +namespace rpc { + + class WalkerBoneControlOut { + public: + + WalkerBoneControlOut() = default; + + explicit WalkerBoneControlOut( + std::vector bone_transforms) + : bone_transforms(bone_transforms) {} + + std::vector bone_transforms; + + MSGPACK_DEFINE_ARRAY(bone_transforms); + }; + +} // namespace rpc +} // namespace carla diff --git a/PythonAPI/carla/source/libcarla/Actor.cpp b/PythonAPI/carla/source/libcarla/Actor.cpp index 4f1c18535..12839332e 100644 --- a/PythonAPI/carla/source/libcarla/Actor.cpp +++ b/PythonAPI/carla/source/libcarla/Actor.cpp @@ -188,7 +188,7 @@ void export_actor() { class_, boost::noncopyable, boost::shared_ptr>("Walker", no_init) .def("apply_control", &ApplyControl, (arg("control"))) - .def("apply_control", &ApplyControl, (arg("control"))) + .def("apply_control", &ApplyControl, (arg("control"))) .def("get_control", &cc::Walker::GetWalkerControl) .def("get_bones", &cc::Walker::GetBonesTransform) .def(self_ns::str(self_ns::self)) diff --git a/PythonAPI/carla/source/libcarla/Control.cpp b/PythonAPI/carla/source/libcarla/Control.cpp index cf46369e6..7724d4bc9 100644 --- a/PythonAPI/carla/source/libcarla/Control.cpp +++ b/PythonAPI/carla/source/libcarla/Control.cpp @@ -9,7 +9,8 @@ #include #include #include -#include +#include +#include #include @@ -38,8 +39,8 @@ namespace rpc { return out; } - std::ostream &operator<<(std::ostream &out, const WalkerBoneControl &control) { - out << "WalkerBoneControl(bone_transforms("; + std::ostream &operator<<(std::ostream &out, const WalkerBoneControlIn &control) { + out << "WalkerBoneControlIn(bone_transforms("; for (auto bone_transform : control.bone_transforms) { out << "(name=" << bone_transform.first << ", transform=" << bone_transform.second << ')'; @@ -48,6 +49,21 @@ namespace rpc { return out; } + std::ostream &operator<<(std::ostream &out, const BoneTransformDataOut &data) { + out << "BoneTransformDataOut(name=" << data.bone_name << ", world=" << data.world << ", component=" << data.component << ", relative=" << data.relative << ')'; + return out; + } + + std::ostream &operator<<(std::ostream &out, const WalkerBoneControlOut &control) { + out << "WalkerBoneControlOut(bone_transforms("; + for (auto bone_transform : control.bone_transforms) { + out << "(name=" << bone_transform.bone_name + << ", world=" << bone_transform.world << ", component=" << bone_transform.component << ", relative=" << bone_transform.relative << ')'; + } + out << "))"; + return out; + } + std::ostream &operator<<(std::ostream &out, const GearPhysicsControl &control) { out << "GearPhysicsControl(ratio=" << std::to_string(control.ratio) << ", down_ratio=" << std::to_string(control.down_ratio) @@ -111,16 +127,16 @@ static auto GetVectorOfVector2DFromList(const boost::python::list &list) { } static auto GetVectorOfBoneTransformFromList(const boost::python::list &list) { - std::vector v; + std::vector v; auto length = boost::python::len(list); v.reserve(static_cast(length)); for (auto i = 0u; i < length; ++i) { - boost::python::extract ext(list[i]); + boost::python::extract ext(list[i]); if (ext.check()) { v.push_back(ext); } else { - v.push_back(carla::rpc::BoneTransformData{ + v.push_back(carla::rpc::BoneTransformDataIn{ boost::python::extract(list[i][0u]), boost::python::extract(list[i][1u])}); } @@ -128,6 +144,26 @@ static auto GetVectorOfBoneTransformFromList(const boost::python::list &list) { return v; } +static auto GetVectorOfBoneTransformOutFromList(const boost::python::list &list) { + std::vector v; + + auto length = boost::python::len(list); + v.reserve(static_cast(length)); + for (auto i = 0u; i < length; ++i) { + boost::python::extract ext(list[i]); + if (ext.check()) { + v.push_back(ext); + } else { + v.push_back(carla::rpc::BoneTransformDataOut{ + boost::python::extract(list[i][0u]), + boost::python::extract(list[i][1u]), + boost::python::extract(list[i][2u]), + boost::python::extract(list[i][3u])}); + } + } + return v; +} + static auto GetWheels(const carla::rpc::VehiclePhysicsControl &self) { const auto &wheels = self.GetWheels(); boost::python::object get_iter = boost::python::iterator>(); @@ -227,18 +263,30 @@ boost::python::object VehiclePhysicsControl_init(boost::python::tuple args, boos return res; } -static auto GetBonesTransform(const carla::rpc::WalkerBoneControl &self) { - const std::vector &bone_transform_data = self.bone_transforms; +static auto GetBonesTransform(const carla::rpc::WalkerBoneControlIn &self) { + const std::vector &bone_transform_data = self.bone_transforms; boost::python::object get_iter = - boost::python::iterator>(); + boost::python::iterator>(); boost::python::object iter = get_iter(bone_transform_data); return boost::python::list(iter); } -static void SetBonesTransform(carla::rpc::WalkerBoneControl &self, const boost::python::list &list) { +static void SetBonesTransform(carla::rpc::WalkerBoneControlIn &self, const boost::python::list &list) { self.bone_transforms = GetVectorOfBoneTransformFromList(list); } +static auto GetBonesTransformOut(const carla::rpc::WalkerBoneControlOut &self) { + const std::vector &bone_transform_data = self.bone_transforms; + boost::python::object get_iter = + boost::python::iterator>(); + boost::python::object iter = get_iter(bone_transform_data); + return boost::python::list(iter); +} + +static void SetBonesTransformOut(carla::rpc::WalkerBoneControlOut &self, const boost::python::list &list) { + self.bone_transforms = GetVectorOfBoneTransformOutFromList(list); +} + boost::python::object WalkerBoneControl_init(boost::python::tuple args, boost::python::dict kwargs) { // Args names const uint32_t NUM_ARGUMENTS = 1; @@ -304,24 +352,51 @@ void export_control() { .def(self_ns::str(self_ns::self)) ; - class_("bone_transform") + class_("bone_transform") .def(init<>()) .def_readwrite("name", &std::pair::first) .def_readwrite("transform", &std::pair::second) .def(self_ns::str(self_ns::self)) ; - class_>("vector_of_bones") - .def(boost::python::vector_indexing_suite>()) + class_>("vector_of_bones") + .def(init<>()) + .def(boost::python::vector_indexing_suite>()) + .def(self_ns::str(self_ns::self)) ; - class_("WalkerBoneControl") + class_("bone_transform_out") + .def(init<>()) + .def_readwrite("name", &cr::BoneTransformDataOut::bone_name) + .def_readwrite("world", &cr::BoneTransformDataOut::world) + .def_readwrite("component", &cr::BoneTransformDataOut::component) + .def_readwrite("relative", &cr::BoneTransformDataOut::relative) + .def(self_ns::str(self_ns::self)) + .def("__eq__", &cr::BoneTransformDataOut::operator==) + .def("__ne__", &cr::BoneTransformDataOut::operator!=) + ; + + class_>("vector_of_bones_out") + .def(init<>()) + .def(boost::python::vector_indexing_suite>()) + .def(self_ns::str(self_ns::self)) + ; + + class_("WalkerBoneControlIn") .def("__init__", raw_function(WalkerBoneControl_init)) .def(init<>()) .add_property("bone_transforms", &GetBonesTransform, &SetBonesTransform) .def(self_ns::str(self_ns::self)) ; + class_("WalkerBoneControlOut") + .def("__init__", raw_function(WalkerBoneControl_init)) + .def(init<>()) + // .add_property("bone_transforms", &GetBonesTransformOut, &SetBonesTransformOut) + .add_property("bone_transforms", &GetBonesTransformOut) + .def(self_ns::str(self_ns::self)) + ; + class_>("vector_of_gears") .def(boost::python::vector_indexing_suite>()) .def(self_ns::str(self_ns::self)) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.cpp index 5dcb1d404..56166554c 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.cpp @@ -27,7 +27,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -1248,7 +1249,7 @@ ECarlaServerResponse FWalkerActor::ApplyControlToWalker( } ECarlaServerResponse FWalkerActor::ApplyBoneControlToWalker( - const FWalkerBoneControl& Control) + const FWalkerBoneControlIn& Control) { if (IsDormant()) { @@ -1270,7 +1271,7 @@ ECarlaServerResponse FWalkerActor::ApplyBoneControlToWalker( return ECarlaServerResponse::Success; } -ECarlaServerResponse FWalkerActor::GetBonesTransform(FWalkerBoneControl& Bones) +ECarlaServerResponse FWalkerActor::GetBonesTransform(FWalkerBoneControlOut& Bones) { if (IsDormant()) { diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.h index 4568bb924..211739eed 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Actor/CarlaActor.h @@ -367,12 +367,12 @@ public: return ECarlaServerResponse::ActorTypeMismatch; } - virtual ECarlaServerResponse ApplyBoneControlToWalker(const FWalkerBoneControl&) + virtual ECarlaServerResponse ApplyBoneControlToWalker(const FWalkerBoneControlIn&) { return ECarlaServerResponse::ActorTypeMismatch; } - virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControl&) + virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControlOut&) { return ECarlaServerResponse::ActorTypeMismatch; } @@ -553,9 +553,9 @@ public: virtual ECarlaServerResponse GetWalkerControl(FWalkerControl&) final; - virtual ECarlaServerResponse ApplyBoneControlToWalker(const FWalkerBoneControl&) final; + virtual ECarlaServerResponse ApplyBoneControlToWalker(const FWalkerBoneControlIn&) final; - virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControl&) final; + virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControlOut&) final; }; class FOtherActor : public FCarlaActor diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Server/CarlaServer.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Server/CarlaServer.cpp index 4cb01a821..095da8da7 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Server/CarlaServer.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Server/CarlaServer.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,7 +54,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -1291,7 +1292,7 @@ void FCarlaServer::FPimpl::BindActions() BIND_SYNC(apply_bone_control_to_walker) << [this]( cr::ActorId ActorId, - cr::WalkerBoneControl Control) -> R + cr::WalkerBoneControlIn Control) -> R { REQUIRE_CARLA_EPISODE(); FCarlaActor* CarlaActor = Episode->FindCarlaActor(ActorId); @@ -1315,7 +1316,7 @@ void FCarlaServer::FPimpl::BindActions() }; BIND_SYNC(get_bones_transform) << [this]( - cr::ActorId ActorId) -> R + cr::ActorId ActorId) -> R { REQUIRE_CARLA_EPISODE(); FCarlaActor* CarlaActor = Episode->FindCarlaActor(ActorId); @@ -1326,7 +1327,7 @@ void FCarlaServer::FPimpl::BindActions() ECarlaServerResponse::ActorNotFound, " Actor Id: " + FString::FromInt(ActorId)); } - FWalkerBoneControl Bones; + FWalkerBoneControlOut Bones; ECarlaServerResponse Response = CarlaActor->GetBonesTransform(Bones); if (Response != ECarlaServerResponse::Success) @@ -1337,15 +1338,18 @@ void FCarlaServer::FPimpl::BindActions() " Actor Id: " + FString::FromInt(ActorId)); } - std::vector BoneData; + std::vector BoneData; for (auto Bone : Bones.BoneTransforms) { - std::pair Data; - Data.first = std::string(TCHAR_TO_UTF8(*Bone.Get<0>())); - Data.second = Bone.Get<1>(); + carla::rpc::BoneTransformDataOut Data; + Data.bone_name = std::string(TCHAR_TO_UTF8(*Bone.Get<0>())); + FWalkerBoneControlOutData Transforms = Bone.Get<1>(); + Data.world = Transforms.World; + Data.component = Transforms.Component; + Data.relative = Transforms.Relative; BoneData.push_back(Data); } - return carla::rpc::WalkerBoneControl(BoneData); + return carla::rpc::WalkerBoneControlOut(BoneData); }; BIND_SYNC(set_actor_autopilot) << [this]( diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControl.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlIn.h similarity index 83% rename from Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControl.h rename to Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlIn.h index 3de8810ca..28dfc4e3a 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControl.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlIn.h @@ -6,10 +6,10 @@ #pragma once -#include "WalkerBoneControl.generated.h" +#include "WalkerBoneControlIn.generated.h" USTRUCT(BlueprintType) -struct CARLA_API FWalkerBoneControl +struct CARLA_API FWalkerBoneControlIn { GENERATED_BODY() diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlOut.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlOut.h new file mode 100644 index 000000000..3a805f894 --- /dev/null +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerBoneControlOut.h @@ -0,0 +1,28 @@ +// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#pragma once + +#include "WalkerBoneControlOut.generated.h" + +USTRUCT(BlueprintType) +struct CARLA_API FWalkerBoneControlOutData +{ + GENERATED_BODY() + FTransform World; + FTransform Component; + FTransform Relative; +}; + +USTRUCT(BlueprintType) +struct CARLA_API FWalkerBoneControlOut +{ + GENERATED_BODY() + + UPROPERTY(Category = "Walker Bone Control", EditAnywhere, BlueprintReadWrite) + TMap BoneTransforms; + +}; diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.cpp index f04b317a5..12a1e066d 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.cpp @@ -67,7 +67,7 @@ void AWalkerController::ApplyWalkerControl(const FWalkerControl &InControl) } } -void AWalkerController::ApplyWalkerControl(const FWalkerBoneControl &InBoneControl) +void AWalkerController::ApplyWalkerControl(const FWalkerBoneControlIn &InBoneControl) { Control = InBoneControl; if (!bManualBones) @@ -108,7 +108,7 @@ void AWalkerController::SetManualBones(const bool bIsEnabled) } } -void AWalkerController::GetBonesTransform(FWalkerBoneControl &WalkerBones) +void AWalkerController::GetBonesTransform(FWalkerBoneControlOut &WalkerBones) { auto *Character = GetCharacter(); TArray PoseableMeshes; @@ -130,11 +130,20 @@ void AWalkerController::GetBonesTransform(FWalkerBoneControl &WalkerBones) SkeletalMesh->SnapshotPose(Snap); for (int i=0; iGetBoneTransformByName(Snap.BoneNames[i], EBoneSpaces::WorldSpace); - WalkerBones.BoneTransforms.Add(Snap.BoneNames[i].ToString(), Trans); + FWalkerBoneControlOutData Transforms; + Transforms.World = PoseableMesh->GetBoneTransformByName(Snap.BoneNames[i], EBoneSpaces::WorldSpace); + Transforms.Component = PoseableMesh->GetBoneTransformByName(Snap.BoneNames[i], EBoneSpaces::ComponentSpace); + Transforms.Relative = Snap.LocalTransforms[i]; + WalkerBones.BoneTransforms.Add(Snap.BoneNames[i].ToString(), Transforms); // FVector Loc = SkeletalMesh->GetBoneLocation(Snap.BoneNames[i], EBoneSpaces::WorldSpace); // Trans = Snap.LocalTransforms[i]; // Trans.SetLocation(Loc); + // FTransform TransRel = Snap.LocalTransforms[i]; + // if (i == 0) + // { + // UE_LOG(LogCarla, Log, TEXT("World (%f, %f, %f), Relative (%f, %f, %f), Component (%f, %f, %f)"), Trans.GetLocation().X, Trans.GetLocation().Y, Trans.GetLocation().Z, TransRel.GetLocation().X, TransRel.GetLocation().Y, TransRel.GetLocation().Z, TransComp.GetLocation().X, TransComp.GetLocation().Y, TransComp.GetLocation().Z); + // UE_LOG(LogCarla, Log, TEXT("World (%f, %f, %f), Relative (%f, %f, %f), Component (%f, %f, %f)"), Trans.GetLocation().X, Trans.GetLocation().Y, Trans.GetLocation().Z, TransRel.GetLocation().X, TransRel.GetLocation().Y, TransRel.GetLocation().Z, TransComp.GetLocation().X, TransComp.GetLocation().Y, TransComp.GetLocation().Z); + // } } } @@ -152,7 +161,7 @@ void AWalkerController::ControlTickVisitor::operator()(const FWalkerControl &Wal } } -void AWalkerController::ControlTickVisitor::operator()(FWalkerBoneControl &WalkerBoneControl) +void AWalkerController::ControlTickVisitor::operator()(FWalkerBoneControlIn &WalkerBoneControlIn) { auto *Character = Controller->GetCharacter(); if (Character == nullptr) @@ -164,12 +173,12 @@ void AWalkerController::ControlTickVisitor::operator()(FWalkerBoneControl &Walke UPoseableMeshComponent *PoseableMesh = PoseableMeshes.IsValidIndex(0) ? PoseableMeshes[0] : nullptr; if (PoseableMesh) { - for (const TPair &pair : WalkerBoneControl.BoneTransforms) + for (const TPair &pair : WalkerBoneControlIn.BoneTransforms) { FName BoneName = FName(*pair.Key); PoseableMesh->SetBoneTransformByName(BoneName, pair.Value, EBoneSpaces::Type::ComponentSpace); } - WalkerBoneControl.BoneTransforms.Empty(); + WalkerBoneControlIn.BoneTransforms.Empty(); } } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.h index dd2a0ab7a..e85c7cd4e 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerController.h @@ -6,14 +6,15 @@ #pragma once -#include "Carla/Walker/WalkerBoneControl.h" +#include "Carla/Walker/WalkerBoneControlIn.h" +#include "Carla/Walker/WalkerBoneControlOut.h" #include "Carla/Walker/WalkerControl.h" #include "CoreMinimal.h" #include "GameFramework/Controller.h" #include -#include +#include #include #include @@ -35,7 +36,7 @@ private: void operator()(const FWalkerControl &WalkerControl); - void operator()(FWalkerBoneControl &WalkerBoneControl); + void operator()(FWalkerBoneControlIn &WalkerBoneControlIn); private: @@ -60,7 +61,7 @@ public: UFUNCTION(BlueprintCallable) void ApplyWalkerControl(const FWalkerControl &InControl); - void ApplyWalkerControl(const FWalkerBoneControl &InBoneControl); + void ApplyWalkerControl(const FWalkerBoneControlIn &InBoneControl); UFUNCTION(BlueprintCallable) const FWalkerControl GetWalkerControl() const @@ -69,20 +70,20 @@ public: } UFUNCTION(BlueprintCallable) - const FWalkerBoneControl GetBoneWalkerControl() const + const FWalkerBoneControlIn GetBoneWalkerControl() const { - return Control.which() == 1u ? boost::get(Control) : FWalkerBoneControl{}; + return Control.which() == 1u ? boost::get(Control) : FWalkerBoneControlIn{}; } UFUNCTION(BlueprintCallable) void SetManualBones(const bool bIsEnabled); UFUNCTION(BlueprintCallable) - void GetBonesTransform(FWalkerBoneControl &WalkerBones); + void GetBonesTransform(FWalkerBoneControlOut &WalkerBones); private: - boost::variant Control; + boost::variant Control; bool bManualBones; };