void DiMotionSerializerImpl::WriteAnimation( const DiAnimation* pkAnimation ) { WriteChunkHeader(DI_ANIMATION,CalcAnimationSize(pkAnimation)); // name WriteString(pkAnimation->GetName()); // length float len = pkAnimation->GetLength(); WriteFloats(&len, 1); auto trackIt = pkAnimation->GetNodeClipsIterator(); while(trackIt.HasMoreElements()) { WriteNodeClip(trackIt.GetNext()); } auto attachIt = pkAnimation->GetAttachClipsIterator(); while(attachIt.HasMoreElements()) { DiNodeClip * pAttach = attachIt.GetNext(); WriteAttachClip(pAttach); } }
void DiMeshSerializerImpl::WriteSubMeshBoneWeights( DiSubMesh* pMesh ) { const DiSubMesh::BoneWeightList& weights = pMesh->GetBoneWeights(); uint32 weightsSize = weights.size(); size_t chunkSize = MSTREAM_OVERHEAD_SIZE + sizeof(uint32) + weightsSize * sizeof(DiBoneWeight); WriteChunkHeader(DI_MESH_WEIGHTS, chunkSize); WriteInts(&weightsSize,1); DiSubMesh::BoneWeightList::const_iterator it; DiSubMesh::BoneWeightList::const_iterator itEnd = weights.end(); for (it = weights.begin(); it != itEnd; ++it) { WriteInts(&it->second.vertexIndex,1); WriteShorts(&it->second.boneIndex,1); WriteFloats(&it->second.weight,1); } }
void DiMeshSerializerImpl::WriteBoundsInfo( const DiMesh* pMesh ) { unsigned long size = MSTREAM_OVERHEAD_SIZE; size += sizeof(float) * 6; WriteChunkHeader(DI_MESH_BOUNDS, size); const DiVec3& min = pMesh->GetBounds().GetMinimum(); const DiVec3& max = pMesh->GetBounds().GetMaximum(); WriteFloats(&min.x, 1); WriteFloats(&min.y, 1); WriteFloats(&min.z, 1); WriteFloats(&max.x, 1); WriteFloats(&max.y, 1); WriteFloats(&max.z, 1); }
void DiMotionSerializerImpl::WriteAttachClip( const DiNodeClip* clip ) { DiAttachNode * attach = (DiAttachNode *)clip->GetTargetNode(); if (!attach) { DI_WARNING("No target node!"); return; } WriteChunkHeader(DI_CLIPS_ATTACH,CalcAttachClipSize(clip)); WriteString(attach->GetName()); uint16 keyFrameNum = (uint16) clip->GetNumFrames(); WriteShorts(&keyFrameNum,1); for (uint16 i = 0; i < keyFrameNum; ++i) { DiTransformKeyFrame* key = clip->GetNodeKeyFrame(i); float time = key->GetTime(); WriteFloats(&time, 1); WriteObject(key->GetTranslate()); WriteObject(key->GetRotation()); bool hasScale = key->GetScale() != DiVec3::UNIT_SCALE; WriteBools(&hasScale,1); if (hasScale) { WriteObject(key->GetScale()); } } }
void DiMotionSerializerImpl::WriteNodeClip( const DiNodeClip* pClip ) { DiBone* bone = (DiBone*)pClip->GetTargetNode(); if (!bone) { return; } WriteChunkHeader(DI_CLIPS_NODE,CalcNodeClipSize(pClip)); uint16 boneid = (uint16)bone->GetHandle(); WriteShorts(&boneid, 1); uint16 keyFrameNum = (uint16) pClip->GetNumFrames(); WriteShorts(&keyFrameNum,1); for (uint16 i = 0; i < keyFrameNum; ++i) { DiTransformKeyFrame* key = pClip->GetNodeKeyFrame(i); float time = key->GetTime(); WriteFloats(&time, 1); WriteObject(key->GetTranslate()); WriteObject(key->GetRotation()); bool hasScale = key->GetScale() != DiVec3::UNIT_SCALE; WriteBools(&hasScale,1); if (hasScale) { WriteObject(key->GetScale()); } } }
void DiSerializer::WriteObject( const DiQuat& q ) { float tmp[4] = { q.x, q.y, q.z, q.w }; WriteFloats(tmp, 4); }
void DiSerializer::WriteObject( const DiVec3& vec ) { WriteFloats(vec.ptr(), 3); }