示例#1
0
        unsafe private void updateHistogram(uint *pimage, uint *pilut, OctreeNode *ptree, ushort *plist, ref ushort *pfree, nint cp, nint sr)
        {
            nuint level = leafLevel;
            nuint prnod = 0;
            uint  ppix  = 0;

            uint *ip = pimage, ipe = ip + cp;

            for (; ip < ipe; ip += sr)
            {
                uint cpix = *ip;
                if (cpix == 0)
                {
                    continue;
                }

                OctreeNode *pnode;
                if (ppix == cpix & prnod != 0)
                {
                    pnode = ptree + prnod;
                    goto Accumulate;
                }

                ppix = cpix;
                nuint idx =
                    pilut[(nuint)(byte)(ppix)] |
                    pilut[(nuint)(byte)(ppix >> 8) + 256] |
                    pilut[(nuint)(byte)(ppix >> 16) + 512];
                nuint parent = idx & 7;

                pnode = ptree + parent;
                for (nuint i = 1; i <= level; i++)
                {
                    idx >>= 3;

                    ushort *childloc = (ushort *)pnode + (idx & 7);
                    nuint   next     = *childloc;
                    if (next == 0)
                    {
                        if (*pfree == 0)
                        {
                            pfree = plist;
                            pruneTree(ptree, pfree);

                            level = leafLevel;
                            prnod = 0;
                            if (i > level)
                            {
                                break;
                            }
                        }

                        next = *pfree++;
                        *childloc = (ushort)next;

                        OctreeNode.SetLevel(ptree + next, (uint)i);
                    }

                    parent = next;
                    pnode  = ptree + parent;
                }

                prnod = parent;

Accumulate:
                OctreeNode.AddSample(pnode, ppix);
            }
        }