Files
2026-05-31 14:27:52 -07:00

81 lines
2.7 KiB
C#

#if UNITY_EDITOR
using Unity.Collections;
using Unity.Mathematics;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
using Hash128 = Unity.Entities.Hash128;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rukhanka.Hybrid
{
public static class BakingUtils
{
public static Hash128 ComputeAnimationHash(uint2 animationAssetID, uint2 avatarAssetID)
{
var rv = new Hash128(avatarAssetID.x, avatarAssetID.y, animationAssetID.x, animationAssetID.y);
return rv;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static uint2 GetAssetID(Object obj)
{
if (obj == null)
return 0;
if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out var guidString, out long fileID))
{
// In case of no backed file, use InstanceID
#if UNITY_6000_4_OR_NEWER
ulong entityID = obj.GetEntityId().GetRawData();
#else
ulong entityID = (ulong)obj.GetInstanceID();
#endif
return new uint2((uint)entityID, (uint)(entityID >> 32));
}
var guid = new GUID(guidString);
var hashBuilder = new xxHash3.StreamingState(true, 121212);
hashBuilder.Update(guid);
hashBuilder.Update(fileID);
var rv = hashBuilder.DigestHash64();
return rv;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static Hash128 ComputeAnimationHash(AnimationClip animation, Avatar avatar)
{
var animationAssetID = GetAssetID(animation);
var avatarAssetID = GetAssetID(avatar);
var rv = ComputeAnimationHash(animationAssetID, avatarAssetID);
return rv;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static Hash128 ComputeControllerHash(AnimatorController controller)
{
var assetID = GetAssetID(controller);
var rv = new Hash128(assetID.x, assetID.y, 0, 0);
return rv;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static Hash128 ComputeAvatarMaskHash(AvatarMask avatarMask, RigDefinitionAuthoring rigDefinition)
{
var assetID = GetAssetID(avatarMask);
var rigHash = rigDefinition.CalculateRigHash();
var rv = new Hash128(assetID.x, assetID.y, rigHash.Value.x, rigHash.Value.y);
return rv;
}
}
}
#endif