Path: blob/master/thirdparty/jolt_physics/Jolt/Skeleton/Skeleton.cpp
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#include <Jolt/Jolt.h>56#include <Jolt/Skeleton/Skeleton.h>7#include <Jolt/ObjectStream/TypeDeclarations.h>8#include <Jolt/Core/StreamIn.h>9#include <Jolt/Core/StreamOut.h>1011JPH_NAMESPACE_BEGIN1213JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(Skeleton::Joint)14{15JPH_ADD_ATTRIBUTE(Joint, mName)16JPH_ADD_ATTRIBUTE(Joint, mParentName)17}1819JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(Skeleton)20{21JPH_ADD_ATTRIBUTE(Skeleton, mJoints)22}2324int Skeleton::GetJointIndex(const string_view &inName) const25{26for (int i = 0; i < (int)mJoints.size(); ++i)27if (mJoints[i].mName == inName)28return i;2930return -1;31}3233void Skeleton::CalculateParentJointIndices()34{35for (Joint &j : mJoints)36j.mParentJointIndex = GetJointIndex(j.mParentName);37}3839bool Skeleton::AreJointsCorrectlyOrdered() const40{41for (int i = 0; i < (int)mJoints.size(); ++i)42if (mJoints[i].mParentJointIndex >= i)43return false;4445return true;46}4748void Skeleton::SaveBinaryState(StreamOut &inStream) const49{50inStream.Write((uint32)mJoints.size());51for (const Joint &j : mJoints)52{53inStream.Write(j.mName);54inStream.Write(j.mParentJointIndex);55inStream.Write(j.mParentName);56}57}5859Skeleton::SkeletonResult Skeleton::sRestoreFromBinaryState(StreamIn &inStream)60{61Ref<Skeleton> skeleton = new Skeleton;6263uint32 len = 0;64inStream.Read(len);65skeleton->mJoints.resize(len);66for (Joint &j : skeleton->mJoints)67{68inStream.Read(j.mName);69inStream.Read(j.mParentJointIndex);70inStream.Read(j.mParentName);71}7273SkeletonResult result;74if (inStream.IsEOF() || inStream.IsFailed())75result.SetError("Failed to read skeleton from stream");76else77result.Set(skeleton);78return result;79}8081JPH_NAMESPACE_END828384