📄 viewspecificgroupretained.java
字号:
/* * $RCSfile: ViewSpecificGroupRetained.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.8 $ * $Date: 2007/04/12 17:34:07 $ * $State: Exp $ */package javax.media.j3d;import java.util.*;/** * The ViewSpecificGroup node retained object. */class ViewSpecificGroupRetained extends GroupRetained { ArrayList apiViewList = new ArrayList(); // Used by leaf objects particularly GAs // Updated in a MT Safe manner and also used by RenderBin ArrayList cachedViewList = new ArrayList(); // The object that contains the dynamic HashKey - a string type object // Used in scoping HashKey tempKey = new HashKey(250); // ArrayList of Integer indices ArrayList parentLists = new ArrayList(); static final int SET_VIEW = 0x1; static final int ADD_VIEW = 0x2; static final int REMOVE_VIEW = 0x4; // Construct retained object ViewSpecificGroupRetained() { this.nodeType = NodeRetained.VIEWSPECIFICGROUP; viewLists = new ArrayList(); } 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); } } } } 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); } } } int[] processViewSpecificInfo(int mode, HashKey key, View v, ArrayList vsgList, int[] keyList, ArrayList leaflist) { int hkIndex = 0; Integer hashInt = null; int[] newKeyList = null; // Get the intersection of the viewList with this view, if (source.isLive()) { if (inSharedGroup) { hkIndex = key.equals(localToVworldKeys, 0, localToVworldKeys.length); } if (mode == ADD_VIEW) { ArrayList parentList = (ArrayList)parentLists.get(hkIndex); parentList.add(v); } else if (mode == REMOVE_VIEW) { ArrayList parentList = (ArrayList)parentLists.get(hkIndex); parentList.remove(v); } if(apiViewList.contains(v)) { // System.err.println("processViewSpecificInfo, this = "+this+" key = "+key); vsgList.add(this); if (keyList.length< vsgList.size()) { // System.err.println("====> allocating new array"); newKeyList = new int[keyList.length+20]; System.arraycopy(keyList, 0, newKeyList, 0, keyList.length); keyList = newKeyList; } if (mode == ADD_VIEW) { if (inSharedGroup) { keyList[vsgList.size()-1] = hkIndex; } else { keyList[vsgList.size()-1] = 0; } } else if (mode == REMOVE_VIEW) { if (inSharedGroup) { keyList[vsgList.size()-1] = hkIndex; } else { keyList[vsgList.size()-1] = 0; } } return super.processViewSpecificInfo(mode, key, v, vsgList, keyList, leaflist); } } return keyList; } View getView(int index) { return (View)apiViewList.get(index); } void insertView(View view, int index) { int i; Integer mtype = new Integer(ADD_VIEW); apiViewList.add(index, 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -