001: /*
002: * $RCSfile: AxisBehavior.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.2 $
041: * $Date: 2007/02/09 17:17:00 $
042: * $State: Exp $
043: */
044:
045: package org.jdesktop.j3d.utils.behaviors.vp;
046:
047: import java.util.Enumeration;
048: import javax.media.j3d.*;
049: import javax.vecmath.*;
050:
051: /**
052: * Behavior class to extract the rotation component of the view
053: * platform transform, and set the axis transform to the inverse of
054: * that rotation. The axis should be added as a child of the platform
055: * geometry. Note that this behavior must run after the view platform
056: * behavior.
057: */
058: public class AxisBehavior extends Behavior {
059: // Axis transform group (target of behavior)
060: private TransformGroup axisTG;
061:
062: // View platform transform group (source)
063: private TransformGroup viewPlatformTG;
064:
065: // Wake up every frame (passively)
066: private WakeupOnElapsedFrames w = new WakeupOnElapsedFrames(0, true);
067:
068: // Cached value of last view platform transform
069: private Transform3D lastTransform = new Transform3D();
070:
071: // Temporary transform
072: private Transform3D t1 = new Transform3D();
073:
074: // Temporary rotation matrix
075: private Matrix3d rotMat = new Matrix3d();
076:
077: /**
078: * Constructs a new AxisBehavior from the specified view
079: * platform transform group and axis transform group.
080: */
081: public AxisBehavior(TransformGroup axisTG,
082: TransformGroup viewPlatformTG) {
083: // Save references to source and target transform groups
084: this .axisTG = axisTG;
085: this .viewPlatformTG = viewPlatformTG;
086:
087: // Run this behavior in the last scheduling interval
088: setSchedulingInterval(Behavior.getNumSchedulingIntervals() - 1);
089: }
090:
091: /**
092: * Initialize local variables and set the initial wakeup
093: * condition. Called when the behavior is first made live.
094: */
095: public void initialize() {
096: // Initiialize to identity (no rotation)
097: lastTransform.setIdentity();
098: t1.setIdentity();
099: axisTG.setTransform(t1);
100:
101: // Set the initial wakeup condition
102: wakeupOn(w);
103: }
104:
105: /**
106: * Extract the rotation from the view platform transform (if it has
107: * changed) and update the target transform with its inverse.
108: */
109: public void processStimulus(Enumeration criteria) {
110: viewPlatformTG.getTransform(t1);
111:
112: // Compute the new axis transform if the viewPlatformTransform
113: // has changed
114: if (!lastTransform.equals(t1)) {
115: lastTransform.set(t1);
116:
117: t1.get(rotMat);
118: t1.setIdentity();
119: t1.set(rotMat);
120: t1.invert();
121: axisTG.setTransform(t1);
122: }
123:
124: // Reset the wakeup condition so we will wakeup next frame
125: wakeupOn(w);
126: }
127: }
|