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; }
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; }
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); } } }
DiString DiSerializer::ReadString( DiDataStreamPtr& stream, size_t numChars ) { assert (numChars <= 255); char str[255]; stream->Read(str, numChars); str[numChars] = '\0'; return str; }
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; }
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); }
void DiSerializer::ReadInts( DiDataStreamPtr& stream, uint32* pDest, size_t count ) { stream->Read(pDest, sizeof(unsigned int) * count); }
void DiSerializer::ReadShorts( DiDataStreamPtr& stream, uint16* pDest, size_t count ) { stream->Read(pDest, sizeof(unsigned short) * count); }
void DiSerializer::ReadFloats( DiDataStreamPtr& stream, float* pDest, size_t count ) { stream->Read(pDest, sizeof(float) * count); }
void DiSerializer::ReadBools( DiDataStreamPtr& stream, bool* pDest, size_t count ) { stream->Read(pDest, sizeof(bool) * count); }