~holger-seelig/cobweb.js/trunk

« back to all changes in this revision

Viewing changes to cobweb.js/cobweb/Components/Interpolation/EaseInEaseOut.js

  • Committer: Holger Seelig
  • Date: 2017-08-22 04:53:24 UTC
  • Revision ID: holger.seelig@yahoo.de-20170822045324-4of4xxgt79669gbt
Switched to npm.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: JavaScript; coding: utf-8; tab-width: 3; indent-tabs-mode: tab; c-basic-offset: 3 -*-
2
 
 *******************************************************************************
3
 
 *
4
 
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
 
 *
6
 
 * Copyright create3000, Scheffelstraße 31a, Leipzig, Germany 2011.
7
 
 *
8
 
 * All rights reserved. Holger Seelig <holger.seelig@yahoo.de>.
9
 
 *
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
13
 
 * create3000.
14
 
 *
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.
18
 
 *
19
 
 * NON-MILITARY USE ONLY
20
 
 *
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.
25
 
 *
26
 
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
27
 
 *
28
 
 * Copyright 2015, 2016 Holger Seelig <holger.seelig@yahoo.de>.
29
 
 *
30
 
 * This file is part of the Cobweb Project.
31
 
 *
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.
35
 
 *
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).
40
 
 *
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.
44
 
 *
45
 
 * For Silvio, Joy and Adi.
46
 
 *
47
 
 ******************************************************************************/
48
 
 
49
 
 
50
 
define ([
51
 
        "jquery",
52
 
        "cobweb/Fields",
53
 
        "cobweb/Basic/X3DFieldDefinition",
54
 
        "cobweb/Basic/FieldDefinitionArray",
55
 
        "cobweb/Components/Interpolation/X3DInterpolatorNode",
56
 
        "cobweb/Bits/X3DConstants",
57
 
],
58
 
function ($,
59
 
          Fields,
60
 
          X3DFieldDefinition,
61
 
          FieldDefinitionArray,
62
 
          X3DInterpolatorNode, 
63
 
          X3DConstants)
64
 
{
65
 
"use strict";
66
 
 
67
 
        function EaseInEaseOut (executionContext)
68
 
        {
69
 
                X3DInterpolatorNode .call (this, executionContext);
70
 
 
71
 
                this .addType (X3DConstants .EaseInEaseOut);
72
 
        }
73
 
 
74
 
        EaseInEaseOut .prototype = $.extend (Object .create (X3DInterpolatorNode .prototype),
75
 
        {
76
 
                constructor: EaseInEaseOut,
77
 
                fieldDefinitions: new FieldDefinitionArray ([
78
 
                        new X3DFieldDefinition (X3DConstants .inputOutput, "metadata",                 new Fields .SFNode ()),
79
 
                        new X3DFieldDefinition (X3DConstants .inputOnly,   "set_fraction",             new Fields .SFFloat ()),
80
 
                        new X3DFieldDefinition (X3DConstants .inputOutput, "key",                      new Fields .MFFloat ()),
81
 
                        new X3DFieldDefinition (X3DConstants .inputOutput, "easeInEaseOut",            new Fields .MFVec2f ()),
82
 
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "modifiedFraction_changed", new Fields .SFFloat ()),
83
 
                ]),
84
 
                getTypeName: function ()
85
 
                {
86
 
                        return "EaseInEaseOut";
87
 
                },
88
 
                getComponentName: function ()
89
 
                {
90
 
                        return "Interpolation";
91
 
                },
92
 
                getContainerField: function ()
93
 
                {
94
 
                        return "children";
95
 
                },
96
 
                initialize: function ()
97
 
                {
98
 
                        X3DInterpolatorNode .prototype .initialize .call (this);
99
 
 
100
 
                        this .easeInEaseOut_ .addInterest ("set_keyValue__", this);
101
 
                },
102
 
                set_keyValue__: function ()
103
 
                {
104
 
                        if (this .easeInEaseOut_ .length < this .key_ .length)
105
 
                                this .easeInEaseOut_ .resize (this .key_ .length, this .easeInEaseOut_ .length ? this .easeInEaseOut_ [this .easeInEaseOut_ .length - 1] : new Fields .SFVec2f ());
106
 
                },
107
 
                interpolate: function (index0, index1, weight)
108
 
                {
109
 
                        var easeOut = this .easeInEaseOut_ [index0] .y;
110
 
                        var easeIn  = this .easeInEaseOut_ [index1] .x;
111
 
                        var sum     = easeOut + easeIn;
112
 
 
113
 
                        if (sum < 0)
114
 
                                this .modifiedFraction_changed_ = weight;
115
 
 
116
 
                        else
117
 
                        {
118
 
                                if (sum > 1)
119
 
                                {
120
 
                                        easeIn  /= sum;
121
 
                                        easeOut /= sum;
122
 
                                }
123
 
 
124
 
                                var t = 1 / (2 - easeOut - easeIn);
125
 
 
126
 
                                if (weight < easeOut)
127
 
                                {
128
 
                                        this .modifiedFraction_changed_ = (t / easeOut) * weight * weight;
129
 
                                }
130
 
                                else if (weight <= 1 - easeIn) // Spec says (weight < 1 - easeIn), but then we get a NaN below if easeIn == 0.
131
 
                                {
132
 
                                        this .modifiedFraction_changed_ = t * (2 * weight - easeOut);
133
 
                                }
134
 
                                else
135
 
                                {
136
 
                                        var w = 1 - weight;
137
 
 
138
 
                                        this .modifiedFraction_changed_ = 1 - ((t * w * w) / easeIn);
139
 
                                }
140
 
                        }
141
 
                },
142
 
        });
143
 
 
144
 
        return EaseInEaseOut;
145
 
});
146
 
 
147