Exemple #1
0
            //

            public Item(SubMesh subMesh)
            {
                this.subMesh = subMesh;

                subMesh.GetSomeGeometry(out positions, out indices);

                Bounds bounds = Bounds.Cleared;

                foreach (Vec3 pos in positions)
                {
                    bounds.Add(pos);
                }
                bounds.Expand(bounds.GetSize() * .001f);

                OctreeContainer.InitSettings initSettings = new OctreeContainer.InitSettings();
                initSettings.InitialOctreeBounds       = bounds;
                initSettings.OctreeBoundsRebuildExpand = Vec3.Zero;
                initSettings.MinNodeSize = bounds.GetSize() / 50;
                octreeContainer          = new OctreeContainer(initSettings);

                for (int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++)
                {
                    Vec3 vertex0 = positions[indices[nTriangle * 3 + 0]];
                    Vec3 vertex1 = positions[indices[nTriangle * 3 + 1]];
                    Vec3 vertex2 = positions[indices[nTriangle * 3 + 2]];

                    Bounds triangleBounds = new Bounds(vertex0);
                    triangleBounds.Add(vertex1);
                    triangleBounds.Add(vertex2);

                    int octreeIndex = octreeContainer.AddObject(triangleBounds, 1);
                }
            }
Exemple #2
0
 public void Dispose()
 {
     if (octreeContainer != null)
     {
         octreeContainer.Dispose();
         octreeContainer = null;
     }
 }
Exemple #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);
    }
Exemple #4
0
    /// <summary>
    /// Grows Octree so current root is made child of new, larger root.
    /// Grows in direction of passed point, until point is within root.
    /// <summary>
    private void grow(Vector3 point)
    {
        while (!root.contains(point))
        {
            int childNum                = optimalChildNum(root, point); /// find growth direction
            var newRootBounds           = root.parentBounds(childNum);
            OctreeContainer <T> newRoot = new OctreeContainer <T>(newRootBounds["min"], newRootBounds["max"], MinSize);
            newRoot.setChild(childNum, root);
            root = newRoot;

            numComponents += 8;
            numVoxels     += 7;
            volume         = root.volume();
        }
    }
Exemple #5
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;
    }
Exemple #6
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);
        }
    }
 public void Dispose()
 {
     if( octreeContainer != null )
     {
         octreeContainer.Dispose();
         octreeContainer = null;
     }
 }
            //
            public Item( SubMesh subMesh )
            {
                this.subMesh = subMesh;

                subMesh.GetSomeGeometry( out positions, out indices );

                Bounds bounds = Bounds.Cleared;
                foreach( Vec3 pos in positions )
                    bounds.Add( pos );
                bounds.Expand( bounds.GetSize() * .001f );

                OctreeContainer.InitSettings initSettings = new OctreeContainer.InitSettings();
                initSettings.InitialOctreeBounds = bounds;
                initSettings.OctreeBoundsRebuildExpand = Vec3.Zero;
                initSettings.MinNodeSize = bounds.GetSize() / 50;
                octreeContainer = new OctreeContainer( initSettings );

                for( int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++ )
                {
                    Vec3 vertex0 = positions[ indices[ nTriangle * 3 + 0 ] ];
                    Vec3 vertex1 = positions[ indices[ nTriangle * 3 + 1 ] ];
                    Vec3 vertex2 = positions[ indices[ nTriangle * 3 + 2 ] ];

                    Bounds triangleBounds = new Bounds( vertex0 );
                    triangleBounds.Add( vertex1 );
                    triangleBounds.Add( vertex2 );

                    int octreeIndex = octreeContainer.AddObject( triangleBounds, 1 );
                }
            }