001: /*
002: * $RCSfile: ConfigSensor.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:44 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.utils.universe;
046:
047: import javax.vecmath.Point3d;
048: import javax.media.j3d.Sensor;
049:
050: class ConfigSensor extends ConfigObject {
051:
052: // The index of this sensor in the associated InputDevice.
053: private int sensorIndex;
054:
055: // The ConfigDevice which creates the associated InputDevice.
056: private ConfigDevice configDevice;
057:
058: // All configurable attributes.
059: private Point3d hotspot = null;
060: private int predictor = -1;
061: private int predictionPolicy = -1;
062: private int sensorReadCount = -1;
063:
064: /**
065: * The corresponding Java 3D core Sensor instance. This is created by the
066: * associated InputDevice.
067: */
068: Sensor j3dSensor;
069:
070: /**
071: * Handles the command
072: * (NewSensor {instanceName} {inputDeviceName} {indexInInputDevice})
073: *
074: * @param command the command that invoked this method
075: */
076: protected void initialize(ConfigCommand command) {
077:
078: int argc = command.argc;
079: Object[] argv = command.argv;
080:
081: // Check that arg[1] and arg[2] are strings, arg[3] a number
082: if (argc != 4) {
083: syntaxError("Incorrect number of arguments to "
084: + command.commandName);
085: }
086:
087: if (!isName(argv[2])) {
088: syntaxError("The second argument to " + command.commandName
089: + " must be the device name");
090: }
091:
092: if (!(argv[3] instanceof Double)) {
093: syntaxError("The third argument to " + command.commandName
094: + " must be a sensor index");
095: }
096:
097: sensorIndex = ((Double) argv[3]).intValue();
098: configDevice = (ConfigDevice) configContainer.findConfigObject(
099: "Device", (String) argv[2]);
100: }
101:
102: /**
103: * Handles the commands
104: * (SensorAttribute {instanceName} {attributeName} {attributeValue}) and
105: * (SensorProperty {instanceName} {attributeName} {attributeValue}).
106: *
107: * @param command the command that invoked this method
108: */
109: protected void setProperty(ConfigCommand command) {
110:
111: int argc = command.argc;
112: Object[] argv = command.argv;
113: String attribute;
114:
115: // Check that arg[1] and arg[2] are strings
116: if (argc != 4) {
117: syntaxError("Incorrect number of arguments to "
118: + command.commandName);
119: }
120:
121: if (!isName(argv[1])) {
122: syntaxError("The first argument to " + command.commandName
123: + " must be the instance name");
124: }
125:
126: if (!isName(argv[2])) {
127: syntaxError("The second argument to " + command.commandName
128: + " must be a property name");
129: }
130:
131: attribute = (String) argv[2];
132: if (attribute.equals("Hotspot")) {
133: if (!(argv[3] instanceof Point3d)) {
134: syntaxError("Hotspot must be a 3D point");
135: }
136: hotspot = (Point3d) argv[3];
137: }
138: /*
139: * Questionable attributes. Commented out for now.
140: else if (attribute.equals("Predictor")) {
141: if (! isName(argv[3])) {
142: syntaxError("Predictor must be a name") ;
143: }
144:
145: String predictorName = (String)argv[3] ;
146: if (predictorName.equals("PREDICT_NONE")) {
147: predictor = Sensor.PREDICT_NONE ;
148: }
149: else if (predictorName.equals("PREDICT_NEXT_FRAME_TIME")) {
150: predictor = Sensor.PREDICT_NEXT_FRAME_TIME ;
151: }
152: else {
153: syntaxError("Predictor must be either PREDICT_NONE " +
154: "or PREDICT_NEXT_FRAME_TIME") ;
155: }
156: }
157: else if (attribute.equals("PredictionPolicy")) {
158: if (! isName(argv[3])) {
159: syntaxError("PredictionPolicy must be a name") ;
160: }
161:
162: String predictionPolicyName = (String)argv[3] ;
163: if (predictionPolicyName.equals("NO_PREDICTOR")) {
164: predictionPolicy = Sensor.NO_PREDICTOR ;
165: }
166: else if (predictionPolicyName.equals("HEAD_PREDICTOR")) {
167: predictionPolicy = Sensor.HEAD_PREDICTOR ;
168: }
169: else if (predictionPolicyName.equals("HAND_PREDICTOR")) {
170: predictionPolicy = Sensor.HAND_PREDICTOR ;
171: }
172: else {
173: syntaxError("PredictionPolicy must be either NO_PREDICTOR, " +
174: "HEAD_PREDICTOR, or HAND_PREDICTOR") ;
175: }
176: }
177: else if (attribute.equals("SensorReadCount")) {
178: if (! (argv[3] instanceof Double)) {
179: syntaxError("SensorReadCount must be a number") ;
180: }
181: sensorReadCount = ((Double)argv[3]).intValue() ;
182: }
183: */
184: else {
185: syntaxError("Unknown " + command.commandName + " \""
186: + attribute + "\"");
187: }
188: }
189:
190: /**
191: * This method is called after all InputDevice implementations have been
192: * instantiated and initialized. All the specified attributes for this
193: * sensor are set in the corresponding Java3D core Sensor instantiated by
194: * the associated InputDevice.
195: */
196: void configureSensor() {
197: j3dSensor = configDevice.j3dInputDevice.getSensor(sensorIndex);
198:
199: if (hotspot != null)
200: j3dSensor.setHotspot(hotspot);
201:
202: if (predictor != -1)
203: j3dSensor.setPredictor(predictor);
204:
205: if (predictionPolicy != -1)
206: j3dSensor.setPredictionPolicy(predictionPolicy);
207:
208: if (sensorReadCount != -1)
209: j3dSensor.setSensorReadCount(sensorReadCount);
210: }
211: }
|