001: /*
002: * $RCSfile: CoordinateInterpolator.java,v $
003: *
004: * @(#)CoordinateInterpolator.java 1.22 98/11/05 20:34:22
005: *
006: * Copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
007: *
008: * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
009: * modify and redistribute this software in source and binary code form,
010: * provided that i) this copyright notice and license appear on all copies of
011: * the software; and ii) Licensee does not utilize the software in a manner
012: * which is disparaging to Sun.
013: *
014: * This software is provided "AS IS," without a warranty of any kind. ALL
015: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
016: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
017: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
018: * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
019: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
020: * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
021: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
022: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
023: * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
024: * POSSIBILITY OF SUCH DAMAGES.
025: *
026: * This software is not designed or intended for use in on-line control of
027: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
028: * the design, construction, operation or maintenance of any nuclear
029: * facility. Licensee represents and warrants that it will not use or
030: * redistribute the Software for such purposes.
031: *
032: * $Revision: 1.2 $
033: * $Date: 2005/02/03 23:06:55 $
034: * $State: Exp $
035: */
036: /*
037: *@Author: Rick Goldberg
038: *@Author: Doug Gehringer
039: */
040: package org.jdesktop.j3d.loaders.vrml97.impl;
041:
042: /** Description of the Class */
043: public class CoordinateInterpolator extends Interpolator {
044:
045: // eventIn
046: SFFloat fraction;
047: // exposedField
048: // MFFloat key; // From Interpolator
049: MFVec3f keyValue;
050: // eventOut
051: MFVec3f value;
052:
053: /**
054: *Constructor for the CoordinateInterpolator object
055: *
056: *@param loader Description of the Parameter
057: */
058: public CoordinateInterpolator(Loader loader) {
059: super (loader);
060: fraction = new SFFloat(0.0f);
061:
062: //there should be empty constructors for all fields.
063: key = new MFFloat();
064: keyValue = new MFVec3f();
065: value = new MFVec3f();
066:
067: initFields();
068:
069: }
070:
071: /**
072: *Constructor for the CoordinateInterpolator object
073: *
074: *@param loader Description of the Parameter
075: *@param fraction Description of the Parameter
076: *@param key Description of the Parameter
077: *@param keyValue Description of the Parameter
078: */
079: public CoordinateInterpolator(Loader loader, SFFloat fraction,
080: MFFloat key, MFVec3f keyValue) {
081: super (loader);
082:
083: this .fraction = fraction;
084: this .key = key;
085: this .keyValue = keyValue;
086: initFields();
087: }
088:
089: /**
090: * Description of the Method
091: *
092: *@param eventInName Description of the Parameter
093: *@param time Description of the Parameter
094: */
095: public void notifyMethod(String eventInName, double time) {
096: if (eventInName.equals("fraction")) {
097: if (key.mfloat.length > 0) {
098: setIndexFract(fraction.value);
099: int valsPerKey = keyValue.size / key.mfloat.length;
100: if (value.size != valsPerKey) {
101: value.checkSize(valsPerKey, false);
102: value.size = valsPerKey;
103: }
104: int indL = iL * valsPerKey;
105: int indH = (iL + 1) * valsPerKey;
106: int v1xi;
107: int v1yi;
108: int v1zi;
109: int v2xi;
110: int v2yi;
111: int v2zi;
112: float v1x;
113: float v1y;
114: float v1z;
115: float v2x;
116: float v2y;
117: float v2z;
118: float vals[] = keyValue.value;
119: for (int j = 0; j < valsPerKey; j += 3) {
120: // since were stack based, maybe this
121: // can be that much more optimal, ie
122: // inc, pop, push, inc -> inc, inc
123: v1xi = (indL) + j;
124: v1yi = v1xi + 1;
125: v1zi = v1yi + 1;
126: //v2xi = v1xi+valsPerKey;
127: v2xi = (indH) + j;
128: v2yi = v2xi + 1;
129: v2zi = v2yi + 1;
130: v1x = vals[v1xi];
131: v1y = vals[v1yi];
132: v1z = vals[v1zi];
133: v2x = vals[v2xi];
134: v2y = vals[v2yi];
135: v2z = vals[v2zi];
136: value.value[j + 0] = (v1x * af) + (v2x * f);
137: value.value[j + 1] = (v1y * af) + (v2y * f);
138: value.value[j + 2] = (v1z * af) + (v2z * f);
139: }
140: }
141: value.route();
142: }
143:
144: }
145:
146: /**
147: * Gets the type attribute of the CoordinateInterpolator object
148: *
149: *@return The type value
150: */
151: public String getType() {
152: return "CoordinateInterpolator";
153: }
154:
155: /**
156: * Description of the Method
157: *
158: *@return Description of the Return Value
159: */
160: public Object clone() {
161: return new CoordinateInterpolator(loader, (SFFloat) fraction
162: .clone(), (MFFloat) key, (MFVec3f) keyValue);
163: }
164:
165: /** Description of the Method */
166: void initFields() {
167: fraction.init(this , FieldSpec, Field.EVENT_IN, "fraction");
168: key.init(this , FieldSpec, Field.EXPOSED_FIELD, "key");
169: keyValue.init(this , FieldSpec, Field.EXPOSED_FIELD, "keyValue");
170: value.init(this , FieldSpec, Field.EVENT_OUT, "value");
171: }
172:
173: }
|