void DiMeshSerializerImpl::ExportMesh( const DiMesh* pMesh, DiDataStreamPtr stream ) { mStream = stream; WriteFileHeader(); DiMesh::ConstSubMeshIterator it = pMesh->GetSubMeshs(); while (it.HasMoreElements()) { DiSubMesh* sm = it.GetNext(); WriteSubMesh(sm); } WriteBoundsInfo(pMesh); }
void MeshSaverImplv1_0::WriteSubMeshData(MeshTemplate* templ, const MeshTemplate::PrimitiveGroup& gr, ChunkOutputStream& outStream) { bool sharedMeshBuffer = false; MeshBuffer* buffer = templ->GetSharedMeshBuffer(); if (!gr.buffer || gr.buffer == buffer) { sharedMeshBuffer = true; } else buffer = gr.buffer; { uint8 primType = (uint8)buffer->GetPrimitiveType(); OutputSerializer& ser = outStream.BeginChunk(MCID_SUBMESH_INFO); ser << primType; outStream.EndChunk(); } if (sharedMeshBuffer) { { uint32 start = gr.startVertex; uint32 count = gr.vertexCount; OutputSerializer& ser = outStream.BeginChunk(MCID_SHARED_VERTEX_DATA); ser << start << count; outStream.EndChunk(); } { uint32 start = gr.startIndex; uint32 count = gr.indexCount; OutputSerializer& ser = outStream.BeginChunk(MCID_SHARED_INDEX_DATA); ser << start << count; outStream.EndChunk(); } } else { WriteVertexData(buffer, outStream); WriteIndexData(buffer, outStream); } WriteBoundsInfo(gr.bounds, outStream); if (gr.material && gr.material != templ->GetSharedMaterial()) { WriteMaterialData(gr.material, outStream); } { OutputSerializer& ser = outStream.BeginChunk(MCID_SUBMESH_END); outStream.EndChunk(); } }
void MeshSaverImplv1_0::Save(OutputStreamPtr& out, AssetSaver& saver) { try { MeshTemplate* mesh = static_cast<MeshTemplate*>( saver.GetRequestPtr()->GetStreamedObject()); WriteVersion(out); ChunkOutputStream stream(out); WriteMeshHeader(mesh, stream); WriteBoundsInfo(mesh->GetBounds(), stream); MeshBuffer* buffer = mesh->GetSharedMeshBuffer(); MaterialTemplatePtr material = mesh->GetSharedMaterial(); if (buffer) { WriteVertexData(buffer, stream); WriteIndexData(buffer, stream); } if (material) { WriteMaterialData(material, stream); } uint32 numPrim = mesh->GetNumPrimitiveGroups(); for (uint32 i = 0; i < numPrim; ++i) { OutputSerializer& ser = stream.BeginChunk(MCID_SUBMESH_DATA); WriteSubMeshData(mesh, mesh->GetPrimitive(i), stream); stream.EndChunk(); } } catch (const GracefulErrorExcept& e) { saver.GetRequestPtr()->SetCompleted(false); NEX_THROW(e); } saver.GetRequestPtr()->SetCompleted(true); }