void setView(View view, int index) { int i; View oldView = (View) apiViewList.get(index); Integer mtype = new Integer(SET_VIEW); if (oldView == view) return; apiViewList.set(index, view); if (source.isLive()) { // Gather all affected leaf nodes and send a message to // RenderingEnv and RenderBin if (inSharedGroup) { ArrayList parentList; for (int k = 0; k < localToVworldKeys.length; k++) { parentList = (ArrayList) parentLists.get(k); Object[] objAry = new Object[8]; ArrayList addVsgList = new ArrayList(); ArrayList removeVsgList = new ArrayList(); ArrayList addLeafList = new ArrayList(); ArrayList removeLeafList = new ArrayList(); int[] addKeyList = new int[10]; int[] removeKeyList = new int[10]; objAry[0] = view; objAry[1] = addVsgList; objAry[2] = addLeafList; objAry[4] = oldView; objAry[5] = removeVsgList; objAry[6] = removeLeafList; HashKey key = localToVworldKeys[k]; if (oldView != null && (parentList == null || parentList.contains(oldView))) { removeVsgList.add(this); removeKeyList[0] = k; objAry[7] = super.processViewSpecificInfo( REMOVE_VIEW, (HashKey) key, oldView, removeVsgList, removeKeyList, removeLeafList); } if (view != null && (parentList == null || parentList.contains(view))) { addVsgList.add(this); addKeyList[0] = k; objAry[3] = super.processViewSpecificInfo( ADD_VIEW, (HashKey) key, view, addVsgList, addKeyList, addLeafList); } J3dMessage message = new J3dMessage(); message.type = J3dMessage.VIEWSPECIFICGROUP_CHANGED; message.threads = (J3dThread.UPDATE_RENDERING_ENVIRONMENT | J3dThread.UPDATE_RENDER | J3dThread.UPDATE_SOUND | J3dThread.SOUND_SCHEDULER); message.universe = universe; message.args[0] = mtype; message.args[1] = objAry; VirtualUniverse.mc.processMessage(message); } } else { ArrayList parentList = (ArrayList) parentLists.get(0); Object[] objAry = new Object[8]; ArrayList addVsgList = new ArrayList(); ArrayList removeVsgList = new ArrayList(); ArrayList addLeafList = new ArrayList(); ArrayList removeLeafList = new ArrayList(); int[] addKeyList = new int[10]; int[] removeKeyList = new int[10]; objAry[0] = view; objAry[1] = addVsgList; objAry[2] = addLeafList; objAry[4] = oldView; objAry[5] = removeVsgList; objAry[6] = removeLeafList; tempKey.reset(); if (oldView != null && (parentList == null || parentList.contains(oldView))) { removeVsgList.add(this); removeKeyList[0] = 0; objAry[7] = super.processViewSpecificInfo( REMOVE_VIEW, (HashKey) tempKey, oldView, removeVsgList, removeKeyList, removeLeafList); } if (view != null && (parentList == null || parentList.contains(view))) { tempKey.reset(); addVsgList.add(this); addKeyList[0] = 0; objAry[3] = super.processViewSpecificInfo( ADD_VIEW, (HashKey) tempKey, view, addVsgList, addKeyList, addLeafList); } J3dMessage message = new J3dMessage(); message.type = J3dMessage.VIEWSPECIFICGROUP_CHANGED; message.threads = (J3dThread.UPDATE_RENDERING_ENVIRONMENT | J3dThread.UPDATE_RENDER | J3dThread.UPDATE_SOUND | J3dThread.SOUND_SCHEDULER); message.universe = universe; message.args[0] = mtype; message.args[1] = objAry; VirtualUniverse.mc.processMessage(message); } } }
void addView(View view) { int i; Integer mtype = new Integer(ADD_VIEW); apiViewList.add(view); if (source.isLive() && view != null) { // Gather all affected leaf nodes and send a message to // RenderingEnv and RenderBin if (inSharedGroup) { ArrayList parentList; for (int k = 0; k < localToVworldKeys.length; k++) { parentList = (ArrayList) parentLists.get(k); // If the parentList contains this view or if this is the // first VSG then .. if (parentList == null || parentList.contains(view)) { Object[] objAry = new Object[4]; ArrayList addVsgList = new ArrayList(); ArrayList addLeafList = new ArrayList(); int[] addKeyList = new int[10]; HashKey key = localToVworldKeys[k]; addVsgList.add(this); addKeyList[0] = k; objAry[0] = view; objAry[1] = addVsgList; objAry[2] = addLeafList; /* for (int n = 0; n < addLeafList.size(); n++) { System.err.println("Shared:n = "+n+" addLeafList = "+addLeafList.get(n)); } */ objAry[3] = super.processViewSpecificInfo( ADD_VIEW, (HashKey) key, view, addVsgList, addKeyList, addLeafList); J3dMessage message = new J3dMessage(); message.type = J3dMessage.VIEWSPECIFICGROUP_CHANGED; message.threads = (J3dThread.UPDATE_RENDERING_ENVIRONMENT | J3dThread.UPDATE_RENDER | J3dThread.UPDATE_SOUND | J3dThread.SOUND_SCHEDULER); message.universe = universe; message.args[0] = mtype; message.args[1] = objAry; VirtualUniverse.mc.processMessage(message); } } } else { ArrayList parentList = (ArrayList) parentLists.get(0); // If the parentList contains this view or if this is the // first VSG then .. if (parentList == null || parentList.contains(view)) { Object[] objAry = new Object[4]; ArrayList addVsgList = new ArrayList(); ArrayList addLeafList = new ArrayList(); int[] addKeyList = new int[10]; objAry[0] = view; objAry[1] = addVsgList; objAry[2] = addLeafList; addVsgList.add(this); addKeyList[0] = 0; tempKey.reset(); objAry[3] = super.processViewSpecificInfo( ADD_VIEW, tempKey, view, addVsgList, addKeyList, addLeafList); /* for (int n = 0; n < addLeafList.size(); n++) { System.err.println("n = "+n+" addLeafList = "+addLeafList.get(n)); } */ J3dMessage message = new J3dMessage(); message.type = J3dMessage.VIEWSPECIFICGROUP_CHANGED; message.threads = (J3dThread.UPDATE_RENDERING_ENVIRONMENT | J3dThread.UPDATE_RENDER | J3dThread.UPDATE_SOUND | J3dThread.SOUND_SCHEDULER); message.universe = universe; message.args[0] = mtype; message.args[1] = objAry; VirtualUniverse.mc.processMessage(message); } } } }
// for non-shared case void updateChildLocalToVworld( ArrayList dirtyTransformGroups, ArrayList keySet, UpdateTargets targets, ArrayList blUsers) { int i, j; Object obj; Transform3D lToVw, childLToVw; TransformGroupRetained tg; LinkRetained ln; CachedTargets ct; synchronized (this) { // sync with setLive/clearLive if (localToVworld != null) { perPathData[0].markedDirty = false; // update immediate child's localToVworld if (perPathData[0].switchState.currentSwitchOn) { lToVw = getCurrentLocalToVworld(0); childLToVw = getUpdateChildLocalToVworld(0); childLToVw.mul(lToVw, currentTransform); dirtyTransformGroups.add(this); ct = j3dCTs[0]; if (ct != null) { targets.addCachedTargets(ct); if (ct.targetArr[Targets.BLN_TARGETS] != null) { gatherBlUsers(blUsers, ct.targetArr[Targets.BLN_TARGETS]); } } } else { perPathData[0].switchDirty = true; // System.err.println("tg.updateChild skip"); } // update child's localToVworld of its children // transformLink contains top level transform group nodes // and link nodes synchronized (childTransformLinks) { for (i = 0; i < childTransformLinks.size(); i++) { obj = childTransformLinks.get(i); if (obj instanceof TransformGroupRetained) { tg = (TransformGroupRetained) obj; tg.updateChildLocalToVworld(dirtyTransformGroups, keySet, targets, blUsers); } else { // LinkRetained ln = (LinkRetained) obj; currentKey.reset(); currentKey.append(locale.nodeId); currentKey.append(LinkRetained.plus).append(ln.nodeId); if ((ln.sharedGroup != null) && (ln.sharedGroup.localToVworldKeys != null)) { j = currentKey.equals( ln.sharedGroup.localToVworldKeys, 0, ln.sharedGroup.localToVworldKeys.length); if (j < 0) { System.err.println("TransformGroupRetained : Can't find hashKey"); } if (j < ln.sharedGroup.localToVworldKeys.length) { ln.sharedGroup.updateChildLocalToVworld( ln.sharedGroup.localToVworldKeys[j], j, dirtyTransformGroups, keySet, targets, blUsers); } } } } } } } }