SkeletonPtr StatefulSkeletonSerializer::loadSkeleton(const String& name)
    {
        // Resource already created upon mesh loading?
        mSkeleton = SkeletonManager::getSingleton().getByName(name);
        if (mSkeleton.isNull())
        {
            // Nope. We create it here then.
            mSkeleton = SkeletonManager::getSingleton().create(name, 
                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
        }

		mSkeleton = SkeletonPtr(new EditableSkeleton(*mSkeleton.getPointer()));

        std::ifstream ifs;
        ifs.open(name.c_str(), std::ios_base::in | std::ios_base::binary);
        if (!ifs)
        {
            throw std::ios_base::failure(("cannot open file " + name).c_str());
        }

        DataStreamPtr stream(new FileStreamDataStream(name, &ifs, false));

        determineFileFormat(stream);

        importSkeleton(stream, mSkeleton.getPointer());

        ifs.close();

		return mSkeleton;
    }
Exemplo n.º 2
0
void MeshCombiner::consoleMeshCombiner()
{
    StringVector vec = m_MeshCombinerConfig->getMultiSetting( "Mesh" );
    if( vec.empty() )
        return;

    MergeMesh* mm = new MergeMesh();
    SkeletonPtr skel = SkeletonPtr();

    for( StringVector::iterator it = vec.begin();
            it != vec.end(); ++it )
    {
        log( "Loading: " + *it );
        try
        {
            MeshPtr mesh = MeshManager::getSingleton().load(
                               *it, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );

            if( !mesh.isNull() )
                mm->addMesh( mesh );
        }
        catch( ... )
        {
        }
    }

    // save
    MeshPtr mesh = mm->bake();

    MeshSerializer* meshSerializer = new MeshSerializer();
    meshSerializer->exportMesh( mesh.getPointer(), "./media/merged.mesh" );

    MeshManager::getSingleton().remove( mesh->getHandle() );

    // try to load...
    mesh = MeshManager::getSingleton().load(
               "merged.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );

    SceneManager* sm = Root::getSingleton().createSceneManager( ST_GENERIC );

    // try to place...
    sm->getRootSceneNode()->attachObject( sm->createEntity( "test", "merged.mesh" ) );

    delete meshSerializer;
    delete mm;
}
Exemplo n.º 3
0
SkeletonPtr AssetLoader::LoadSkeleton(std::string fileName)
{
    FILE * f;
    fopen_s(&f,fileName.c_str(),"rb");
    unsigned int number;
    fread_s(&number,4,4,1,f);
    if(number != 50)
    {
        fclose(f);
        return SkeletonPtr(true);
    }

    unsigned int meshesCount;
    fread_s(&meshesCount,4,4,1,f);

    int vertCount;
    int indCount;
    for(unsigned int i = 0; i < meshesCount; i++)
    {
        fread_s(&vertCount,4,4,1,f);

        fseek(f,(sizeof(AnimatedVert) * vertCount),SEEK_CUR);

        fread_s(&indCount,4,4,1,f);
        fseek(f,(4 * indCount),SEEK_CUR);
    }



    DirectX::XMFLOAT4X4 mat;
    SkeletonPtr ptr(Heap::GetPtr()->Skeletons.New());

    Skeleton * skeleton = ptr.Get();
    skeleton->Init();

    fread_s(&skeleton->globalInverse,64,64,1,f);
    fread_s(&skeleton->numberOfBones,4,4,1,f);

    skeleton->bones = new Bone[skeleton->numberOfBones];
    int index;
    for(unsigned int i = 0; i<skeleton->numberOfBones; i++)
    {
        skeleton->bones[i].name = "name";

        fread_s(&skeleton->bones[i].offsetMatrix,64,64,1,f);

        fread_s(&skeleton->bones[i].transformation,64,64,1,f);

        int childCount;
        fread_s(&childCount,4,4,1,f);
        if(childCount > 0)
        {
            for(int ch = 0; ch < childCount; ch++)
            {
                fread_s(&index,4,4,1,f);
                skeleton->bones[i].childIndexes.push_back(index);
            }

        }
    }
    fclose(f);

    return ptr;
}