📄 soundstructure.java
字号:
/* * $RCSfile: SoundStructure.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.7 $ * $Date: 2007/04/12 17:34:06 $ * $State: Exp $ */package javax.media.j3d;import java.util.*;/** * A sound structure is a object that organizes Sounds and * soundscapes. * This structure parallels the RenderingEnv structure and * is used for sounds */class SoundStructure extends J3dStructure { /** * The list of Sound nodes */ UnorderList nonViewScopedSounds = new UnorderList(SoundRetained.class); HashMap viewScopedSounds = new HashMap(); /** * The list of Soundscapes */ UnorderList nonViewScopedSoundscapes = new UnorderList(SoundscapeRetained.class); HashMap viewScopedSoundscapes = new HashMap(); /** * The list of view platforms */ UnorderList viewPlatforms = new UnorderList(ViewPlatformRetained.class); /** * A bounds used for getting a view platform scheduling BoundingSphere */ BoundingSphere tempSphere = new BoundingSphere(); BoundingSphere vpsphere = new BoundingSphere(); // ArrayList of leafRetained object whose mirrorObjects // should be updated ArrayList objList = new ArrayList(); // ArrayList of leafRetained object whose boundingleaf xform // should be updated ArrayList xformChangeList = new ArrayList(); // ArrayList of switches that have changed ArrayList switchChangeLeafNodes = new ArrayList(); ArrayList switchChangeLeafMasks = new ArrayList(); // variables for processing transform messages boolean transformMsg = false; UpdateTargets targets = null; /** * This constructor does nothing */ SoundStructure(VirtualUniverse u) { super(u, J3dThread.UPDATE_SOUND); if (debugFlag) debugPrint("SoundStructure constructed"); } void processMessages(long referenceTime) { J3dMessage messages[] = getMessages(referenceTime); int nMsg = getNumMessage(); J3dMessage m; if (nMsg <= 0) { return; } for (int i=0; i < nMsg; i++) { m = messages[i]; switch (m.type) { case J3dMessage.INSERT_NODES : // Prioritize retained and non-retained sounds for this view insertNodes(m); break; case J3dMessage.REMOVE_NODES: removeNodes(m); break; case J3dMessage.SOUND_ATTRIB_CHANGED: changeNodeAttrib(m); break; case J3dMessage.SOUND_STATE_CHANGED: changeNodeState(m); break; case J3dMessage.SOUNDSCAPE_CHANGED: case J3dMessage.AURALATTRIBUTES_CHANGED: // XXXX: this needs to be changed changeNodeAttrib(m); break; case J3dMessage.TRANSFORM_CHANGED: transformMsg = true; break; case J3dMessage.SWITCH_CHANGED: // This method isn't implemented yet. // processSwitchChanged(m); // may need to process dirty switched-on transform if (universe.transformStructure.getLazyUpdate()) { transformMsg = true; } break; case J3dMessage.VIEWSPECIFICGROUP_CHANGED: updateViewSpecificGroupChanged(m); break; // XXXX: case J3dMessage.BOUNDINGLEAF_CHANGED } /* // NOTE: this should already be handled by including/ORing // SOUND_SCHEDULER in targetThread for these message types!! // Dispatch a message about a sound change ViewPlatformRetained vpLists[] = (ViewPlatformRetained []) viewPlatforms.toArray(false); // QUESTION: can I just use this message to pass to all the Sound Bins for (int k=viewPlatforms.arraySize()- 1; k>=0; k--) { View[] views = vpLists[k].getViewList(); for (int j=(views.length-1); j>=0; j--) { View v = (View)(views[j]); m.view = v; VirtualUniverse.mc.processMessage(m); } } */ m.decRefcount(); } if (transformMsg) { targets = universe.transformStructure.getTargetList(); updateTransformChange(targets, referenceTime); transformMsg = false; targets = null; } Arrays.fill(messages, 0, nMsg, null); } void insertNodes(J3dMessage m) { Object[] nodes = (Object[])m.args[0]; ArrayList viewScopedNodes = (ArrayList)m.args[3]; ArrayList scopedNodesViewList = (ArrayList)m.args[4]; Object node; for (int i=0; i<nodes.length; i++) { node = (Object) nodes[i]; if (node instanceof SoundRetained) { addNonScopedSound((SoundRetained) node); } if (node instanceof SoundscapeRetained) { addNonSoundscape((SoundscapeRetained) node); } } // Handle ViewScoped Nodes if (viewScopedNodes != null) { int size = viewScopedNodes.size(); int vlsize; for (int i = 0; i < size; i++) { node = (NodeRetained)viewScopedNodes.get(i); ArrayList vl = (ArrayList) scopedNodesViewList.get(i); int vsize = vl.size(); if (node instanceof SoundRetained) { ((SoundRetained)node).isViewScoped = true; for (int k = 0; k < vsize; k++) { View view = (View) vl.get(k); addScopedSound((SoundRetained) node, view); } } else if (node instanceof SoundscapeRetained) { ((SoundscapeRetained)node).isViewScoped = true; for (int k = 0; k < vsize; k++) { View view = (View) vl.get(k); addScopedSoundscape((SoundscapeRetained) node, view); } } } } /* // XXXX: if (node instanceof AuralAttributesRetained) { } else if (node instanceof ViewPlatformRetained) { addViewPlatform((ViewPlatformRetained) node); } */ } /** * Add sound to sounds list. */ void addScopedSound(SoundRetained mirSound, View view) { if (debugFlag) debugPrint("SoundStructure.addSound()"); ArrayList l = (ArrayList) viewScopedSounds.get(view); if (l == null) { l = new ArrayList(); viewScopedSounds.put(view, l); } l.add(mirSound); } // end addSound() void addNonScopedSound(SoundRetained mirSound) { if (debugFlag) debugPrint("SoundStructure.addSound()"); nonViewScopedSounds.add(mirSound); } // end addSound() void addScopedSoundscape(SoundscapeRetained soundscape, View view) { if (debugFlag) debugPrint("SoundStructure.addSoundscape()"); ArrayList l = (ArrayList) viewScopedSoundscapes.get(view); if (l == null) { l = new ArrayList(); viewScopedSoundscapes.put(view, l); } l.add(soundscape); } void addNonSoundscape(SoundscapeRetained soundscape) { if (debugFlag) debugPrint("SoundStructure.addSoundscape()"); nonViewScopedSoundscapes.add(soundscape); } void removeNodes(J3dMessage m) { Object[] nodes = (Object[])m.args[0]; ArrayList viewScopedNodes = (ArrayList)m.args[3]; ArrayList scopedNodesViewList = (ArrayList)m.args[4]; Object node; for (int i=0; i<nodes.length; i++) { node = (Object) nodes[i]; if (node instanceof SoundRetained) { deleteNonScopedSound((SoundRetained) node); } if (node instanceof SoundscapeRetained) { deleteNonScopedSoundscape((SoundscapeRetained) node); } } // Handle ViewScoped Nodes if (viewScopedNodes != null) { int size = viewScopedNodes.size(); int vlsize; for (int i = 0; i < size; i++) { node = (NodeRetained)viewScopedNodes.get(i); ArrayList vl = (ArrayList) scopedNodesViewList.get(i); // If the node object is scoped to this view, then .. int vsize = vl.size(); if (node instanceof SoundRetained) { ((SoundRetained)node).isViewScoped = false; for (int k = 0; k < vsize; k++) { View view = (View) vl.get(k); deleteScopedSound((SoundRetained) node, view); } } else if (node instanceof SoundscapeRetained) { ((SoundscapeRetained)node).isViewScoped = false; for (int k = 0; k < vsize; k++) { View view = (View) vl.get(k); deleteScopedSoundscape((SoundscapeRetained) node, view); } } } } } void deleteNonScopedSound(SoundRetained sound) { if (!nonViewScopedSounds.isEmpty()) { // find sound in list and remove it int index = nonViewScopedSounds.indexOf(sound); nonViewScopedSounds.remove(index); } } void deleteNonScopedSoundscape(SoundscapeRetained soundscape) { boolean error = nonViewScopedSoundscapes.remove(soundscape); } void deleteScopedSound(SoundRetained sound, View view) { ArrayList l = (ArrayList) viewScopedSounds.get(view); if (!l.isEmpty()) { // find sound in list and remove it int index = l.indexOf(sound); l.remove(index); } if (l.isEmpty()) viewScopedSounds.remove(view); } void deleteScopedSoundscape(SoundscapeRetained soundscape, View view) { ArrayList l = (ArrayList) viewScopedSoundscapes.get(view); if (!l.isEmpty()) { // find sound in list and remove it int index = l.indexOf(soundscape); l.remove(index); } if (l.isEmpty()) viewScopedSoundscapes.remove(view); } void changeNodeAttrib(J3dMessage m) { int attribDirty; Object node = m.args[0]; Object value = m.args[1]; if (debugFlag) debugPrint("SoundStructure.changeNodeAttrib:"); if (node instanceof SoundRetained) { attribDirty = ((Integer)value).intValue(); if (debugFlag) debugPrint(" Sound node dirty bit = " + attribDirty); if ((attribDirty & SoundRetained.PRIORITY_DIRTY_BIT) > 0) { // XXXX: shuffle in SoundScheduler /* shuffleSound((SoundRetained) node); */ } if ((attribDirty & SoundRetained.SOUND_DATA_DIRTY_BIT) > 0) { loadSound((SoundRetained) node, true); } ((SoundRetained)node).updateMirrorObject(m.args); } if (node instanceof SoundscapeRetained) {/* attribDirty = ((Integer)value).intValue(); if (((attribDirty & SoundscapeRetained.BOUNDING_LEAF_CHANGED) != 0) || ((attribDirty & SoundscapeRetained.APPLICATION_BOUNDS_CHANGED) != 0) ) {*/ ((SoundscapeRetained)node).updateTransformChange();/* }*/// XXXX: have no dirty flag for soundscape, just auralAttributes...// what if reference to AA changes in soundscape??? } } void changeNodeState(J3dMessage m) { int stateDirty; Object node = m.args[0]; Object value = m.args[1]; if (debugFlag) debugPrint("SoundStructure.changeNodeState:"); if (node instanceof SoundRetained) { stateDirty = ((Integer)value).intValue();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -