Return all transforms for bones (world, component and relative)

This commit is contained in:
bernatx 2021-10-18 12:31:57 +02:00 committed by bernat
parent 93e4733cf8
commit b7a1685166
18 changed files with 278 additions and 75 deletions

View File

@ -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

View File

@ -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:

View File

@ -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<rpc::WalkerBoneControl>("get_bones_transform", walker);
rpc::WalkerBoneControlOut Client::GetBonesTransform(rpc::ActorId walker) {
auto res = _pimpl->CallAndWait<rpc::WalkerBoneControlOut>("get_bones_transform", walker);
return res;
}

View File

@ -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(

View File

@ -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());
}

View File

@ -14,7 +14,7 @@
namespace carla {
namespace rpc {
using BoneTransformData = std::pair<std::string, geom::Transform>;
using BoneTransformDataIn = std::pair<std::string, geom::Transform>;
} // namespace rpc
} // namespace carla

View File

@ -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 <https://opensource.org/licenses/MIT>.
#pragma once
#include "carla/rpc/Transform.h"
#include <string>
#include <utility>
namespace carla {
namespace rpc {
// using BoneTransformDataOut = std::pair<std::string, geom::Transform>;
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

View File

@ -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 <vector>
@ -20,19 +20,19 @@
namespace carla {
namespace rpc {
class WalkerBoneControl {
class WalkerBoneControlIn {
public:
WalkerBoneControl() = default;
WalkerBoneControlIn() = default;
explicit WalkerBoneControl(
std::vector<rpc::BoneTransformData> bone_transforms)
explicit WalkerBoneControlIn(
std::vector<rpc::BoneTransformDataIn> 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<rpc::BoneTransformData> bone_transforms;
std::vector<rpc::BoneTransformDataIn> bone_transforms;
MSGPACK_DEFINE_ARRAY(bone_transforms);
};

View File

@ -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 <https://opensource.org/licenses/MIT>.
#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 <vector>
namespace carla {
namespace rpc {
class WalkerBoneControlOut {
public:
WalkerBoneControlOut() = default;
explicit WalkerBoneControlOut(
std::vector<rpc::BoneTransformDataOut> bone_transforms)
: bone_transforms(bone_transforms) {}
std::vector<rpc::BoneTransformDataOut> bone_transforms;
MSGPACK_DEFINE_ARRAY(bone_transforms);
};
} // namespace rpc
} // namespace carla

View File

@ -188,7 +188,7 @@ void export_actor() {
class_<cc::Walker, bases<cc::Actor>, boost::noncopyable, boost::shared_ptr<cc::Walker>>("Walker", no_init)
.def("apply_control", &ApplyControl<cr::WalkerControl>, (arg("control")))
.def("apply_control", &ApplyControl<cr::WalkerBoneControl>, (arg("control")))
.def("apply_control", &ApplyControl<cr::WalkerBoneControlIn>, (arg("control")))
.def("get_control", &cc::Walker::GetWalkerControl)
.def("get_bones", &cc::Walker::GetBonesTransform)
.def(self_ns::str(self_ns::self))

View File

@ -9,7 +9,8 @@
#include <carla/rpc/VehiclePhysicsControl.h>
#include <carla/rpc/WheelPhysicsControl.h>
#include <carla/rpc/WalkerControl.h>
#include <carla/rpc/WalkerBoneControl.h>
#include <carla/rpc/WalkerBoneControlIn.h>
#include <carla/rpc/WalkerBoneControlOut.h>
#include <ostream>
@ -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<carla::rpc::BoneTransformData> v;
std::vector<carla::rpc::BoneTransformDataIn> v;
auto length = boost::python::len(list);
v.reserve(static_cast<size_t>(length));
for (auto i = 0u; i < length; ++i) {
boost::python::extract<carla::rpc::BoneTransformData> ext(list[i]);
boost::python::extract<carla::rpc::BoneTransformDataIn> 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<std::string>(list[i][0u]),
boost::python::extract<carla::geom::Transform>(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<carla::rpc::BoneTransformDataOut> v;
auto length = boost::python::len(list);
v.reserve(static_cast<size_t>(length));
for (auto i = 0u; i < length; ++i) {
boost::python::extract<carla::rpc::BoneTransformDataOut> ext(list[i]);
if (ext.check()) {
v.push_back(ext);
} else {
v.push_back(carla::rpc::BoneTransformDataOut{
boost::python::extract<std::string>(list[i][0u]),
boost::python::extract<carla::geom::Transform>(list[i][1u]),
boost::python::extract<carla::geom::Transform>(list[i][2u]),
boost::python::extract<carla::geom::Transform>(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<std::vector<carla::rpc::WheelPhysicsControl>>();
@ -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<carla::rpc::BoneTransformData> &bone_transform_data = self.bone_transforms;
static auto GetBonesTransform(const carla::rpc::WalkerBoneControlIn &self) {
const std::vector<carla::rpc::BoneTransformDataIn> &bone_transform_data = self.bone_transforms;
boost::python::object get_iter =
boost::python::iterator<const std::vector<carla::rpc::BoneTransformData>>();
boost::python::iterator<const std::vector<carla::rpc::BoneTransformDataIn>>();
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<carla::rpc::BoneTransformDataOut> &bone_transform_data = self.bone_transforms;
boost::python::object get_iter =
boost::python::iterator<const std::vector<carla::rpc::BoneTransformDataOut>>();
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_<cr::BoneTransformData>("bone_transform")
class_<cr::BoneTransformDataIn>("bone_transform")
.def(init<>())
.def_readwrite("name", &std::pair<std::string, cg::Transform>::first)
.def_readwrite("transform", &std::pair<std::string, cg::Transform>::second)
.def(self_ns::str(self_ns::self))
;
class_<std::vector<cr::BoneTransformData>>("vector_of_bones")
.def(boost::python::vector_indexing_suite<std::vector<cr::BoneTransformData>>())
class_<std::vector<cr::BoneTransformDataIn>>("vector_of_bones")
.def(init<>())
.def(boost::python::vector_indexing_suite<std::vector<cr::BoneTransformDataIn>>())
.def(self_ns::str(self_ns::self))
;
class_<cr::WalkerBoneControl>("WalkerBoneControl")
class_<cr::BoneTransformDataOut>("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_<std::vector<cr::BoneTransformDataOut>>("vector_of_bones_out")
.def(init<>())
.def(boost::python::vector_indexing_suite<std::vector<cr::BoneTransformDataOut>>())
.def(self_ns::str(self_ns::self))
;
class_<cr::WalkerBoneControlIn>("WalkerBoneControlIn")
.def("__init__", raw_function(WalkerBoneControl_init))
.def(init<>())
.add_property("bone_transforms", &GetBonesTransform, &SetBonesTransform)
.def(self_ns::str(self_ns::self))
;
class_<cr::WalkerBoneControlOut>("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_<std::vector<cr::GearPhysicsControl>>("vector_of_gears")
.def(boost::python::vector_indexing_suite<std::vector<cr::GearPhysicsControl>>())
.def(self_ns::str(self_ns::self))

View File

@ -27,7 +27,8 @@
#include <carla/rpc/VehiclePhysicsControl.h>
#include <carla/rpc/VehicleLightState.h>
#include <carla/rpc/VehicleLightStateList.h>
#include <carla/rpc/WalkerBoneControl.h>
#include <carla/rpc/WalkerBoneControlIn.h>
#include <carla/rpc/WalkerBoneControlOut.h>
#include <carla/rpc/WalkerControl.h>
#include <carla/rpc/VehicleWheels.h>
#include <carla/rpc/WeatherParameters.h>
@ -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())
{

View File

@ -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

View File

@ -32,7 +32,7 @@
#include <carla/rpc/Actor.h>
#include <carla/rpc/ActorDefinition.h>
#include <carla/rpc/ActorDescription.h>
#include <carla/rpc/BoneTransformData.h>
#include <carla/rpc/BoneTransformDataIn.h>
#include <carla/rpc/Command.h>
#include <carla/rpc/CommandResponse.h>
#include <carla/rpc/DebugShape.h>
@ -54,7 +54,8 @@
#include <carla/rpc/VehiclePhysicsControl.h>
#include <carla/rpc/VehicleLightState.h>
#include <carla/rpc/VehicleLightStateList.h>
#include <carla/rpc/WalkerBoneControl.h>
#include <carla/rpc/WalkerBoneControlIn.h>
#include <carla/rpc/WalkerBoneControlOut.h>
#include <carla/rpc/WalkerControl.h>
#include <carla/rpc/VehicleWheels.h>
#include <carla/rpc/WeatherParameters.h>
@ -1291,7 +1292,7 @@ void FCarlaServer::FPimpl::BindActions()
BIND_SYNC(apply_bone_control_to_walker) << [this](
cr::ActorId ActorId,
cr::WalkerBoneControl Control) -> R<void>
cr::WalkerBoneControlIn Control) -> R<void>
{
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::WalkerBoneControl>
cr::ActorId ActorId) -> R<cr::WalkerBoneControlOut>
{
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<carla::rpc::BoneTransformData> BoneData;
std::vector<carla::rpc::BoneTransformDataOut> BoneData;
for (auto Bone : Bones.BoneTransforms)
{
std::pair<std::string, carla::geom::Transform> 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](

View File

@ -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()

View File

@ -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 <https://opensource.org/licenses/MIT>.
#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<FString, FWalkerBoneControlOutData> BoneTransforms;
};

View File

@ -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<UPoseableMeshComponent *> PoseableMeshes;
@ -130,11 +130,20 @@ void AWalkerController::GetBonesTransform(FWalkerBoneControl &WalkerBones)
SkeletalMesh->SnapshotPose(Snap);
for (int i=0; i<Snap.BoneNames.Num(); ++i)
{
FTransform Trans = PoseableMesh->GetBoneTransformByName(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<FString, FTransform> &pair : WalkerBoneControl.BoneTransforms)
for (const TPair<FString, FTransform> &pair : WalkerBoneControlIn.BoneTransforms)
{
FName BoneName = FName(*pair.Key);
PoseableMesh->SetBoneTransformByName(BoneName, pair.Value, EBoneSpaces::Type::ComponentSpace);
}
WalkerBoneControl.BoneTransforms.Empty();
WalkerBoneControlIn.BoneTransforms.Empty();
}
}

View File

@ -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 <compiler/disable-ue4-macros.h>
#include <carla/rpc/WalkerBoneControl.h>
#include <carla/rpc/WalkerBoneControlIn.h>
#include <boost/variant.hpp>
#include <compiler/enable-ue4-macros.h>
@ -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<FWalkerBoneControl>(Control) : FWalkerBoneControl{};
return Control.which() == 1u ? boost::get<FWalkerBoneControlIn>(Control) : FWalkerBoneControlIn{};
}
UFUNCTION(BlueprintCallable)
void SetManualBones(const bool bIsEnabled);
UFUNCTION(BlueprintCallable)
void GetBonesTransform(FWalkerBoneControl &WalkerBones);
void GetBonesTransform(FWalkerBoneControlOut &WalkerBones);
private:
boost::variant<FWalkerControl, FWalkerBoneControl> Control;
boost::variant<FWalkerControl, FWalkerBoneControlIn> Control;
bool bManualBones;
};