From 04343eda8c2f870b0da55cfdc8003c99fe1cc4de Mon Sep 17 00:00:00 2001
From: Kris Kowal
Date: Fri, 6 Jul 2012 11:53:10 -0700
Subject: Remove trailing spaces
---
.../RDGE/src/core/script/animation.js | 54 +++++++++++-----------
1 file changed, 27 insertions(+), 27 deletions(-)
(limited to 'js/helper-classes/RDGE/src/core/script/animation.js')
diff --git a/js/helper-classes/RDGE/src/core/script/animation.js b/js/helper-classes/RDGE/src/core/script/animation.js
index 2e13cce6..2af5b207 100755
--- a/js/helper-classes/RDGE/src/core/script/animation.js
+++ b/js/helper-classes/RDGE/src/core/script/animation.js
@@ -32,11 +32,11 @@ POSSIBILITY OF SUCH DAMAGE.
var RDGE = RDGE || {};
RDGE.animation = RDGE.animation || {};
-/**
- * channelController
- * The channel controller is really the workhorse of the RDGE animation system. It handles timing,
- * interpolation, and sampling of attributes over the lifetime of an animation. Each channel controller
- * is responsible for animating a single attribute. The current implementation supports animating vector,
+/**
+ * channelController
+ * The channel controller is really the workhorse of the RDGE animation system. It handles timing,
+ * interpolation, and sampling of attributes over the lifetime of an animation. Each channel controller
+ * is responsible for animating a single attribute. The current implementation supports animating vector,
* boolean, or quaternion attributes. This class is used internally by the animation system.
*
* @param _animation - the animation resource
@@ -44,16 +44,16 @@ RDGE.animation = RDGE.animation || {};
*
*/
RDGE.animation.channelController = function (_animation, _channel) {
- /**
- * this.interpolate - Enable/Disable interpolation between animation frames.
- * Typically this should be enabled for smoother looking animation. However,
- * there may be applications where interpolation is undesireable.
+ /**
+ * this.interpolate - Enable/Disable interpolation between animation frames.
+ * Typically this should be enabled for smoother looking animation. However,
+ * there may be applications where interpolation is undesireable.
*/
this.interpolate = false;
- /**
- * this.animation - the animation resource.
- * This is where the keyframes for the channel are stored.
+ /**
+ * this.animation - the animation resource.
+ * This is where the keyframes for the channel are stored.
*/
this.animation = _animation;
@@ -77,20 +77,20 @@ RDGE.animation.channelController = function (_animation, _channel) {
*/
this.endTime = this.animation.clipEnd / this.animation.framesPerSec;
- /**
+ /**
* this.cachedFrame - cached frame index, this optimizes best case scenario computeFrame calls.
*/
this.cachedFrame = -1;
- /**
+ /**
* oneFrameInSecs - stores the interval of a single frame in seconds. This is used for internal calculations.
*/
oneFrameInSecs = 1.0 / _animation.framesPerSec;
- /**
- * this.channel.timeline - stores the animation timeline.
- * Currently this is calculated based on the framePerSec settings of the animation.
- * Eventually the timeline should be exported with the animation. Individual channels
+ /**
+ * this.channel.timeline - stores the animation timeline.
+ * Currently this is calculated based on the framePerSec settings of the animation.
+ * Eventually the timeline should be exported with the animation. Individual channels
* may have different timelines depending on which frames are keyed.
*/
this.channel.timeline = new Array(this.channel.numKeys + 1);
@@ -98,11 +98,11 @@ RDGE.animation.channelController = function (_animation, _channel) {
this.channel.timeline[i] = i / this.animation.framesPerSec;
}
- /** this.computeFrame
- * Calculates the current frame index of the animation at the current time.
- * In the worst case, this function will perform a binary search for the frame
- * whose time is closest to and less than the current time. In the best case,
- * the current frame is near the most recently cached frame, or it remains unchanged.
+ /** this.computeFrame
+ * Calculates the current frame index of the animation at the current time.
+ * In the worst case, this function will perform a binary search for the frame
+ * whose time is closest to and less than the current time. In the best case,
+ * the current frame is near the most recently cached frame, or it remains unchanged.
*/
this.computeFrame = function () {
var absTime = this.localTime + this.startTime;
@@ -146,7 +146,7 @@ RDGE.animation.channelController = function (_animation, _channel) {
}
}
- // binary search...
+ // binary search...
while (start + 1 < end) {
var mid = Math.floor((start + end) / 2);
if (absTime > this.channel.timeline[mid]) {
@@ -262,9 +262,9 @@ RDGE.animation.channelController = function (_animation, _channel) {
};
};
-/**
- * track
- * Each track advances and samples from a list of channel controllers, and is assigned to a scene graph node.
+/**
+ * track
+ * Each track advances and samples from a list of channel controllers, and is assigned to a scene graph node.
*
* @param _animation - the animation resource
* @param _track - the track id
--
cgit v1.2.3
From 3644cb6def4f681c99959e5729e78ea353441fad Mon Sep 17 00:00:00 2001
From: Kris Kowal
Date: Fri, 6 Jul 2012 12:34:53 -0700
Subject: Normalize to unix line terminators
---
.../RDGE/src/core/script/animation.js | 690 ++++++++++-----------
1 file changed, 345 insertions(+), 345 deletions(-)
(limited to 'js/helper-classes/RDGE/src/core/script/animation.js')
diff --git a/js/helper-classes/RDGE/src/core/script/animation.js b/js/helper-classes/RDGE/src/core/script/animation.js
index 2af5b207..0a4826c5 100755
--- a/js/helper-classes/RDGE/src/core/script/animation.js
+++ b/js/helper-classes/RDGE/src/core/script/animation.js
@@ -1,345 +1,345 @@
-/*
-Copyright (c) 2012, Motorola Mobility, Inc
-All Rights Reserved.
-BSD License.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- - Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- - Neither the name of Motorola Mobility nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
- */
-
-// RDGE namespaces
-var RDGE = RDGE || {};
-RDGE.animation = RDGE.animation || {};
-
-/**
- * channelController
- * The channel controller is really the workhorse of the RDGE animation system. It handles timing,
- * interpolation, and sampling of attributes over the lifetime of an animation. Each channel controller
- * is responsible for animating a single attribute. The current implementation supports animating vector,
- * boolean, or quaternion attributes. This class is used internally by the animation system.
- *
- * @param _animation - the animation resource
- * @param _channel - the channel id
- *
- */
-RDGE.animation.channelController = function (_animation, _channel) {
- /**
- * this.interpolate - Enable/Disable interpolation between animation frames.
- * Typically this should be enabled for smoother looking animation. However,
- * there may be applications where interpolation is undesireable.
- */
- this.interpolate = false;
-
- /**
- * this.animation - the animation resource.
- * This is where the keyframes for the channel are stored.
- */
- this.animation = _animation;
-
- /**
- * this.channel - the channel id. This is used to look up the keyframe data for this channel.
- */
- this.channel = _channel;
-
- /**
- * this.localTime - the current time, relative to the start time.
- */
- this.localTime = 0.0;
-
- /**
- * this.startTime - the start time of the animation clip window.
- */
- this.startTime = this.animation.clipStart / this.animation.framesPerSec;
-
- /**
- * this.endTime - the end time of the animation clip window.
- */
- this.endTime = this.animation.clipEnd / this.animation.framesPerSec;
-
- /**
- * this.cachedFrame - cached frame index, this optimizes best case scenario computeFrame calls.
- */
- this.cachedFrame = -1;
-
- /**
- * oneFrameInSecs - stores the interval of a single frame in seconds. This is used for internal calculations.
- */
- oneFrameInSecs = 1.0 / _animation.framesPerSec;
-
- /**
- * this.channel.timeline - stores the animation timeline.
- * Currently this is calculated based on the framePerSec settings of the animation.
- * Eventually the timeline should be exported with the animation. Individual channels
- * may have different timelines depending on which frames are keyed.
- */
- this.channel.timeline = new Array(this.channel.numKeys + 1);
- for (i = 0; i <= this.channel.numKeys; ++i) {
- this.channel.timeline[i] = i / this.animation.framesPerSec;
- }
-
- /** this.computeFrame
- * Calculates the current frame index of the animation at the current time.
- * In the worst case, this function will perform a binary search for the frame
- * whose time is closest to and less than the current time. In the best case,
- * the current frame is near the most recently cached frame, or it remains unchanged.
- */
- this.computeFrame = function () {
- var absTime = this.localTime + this.startTime;
- var start = this.animation.clipStart;
- var end = this.animation.clipEnd;
-
- if (this.cachedFrame != -1) {
- // if the current time is reasonably close to the last frame processed try searching
- // forward or backward. best case it is the next frame.
- if (Math.abs(absTime - this.channel.timeline[this.cachedFrame]) < 5 * oneFrameInSecs) {
- if (this.channel.timeline[this.cachedFrame] < absTime) {
- while (this.channel.timeline[this.cachedFrame + 1] <= absTime) {
- this.cachedFrame++;
- if (this.animation.looping) {
- if (this.cachedFrame > this.numFrames - 1) {
- this.cachedFrame -= this.numFrames - 1;
- }
- } else {
- if (this.cachedFrame > this.numFrames - 1) {
- this.cachedFrame = this.numFrames - 1;
- }
- }
- }
- return this.cachedFrame;
-
- } else {
- while (this.channel.timeline[this.cachedFrame] > absTime) {
- this.cachedFrame--;
- if (this.animation.looping) {
- if (this.cachedFrame < 0) {
- this.cachedFrame += this.numFrames - 1;
- }
- } else {
- if (this.cachedFrame > this.numFrames - 1) {
- this.cachedFrame = this.numFrames - 1;
- }
- }
- }
- return this.cachedFrame;
- }
- }
- }
-
- // binary search...
- while (start + 1 < end) {
- var mid = Math.floor((start + end) / 2);
- if (absTime > this.channel.timeline[mid]) {
- start = mid + 1;
- } else {
- end = mid - 1;
- }
- }
-
- this.cachedFrame = start;
-
- return start;
- };
-
- /* this.sampleBool - Sample a boolean at the current frame, booleans are not interpolated.
- * This function is used internally.
- */
- this.sampleBool = function () {
- // no interpolation on flags...
- var index = this.computeFrame();
- return this.channel.keys[index];
- };
-
- /* this.sampleQuat - Sample a quaternion at the current frame.
- * if this.interpolate == true, quaternions are interpolated inbetween frames using spherical linear interpolation (SLERP).
- */
- this.sampleQuat = function () {
- var frame0 = this.computeFrame();
- var frame1 = frame0 + 1;
-
- var k0 = this.channel.timeline[frame0];
- var k1 = this.channel.timeline[frame1];
- var index0 = frame0 * 4;
- var index1 = frame1 * 4;
-
- if (this.interpolate) {
- var absTime = this.localTime + this.startTime;
- var t = (absTime - k0) / (k1 - k0);
- var a = [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2], this.channel.keys[index0 + 3]];
- var b = [this.channel.keys[index1 + 0], this.channel.keys[index1 + 1], this.channel.keys[index1 + 2], this.channel.keys[index1 + 3]];
- return RDGE.quat.slerp(a, b, t);
- }
-
- return [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2], this.channel.keys[index0 + 3]];
- };
-
- /* this.sampleVec3 - Sample a vector3 at the current frame.
- * if this.interpolate == true, vectors are interpolated inbetween frames using linear interpolation (LERP).
- */
- this.sampleVec3 = function () {
- var frame0 = this.computeFrame();
- var frame1 = frame0 + 1;
-
- var k0 = this.channel.timeline[frame0];
- var k1 = this.channel.timeline[frame1];
- var index0 = frame0 * 3;
- var index1 = frame1 * 3;
-
- if (this.interpolate) {
- var absTime = this.localTime + this.startTime;
- var t = (absTime - k0) / (k1 - k0);
- var a = [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2]];
- var b = [this.channel.keys[index1 + 0], this.channel.keys[index1 + 1], this.channel.keys[index1 + 2]];
-
- return RDGE.vec3.lerp(a, b, t);
- }
- return [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2]];
- };
-
- /* this.setTime - set the current time.
- */
- this.setTime = function (t) {
- this.localTime = t;
- if (this.localTime < 0.0) {
- this.localTime = 0.0;
- }
- if (this.localTime > this.animation.duration - oneFrameInSecs) {
- this.localTime = this.animation.duration - oneFrameInSecs;
- }
- };
-
- /* this.setProgress - set the current time as a percentage of the duration.
- */
- this.setProgress = function (f) {
- this.setTime(f * this.animation.duration);
- };
-
- /* this.setFrame - set the current time by frame number.
- */
- this.setFrame = function (f) {
- this.setTime(f / this.animation.framesPerSec);
- };
-
- /* this.step - advance time by the given timestep and wrap if looping.
- */
- this.step = function (_dt) {
- this.localTime += _dt;
- if (this.animation.looping) {
- while (this.localTime < 0.0) {
- this.localTime += this.animation.duration - oneFrameInSecs;
- }
- while (this.localTime >= this.animation.duration - oneFrameInSecs) {
- this.localTime -= this.animation.duration - oneFrameInSecs;
- }
- } else {
- if (this.localTime < 0.0) {
- this.localTime = 0.0;
- }
- if (this.localTime > this.animation.duration) {
- this.localTime = this.animation.duration;
- }
- }
- };
-};
-
-/**
- * track
- * Each track advances and samples from a list of channel controllers, and is assigned to a scene graph node.
- *
- * @param _animation - the animation resource
- * @param _track - the track id
- * @param _node - the scene node
- *
- */
-RDGE.animation.track = function (_animation, _track, _node) {
- this.track = _track;
- this.node = _node;
-
- this.channelControllers = new Array();
- for (ch in _track) {
- this.channelControllers[ch] = new RDGE.animation.channelController(_animation, _track[ch]);
- }
-
- this.step = function (_dt) {
- for (cc in this.channelControllers) {
- this.channelControllers[cc].step(_dt);
- }
- var rotate = this.channelControllers["rotate"].sampleQuat();
- var scale = this.channelControllers["scale"].sampleVec3();
- var translate = this.channelControllers["translate"].sampleVec3();
- if (this.channelControllers["vis"] != null) {
- var vis = this.channelControllers["vis"].sampleBool();
- this.node.hide = !vis;
- }
-
- var m = RDGE.mat4.identity();
- m = RDGE.mat4.scale(m, scale);
- m = RDGE.mat4.mul(m, RDGE.quat.toMatrix(rotate));
- m = RDGE.mat4.translate(m, translate);
- this.node.local = m;
- }
-};
-
-RDGE.animation.animation = function (_scene, _clipStart, _clipEnd, _loop) {
- this.animation = _scene.scene.animation;
- this.clipStart = _clipStart;
- // this is a little hacky, but it works for now.
- if (_clipEnd == -1) {
- for (tr in this.animation) {
- for (ch in this.animation[tr]) {
- _clipEnd = this.animation[tr][ch].numKeys - 1;
- break;
- }
- break;
- }
- }
- this.clipEnd = _clipEnd;
- this.numFrames = _clipEnd - _clipStart;
- this.framesPerSec = 30.0;
- this.duration = this.numFrames / this.framesPerSec;
- this.rate = 1.0;
- this.looping = _loop;
- this.tracks = new Array();
-
- // creating a mapping here to make binding tracks a little more
- // straightforward.
- mapping = new Array();
- mapping.process = function (trNode, parent) {
- mapping[trNode.name] = trNode;
- }
-
- RDGE.globals.engine.getContext().getScene().Traverse(mapping);
- //g_sg.Traverse(mapping);
-
- for (tr in this.animation) {
- if (mapping[tr] !== undefined) {
- this.tracks.push(new RDGE.animation.track(this, this.animation[tr], mapping[tr]));
- }
- }
-
- this.step = function (_dt) {
- for (tr in this.tracks) {
- this.tracks[tr].step(g_animationRate * this.rate * _dt);
- }
- }
-};
+/*
+Copyright (c) 2012, Motorola Mobility, Inc
+All Rights Reserved.
+BSD License.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ - Neither the name of Motorola Mobility nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// RDGE namespaces
+var RDGE = RDGE || {};
+RDGE.animation = RDGE.animation || {};
+
+/**
+ * channelController
+ * The channel controller is really the workhorse of the RDGE animation system. It handles timing,
+ * interpolation, and sampling of attributes over the lifetime of an animation. Each channel controller
+ * is responsible for animating a single attribute. The current implementation supports animating vector,
+ * boolean, or quaternion attributes. This class is used internally by the animation system.
+ *
+ * @param _animation - the animation resource
+ * @param _channel - the channel id
+ *
+ */
+RDGE.animation.channelController = function (_animation, _channel) {
+ /**
+ * this.interpolate - Enable/Disable interpolation between animation frames.
+ * Typically this should be enabled for smoother looking animation. However,
+ * there may be applications where interpolation is undesireable.
+ */
+ this.interpolate = false;
+
+ /**
+ * this.animation - the animation resource.
+ * This is where the keyframes for the channel are stored.
+ */
+ this.animation = _animation;
+
+ /**
+ * this.channel - the channel id. This is used to look up the keyframe data for this channel.
+ */
+ this.channel = _channel;
+
+ /**
+ * this.localTime - the current time, relative to the start time.
+ */
+ this.localTime = 0.0;
+
+ /**
+ * this.startTime - the start time of the animation clip window.
+ */
+ this.startTime = this.animation.clipStart / this.animation.framesPerSec;
+
+ /**
+ * this.endTime - the end time of the animation clip window.
+ */
+ this.endTime = this.animation.clipEnd / this.animation.framesPerSec;
+
+ /**
+ * this.cachedFrame - cached frame index, this optimizes best case scenario computeFrame calls.
+ */
+ this.cachedFrame = -1;
+
+ /**
+ * oneFrameInSecs - stores the interval of a single frame in seconds. This is used for internal calculations.
+ */
+ oneFrameInSecs = 1.0 / _animation.framesPerSec;
+
+ /**
+ * this.channel.timeline - stores the animation timeline.
+ * Currently this is calculated based on the framePerSec settings of the animation.
+ * Eventually the timeline should be exported with the animation. Individual channels
+ * may have different timelines depending on which frames are keyed.
+ */
+ this.channel.timeline = new Array(this.channel.numKeys + 1);
+ for (i = 0; i <= this.channel.numKeys; ++i) {
+ this.channel.timeline[i] = i / this.animation.framesPerSec;
+ }
+
+ /** this.computeFrame
+ * Calculates the current frame index of the animation at the current time.
+ * In the worst case, this function will perform a binary search for the frame
+ * whose time is closest to and less than the current time. In the best case,
+ * the current frame is near the most recently cached frame, or it remains unchanged.
+ */
+ this.computeFrame = function () {
+ var absTime = this.localTime + this.startTime;
+ var start = this.animation.clipStart;
+ var end = this.animation.clipEnd;
+
+ if (this.cachedFrame != -1) {
+ // if the current time is reasonably close to the last frame processed try searching
+ // forward or backward. best case it is the next frame.
+ if (Math.abs(absTime - this.channel.timeline[this.cachedFrame]) < 5 * oneFrameInSecs) {
+ if (this.channel.timeline[this.cachedFrame] < absTime) {
+ while (this.channel.timeline[this.cachedFrame + 1] <= absTime) {
+ this.cachedFrame++;
+ if (this.animation.looping) {
+ if (this.cachedFrame > this.numFrames - 1) {
+ this.cachedFrame -= this.numFrames - 1;
+ }
+ } else {
+ if (this.cachedFrame > this.numFrames - 1) {
+ this.cachedFrame = this.numFrames - 1;
+ }
+ }
+ }
+ return this.cachedFrame;
+
+ } else {
+ while (this.channel.timeline[this.cachedFrame] > absTime) {
+ this.cachedFrame--;
+ if (this.animation.looping) {
+ if (this.cachedFrame < 0) {
+ this.cachedFrame += this.numFrames - 1;
+ }
+ } else {
+ if (this.cachedFrame > this.numFrames - 1) {
+ this.cachedFrame = this.numFrames - 1;
+ }
+ }
+ }
+ return this.cachedFrame;
+ }
+ }
+ }
+
+ // binary search...
+ while (start + 1 < end) {
+ var mid = Math.floor((start + end) / 2);
+ if (absTime > this.channel.timeline[mid]) {
+ start = mid + 1;
+ } else {
+ end = mid - 1;
+ }
+ }
+
+ this.cachedFrame = start;
+
+ return start;
+ };
+
+ /* this.sampleBool - Sample a boolean at the current frame, booleans are not interpolated.
+ * This function is used internally.
+ */
+ this.sampleBool = function () {
+ // no interpolation on flags...
+ var index = this.computeFrame();
+ return this.channel.keys[index];
+ };
+
+ /* this.sampleQuat - Sample a quaternion at the current frame.
+ * if this.interpolate == true, quaternions are interpolated inbetween frames using spherical linear interpolation (SLERP).
+ */
+ this.sampleQuat = function () {
+ var frame0 = this.computeFrame();
+ var frame1 = frame0 + 1;
+
+ var k0 = this.channel.timeline[frame0];
+ var k1 = this.channel.timeline[frame1];
+ var index0 = frame0 * 4;
+ var index1 = frame1 * 4;
+
+ if (this.interpolate) {
+ var absTime = this.localTime + this.startTime;
+ var t = (absTime - k0) / (k1 - k0);
+ var a = [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2], this.channel.keys[index0 + 3]];
+ var b = [this.channel.keys[index1 + 0], this.channel.keys[index1 + 1], this.channel.keys[index1 + 2], this.channel.keys[index1 + 3]];
+ return RDGE.quat.slerp(a, b, t);
+ }
+
+ return [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2], this.channel.keys[index0 + 3]];
+ };
+
+ /* this.sampleVec3 - Sample a vector3 at the current frame.
+ * if this.interpolate == true, vectors are interpolated inbetween frames using linear interpolation (LERP).
+ */
+ this.sampleVec3 = function () {
+ var frame0 = this.computeFrame();
+ var frame1 = frame0 + 1;
+
+ var k0 = this.channel.timeline[frame0];
+ var k1 = this.channel.timeline[frame1];
+ var index0 = frame0 * 3;
+ var index1 = frame1 * 3;
+
+ if (this.interpolate) {
+ var absTime = this.localTime + this.startTime;
+ var t = (absTime - k0) / (k1 - k0);
+ var a = [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2]];
+ var b = [this.channel.keys[index1 + 0], this.channel.keys[index1 + 1], this.channel.keys[index1 + 2]];
+
+ return RDGE.vec3.lerp(a, b, t);
+ }
+ return [this.channel.keys[index0 + 0], this.channel.keys[index0 + 1], this.channel.keys[index0 + 2]];
+ };
+
+ /* this.setTime - set the current time.
+ */
+ this.setTime = function (t) {
+ this.localTime = t;
+ if (this.localTime < 0.0) {
+ this.localTime = 0.0;
+ }
+ if (this.localTime > this.animation.duration - oneFrameInSecs) {
+ this.localTime = this.animation.duration - oneFrameInSecs;
+ }
+ };
+
+ /* this.setProgress - set the current time as a percentage of the duration.
+ */
+ this.setProgress = function (f) {
+ this.setTime(f * this.animation.duration);
+ };
+
+ /* this.setFrame - set the current time by frame number.
+ */
+ this.setFrame = function (f) {
+ this.setTime(f / this.animation.framesPerSec);
+ };
+
+ /* this.step - advance time by the given timestep and wrap if looping.
+ */
+ this.step = function (_dt) {
+ this.localTime += _dt;
+ if (this.animation.looping) {
+ while (this.localTime < 0.0) {
+ this.localTime += this.animation.duration - oneFrameInSecs;
+ }
+ while (this.localTime >= this.animation.duration - oneFrameInSecs) {
+ this.localTime -= this.animation.duration - oneFrameInSecs;
+ }
+ } else {
+ if (this.localTime < 0.0) {
+ this.localTime = 0.0;
+ }
+ if (this.localTime > this.animation.duration) {
+ this.localTime = this.animation.duration;
+ }
+ }
+ };
+};
+
+/**
+ * track
+ * Each track advances and samples from a list of channel controllers, and is assigned to a scene graph node.
+ *
+ * @param _animation - the animation resource
+ * @param _track - the track id
+ * @param _node - the scene node
+ *
+ */
+RDGE.animation.track = function (_animation, _track, _node) {
+ this.track = _track;
+ this.node = _node;
+
+ this.channelControllers = new Array();
+ for (ch in _track) {
+ this.channelControllers[ch] = new RDGE.animation.channelController(_animation, _track[ch]);
+ }
+
+ this.step = function (_dt) {
+ for (cc in this.channelControllers) {
+ this.channelControllers[cc].step(_dt);
+ }
+ var rotate = this.channelControllers["rotate"].sampleQuat();
+ var scale = this.channelControllers["scale"].sampleVec3();
+ var translate = this.channelControllers["translate"].sampleVec3();
+ if (this.channelControllers["vis"] != null) {
+ var vis = this.channelControllers["vis"].sampleBool();
+ this.node.hide = !vis;
+ }
+
+ var m = RDGE.mat4.identity();
+ m = RDGE.mat4.scale(m, scale);
+ m = RDGE.mat4.mul(m, RDGE.quat.toMatrix(rotate));
+ m = RDGE.mat4.translate(m, translate);
+ this.node.local = m;
+ }
+};
+
+RDGE.animation.animation = function (_scene, _clipStart, _clipEnd, _loop) {
+ this.animation = _scene.scene.animation;
+ this.clipStart = _clipStart;
+ // this is a little hacky, but it works for now.
+ if (_clipEnd == -1) {
+ for (tr in this.animation) {
+ for (ch in this.animation[tr]) {
+ _clipEnd = this.animation[tr][ch].numKeys - 1;
+ break;
+ }
+ break;
+ }
+ }
+ this.clipEnd = _clipEnd;
+ this.numFrames = _clipEnd - _clipStart;
+ this.framesPerSec = 30.0;
+ this.duration = this.numFrames / this.framesPerSec;
+ this.rate = 1.0;
+ this.looping = _loop;
+ this.tracks = new Array();
+
+ // creating a mapping here to make binding tracks a little more
+ // straightforward.
+ mapping = new Array();
+ mapping.process = function (trNode, parent) {
+ mapping[trNode.name] = trNode;
+ }
+
+ RDGE.globals.engine.getContext().getScene().Traverse(mapping);
+ //g_sg.Traverse(mapping);
+
+ for (tr in this.animation) {
+ if (mapping[tr] !== undefined) {
+ this.tracks.push(new RDGE.animation.track(this, this.animation[tr], mapping[tr]));
+ }
+ }
+
+ this.step = function (_dt) {
+ for (tr in this.tracks) {
+ this.tracks[tr].step(g_animationRate * this.rate * _dt);
+ }
+ }
+};
--
cgit v1.2.3