示例#1
0
    const AnimData* AnimResManager::loadAnimData(const char *aniFileName)
    {
        assert(aniFileName != NULL && *aniFileName != 0);
        vector< Pair >::iterator node = find(m_AnimData.begin(), m_AnimData.end(), aniFileName);
        if (node != m_AnimData.end())
        {
            return node->pAnimData;
        }

        char *s2 = strdup(aniFileName);
        if (!s2)
            return 0;

        vector<const char *> pathTokens;
        for (const char *pathToken = strtok(s2, "/\\"); pathToken; pathToken = strtok(0, "/\\"))
        {
            pathTokens.push_back(pathToken);
        }
        const char *cdot = strrchr(pathTokens.back(), '.');
        bool bXmlFile = false;
        if (cdot && 0 == strcmp(cdot, ".xml"))
            bXmlFile = true;
        free(s2);

        if (bXmlFile)
        {
            AnimData *pAnimData = new AnimData;
            if (pAnimData)
            {
                if (!pAnimData->loadFromXml(aniFileName))
                {
                    delete pAnimData;
                    pAnimData = 0;
                }
            }
            return pAnimData;
        }
        else
        {
            iByteStream *byteStream = iSystem::GetInstance()->loadStream(aniFileName);
            if (!byteStream)
                return 0;

            AnimData *pAnimData = new AnimData;
            if (pAnimData)
            {
                if (!pAnimData->loadFromByteStream(byteStream))
                {
                    delete pAnimData;
                    pAnimData = 0;
                }
            }

            iSystem::GetInstance()->release(byteStream);
            return pAnimData;
        }
    }