~holger-seelig/cobweb.js/trunk

« back to all changes in this revision

Viewing changes to src/cobweb/Components/Time/TimeSensor.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/Core/X3DSensorNode",
 
56
        "cobweb/Components/Time/X3DTimeDependentNode",
 
57
        "cobweb/Bits/X3DConstants",
 
58
],
 
59
function ($,
 
60
          Fields,
 
61
          X3DFieldDefinition,
 
62
          FieldDefinitionArray,
 
63
          X3DSensorNode, 
 
64
          X3DTimeDependentNode, 
 
65
          X3DConstants)
 
66
{
 
67
"use strict";
 
68
 
 
69
        function TimeSensor (executionContext)
 
70
        {
 
71
                X3DSensorNode        .call (this, executionContext);
 
72
                X3DTimeDependentNode .call (this, executionContext);
 
73
 
 
74
                this .addType (X3DConstants .TimeSensor);
 
75
 
 
76
                this .addChildObjects ("range", new Fields .MFFloat (0, 0, 1));
 
77
                
 
78
                this .cycle    = 0;
 
79
                this .interval = 0;
 
80
                this .first    = 0;
 
81
                this .last     = 1;
 
82
                this .scale    = 1;
 
83
        }
 
84
 
 
85
        TimeSensor .prototype = $.extend (Object .create (X3DSensorNode .prototype),
 
86
                X3DTimeDependentNode .prototype,
 
87
        {
 
88
                constructor: TimeSensor,
 
89
                fieldDefinitions: new FieldDefinitionArray ([
 
90
                        new X3DFieldDefinition (X3DConstants .inputOutput, "metadata",         new Fields .SFNode ()),
 
91
                        new X3DFieldDefinition (X3DConstants .inputOutput, "enabled",          new Fields .SFBool (true)),
 
92
                        new X3DFieldDefinition (X3DConstants .inputOutput, "cycleInterval",    new Fields .SFTime (1)),
 
93
                        new X3DFieldDefinition (X3DConstants .inputOutput, "loop",             new Fields .SFBool ()),
 
94
                        new X3DFieldDefinition (X3DConstants .inputOutput, "startTime",        new Fields .SFTime ()),
 
95
                        new X3DFieldDefinition (X3DConstants .inputOutput, "resumeTime",       new Fields .SFTime ()),
 
96
                        new X3DFieldDefinition (X3DConstants .inputOutput, "pauseTime",        new Fields .SFTime ()),
 
97
                        new X3DFieldDefinition (X3DConstants .inputOutput, "stopTime",         new Fields .SFTime ()),
 
98
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "isPaused",         new Fields .SFBool ()),
 
99
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "isActive",         new Fields .SFBool ()),
 
100
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "cycleTime",        new Fields .SFTime ()),
 
101
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "elapsedTime",      new Fields .SFTime ()),
 
102
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "fraction_changed", new Fields .SFFloat ()),
 
103
                        new X3DFieldDefinition (X3DConstants .outputOnly,  "time",             new Fields .SFTime ()),
 
104
                ]),
 
105
                getTypeName: function ()
 
106
                {
 
107
                        return "TimeSensor";
 
108
                },
 
109
                getComponentName: function ()
 
110
                {
 
111
                        return "Time";
 
112
                },
 
113
                getContainerField: function ()
 
114
                {
 
115
                        return "children";
 
116
                },
 
117
                initialize: function ()
 
118
                {
 
119
                        X3DSensorNode        .prototype .initialize .call (this);
 
120
                        X3DTimeDependentNode .prototype .initialize .call (this);
 
121
                },
 
122
                prepareEvents: function ()
 
123
                {
 
124
                        // The event order below is very important.
 
125
 
 
126
                        var time = this .getBrowser () .getCurrentTime ();
 
127
 
 
128
                        if (time - this .cycle >= this .interval)
 
129
                        {
 
130
                                if (this .loop_ .getValue ())
 
131
                                {
 
132
                                        if (this .interval)
 
133
                                        {
 
134
                                                this .cycle += this .interval * Math .floor ((time - this .cycle) / this .interval);
 
135
 
 
136
                                                this .fraction_changed_ = this .last;
 
137
                                                this .elapsedTime_      = this .getElapsedTime ();
 
138
                                                this .cycleTime_        = time;
 
139
                                        }
 
140
                                }
 
141
                                else
 
142
                                {
 
143
                                        this .fraction_changed_ = this .last;
 
144
                                        this .stop ();
 
145
                                }
 
146
                        }
 
147
                        else
 
148
                        {
 
149
                                var t = (time - this .cycle) / this .interval;
 
150
 
 
151
                                this .fraction_changed_ = this .first + (t - Math .floor (t)) * this .scale;
 
152
                                this .elapsedTime_      = this .getElapsedTime ();
 
153
                        }
 
154
 
 
155
                        this .time_ = time;
 
156
                },
 
157
                set_start: function ()
 
158
                {
 
159
                        this .first  = this .range_ [0];
 
160
                        this .last   = this .range_ [2];
 
161
                        this .scale  = this .last - this .first;
 
162
 
 
163
                        var offset = (this .range_ [1] -  this .first) *  this .cycleInterval_ .getValue ();
 
164
 
 
165
                        this .interval = this .cycleInterval_ .getValue () * this .scale;
 
166
                        this .cycle    = this .getBrowser () .getCurrentTime () - offset;
 
167
 
 
168
                        this .fraction_changed_ = this .range_ [1];
 
169
                        this .time_             = this .getBrowser () .getCurrentTime ();
 
170
                },                      
 
171
                set_resume: function (pauseInterval)
 
172
                {
 
173
                        this .cycle += pauseInterval;
 
174
                },
 
175
        });
 
176
 
 
177
        return TimeSensor;
 
178
});
 
179
 
 
180