コード例 #1
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializerImpl::ReadSubMesh( DiDataStreamPtr& stream, DiMesh* pMesh )
    {
        DI_SERIAL_LOG("Reading submesh..");

        DiSubMesh* sm = pMesh->CreateSubMesh();

        unsigned short streamID = 0;

        DiString material = ReadString(stream);
        sm->SetMaterialName(material);

        DI_SERIAL_LOG("Liking material: %s", material.c_str());

        unsigned int indexCount = 0;
        ReadInts(stream, &indexCount, 1);

        DI_SERIAL_LOG("Indeices count: %d", indexCount);

        bool idx32bit;
        ReadBools(stream, &idx32bit, 1);

        DI_SERIAL_LOG("Index size: %d", idx32bit?32:16);

        uint16 primitive;
        ReadShorts(stream,&primitive,1);
        sm->SetPrimitiveType((DiPrimitiveType)primitive);

        DI_SERIAL_LOG("Primitive type: %d", primitive);

        if (indexCount > 0)
        {
            void* indexdata = sm->CreateIndexData(indexCount,idx32bit?TRUE:FALSE);
            int size = indexCount * (sm->GetIndexSize() / 8);
            stream->Read(indexdata, size);
            DI_SERIAL_LOG("%d bytes readed", size);
        }

        streamID = ReadChunk(stream);
        if (streamID != DI_GEOMETRY)
        {
            DI_ERROR("Bad stream ID");
            return;
        }

        ReadGeometry(stream, sm);

        if (!stream->Eof())
        {
            streamID = ReadChunk(stream);
            if (streamID == DI_MESH_WEIGHTS)
            {
                ReadSubMeshBoneWeights(stream,sm);
            }
            else
            {
                if (!stream->Eof())
                    stream->Skip(-MSTREAM_OVERHEAD_SIZE);
            }
        }
    }
コード例 #2
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializerImpl::ImportMesh( DiDataStreamPtr& stream, DiMesh* pMesh )
    {
        ReadFileHeader(stream);

        if (!stream->Eof())
        {
            uint16 streamID = ReadChunk(stream);
            while(!stream->Eof() &&
                (
                streamID == DI_SUBMESH ||
                streamID == DI_MESH_BOUNDS))
            {
                switch(streamID)
                {
                case DI_SUBMESH:
                    ReadSubMesh(stream, pMesh);
                    break;

                case DI_MESH_BOUNDS:
                    ReadBoundsInfo(stream, pMesh);
                    break;
                }

                if (!stream->Eof())
                {
                    streamID = ReadChunk(stream);
                }

            }
            if (!stream->Eof())
            {
                stream->Skip(-MSTREAM_OVERHEAD_SIZE);
            }
        }
    }
コード例 #3
0
ファイル: MotionSerial.cpp プロジェクト: wangyanxing/Demi3D
    void DiMotionSerializerImpl::ImportMotion( DiDataStreamPtr& stream, DiMotion* pDest )
    {
        ReadFileHeader(stream);

        if (!stream->Eof())
        {
            uint16 streamID = ReadChunk(stream);
            while(!stream->Eof() &&
                (streamID == DI_SKELETON ||
                streamID == DI_POSE ||
                streamID == DI_ANIMATION))
            {
                switch(streamID)
                {
                case DI_SKELETON:
                    ReadSkeleton(stream,pDest);
                    break;

                case DI_ANIMATION:
                    ReadAnimations(stream, pDest);
                    break;

                case DI_POSE:
                    ReadPoses(stream,pDest);
                    break;
                }

                if (!stream->Eof())
                    streamID = ReadChunk(stream);

            }
            if (!stream->Eof())
                stream->Skip(-MSTREAM_OVERHEAD_SIZE);
        }
    }
コード例 #4
0
ファイル: MotionSerial.cpp プロジェクト: wangyanxing/Demi3D
    void DiMotionSerializerImpl::ReadAnimations( DiDataStreamPtr& stream, DiMotion* motion )
    {
        // name
        DiString name = ReadString(stream);

        // length
        float len = 0;
        ReadFloats(stream,&len, 1);

        DiAnimation* anim = motion->CreateAnimation(name,len);

        if (!stream->Eof())
        {
            uint16 streamID = ReadChunk(stream);
            while(!stream->Eof() &&
                (streamID == DI_CLIPS_NODE ||
                streamID == DI_CLIPS_ATTACH ||
                streamID == DI_CLIPS_POSE))
            {
                switch(streamID)
                {
                case DI_CLIPS_NODE:
                    ReadNodeClips(stream,anim);
                    break;

                case DI_CLIPS_POSE:
                    ReadPoseClips(stream,anim);
                    break;

                case DI_CLIPS_ATTACH:
                    ReadAttachClips(stream,anim);
                    break;
                }

                if (!stream->Eof())
                {
                    streamID = ReadChunk(stream);
                }

            }
            if (!stream->Eof())
            {
                stream->Skip(-MSTREAM_OVERHEAD_SIZE);
            }
        }
    }
コード例 #5
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializerImpl::ReadGeometry( DiDataStreamPtr& stream, DiSubMesh* pMesh )
    {
        DI_SERIAL_LOG("Reading geometry data...");

        unsigned int vertexCount = 0;
        ReadInts(stream, &vertexCount, 1);
        pMesh->SetVerticeNum(vertexCount);

        DI_SERIAL_LOG("Vertices count: %d", vertexCount);

        unsigned int faceCount = 0;
        ReadInts(stream, &faceCount, 1);
        pMesh->SetPrimitiveCount(faceCount);

        DI_SERIAL_LOG("Face count: %d", faceCount);

        if (!stream->Eof())
        {
            unsigned short streamID = ReadChunk(stream);
            while(!stream->Eof() &&
                (streamID == DI_GEOMETRY_VERTEX_BUFFER ||
                streamID == DI_GEOMETRY_VERTEX_DECLARATION))
            {
                switch (streamID)
                {
                case DI_GEOMETRY_VERTEX_DECLARATION:
                    ReadGeometryVertexDeclaration(stream, pMesh);
                    break;
                case DI_GEOMETRY_VERTEX_BUFFER:
                    ReadGeometryVertexBuffer(stream, pMesh);
                    break;
                }

                if (!stream->Eof())
                {
                    streamID = ReadChunk(stream);
                }
            }
            if (!stream->Eof())
            {
                stream->Skip(-MSTREAM_OVERHEAD_SIZE);
            }
        }
    }
コード例 #6
0
ファイル: MotionSerial.cpp プロジェクト: wangyanxing/Demi3D
    void DiMotionSerializerImpl::ReadSkeleton( DiDataStreamPtr& stream,DiMotion* motion )
    {
        DiSkeleton* skel = motion->CreateSkeleton();
    
        uint16 blendmode;
        ReadShorts(stream,&blendmode,1);
        skel->SetBlendMode(SkeletonBlendMode(blendmode));

        if (!stream->Eof())
        {
            uint16 streamID = ReadChunk(stream);
            while(!stream->Eof() &&
                (streamID == DI_BONES ||
                streamID == DI_BONES_PARENT))
            {
                switch(streamID)
                {
                case DI_BONES:
                    ReadBones(stream,skel);
                    break;

                case DI_BONES_PARENT:
                    ReadBonesParents(stream,skel);
                    break;
                }

                if (!stream->Eof())
                {
                    streamID = ReadChunk(stream);
                }

            }
            if (!stream->Eof())
            {
                stream->Skip(-MSTREAM_OVERHEAD_SIZE);
            }
        }
    }