~holger-seelig/cobweb.js/trunk

« back to all changes in this revision

Viewing changes to src/cobweb/Components/Followers/X3DDamperNode.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/Components/Followers/X3DFollowerNode",
 
53
        "cobweb/Bits/X3DConstants",
 
54
        "standard/Math/Algorithm",
 
55
],
 
56
function ($,
 
57
          X3DFollowerNode, 
 
58
          X3DConstants,
 
59
          Algorithm)
 
60
{
 
61
"use strict";
 
62
 
 
63
        function X3DDamperNode (executionContext)
 
64
        {
 
65
                X3DFollowerNode .call (this, executionContext);
 
66
 
 
67
                this .addType (X3DConstants .X3DDamperNode);
 
68
        }
 
69
 
 
70
        X3DDamperNode .prototype = $.extend (Object .create (X3DFollowerNode .prototype),
 
71
        {
 
72
                constructor: X3DDamperNode,
 
73
                initialize: function ()
 
74
                {
 
75
                        X3DFollowerNode .prototype .initialize .call (this);
 
76
                
 
77
                        this .order_           .addInterest ("set_order__", this);
 
78
                        this .set_value_       .addInterest ("set_value__", this);
 
79
                        this .set_destination_ .addInterest ("set_destination__", this);
 
80
 
 
81
                        var
 
82
                                buffer             = this .getBuffer (),
 
83
                                initialValue       = this .getInitialValue (),
 
84
                                initialDestination = this .getInitialDestination ();
 
85
 
 
86
                        buffer [0] = this .duplicate (initialDestination);
 
87
                
 
88
                        for (var i = 1, length = this .getOrder () + 1; i < length; ++ i)
 
89
                                buffer [i] = this .duplicate (initialValue);
 
90
        
 
91
                        if (this .equals (initialDestination, initialValue, this .getTolerance ()))
 
92
                                this .setValue (initialDestination);
 
93
 
 
94
                        else
 
95
                                this .set_active (true);
 
96
                },
 
97
                getOrder: function ()
 
98
                {
 
99
                        return Algorithm .clamp (this .order_ .getValue (), 0, 5);
 
100
                },
 
101
                getTolerance: function ()
 
102
                {
 
103
                        if (this .tolerance_ .getValue () < 0)
 
104
                                return 1e-4;
 
105
 
 
106
                        return this .tolerance_ .getValue ();
 
107
                },
 
108
                prepareEvents: function ()
 
109
                {
 
110
                        var
 
111
                                buffer = this .getBuffer (),
 
112
                                order  = buffer .length - 1;
 
113
 
 
114
                        if (this .tau_ .getValue ())
 
115
                        {
 
116
                                var
 
117
                                        delta = 1 / this .getBrowser () .currentFrameRate,
 
118
                                        alpha = Math .exp (-delta / this .tau_ .getValue ());
 
119
 
 
120
                                for (var i = 0; i < order; ++ i)
 
121
                                {
 
122
                                        try
 
123
                                        {
 
124
                                                this .assign (buffer, i + 1, this .interpolate (buffer [i], buffer [i + 1], alpha));
 
125
                                        }
 
126
                                        catch (error)
 
127
                                        { }
 
128
                                }
 
129
 
 
130
                                this .setValue (buffer [order]);
 
131
 
 
132
                                if (! this .equals (buffer [order], buffer [0], this .getTolerance ()))
 
133
                                        return;
 
134
                        }
 
135
                        else
 
136
                        {
 
137
                                this .setValue (buffer [0]);
 
138
 
 
139
                                order = 0;
 
140
                        }
 
141
 
 
142
                        for (var i = 1, length = buffer .length; i < length; ++ i)
 
143
                                this .assign (buffer, i, buffer [order]);
 
144
 
 
145
                        this .set_active (false);
 
146
                },
 
147
                set_value__: function ()
 
148
                {
 
149
                        var
 
150
                                buffer = this .getBuffer (),
 
151
                                value  = this .getValue ();
 
152
 
 
153
                        for (var i = 1, length = buffer .length; i < length; ++ i)
 
154
                                this .assign (buffer, i, value);
 
155
 
 
156
                        this .setValue (value);
 
157
                
 
158
                        this .set_active (true);
 
159
                },
 
160
                set_destination__: function ()
 
161
                {
 
162
                        this .assign (this .getBuffer (), 0, this .getDestination ());
 
163
 
 
164
                        this .set_active (true);
 
165
                },
 
166
                set_order__: function ()
 
167
                {
 
168
                        var
 
169
                                buffer = this .getBuffer (),
 
170
                                value  = buffer [buffer .length - 1];
 
171
 
 
172
                        for (var i = buffer .length, length = this .getOrder () + 1; i < length; ++ i)
 
173
                                buffer [i] = this .duplicate (value);
 
174
 
 
175
                        buffer .length = length;
 
176
                },
 
177
        });
 
178
 
 
179
        return X3DDamperNode;
 
180
});
 
181
 
 
182