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