/**
   * <code>updateGeometricState</code> updates the lightlist, computes the world transforms, and
   * computes the world bounds for this Spatial. Calling this when the Spatial is attached to a node
   * will cause undefined results. User code should only call this method on Spatials having no
   * parent.
   *
   * @see Spatial#getWorldLightList()
   * @see Spatial#getWorldTransform()
   * @see Spatial#getWorldBound()
   */
  public void updateGeometricState() {
    // assume that this Spatial is a leaf, a proper implementation
    // for this method should be provided by Node.

    // NOTE: Update world transforms first because
    // bound transform depends on them.
    if ((refreshFlags & RF_LIGHTLIST) != 0) {
      updateWorldLightList();
    }
    if ((refreshFlags & RF_TRANSFORM) != 0) {
      updateWorldTransforms();
    }
    if ((refreshFlags & RF_BOUND) != 0) {
      updateWorldBound();
    }

    assert refreshFlags == 0;
  }
  /** Computes this Spatial's world bounding volume in the most efficient manner possible. */
  void checkDoBoundUpdate() {
    if ((refreshFlags & RF_BOUND) == 0) {
      return;
    }

    checkDoTransformUpdate();

    // Go to children recursively and update their bound
    if (this instanceof Node) {
      Node node = (Node) this;
      int len = node.getQuantity();
      for (int i = 0; i < len; i++) {
        Spatial child = node.getChild(i);
        child.checkDoBoundUpdate();
      }
    }

    // All children's bounds have been updated. Update my own now.
    updateWorldBound();
  }