// 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); } } }