private void GatherLeaves(uint key, byte lvl, List <uint> leaves) { var cur_node = map.Get(key); if (cur_node == 0) { return; } if ((cur_node & LeafNodeBit) == 0) //Not a leaf node { for (uint i = 0; i < 8; i++) //Depth-first traversal { GatherLeaves((key << 3) | i, (byte)(lvl + 1), leaves); } } else { //recode cur_node MortonCoder.Decode((key << (3 * (MaxLevel - lvl))) & 0x003fffff, out var x, out var y, out var z); leaves.Add(x | (uint)(y << 7) | (uint)(z << 14) | (uint)((lvl & 0x7) << 21) | (key & 0xff00_0000)); } }
static uint ComputeKey_RootRel(byte x, byte y, byte z, byte lvl, byte mat, bool isLeaf) { return((isLeaf ? LeafNodeBit : 0u) | (1u << (3 * lvl)) | (MortonCoder.Encode(x, y, z) >> (int)(3 * (MaxLevel - lvl))) | (uint)(mat << 24)); }