コード例 #1
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializer::ImportMesh( DiDataStreamPtr& stream, DiMesh* pDest )
    {
        DI_SERIAL_LOG("Loading mesh : %s", stream->GetName().c_str());
        char sign[4];
        stream->Read(sign,4);

        if (CheckHead(sign))
        {
            uint16 version;
            stream->Read(&version,sizeof(uint16));

            DI_SERIAL_LOG("Mesh version: %d", version);

            if (version >= MODEL_SERIAL_VERSION_NUM)
            {
                DI_ERROR("Unknow mesh version.");
                return;
            }

            DiMeshSerializerImpl* impl = GetImplemention((DiMeshSerialVersion)version);
            if (impl)
            {
                impl->ImportMesh(stream,pDest);
            }

            DI_DELETE impl;
            return;
        }

        DI_ERROR("Invalid mesh file head.");
        return;
    }
コード例 #2
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);
        }
    }
コード例 #3
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);
            }
        }
    }
コード例 #4
0
ファイル: MotionSerial.cpp プロジェクト: wangyanxing/Demi3D
    void DiMotionSerializer::ImportMotion( DiDataStreamPtr& stream, DiMotion* pDest )
    {
        char sign[4];
        stream->Read(sign,4);

        if (sign[0] == 'D' &&
            sign[1] == 'i' &&
            sign[2] == 'M' &&
            sign[3] == 'o')
        {
            uint16 version;
            stream->Read(&version,sizeof(uint16));

            if (version >= MOTION_SERIAL_VERSION_NUM)
            {
                DI_ERROR("Invalid version number!");
                return;
            }

            DiMotionSerializerImpl* impl = GetImplemention((DiMotionSerialVersion)version);
            if (impl)
            {
                impl->ImportMotion(stream,pDest);
            }

            DI_DELETE impl;
            return;
        }

        DI_ERROR("Invalid head format!");
        return;
    }
コード例 #5
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);
            }
        }
    }
コード例 #6
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializerImpl::ReadGeometryVertexDeclaration( 
        DiDataStreamPtr& stream, DiSubMesh* pMesh)
    {
        DI_SERIAL_LOG("Reading vertex declaration info...");

        uint32  elementsNum = (mCurChunkSize - MSTREAM_OVERHEAD_SIZE)/(sizeof(uint16)*4);

        DI_SERIAL_LOG("Number of elements: %d", elementsNum);

        if (elementsNum > 0 && !stream->Eof())
        {
            pMesh->GetVertexElements().ClearElements();

            for (uint32 i=0; i<elementsNum; i++)
            {
                unsigned short source, tmp;
                DiVertexType vType;
                DiVertexUsage vSemantic;
                ReadShorts(stream, &source, 1);
                ReadShorts(stream, &tmp, 1);
                vType = static_cast<DiVertexType>(tmp);
                ReadShorts(stream, &tmp, 1);
                vSemantic = static_cast<DiVertexUsage>(tmp);
                ReadShorts(stream, &tmp, 1);
                uint8 usageID = static_cast<uint8>(tmp);
                pMesh->GetVertexElements().AddElement(source,vType,vSemantic,usageID);
            }
        }
    }
コード例 #7
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializer::ExportMesh( const DiMeshPtr pMesh, DiDataStreamPtr stream )
    {
        static char head[4] = { 'D', 'e', 'm', 'i' };
        stream->Write(head, 4);

        uint16 version = MODEL_SERIAL_VERSION_NUM - 1;
        stream->Write(&version,sizeof(uint16));

        DiMeshSerializerImpl* impl = GetImplemention((DiMeshSerialVersion)version);
        if (impl)
        {
            impl->ExportMesh(pMesh.get(),stream);
        }

        DI_DELETE impl;
    }
コード例 #8
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);
            }
        }
    }
コード例 #9
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 DiString DiSerializer::ReadString( DiDataStreamPtr& stream, size_t numChars )
 {
     assert (numChars <= 255);
     char str[255];
     stream->Read(str, numChars);
     str[numChars] = '\0';
     return str;
 }
コード例 #10
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);
            }
        }
    }
コード例 #11
0
ファイル: Material.cpp プロジェクト: wangyanxing/Demi3D
 bool DiMaterial::Load( DiDataStreamPtr data )
 {
     DiMaterialSerializer ms;
     if(ms.ParseMaterial(data,this) == false)
     {
         DI_WARNING("Failed to load the material : %s",data->GetName().c_str());
         return false;
     }
     return true;
 }
コード例 #12
0
ファイル: MotionSerial.cpp プロジェクト: wangyanxing/Demi3D
    void DiMotionSerializer::ExportMotion( const DiMotionPtr pMotion, DiDataStreamPtr stream )
    {
        char sign[4];
        sign[0] = 'D';
        sign[1] = 'i';
        sign[2] = 'M';
        sign[3] = 'o';
        stream->Write(sign,4);

        uint16 version = MOTION_SERIAL_VERSION_NUM - 1;
        stream->Write(&version,sizeof(uint16));

        DiMotionSerializerImpl* impl = GetImplemention((DiMotionSerialVersion)version);
        if (impl)
        {
            impl->ExportMotion(pMotion.get(),stream);
        }

        DI_DELETE impl;
    }
コード例 #13
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
    void DiSerializer::ReadFloats( DiDataStreamPtr& stream, double* pDest, size_t count )
    {
        float* tmp = DI_NEW float[count];
        float* ptmp = tmp;
        stream->Read(tmp, sizeof(float) * count);

        while(count--)
        {
            *pDest++ = *ptmp++;
        }

        DI_DELETE[] tmp;
    }
コード例 #14
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);
            }
        }
    }
コード例 #15
0
ファイル: MeshSerial.cpp プロジェクト: redkaras/Demi3D
    void DiMeshSerializerImpl::ReadGeometryVertexBuffer( 
        DiDataStreamPtr& stream, DiSubMesh* pMesh )
    {
        DI_SERIAL_LOG("Reading vertex buffer...");

        uint16 bindIndex, vertexSize;
        
        ReadShorts(stream, &bindIndex, 1);
        ReadShorts(stream, &vertexSize, 1);

        uint32 size = vertexSize * pMesh->GetVerticeNum();
        void* buf = pMesh->CreateSourceData(bindIndex,pMesh->GetVerticeNum(),vertexSize);

        stream->Read(buf, size);
        DI_SERIAL_LOG("%d bytes readed", size);
    }
コード例 #16
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 DiString DiSerializer::ReadString( DiDataStreamPtr& stream )
 {
     return stream->GetLine();
 }
コード例 #17
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadBools( DiDataStreamPtr& stream, bool* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(bool) * count);
 }
コード例 #18
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadFloats( DiDataStreamPtr& stream, float* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(float) * count);
 }
コード例 #19
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadShorts( DiDataStreamPtr& stream, uint16* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(unsigned short) * count);
 }
コード例 #20
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadInts( DiDataStreamPtr& stream, uint32* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(unsigned int) * count);
 }