예제 #1
0
    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());
        }
    }
예제 #2
0
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;
}