void clearLive(SetLiveState s) {

    Targets[] savedTransformTargets = null;

    savedTransformTargets = s.transformTargets;
    // no need to gather targets from tg in clear live
    s.transformTargets = null;

    super.clearLive(s);

    // restore setLiveState from it's local variables.
    // removeNodeData has altered these variables.
    s.localToVworld = localToVworld;
    s.localToVworldIndex = localToVworldIndex;
    s.transformTargets = savedTransformTargets;

    synchronized (this) { // synchronized with TransformStructure
      if (inSharedGroup) {
        if (transformLevels != null) {
          maxTransformLevel = transformLevels[0];
          for (int i = 1; i < transformLevels.length; i++) {
            if (transformLevels[i] > maxTransformLevel) {
              maxTransformLevel = transformLevels[i];
            }
          }
        } else {
          maxTransformLevel = -1;
        }

        if (s.switchTargets != null) {
          for (int i = 0; i < s.switchTargets.length; i++) {
            if (s.switchTargets[i] != null) {
              s.switchTargets[i].addNode(this, Targets.GRP_TARGETS);
            }
          }
        }

      } else {
        maxTransformLevel = -1;
        if (s.switchTargets != null && s.switchTargets[0] != null) {
          s.switchTargets[0].addNode(this, Targets.GRP_TARGETS);
        }
      }
    }
    // XXXX: recontruct targetThreads
  }
  void clearLive(SetLiveState s) {
    ArrayList savedViewList = s.viewLists;
    if (s.changedViewGroup == null) {
      s.changedViewGroup = new ArrayList();
      s.changedViewList = new ArrayList();
      s.keyList = new int[10];
      s.viewScopedNodeList = new ArrayList();
      s.scopedNodesViewList = new ArrayList();
    }
    // XXXX: This is a hack since removeNodeData is called before
    // children are clearLives
    int[] tempIndex = null;
    // Don't keep the indices if everything will be cleared
    if (inSharedGroup && (s.keys.length != localToVworld.length)) {
      tempIndex = new int[s.keys.length];
      for (int i = 0; i < s.keys.length; i++) {
        tempIndex[i] = s.keys[i].equals(localToVworldKeys, 0, localToVworldKeys.length);
      }
    }
    super.clearLive(s);
    // Do this after children clearlive since part of the viewLists may get cleared
    // during removeNodeData

    // If the last SharedGroup is being cleared
    if ((!inSharedGroup) || (localToVworld == null)) {
      viewLists.clear();
    } else {
      // Must be in reverse, to preserve right indexing.
      for (int i = tempIndex.length - 1; i >= 0; i--) {
        if (tempIndex[i] >= 0) {
          viewLists.remove(tempIndex[i]);
        }
      }
    }
    s.viewLists = savedViewList;
  }
  @Override
  void clearLive(SetLiveState s) {

    int i, j, k, index;

    Transform3D savedLocalToVworld[][] = s.localToVworld;
    int savedLocalToVworldIndex[][] = s.localToVworldIndex;
    HashKey savedLocalToVworldKeys[] = s.localToVworldKeys;
    ArrayList<OrderedPath> savedOrderedPaths = s.orderedPaths;
    ArrayList<ArrayList<View>> savedViewLists = s.viewLists;

    ArrayList<ArrayList<LightRetained>> savedLights = s.lights;
    ArrayList<ArrayList<FogRetained>> savedFogs = s.fogs;
    ArrayList<ArrayList<ModelClipRetained>> savedMclips = s.modelClips;
    ArrayList<ArrayList<AlternateAppearanceRetained>> savedAltApps = s.altAppearances;

    Targets[] savedSwitchTargets = s.switchTargets;
    Targets[] savedTransformTargets = s.transformTargets;
    // no need to gather targets from sg in clear live
    s.transformTargets = null;
    s.switchTargets = null;

    // XXXX: This is a hack since removeNodeData is called before
    // children are clearLives
    int[] tempIndex = null;
    // Don't keep the indices if everything will be cleared
    if (s.keys.length != localToVworld.length) {
      tempIndex = new int[s.keys.length];
      for (i = s.keys.length - 1; i >= 0; i--) {
        tempIndex[i] = s.keys[i].equals(localToVworldKeys, 0, localToVworldKeys.length);
      }
    }

    super.clearLive(s);
    // Do this after children clearlive since part of the viewLists may get cleared
    // during removeNodeData
    if (refCount <= 0) {
      viewLists.clear();
    } else {
      // Must be in reverse, to preserve right indexing.
      for (i = tempIndex.length - 1; i >= 0; i--) {
        if (tempIndex[i] >= 0) {
          viewLists.remove(tempIndex[i]);
        }
      }
    }

    // restore setLiveState from it's local variables.
    // removeNodeData has altered these variables.
    s.localToVworld = savedLocalToVworld;
    s.localToVworldIndex = savedLocalToVworldIndex;
    s.localToVworldKeys = savedLocalToVworldKeys;
    s.orderedPaths = savedOrderedPaths;
    s.viewLists = savedViewLists;
    s.lights = savedLights;
    s.fogs = savedFogs;
    s.modelClips = savedMclips;
    s.altAppearances = savedAltApps;
    s.transformTargets = savedTransformTargets;
    s.switchTargets = savedSwitchTargets;
  }