void DiMotionSerializerImpl::ExportMotion( const DiMotion* pMotion, DiDataStreamPtr stream ) { mStream = stream; WriteFileHeader(); if (pMotion->GetSkeleton()) { WriteSkeleton(pMotion->GetSkeleton()); } DiMotion::ConstAnimationListIterator i = pMotion->GetAnimations(); while (i.HasMoreElements()) { WriteAnimation(i.GetNext()); } }
bool mdlWriter::write(scene::SMesh*m,OS::IStream* stream) { if(!stream || !m) return false; core::stringc tmpStr; OS::StreamWriter writer(stream); MDLLoaderV0::MDLHeader header; MDLLoaderV0::MeshHeader meshHeader; MDLLoaderV0::SkinClusterHeader skinHeader; MDLLoaderV0::SkinClusterBoneHeader skinBoneHeader; MDLLoaderV0::StreamHeader streamHeader; MDLLoaderV0::IndexStreamHeader indexStreamHeader; header.magic=0x1A1B; header.version=0x10; header.objectsCount=m->getBuffersCount(); header.hasSkeleton=!m->getSkeleton().isNull(); header.totalCycles=0; header.totalLocators=0; stream->write(&header,sizeof(header)); //write the skeleton if exists if(m->getSkeleton()) { WriteSkeleton(m->getSkeleton().pointer(),stream); } //write all buffers for(int buffId=0;buffId<m->getBuffersCount();++buffId) { scene::MeshBufferData* buffData= m->getBufferData(buffId); scene::IMeshBuffer* buffer= buffData->getMeshBuffer(); core::string_to_char(buffer->getMeshName(),tmpStr); //int len=math::Min<uint>(sizeof(meshHeader.objectName),tmpStr.length()); //memcpy(meshHeader.objectName,tmpStr.c_str(),len); //meshHeader.objectName[len]=0; writer.binWriteString(tmpStr); video::StreamsDataCRef streams= buffer->getStreamsData(); video::StreamsMap::const_iterator streamIt=streams->streams.begin(); meshHeader.streamsCount=streams->streams.size(); meshHeader.hasSkin=!buffer->getSkinCluster().isNull(); meshHeader.boundingBox=buffer->getBoundingBox(); meshHeader.renderType= buffer->getRenderType(); //write mesh buffer header stream->write(&meshHeader,sizeof(meshHeader)); video::IHardwareIndexBuffer* indexBuffer=buffer->getIndexData()->indexBuffer.pointer(); indexStreamHeader.firstIndex=buffer->getIndexData()->firstIndex; indexStreamHeader.indexCount=buffer->getIndexData()->indexCount; indexStreamHeader.indexType=indexBuffer->getIndexType(); indexStreamHeader.indexSize=indexBuffer->getIndexSize(); indexStreamHeader.numIndicies=indexBuffer->getIndexCount(); indexStreamHeader.usage=indexBuffer->getUsageType(); indexStreamHeader.useVirtualBuffer=indexBuffer->hasVirtualBuffer(); indexStreamHeader.software=!indexBuffer->isInGPU(); //write index header stream->write(&indexStreamHeader,sizeof(indexStreamHeader)); //write indicies void* indicies=indexBuffer->lock(0,0,video::IHardwareBuffer::ELO_ReadOnly); stream->write(indicies,indexBuffer->getSizeInBytes()); indexBuffer->unlock(); for(;streamIt!=streams->streams.end();++streamIt) { video::IHardwareStreamBuffer* streamBuff=streamIt->second.pointer(); streamHeader.streamIndex=streamIt->first.index; streamHeader.streamType=streamIt->first.type; streamHeader.dataType=streamBuff->getElementData(); streamHeader.length=streamBuff->length(); streamHeader.usage=streamBuff->getUsageType(); streamHeader.useVirtualBuffer=streamBuff->hasVirtualBuffer(); streamHeader.software=!streamBuff->isInGPU(); //write stream header stream->write(&streamHeader,sizeof(streamHeader)); //write stream data void* data=streamBuff->lock(0,0,video::IHardwareBuffer::ELO_ReadOnly); stream->write(data,streamBuff->getSizeInBytes()); streamBuff->unlock(); } if(meshHeader.hasSkin) { scene::ISkinCluster* cluster= buffer->getSkinCluster(); const scene::ISkinCluster::BoneWeightList& weights=cluster->getBoneWeightList(); skinHeader.bonesCount=weights.size(); stream->write(&skinHeader,sizeof(skinHeader)); scene::ISkinCluster::BoneWeightList::const_iterator it=weights.begin(); for(;it!=weights.end();++it) { const scene::ISkinCluster::SBoneWeights& bweights=*it; skinBoneHeader.index= bweights.boneIndex; skinBoneHeader.vertices= bweights.vertices.size(); stream->write(&skinBoneHeader,sizeof(skinBoneHeader)); if(skinBoneHeader.vertices>0) stream->write(&bweights.vertices[0],sizeof(float)*skinBoneHeader.vertices); } } } stream->close(); return true; }