gt:         transformLevels = new int[]{-1};
context: /*
   * $RCSfile$
   *
   * Copyright 1998-2008 Sun Microsystems, Inc.  All Rights Reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.  Sun designates this
   * particular file as subject to the "Classpath" exception as provided
   * by Sun in the LICENSE file that accompanied this code.
   *
   * This code is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   * CA 95054 USA or visit www.sun.com if you need additional information or
   * have any questions.
   *
   * $Revision$
   * $Date$
   * $State$
   */
  
  package javax.media.j3d;
  
  import java.util.ArrayList;
  
  /**
   * SetLiveState is used to encapsulate all state needed when a branch
   * group is added to the scene graph
   */
  
  class SetLiveState extends Object {
      // The VirtualUniverse for this branch group
      VirtualUniverse universe = null;
  
      // The Locale for this Branch Graph
      Locale locale = null;
  
      // The transforms used to update state
      Transform3D[][] currentTransforms = new Transform3D[1][];
      int[][]	    currentTransformsIndex = new int[1][];
      
      // The keys used when dealing with SharedGroups
      HashKey[] keys = null;
  
      // flags for detecting what we are under
      boolean inSharedGroup = false;
      boolean inBackgroundGroup = false;
      boolean inViewSpecificGroup = false;
  
      /**
       * The list of nodes added/removed during setLive/clearLive
       */
      ArrayList nodeList = new ArrayList();
  
      /**
       * List of nodes that are viewScoped.  Note that all nodes
       * except Shape3D nodes can be in viewScopedNodeList, shape3D
       * nodes will always be in the nodeList regardless of scoped
       * or not. Also, only renderbin and renderingEnv structure is
       * interested in viewScopedNodeList
       */
      ArrayList viewScopedNodeList = null;
  
      /**
       * Parallel list to viewScopedNodeList containing a list of views
       * that the viewScopedNode is scoped to
       */
      ArrayList scopedNodesViewList = null;
  
      // Threads to notify after setLive/clearLive
      int notifyThreads = 0;
  
      // The current list of leaf nodes for transform targets
      Targets[] transformTargets = null;
  
      // List of transform level, one per shared path
      int transformLevels[] = new int[]{-1};
  
      // List of scoped lights
      ArrayList lights = null;
  
      // List of scoped fogs
      ArrayList fogs =null;
  
      // List of scoped modelClips
      ArrayList modelClips = null;
  
      // List of scoped alt app
      ArrayList altAppearances =null;
  
      // List of viewes scoped to this Group, for all subclasses
      // of group, except ViewSpecificGroup its a pointer to closest
      // ViewSpecificGroup parent
      // viewList for this node, if inSharedGroup is
      // false then only viewList(0) is valid
      ArrayList viewLists = null;
      ArrayList changedViewGroup = null;
      ArrayList changedViewList = null;
      int[] keyList = null;
  
  
      // The current bitmask of types in transformTragets
      //int transformTargetThreads = 0;
  
      ArrayList orderedPaths = null;
  
      ArrayList ogList = new ArrayList(5);
      ArrayList ogChildIdList = new ArrayList(5);
      ArrayList ogOrderedIdList = new ArrayList(5);
      // ogCIOList contains a list of OG with affected child index order.
      ArrayList ogCIOList =  new ArrayList(5);
      // ogCIOTableList contains a list of affected child index order.
      ArrayList ogCIOTableList = new ArrayList(5);
  
      /**
       * List of BranchGroup from this node to the root of tree 
       * This is used by BranchGroupRetained to construct 
       * BranchGroup lists for picking. 
       *
       * @see NodeRetained.branchGroupPaths
       */
      ArrayList branchGroupPaths = null;
      ArrayList parentBranchGroupPaths = null;
  
      /**
       * List of Pickable flags, one for each share path.
       * This flag is true when all the NodeRetained.pickable is true
       * along the path except current node.
       */
      boolean pickable[] = new boolean[]{true};
  
      /**
       * List of collidable flags, one for each share path.
       * This flag is true when all the NodeRetained.pickable is true
       * along the path except current node.
       */
      boolean collidable[] = new boolean[]{true};
  
      // reference count use in set/clear Live to remember how
      // many references of the original branch that attach()/detach()
      int refCount = 1;
  
      // background node whose geometry branch contains this node 
      BackgroundRetained geometryBackground = null;
  
      // behavior nodes
      ArrayList behaviorNodes = new ArrayList(1);
  
      // The current list of child transform group nodes or link nodes
      // under a transform group
      ArrayList childTransformLinks = null;
  
      // closest parent which is a TransformGroupRetained or sharedGroupRetained
      GroupRetained parentTransformLink = null;
  
      // switch Level, start from -1, increment by one for each SwitchNode
      // encounter in a branch, one per key
      int switchLevels[] = new int[]{-1};
  
      // closest switch parent, one per key
      SwitchRetained closestSwitchParents[] = new SwitchRetained[]{null};
  
      // the child id from the closest switch parent, one per key
      int closestSwitchIndices[] = new int[]{-1};
  
      // The current list of leaf nodes for switch targets
      Targets[] switchTargets = null;
  
      // The current list of closest child switch nodes or
      // link nodes under a switch node
      ArrayList childSwitchLinks = null;
  
      // closest parent which is a SwitchRetained or sharedGroupRetained
      GroupRetained parentSwitchLink = null;
  
      SharedGroupRetained lastSharedGroup = null;
      
      int traverseFlags = 0;
  
      // Use for set live.
      Transform3D[][] localToVworld = null;
      int[][] localToVworldIndex = null;
      HashKey[] localToVworldKeys = null;
  
      // cached hashkey index to eliminate duplicate hash key index search
      // currently used by Switch, can be extended for other node types
      int[] hashkeyIndex = null;
  
      ArrayList switchStates = null;
      
      SetLiveState(VirtualUniverse u) {
  	universe = u;
      }
  
  
      void reset(Locale l) {	
  	locale = l;
  	clear();
      }
  
      void clear() {
  	inSharedGroup = false;
  	inBackgroundGroup = false;
  	inViewSpecificGroup = false;
  	nodeList.clear();
  	viewScopedNodeList = null;
  	scopedNodesViewList = null;
  	
  	notifyThreads = 0;
  	transformTargets = null;
  	lights = null;
  	fogs = null;
  	modelClips = null;
  	altAppearances = null;
  	viewLists = null;
  	changedViewGroup = null;
  	changedViewList = null;
  	keyList = null;
  	
          behaviorNodes.clear();
  	traverseFlags = 0;
  
  	ogList.clear();
  	ogChildIdList.clear();
  	ogOrderedIdList.clear();
  	ogCIOList.clear();
  	ogCIOTableList.clear();
  
  	pickable = new boolean[]{true};
  	collidable = new boolean[]{true};
  	refCount = 1;
          geometryBackground = null;
  