//--------------------------------------------------------------------- void SkeletonSerializer::writeBoneParent(const Skeleton* pSkel, unsigned short boneId, unsigned short parentId) { writeChunkHeader(SKELETON_BONE_PARENT, calcBoneParentSize(pSkel)); // unsigned short handle : child bone writeShorts(&boneId, 1); // unsigned short parentHandle : parent bone writeShorts(&parentId, 1); }
////////////////////////////////////////////////////////////////////////// // 写 void Serializer::writeFileHeader(void) { uint16 val = HEADER_STREAM_ID; writeShorts(&val, 1); writeString(mVersion); }
//--------------------------------------------------------------------- void SkeletonSerializer::writeSkeleton(const Skeleton* pSkel, SkeletonVersion ver) { // Write blend mode if ((int)ver > (int)SKELETON_VERSION_1_0) { writeChunkHeader(SKELETON_BLENDMODE, SSTREAM_OVERHEAD_SIZE + sizeof(unsigned short)); uint16 blendMode = static_cast<uint16>(pSkel->getBlendMode()); writeShorts(&blendMode, 1); } // Write each bone unsigned short numBones = pSkel->getNumBones(); unsigned short i; for (i = 0; i < numBones; ++i) { Bone* pBone = pSkel->getBone(i); writeBone(pSkel, pBone); } // Write parents for (i = 0; i < numBones; ++i) { Bone* pBone = pSkel->getBone(i); unsigned short handle = pBone->getHandle(); Bone* pParent = (Bone*)pBone->getParent(); if (pParent != NULL) { writeBoneParent(pSkel, handle, pParent->getHandle()); } } }
//--------------------------------------------------------------------- void Serializer::writeChunkHeader(uint16 id, size_t size) { #if OGRE_SERIALIZER_VALIDATE_CHUNKSIZE if (!mChunkSizeStack.empty()){ size_t pos = mStream->tell(); if (pos != static_cast<size_t>(mChunkSizeStack.back()) && mReportChunkErrors){ LogManager::getSingleton().logMessage("Corrupted chunk detected! Stream name: '" + mStream->getName() + "' Chunk id: " + StringConverter::toString(id)); } mChunkSizeStack.back() = pos + size; } #endif writeShorts(&id, 1); uint32 uint32size = static_cast<uint32>(size); writeInts(&uint32size, 1); }
//--------------------------------------------------------------------- void SkeletonSerializer::writeAnimationTrack(const Skeleton* pSkel, const NodeAnimationTrack* track) { writeChunkHeader(SKELETON_ANIMATION_TRACK, calcAnimationTrackSize(pSkel, track)); // unsigned short boneIndex : Index of bone to apply to Bone* bone = (Bone*)track->getAssociatedNode(); unsigned short boneid = bone->getHandle(); writeShorts(&boneid, 1); // Write all keyframes for (unsigned short i = 0; i < track->getNumKeyFrames(); ++i) { writeKeyFrame(pSkel, track->getNodeKeyFrame(i)); } }
//--------------------------------------------------------------------- void SkeletonSerializer::writeBone(const Skeleton* pSkel, const Bone* pBone) { writeChunkHeader(SKELETON_BONE, calcBoneSize(pSkel, pBone)); unsigned short handle = pBone->getHandle(); // char* name writeString(pBone->getName()); // unsigned short handle : handle of the bone, should be contiguous & start at 0 writeShorts(&handle, 1); // Vector3 position : position of this bone relative to parent writeObject(pBone->getPosition()); // Quaternion orientation : orientation of this bone relative to parent writeObject(pBone->getOrientation()); // Vector3 scale : scale of this bone relative to parent if (pBone->getScale() != Vector3::UNIT_SCALE) { writeObject(pBone->getScale()); } }
//--------------------------------------------------------------------- void SkeletonSerializer::writeBone(const Skeleton* pSkel, const Bone* pBone) { writeChunkHeader(SKELETON_BONE, calcBoneSize(pSkel, pBone)); unsigned short handle = pBone->getHandle(); // char* name writeString(pBone->getName()); #if OGRE_SERIALIZER_VALIDATE_CHUNKSIZE // Hack to fix chunk size validation: mChunkSizeStack.back() += calcStringSize(pBone->getName()); #endif // unsigned short handle : handle of the bone, should be contiguous & start at 0 writeShorts(&handle, 1); // Vector3 position : position of this bone relative to parent writeObject(pBone->getPosition()); // Quaternion orientation : orientation of this bone relative to parent writeObject(pBone->getOrientation()); // Vector3 scale : scale of this bone relative to parent if (pBone->getScale() != Vector3::UNIT_SCALE) { writeObject(pBone->getScale()); } }
//--------------------------------------------------------------------- void Serializer::writeChunkHeader(uint16 id, size_t size) { writeShorts(&id, 1); uint32 uint32size = static_cast<uint32>(size); writeInts(&uint32size, 1); }