using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UltraTerrain.Common.Morton;
namespace UltraTerrain.Common.Morton
{
public static class Arithmetic
{
public const uint FullMask = 0xFFFFFFFF;
public static uint SignMask = "10.000.000.000.000.000.000.000.000.000.000".FromBinary();// 0x80000000;
public static uint XMask = "01.001.001.001.001.001.001.001.001.001.001".FromBinary(); //0x9249249;
public static uint YMask = "10.010.010.010.010.010.010.010.010.010.010".FromBinary(); //0x12492492;
public static uint ZMask = "00.100.100.100.100.100.100.100.100.100.100".FromBinary(); //0x24924924;
public static uint XMaskWithSign = XMask | SignMask;
public static uint YMaskWithSign = YMask | SignMask;
public static uint ZMaskWithSign = ZMask | SignMask;
public static uint AddMorton(this uint a, uint b)
{
var cx = ((a | ~XMask) + (b & XMask)) & XMask;
var cy = ((a | ~YMask) + (b & YMask)) & YMask;
var cz = ((a | ~ZMask) + (b & ZMask)) & ZMask;
var c = cx | cy | cz;
return c;
}
public static uint SubtractMorton(this uint a, uint b)
{
var cx = ((a & XMaskWithSign) - (b & XMask)) & XMaskWithSign;
var cy = ((a & YMaskWithSign) - (b & YMask)) & YMaskWithSign;
var cz = ((a & ZMaskWithSign) - (b & ZMask)) & ZMaskWithSign;
var c = cx | cy | cz;
return c;
}
}
}