001: /*
002: * $RCSfile: LwsCamera.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.4 $
041: * $Date: 2007/02/09 17:20:08 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.loaders.lw3d;
046:
047: import java.io.*;
048: import java.util.Vector;
049: import javax.media.j3d.*;
050: import javax.vecmath.*;
051: import java.util.Enumeration;
052: import com.sun.j3d.loaders.ParsingErrorException;
053:
054: /**
055: * This class parses the data in a Scene file related to the camera and
056: * creates Java3D TransformGroup that holds the data for positioning
057: * and orienting the view according to the camera specifications.
058: */
059:
060: class LwsCamera extends TextfileParser implements LwsPrimitive {
061:
062: // data from the file
063: String fileName;
064: String objName;
065: LwsMotion motion;
066: int parent;
067: TransformGroup objectTransform;
068: Vector objectBehavior;
069:
070: /**
071: * Constructor: parses camera info and creates LwsMotion object for
072: * keyframe data
073: */
074: LwsCamera(StreamTokenizer st, int firstFrame, int totalFrames,
075: float totalTime, int debugVals)
076: throws ParsingErrorException {
077: debugPrinter.setValidOutput(debugVals);
078: parent = -1;
079: getNumber(st); // Skip ShowCamera parameters
080: getNumber(st);
081: getAndCheckString(st, "CameraMotion");
082: motion = new LwsMotion(st, firstFrame, totalFrames, totalTime,
083: debugPrinter.getValidOutput());
084:
085: // TODO: buggy way to stop processing the camera. Should actually
086: // process required/optional fields in order and stop when there's
087: // no more.
088:
089: while (!isCurrentToken(st, "DepthOfField")) {
090: debugOutputLn(LINE_TRACE, "currentToken = " + st.sval);
091:
092: if (isCurrentToken(st, "ParentObject")) {
093: parent = (int) getNumber(st);
094: }
095: try {
096: st.nextToken();
097: } catch (IOException e) {
098: throw new ParsingErrorException(e.getMessage());
099: }
100: }
101: getNumber(st); // skip shadow type parameter
102: }
103:
104: /**
105: * Returns parent of the camera object
106: */
107: int getParent() {
108: return parent;
109: }
110:
111: /**
112: * Creates Java3D items from the camera data. These objects consist
113: * of: a TransformGroup to hold the view platform, and the behaviors
114: * (if any) that act upon the view's TransformGroup.
115: */
116: void createJava3dObject(int loadBehaviors) {
117: Matrix4d mat = new Matrix4d();
118: mat.setIdentity();
119: // Set the node's transform matrix according to the first frame
120: // of the object's motion
121: LwsFrame firstFrame = motion.getFirstFrame();
122: firstFrame.setMatrix(mat);
123: debugOutputLn(VALUES, " Camera Matrix = \n" + mat);
124: Transform3D t1 = new Transform3D();
125: Matrix4d m = new Matrix4d();
126: double scale = .1;
127: m.setColumn(0, scale, 0, 0, 0); // setScale not yet implemented
128: m.setColumn(1, 0, scale, 0, 0);
129: m.setColumn(2, 0, 0, scale, 0);
130: m.setColumn(3, 0, 0, 0, 1);
131: Transform3D scaleTrans = new Transform3D(m);
132: TransformGroup scaleGroup = new TransformGroup(scaleTrans);
133: scaleGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
134: scaleGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
135: // mat.mul(m);
136: t1.set(mat);
137: objectTransform = new TransformGroup(t1);
138: objectTransform
139: .setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
140: objectBehavior = new Vector();
141: ;
142: if (loadBehaviors != 0) {
143: motion.createJava3dBehaviors(objectTransform);
144: Behavior b = motion.getBehaviors();
145: if (b != null)
146: objectBehavior.addElement(b);
147: }
148: }
149:
150: /**
151: * Returns TransformGroup of camera
152: */
153: public TransformGroup getObjectNode() {
154: return objectTransform;
155: }
156:
157: /**
158: * Returns animation behaviors for camera
159: */
160: public Vector getObjectBehaviors() {
161: debugOutputLn(TRACE, "getObjectBehaviors()");
162: return objectBehavior;
163: }
164:
165: /**
166: * This is a debuggin utility, not currently activated. It prints
167: * out the camera values
168: */
169: void printVals() {
170: System.out.println(" objName = " + objName);
171: motion.printVals();
172: }
173:
174: }
|