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); } } }
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); } } }
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); } }
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); } } }
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); } } }
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); } } }