Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
        }
*/
    }
}