| 115 | static const char Y_KEY[] = "y"; |
| 116 | static const char Z_KEY[] = "z"; |
| 117 | static inline void handleLevel(Transform &t, Json::Value const &v) { |
| 118 | if (!v.isObject()) { |
| 119 | // This is a non-object leaf node. |
| 120 | return; |
| 121 | } |
| 122 | if (v.isMember(CHANGE_BASIS_KEY)) { |
| 123 | Json::Value changeBasis = v[CHANGE_BASIS_KEY]; |
| 124 | ChangeOfBasis cb; |
| 125 | cb.setNewX(vectorFromJson<>(changeBasis[X_KEY])); |
| 126 | cb.setNewY(vectorFromJson<>(changeBasis[Y_KEY])); |
| 127 | cb.setNewZ(vectorFromJson<>(changeBasis[Z_KEY])); |
| 128 | t.transform(cb.get()); |
| 129 | return; |
| 130 | } |
| 131 | Eigen::Vector3d position = Eigen::Vector3d::Zero(); |
| 132 | Eigen::AngleAxisd orientation = Eigen::AngleAxisd::Identity(); |
| 133 | Eigen::Vector3d preposition = Eigen::Vector3d::Zero(); |
| 134 | Eigen::AngleAxisd preorientation = Eigen::AngleAxisd::Identity(); |
| 135 | bool haveTransform = false; |
| 136 | bool havePreTransform = false; |
| 137 | if (v.isMember(TRANSLATE_KEY)) { |
| 138 | position = vectorFromJson<>(v[TRANSLATE_KEY]); |
| 139 | haveTransform = true; |
| 140 | } |
| 141 | if (v.isMember(PRETRANSLATE_KEY)) { |
| 142 | preposition = vectorFromJson<>(v[PRETRANSLATE_KEY]); |
| 143 | havePreTransform = true; |
| 144 | } |
| 145 | if (v.isMember(ROTATE_KEY)) { |
| 146 | Json::Value rotate = v[ROTATE_KEY]; |
| 147 | orientation = Eigen::AngleAxisd(angleAsRadians(rotate), |
| 148 | vectorFromJson<>(rotate[AXIS_KEY])); |
| 149 | haveTransform = true; |
| 150 | } |
| 151 | if (v.isMember(PREROTATE_KEY)) { |
| 152 | Json::Value rotate = v[PREROTATE_KEY]; |
| 153 | preorientation = Eigen::AngleAxisd( |
| 154 | angleAsRadians(rotate), vectorFromJson<>(rotate[AXIS_KEY])); |
| 155 | havePreTransform = true; |
| 156 | } |
| 157 | if (haveTransform) { |
| 158 | Eigen::Affine3d xform; |
| 159 | xform.fromPositionOrientationScale(position, orientation, |
| 160 | Eigen::Vector3d::Constant(1)); |
| 161 | t.concatPost(xform.matrix()); |
| 162 | } |
| 163 | if (havePreTransform) { |
| 164 | Eigen::Affine3d xform; |
| 165 | xform.fromPositionOrientationScale(preposition, preorientation, |
| 166 | Eigen::Vector3d::Constant(1)); |
| 167 | t.concatPre(xform.matrix()); |
| 168 | } |
| 169 | } |
| 170 | |
| 171 | static const char CHILD_KEY[] = "child"; |
| 172 | JSONTransformVisitor::JSONTransformVisitor(Json::Value const &root) { |
no test coverage detected