Esempio n. 1
0
 public ClientPhysicsQuadTreeNode(BoundingBox boundingBox)
 {
     nodeData            = new QuadTreeNodeData <ClientPhysicsQuadTreeNode>(boundingBox.dx());
     physicsEnabled      = false;
     physicsObjects      = new List <IClientPhysicsObject>();
     dynamicObjectsCount = 0;
 }
        public void RenderNodeBoundingBox <T>(DX11Game game, IQuadTreeNode <T> quadTreeNode) where T : IQuadTreeNode <T>
        {
            if (quadTreeNode == null)
            {
                return;
            }

            QuadTreeNodeData <T> node = quadTreeNode.NodeData;

            RenderNodeBoundingBox(game, node.UpperLeft);
            RenderNodeBoundingBox(game, node.UpperRight);
            RenderNodeBoundingBox(game, node.LowerLeft);
            RenderNodeBoundingBox(game, node.LowerRight);

            //TODO: Calculate level is quite lame here and slow, since we loop the tree level by level
            int    level = QuadTree.CalculateLevel(quadTreeNode);
            Color4 col;

            if (level < levelColor4s.Length)
            {
                col = levelColor4s[level];
            }
            else
            {
                col = levelColor4s[levelColor4s.Length - 1];
            }

            game.LineManager3D.AddBox(quadTreeNode.NodeData.BoundingBox, col);
        }
        public void RenderNodeGroundBoundig <T>(DX11Game game, IQuadTreeNode <T> quadTreeNode) where T : IQuadTreeNode <T>
        {
            if (quadTreeNode == null)
            {
                return;
            }

            QuadTreeNodeData <T> node = quadTreeNode.NodeData;

            RenderNodeGroundBoundig(game, node.UpperLeft);
            RenderNodeGroundBoundig(game, node.UpperRight);
            RenderNodeGroundBoundig(game, node.LowerLeft);
            RenderNodeGroundBoundig(game, node.LowerRight);

            //if ( node.IsLeaf == false ) return;
            //FloorLowerLeft = min
            //TopUpperRight = max

            //TODO: Calculate level is quite lame here and slow, since we loop the tree level by level
            int    level = QuadTree.CalculateLevel(quadTreeNode);
            Color4 col;

            if (level < levelColor4s.Length)
            {
                col = levelColor4s[level];
            }
            else
            {
                col = levelColor4s[levelColor4s.Length - 1];
            }

            Vector3 radius = (node.BoundingBox.Maximum - node.BoundingBox.Minimum);
            Vector3 radX   = new Vector3(radius.X, 0, 0);
            Vector3 radY   = new Vector3(0, radius.Y, 0);
            Vector3 radZ   = new Vector3(0, 0, radius.Z);
            Vector3 min    = node.BoundingBox.Minimum;

            min.Y = -1 + level;


            Vector3 fll = min;
            Vector3 flr = min + radX;
            Vector3 ful = min + radZ;
            Vector3 fur = min + radX + radZ;



            //grondvlak
            game.LineManager3D.AddLine(fll, flr, col);
            game.LineManager3D.AddLine(flr, fur, col);
            game.LineManager3D.AddLine(fur, ful, col);
            game.LineManager3D.AddLine(ful, fll, col);
        }
        /// <summary>
        /// This functions loops through all nodes and renders the node when the given predicate returns true for given node. It uses the out Color4 argument to determine the Color4 of the rendered node.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="game"></param>
        /// <param name="quadTreeNode"></param>
        /// <param name="predicate"></param>
        public void RenderNodeGroundBoundig <T>(DX11Game game, T quadTreeNode, RenderNodePredicate <T> predicate) where T : class, IQuadTreeNode <T>
        {
            if (quadTreeNode == null)
            {
                return;
            }

            QuadTreeNodeData <T> node = quadTreeNode.NodeData;

            RenderNodeGroundBoundig(game, node.UpperLeft, predicate);
            RenderNodeGroundBoundig(game, node.UpperRight, predicate);
            RenderNodeGroundBoundig(game, node.LowerLeft, predicate);
            RenderNodeGroundBoundig(game, node.LowerRight, predicate);


            Color4 col;

            if (!predicate(quadTreeNode, out col))
            {
                return;
            }

            //TODO: Calculate level is quite lame here and slow, since we loop the tree level by level
            int level = QuadTree.CalculateLevel(quadTreeNode);


            Vector3 radius = (node.BoundingBox.Maximum - node.BoundingBox.Minimum);
            Vector3 radX   = new Vector3(radius.X, 0, 0);
            Vector3 radY   = new Vector3(0, radius.Y, 0);
            Vector3 radZ   = new Vector3(0, 0, radius.Z);
            Vector3 min    = node.BoundingBox.Minimum;

            min.Y = -1 + level;


            Vector3 fll = min;
            Vector3 flr = min + radX;
            Vector3 ful = min + radZ;
            Vector3 fur = min + radX + radZ;



            //grondvlak
            game.LineManager3D.AddLine(fll, flr, col);
            game.LineManager3D.AddLine(flr, fur, col);
            game.LineManager3D.AddLine(fur, ful, col);
            game.LineManager3D.AddLine(ful, fll, col);
        }
        public FrustumCuller(BoundingBox quadtreeBounding, int numberLevels)
        {
            TreeBounding = quadtreeBounding;
            NumberLevels = numberLevels;
            RootNode     = new CullNode();
            QuadTreeNodeData <CullNode> data = new QuadTreeNodeData <CullNode>();

            data.BoundingBox  = quadtreeBounding;
            RootNode.NodeData = data;

            QuadTree.Split(RootNode, numberLevels - 1);

            cullNodes = new CullNode[CompactQuadTree <bool> .CalculateNbNodes(numberLevels)];
            buildCullNodeArray(RootNode, new CompactQuadTree <bool> .Node(0));

            expandCullablesBuffer();
        }
Esempio n. 6
0
        /// <summary>
        /// Creates a simple quadtree from scratch, without using any other functions (split/merge etc)
        /// </summary>
        private TestQuadTreeNode createSimpleQuadtree()
        {
            TestQuadTreeNode root = new TestQuadTreeNode();
            QuadTreeNodeData <TestQuadTreeNode> rootNodeData = new QuadTreeNodeData <TestQuadTreeNode>();

            rootNodeData.BoundingBox = new BoundingBox(new Vector3(-20, -20, -20), new Vector3(20, 20, 20)).dx();


            TestQuadTreeNode child = new TestQuadTreeNode();
            QuadTreeNodeData <TestQuadTreeNode> childNodeData = new QuadTreeNodeData <TestQuadTreeNode>();

            child = new TestQuadTreeNode();
            rootNodeData.UpperLeft    = child;
            childNodeData.Parent      = root;
            childNodeData.BoundingBox = new BoundingBox(new Vector3(-20, -20, -20), new Vector3(0, 20, 0)).dx();

            child.NodeData = childNodeData;

            root.NodeData = rootNodeData;

            return(root);
        }
 public CullNode CreateChild(QuadTreeNodeData <CullNode> nodeData)
 {
     return(new CullNode());
 }
Esempio n. 8
0
 public ClientPhysicsQuadTreeNode CreateChild(QuadTreeNodeData <ClientPhysicsQuadTreeNode> _nodeData)
 {
     return(new ClientPhysicsQuadTreeNode());
 }
Esempio n. 9
0
 public TestQuadTreeNode CreateChild(QuadTreeNodeData <TestQuadTreeNode> nodeData)
 {
     return(new TestQuadTreeNode());
 }