コード例 #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 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;
    }
コード例 #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
ファイル: 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;
 }
コード例 #5
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;
    }
コード例 #6
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);
    }
コード例 #7
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadInts( DiDataStreamPtr& stream, uint32* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(unsigned int) * count);
 }
コード例 #8
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadShorts( DiDataStreamPtr& stream, uint16* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(unsigned short) * count);
 }
コード例 #9
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadFloats( DiDataStreamPtr& stream, float* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(float) * count);
 }
コード例 #10
0
ファイル: Serializer.cpp プロジェクト: redkaras/Demi3D
 void DiSerializer::ReadBools( DiDataStreamPtr& stream, bool* pDest, size_t count )
 {
     stream->Read(pDest, sizeof(bool) * count);
 }