1
/* -*- Mode: JavaScript; coding: utf-8; tab-width: 3; indent-tabs-mode: tab; c-basic-offset: 3 -*-
2
*******************************************************************************
4
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6
* Copyright create3000, Scheffelstraße 31a, Leipzig, Germany 2011.
8
* All rights reserved. Holger Seelig <holger.seelig@yahoo.de>.
10
* The copyright notice above does not evidence any actual of intended
11
* publication of such source code, and is an unpublished work by create3000.
12
* This material contains CONFIDENTIAL INFORMATION that is the property of
15
* No permission is granted to copy, distribute, or create derivative works from
16
* the contents of this software, in whole or in part, without the prior written
17
* permission of create3000.
19
* NON-MILITARY USE ONLY
21
* All create3000 software are effectively free software with a non-military use
22
* restriction. It is free. Well commented source is provided. You may reuse the
23
* source in any way you please with the exception anything that uses it must be
24
* marked to indicate is contains 'non-military use only' components.
26
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
28
* Copyright 2015, 2016 Holger Seelig <holger.seelig@yahoo.de>.
30
* This file is part of the Cobweb Project.
32
* Cobweb is free software: you can redistribute it and/or modify it under the
33
* terms of the GNU General Public License version 3 only, as published by the
34
* Free Software Foundation.
36
* Cobweb is distributed in the hope that it will be useful, but WITHOUT ANY
37
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
38
* A PARTICULAR PURPOSE. See the GNU General Public License version 3 for more
39
* details (a copy is included in the LICENSE file that accompanied this code).
41
* You should have received a copy of the GNU General Public License version 3
42
* along with Cobweb. If not, see <http://www.gnu.org/licenses/gpl.html> for a
43
* copy of the GPLv3 License.
45
* For Silvio, Joy and Adi.
47
******************************************************************************/
51
"standard/Math/Numbers/Vector4",
52
"standard/Math/Numbers/Matrix4",
63
S = new Vector4 (0, 0, 0, 0);
65
var H = new Matrix4 ( 2, -2, 1, 1,
70
function CatmullRomSplineInterpolator ()
76
CatmullRomSplineInterpolator .prototype =
78
constructor: CatmullRomSplineInterpolator,
79
generate: function (closed, key, keyValue, keyVelocity, normalizeVelocity)
96
if (keyVelocity .length === 0)
99
T .push (this .divide (this .subtract (keyValue [1] .getValue (), keyValue [keyValue .size () - 2] .getValue ()), 2));
102
T .push (this .create ());
104
for (var i = 1, length = keyValue .length - 1; i < length; ++ i)
105
T .push (this .divide (this .subtract (keyValue [i + 1] .getValue (), keyValue [i - 1] .getValue ()), 2));
107
T .push (this .copy (T [0]));
111
for (var i = 0, length = keyVelocity .length; i < length; ++ i)
112
T .push (this .copy (keyVelocity [i] .getValue ()));
114
if (normalizeVelocity)
118
for (var i = 0, length = keyValue .length - 1; i < length; ++ i)
119
Dtot += this .abs (this .subtract (keyValue [i] .getValue (), keyValue [i + 1] .getValue ()));
121
for (var i = 0, length = T .length - 1; i < length; ++ i)
122
T [i] = this .multiply (T [i], Dtot / this .abs (T [i]));
130
var i_1 = key .length - 1;
131
var i_2 = key .length - 2;
133
var d = key [1] .getValue () - key [0] .getValue () + key [i_1] .getValue () - key [i_2] .getValue ();
135
Fm .push (2 * (key [1] .getValue () - key [0] .getValue ()) / d);
136
Fp .push (2 * (key [i_1] .getValue () - key [i_2] .getValue ()) / d);
145
for (var i = 1, length = key .length - 1; i < length; ++ i)
147
var d = key [i + 1] .getValue () - key [i - 1] .getValue ();
149
Fm .push (2 * (key [i + 1] .getValue () - key [i] .getValue ()) / d);
150
Fp .push (2 * (key [i] .getValue () - key [i - 1] .getValue ()) / d);
158
for (var i = 0, length = T .length; i < length; ++ i)
160
T0 .push (this .multiply (T [i], Fp [i]));
161
T1 .push (this .multiply (T [i], Fm [i]));
166
T0 .push (this .create ());
167
T1 .push (this .create ());
170
interpolate: function (index0, index1, weight, keyValue)
172
S .set (Math .pow (weight, 3), Math .pow (weight, 2), weight, 1);
174
// Taking dot product from SH and C;
176
return this .dot (H .multVecMatrix (S),
177
keyValue [index0] .getValue (),
178
keyValue [index1] .getValue (),
184
return CatmullRomSplineInterpolator;