// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
namespace MagicaCloth
{
public static class DataUtility
{
///
/// 2つのインデックスを1つのUint型にパッキングする
/// 上位16ビット、下位16ビットにv0/v1番号を結合する
/// ただし番号が若いものが上位に来るように配置
///
///
///
///
public static uint PackPair(int v0, int v1)
{
if (v0 > v1)
{
return (uint)v1 << 16 | (uint)v0 & 0xffff;
}
else
{
return (uint)v0 << 16 | (uint)v1 & 0xffff;
}
}
///
/// パックデータを2つの番号(v0/v1)に分離する
///
///
///
///
public static void UnpackPair(uint pack, out int v0, out int v1)
{
// 辺の頂点分解
v0 = (int)((pack >> 16) & 0xffff);
v1 = (int)(pack & 0xffff);
}
///
/// 2つのintを1つのuintにパッキングする
///
///
///
///
public static uint Pack16(int hi, int low)
{
return (uint)hi << 16 | (uint)low & 0xffff;
}
///
/// uintパックデータから上位16bitをintにして返す
///
///
///
public static int Unpack16Hi(uint pack)
{
return (int)((pack >> 16) & 0xffff);
}
///
/// uintパックデータから下位16bitをintにして返す
///
///
///
public static int Unpack16Low(uint pack)
{
return (int)(pack & 0xffff);
}
///
/// 2つのintを1つのuintにパッキングする(4bit/28bit)
///
///
///
///
public static uint Pack4_28(int hi, int low)
{
return (uint)hi << 28 | (uint)low & 0xfffffff;
}
///
/// uintパックデータから上位4bitをintにして返す
///
///
///
public static int Unpack4_28Hi(uint pack)
{
return (int)((pack >> 28) & 0xf);
}
///
/// uintパックデータから下位28bitをintにして返す
///
///
///
public static int Unpack4_28Low(uint pack)
{
return (int)(pack & 0xfffffff);
}
///
/// 2つのintを1つのuintにパッキングする(8bit/24bit)
///
///
///
///
public static uint Pack8_24(int hi, int low)
{
return (uint)hi << 24 | (uint)low & 0xffffff;
}
///
/// uintパックデータから上位8bitをintにして返す
///
///
///
public static int Unpack8_24Hi(uint pack)
{
return (int)((pack >> 24) & 0xf);
}
///
/// uintパックデータから下位24bitをintにして返す
///
///
///
public static int Unpack8_24Low(uint pack)
{
return (int)(pack & 0xffffff);
}
///
/// 2つのintを1つのulongにパッキングする
///
///
///
///
public static ulong Pack32(int hi, int low)
{
return (ulong)hi << 32 | (ulong)low & 0xffffffff;
}
///
/// ulongパックデータから上位データを返す
///
///
///
public static int Unpack32Hi(ulong pack)
{
return (int)((pack >> 32) & 0xffffffff);
}
///
/// ulongパックデータから下位データを返す
///
///
///
public static int Unpack32Low(ulong pack)
{
return (int)(pack & 0xffffffff);
}
///
/// 3つのインデックスを1つのulong型にパッキングする
/// 番号が若いものが上位に来るように配置
/// ※この関数はジョブシステムでは利用できません
///
///
///
///
///
public static ulong PackTriple(int v0, int v1, int v2)
{
List indexList = new List();
indexList.Add((ulong)v0);
indexList.Add((ulong)v1);
indexList.Add((ulong)v2);
indexList.Sort();
ulong hash = (indexList[0] << 32) | (indexList[1] << 16) | (indexList[2]);
return hash;
}
///
/// パックデータを3つの番号に分離する
///
///
///
///
///
public static void UnpackTriple(ulong pack, out int v0, out int v1, out int v2)
{
v0 = (int)((pack >> 32) & 0xffff);
v1 = (int)((pack >> 16) & 0xffff);
v2 = (int)(pack & 0xffff);
}
///
/// 4つのインデックスを1つのulong型にパッキングする
/// 番号が若いものが上位に来るように配置
/// ※この関数はジョブシステムでは利用できません
///
///
///
///
///
public static ulong PackQuater(int v0, int v1, int v2, int v3)
{
List indexList = new List();
indexList.Add((ulong)v0);
indexList.Add((ulong)v1);
indexList.Add((ulong)v2);
indexList.Add((ulong)v3);
indexList.Sort();
ulong hash = (indexList[0] << 48) | (indexList[1] << 32) | (indexList[2] << 16) | (indexList[3]);
return hash;
}
///
/// パックデータを4つの番号に分離する
///
///
///
///
///
public static void UnpackQuater(ulong pack, out int v0, out int v1, out int v2, out int v3)
{
v0 = (int)((pack >> 48) & 0xffff);
v1 = (int)((pack >> 32) & 0xffff);
v2 = (int)((pack >> 16) & 0xffff);
v3 = (int)(pack & 0xffff);
}
}
}