Beispiel #1
0
    /// <summary>
    /// Reformats octree upon increase in MinSize.
    /// Growing octree resets all data.
    /// </summary>
    private void Reformat(float newMinValue)
    {
        if (root.size() < newMinValue * 2f)
        {
            root = new OctreeContainer <T>(root.min,
                                           root.min + new Vector3(newMinValue * 2, newMinValue * 2, newMinValue * 2), MinSize);

            numComponents    = 9;
            numVoxels        = 8;
            numNonNullVoxels = 1;
            volume           = root.volume();
            nonNullVolume    = root.volume() / 8f;
        }
        else
        {
            MetadataChange change = new MetadataChange();
            for (int i = 0; i < 8; i++)
            {
                change += root.children[i].Reformat(newMinValue);
            }
            updateMetadata(change);
        }
    }
Beispiel #2
0
    /// <summary>
    /// Constructor. Creates null-value Voxel of defaultSize around point as root of Octree.
    /// <summary>
    public Octree(Vector3 point, float myMinSize, float myDefaultSize)
    {
        minSize     = myMinSize;
        defaultSize = myDefaultSize;

        float   buffer1 = 0.2f * defaultSize;
        float   buffer2 = defaultSize - buffer1;
        Vector3 min     = new Vector3(point.x - buffer1, point.y - buffer1, point.z - buffer1);
        Vector3 max     = new Vector3(point.x + buffer2, point.y + buffer2, point.z + buffer2);

        root = new OctreeContainer <T>(min, max, MinSize);

        numComponents    = 9;
        numVoxels        = 8;
        numNonNullVoxels = 0;
        volume           = root.volume();
        nonNullVolume    = 0;
    }
Beispiel #3
0
    /// <summary>
    /// Splits Voxel into 8 smaller Voxels, returns new Octree Container.
    /// <summary>
    public OctreeContainer <T> split(out MetadataChange change)
    {
        OctreeContainer <T> replacement = new OctreeContainer <T>(min, max, minSize);

        /// add original point to new OctreeContainer
        int childNum  = replacement.whichChild(point);
        var voxBounds = replacement.childBounds(childNum);

        replacement.setChild(childNum, new Voxel <T>(voxBounds["min"], voxBounds["max"], minSize, point, value));

        change = new MetadataChange(dComponents: 8, dVoxels: 7, dNonNullVolume: -0.875 * replacement.volume());
        return(replacement);
    }