// --------------------------------------------------------------------- // 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); }
// --------------------------------------------------------------------- // 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); } } }