| 212 | } |
| 213 | |
| 214 | MatrixF ColladaAppNode::getTransform(F32 time) |
| 215 | { |
| 216 | // Check if we can use the last computed transform |
| 217 | if (time == lastTransformTime) |
| 218 | return lastTransform; |
| 219 | |
| 220 | if (appParent) { |
| 221 | // Get parent node's transform |
| 222 | lastTransform = appParent->getTransform(time); |
| 223 | } |
| 224 | else { |
| 225 | // no parent (ie. root level) => scale by global shape <unit> |
| 226 | lastTransform.identity(); |
| 227 | lastTransform.scale(ColladaUtils::getOptions().unit); |
| 228 | if (!isBounds()) |
| 229 | ColladaUtils::convertTransform(lastTransform); // don't convert bounds node transform (or upAxis won't work!) |
| 230 | } |
| 231 | |
| 232 | // Multiply by local node transform elements |
| 233 | for (S32 iTxfm = 0; iTxfm < nodeTransforms.size(); iTxfm++) { |
| 234 | |
| 235 | MatrixF mat(true); |
| 236 | |
| 237 | // Convert the transform element to a MatrixF |
| 238 | switch (nodeTransforms[iTxfm].element->getElementType()) { |
| 239 | case COLLADA_TYPE::TRANSLATE: mat = vecToMatrixF<domTranslate>(nodeTransforms[iTxfm].getValue(time)); break; |
| 240 | case COLLADA_TYPE::SCALE: mat = vecToMatrixF<domScale>(nodeTransforms[iTxfm].getValue(time)); break; |
| 241 | case COLLADA_TYPE::ROTATE: mat = vecToMatrixF<domRotate>(nodeTransforms[iTxfm].getValue(time)); break; |
| 242 | case COLLADA_TYPE::MATRIX: mat = vecToMatrixF<domMatrix>(nodeTransforms[iTxfm].getValue(time)); break; |
| 243 | case COLLADA_TYPE::SKEW: mat = vecToMatrixF<domSkew>(nodeTransforms[iTxfm].getValue(time)); break; |
| 244 | case COLLADA_TYPE::LOOKAT: mat = vecToMatrixF<domLookat>(nodeTransforms[iTxfm].getValue(time)); break; |
| 245 | } |
| 246 | |
| 247 | // Remove node scaling (but keep reflections) if desired |
| 248 | if (ColladaUtils::getOptions().ignoreNodeScale) |
| 249 | { |
| 250 | Point3F invScale = mat.getScale(); |
| 251 | invScale.x = invScale.x ? (1.0f / invScale.x) : 0; |
| 252 | invScale.y = invScale.y ? (1.0f / invScale.y) : 0; |
| 253 | invScale.z = invScale.z ? (1.0f / invScale.z) : 0; |
| 254 | mat.scale(invScale); |
| 255 | } |
| 256 | |
| 257 | // Post multiply the animated transform |
| 258 | lastTransform.mul(mat); |
| 259 | } |
| 260 | |
| 261 | lastTransformTime = time; |
| 262 | return lastTransform; |
| 263 | } |
no test coverage detected