Example #1
0
        // ---------------------------------------------------------------------
        // Reset the patch.
        //
        public void reset()
        {
            // Assume patch is not visible.
            m_isVisible = 0;

            // Reset the important relationships
            m_BaseLeft.setLeftChild(null);
            m_BaseLeft.setRightChild(null);
            m_BaseRight.setLeftChild(null);
            m_BaseLeft.setLeftChild(null);

            // Attach the two m_Base triangles together
            m_BaseLeft.setBaseNeighbor(m_BaseRight);
            m_BaseRight.setBaseNeighbor(m_BaseLeft);

            // Clear the other relationships.
            m_BaseLeft.setRightNeighbor(null);
            m_BaseLeft.setLeftNeighbor(null);
            m_BaseRight.setRightNeighbor(null);
            m_BaseRight.setLeftNeighbor(null);
        }
Example #2
0
        // ---------------------------------------------------------------------
        // Split a single Triangle and link it into the mesh.
        // Will correctly force-split diamonds.
        //
        public void split(TriTreeNode tri)
        {
            if (tri != null)
            {
                // We are already split, no need to do it again.
                if (tri.getLeftChild() != null)
                {
                    return;
                }

                // If this triangle is not in a proper diamond, force split our base neighbor
                if (tri.getBaseNeighbor() != null && tri.getBaseNeighbor().getBaseNeighbor() != tri)
                {
                    split(tri.getBaseNeighbor());
                }

                // Create children and link into mesh
                tri.setLeftChild(landscape.allocateTri());
                tri.setRightChild(landscape.allocateTri());

                // If creation failed, just exit.
                if (tri.getLeftChild() == null)
                {
                    return;
                }
                if (tri.getRightChild() == null)
                {
                    return;
                }
                // Fill in the information we can get from the parent (neighbor pointers)
                tri.getLeftChild().setBaseNeighbor(tri.getLeftNeighbor());
                tri.getLeftChild().setLeftNeighbor(tri.getRightChild());

                tri.getRightChild().setBaseNeighbor(tri.getRightNeighbor());
                tri.getRightChild().setRightNeighbor(tri.getLeftChild());

                // Link our Left Neighbor to the new children
                if (tri.getLeftNeighbor() != null)
                {
                    if (tri.getLeftNeighbor().getBaseNeighbor() == tri)
                    {
                        tri.getLeftNeighbor().setBaseNeighbor(tri.getLeftChild());
                    }
                    else if (tri.getLeftNeighbor().getLeftNeighbor() == tri)
                    {
                        tri.getLeftNeighbor().setLeftNeighbor(tri.getLeftChild());
                    }
                    else if (tri.getLeftNeighbor().getRightNeighbor() == tri)
                    {
                        tri.getLeftNeighbor().setRightNeighbor(tri.getLeftChild());
                    }
                    else
                    {
                        ;// Illegal Left Neighbor!
                    }
                }

                // Link our Right Neighbor to the new children
                if (tri.getRightNeighbor() != null)
                {
                    if (tri.getRightNeighbor().getBaseNeighbor() == tri)
                    {
                        tri.getRightNeighbor().setBaseNeighbor(tri.getRightChild());
                    }
                    else if (tri.getRightNeighbor().getRightNeighbor() == tri)
                    {
                        tri.getRightNeighbor().setRightNeighbor(tri.getRightChild());
                    }
                    else if (tri.getRightNeighbor().getLeftNeighbor() == tri)
                    {
                        tri.getRightNeighbor().setLeftNeighbor(tri.getRightChild());
                    }
                    else
                    {
                        ;// Illegal Right Neighbor!
                    }
                }

                // Link our Base Neighbor to the new children
                if (tri.getBaseNeighbor() != null)
                {
                    if (tri.getBaseNeighbor().getLeftChild() != null)
                    {
                        tri.getBaseNeighbor().getLeftChild().setRightNeighbor(tri.getRightChild());
                        tri.getBaseNeighbor().getRightChild().setLeftNeighbor(tri.getLeftChild());
                        tri.getLeftChild().setRightNeighbor(tri.getBaseNeighbor().getRightChild());
                        tri.getRightChild().setLeftNeighbor(tri.getBaseNeighbor().getLeftChild());
                    }
                    else
                    {
                        split(tri.getBaseNeighbor());  // Base Neighbor (in a diamond with us) was not split yet, so do that now.
                    }
                }
                else
                {
                    // An edge triangle, trivial case.
                    tri.getLeftChild().setRightNeighbor(null);
                    tri.getRightChild().setLeftNeighbor(null);
                }
            }
        }