diff --git a/VirtualRobot/XML/mujoco/MasslessBodySanitizer.cpp b/VirtualRobot/XML/mujoco/MasslessBodySanitizer.cpp index 71ec5ae807d4a4902ca5ebe0b247aa69f5051502..cf13eda4799ec49b3aaf783a5cce6ff6d3c0fc80 100644 --- a/VirtualRobot/XML/mujoco/MasslessBodySanitizer.cpp +++ b/VirtualRobot/XML/mujoco/MasslessBodySanitizer.cpp @@ -67,39 +67,41 @@ void MasslessBodySanitizer::sanitizeRecursion(mjcf::Body body) } } -template <class ChildT> -static void updatePos(ChildT child, const Eigen::Matrix4f& accChildPose) +static void updatePos(AnyElement element, const Eigen::Matrix4f& accChildPose) { - child.pos = math::Helpers::TransformPosition(accChildPose, child.pos); + const Eigen::Vector3f pos = element.getAttribute<Eigen::Vector3f>("pos", Eigen::Vector3f::Zero()); + element.setAttribute("pos", math::Helpers::TransformPosition(accChildPose, pos)); } -template <class ChildT> -static void updateOri(ChildT child, const Eigen::Matrix3f& accChildOri) +static void updateOri(AnyElement element, const Eigen::Matrix3f& accChildOri) { - child.quat = Eigen::Quaternionf(accChildOri * child.quat.get()); -} - -template <> -void updateOri<Joint>(Joint child, const Eigen::Matrix3f& accChildOri) -{ - child.axis = accChildOri * child.axis.get(); -} -template <> -void updateOri<Light>(Light child, const Eigen::Matrix3f& accChildOri) -{ - child.dir = accChildOri * child.dir.get(); + if (element.is<Joint>()) + { + Joint joint = element.as<Joint>(); + joint.axis = accChildOri * joint.axis.get(); + } + else if (element.is<Light>()) + { + Light light = element.as<Light>(); + light.dir = accChildOri * light.dir.get(); + } + else + { + const Eigen::Quaternionf quat = + element.getAttribute<Eigen::Quaternionf>("quat", Eigen::Quaternionf::Identity()); + element.setAttribute("quat", Eigen::Quaternionf(accChildOri * quat)); + } } -template <class ChildT> -void doo(Body body, Body child, const Eigen::Matrix4f& childPose) +void copyChildren(Body body, Body child, const Eigen::Matrix4f& childPose) { // merge childBody into body => move all its elements here // while doing this, apply accChildPose to elements - for (Element<ChildT> grandChild = child.firstChild<ChildT>(); - grandChild; grandChild = grandChild.template nextSiblingElement<ChildT>()) + for (AnyElement grandChild = child.firstChild<AnyElement>(); + grandChild; grandChild = grandChild.template nextSiblingElement<AnyElement>()) { // clone grandchild - ChildT elem = grandChild.deepClone(); + AnyElement elem = grandChild.deepClone(); if (elem) { @@ -132,20 +134,14 @@ void MasslessBodySanitizer::mergeBodies(Body body, Body childBody, Eigen::Matrix // merge childBody into body => move all its elements here // while doing this, apply accChildPose to elements - doo<Joint>(body, childBody, accChildPose); - doo<Body>(body, childBody, accChildPose); - doo<Inertial>(body, childBody, accChildPose); - doo<Geom>(body, childBody, accChildPose); - doo<Site>(body, childBody, accChildPose); - doo<Camera>(body, childBody, accChildPose); - doo<Light>(body, childBody, accChildPose); + copyChildren(body, childBody, accChildPose); // update body name MergedBodySet& bodySet = getMergedBodySetWith(body.name); bodySet.addBody(childBody.name); body.name = bodySet.getMergedBodyName(); - std::cout << "\t(new name: " << bodySet.getMergedBodyName() << ")" << std::endl; + std::cout << t << "\t(new name: '" << bodySet.getMergedBodyName() << "')" << std::endl; // delete child body.deleteChild(childBody);