⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soundstructure.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * $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 + -