IZ_BOOL CColladaAnimation::ReadJoint(domNodeRef pNode) { domNodeType type = pNode->getType(); if (type == NODETYPE_JOINT) { SJoint sJoint; sJoint.name = pNode->getName(); for (size_t n = 0; n < pNode->getContents().getCount(); n++) { domElement* pContent = pNode->getContents().get(n); daeString strType = pContent->getTypeName(); if (izanagi::tool::CString::CmpStr(strType, "node")) { // terminate... continue; } SJointTransform sTransform; sTransform.type = GetTransformType(strType); switch (sTransform.type) { case E_TRANSFROM_TYPE_TRANSLATE: GetTransform<domTranslate, 3>(pContent, sTransform); break; case E_TRANSFROM_TYPE_QUARTANION: GetTransform<domRotate, 4>(pContent, sTransform); break; case E_TRANSFROM_TYPE_SCALE: GetTransform<domScale, 3>(pContent, sTransform); break; default: VRETURN(IZ_FALSE); break; } sJoint.transforms.push_back(sTransform); } if (!sJoint.transforms.empty()) { m_Joints.push_back(sJoint); } } size_t nChildNodeCnt = pNode->getNode_array().getCount(); for (size_t n = 0; n < nChildNodeCnt; n++) { domNodeRef node = pNode->getNode_array().get(n); VRETURN(ReadJoint(node)); } return IZ_TRUE; }
void Plugin::ReadNodeTranforms(Object *node, domNodeRef domNode, Object *) { // load the node transformations as they are to be able to // handle any matrix stack configurations independant of the tools for (unsigned int i = 0; i < domNode->getContents().getCount(); i++) { // get the component type string char *typeName = (char*)domNode->getContents()[i]->getTypeName(); // set the matrix transformation with the good attributes if (strcmp(typeName, "rotate") == 0) { // load rotation domRotateRef rotateArray = (domRotate*)(domElement*)domNode->getContents()[i]; if (rotateArray->getValue().getCount() != 4) LOG_DEBUG << "something wrong when we load the rotation matrix transformation" << std::endl; else { node->Matrix.AddRotation(Vector3f((float)rotateArray->getValue()[0], (float)rotateArray->getValue()[1], (float)rotateArray->getValue()[2]), (float)rotateArray->getValue()[3]); //transform->SetRotate( rot ); // this will be used to bind to an animation later //sid = (CrtChar *)rotateArray->getSid(); //if ( sid ) // transform->SetSid( sid ); //crtNode->Transforms.push_back(transform); } } else if (strcmp(typeName, "translate") == 0) { // load translation domTranslateRef translateArray = (domTranslate*)(domElement*)domNode->getContents()[i]; if (translateArray->getValue().getCount() != 3) LOG_DEBUG << "something wrong when we load the rotation matrix transformation" << std::endl; else { // get the transation data node->Matrix.AddTranslation((float)translateArray->getValue()[0], (float)translateArray->getValue()[1], (float)translateArray->getValue()[2]); //crtNode->Transforms.push_back(transform); } } else if (strcmp(typeName, "scale") == 0) { // load scale domScaleRef scaleArray = (domScale*)(domElement*)domNode->getContents()[i]; if (scaleArray->getValue().getCount() != 3) LOG_DEBUG << "something wrong when we load the rotation matrix transformation" << std::endl; else { // get the rotation data node->Matrix.AddScale((float)scaleArray->getValue()[0], (float)scaleArray->getValue()[1], (float)scaleArray->getValue()[2]); //crtNode->Transforms.push_back(transform); } } else if (strcmp(typeName, "matrix") == 0) { domMatrixRef matrixArray = (domMatrix*)(domElement*)domNode->getContents()[i]; TMatrix mat; for (int j = 0; j < 4; ++j) for (int k = 0; k < 4; ++k) mat[j][k] = (float)matrixArray->getValue()[(j*4) + k]; node->Matrix.AddTransformation(mat); //crtNode->Transforms.push_back(transform); } /* for (unsigned int i=0; i<Animations.size(); i++) { CrtAnimation * anim = Animations[i]; if (anim->HasFoundTarget()) continue; CrtBool found_target = CrtFalse; for (CrtUInt j=0; j<anim->Channels.size(); j++) { CrtChar * target_id = anim->Channels[j]->GetTargetID(); CrtChar * target_sid = anim->Channels[j]->GetTargetSID(); CrtChar * id = crtNode->GetId(); if (target_id && target_sid && id && sid) { if (CrtICmp(target_id, id) && CrtICmp(target_sid, sid)) { anim->SetFoundTarget(); transform->SetAnimation(anim); transform->AddChannelId(j); found_target = CrtTrue; crtNode->SetAnimation( anim ); // don't want to break, though there maybe be multiple anim targets NumAnimatedNodes++; break; } } } if (found_target) break; } */ } }