/
ScalarSequencerPrototype.x3d
130 lines (104 loc) · 4.96 KB
/
ScalarSequencerPrototype.x3d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Interactive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' http://www.web3d.org/specifications/x3d-3.3.xsd '>
<head>
<meta name='title' content='ScalarSequencerPrototype.x3d'/>
<meta name='description' content='ScalarSequencer is modeled after ScalarInterpolator and generates SFFloat values.'/>
<meta name='creator' content='Andreas Plesch'/>
<meta name='created' content='Fall 2017'/>
<meta name='reference' content=' http://www.web3d.org/technicalinfo/specifications/vrml97/part1/nodesRef.html#ScalarInterpolator '/>
<meta name='subject' content='scalar sequencer'/>
<meta name='identifier' content=' https://github.com/andreasplesch/ScalarSequencer '/>
<meta name='license' content=' ../LICENSE'/>
</head>
<Scene>
<ProtoDeclare name='ScalarSequencer'>
<ProtoInterface>
<field name='next' type='SFBool' accessType='inputOnly'></field>
<field name='previous' type='SFBool' accessType='inputOnly'></field>
<field name='fraction' type='SFFloat' accessType='inputOutput'></field>
<field name='key' type='MFFloat' accessType='inputOutput'></field>
<field name='keyValue' type='MFFloat' accessType='inputOutput'></field>
<field name='value_changed' type='SFFloat' accessType='outputOnly'></field>
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/>
</ProtoInterface>
<ProtoBody>
<Script>
<field name='next' type='SFBool' accessType='inputOnly'></field>
<field name='previous' type='SFBool' accessType='inputOnly'></field>
<field name='fraction' type='SFFloat' value='0' accessType='inputOutput'></field>
<field name='key' type='MFFloat' value='0 0.2 0.4 1' accessType='inputOutput'></field>
<field name='keyValue' type='MFFloat' value='0 0.2 0.4 1' accessType='inputOutput'></field>
<field name='value_changed' type='SFFloat' accessType='outputOnly'></field>
<field name='_keyIndex' type='SFFloat' value='-1' accessType='initializeOnly'></field>
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/>
<IS>
<connect protoField='next' nodeField='next'></connect>
<connect protoField='previous' nodeField='previous'></connect>
<connect protoField='fraction' nodeField='fraction'></connect>
<connect protoField='key' nodeField='key'></connect>
<connect protoField='keyValue' nodeField='keyValue'></connect>
<connect protoField='value_changed' nodeField='value_changed'></connect>
<connect protoField='traceEnabled' nodeField='traceEnabled'></connect>
</IS>
<![CDATA[ ecmascript:
// var _keyIndex = -1; // use initializeOnly field instead for compat.
function findInterval(time) {
var keyLength = key.length - 1;
if (time < key[0]) return 0;
else if (time >= key[keyLength]) return keyLength;
for (var i = 0; i < keyLength; ++i) {
if ((key[i] <= time) && (time < key[i+1])) {
return i;
}
}
Browser.print(' ScalarSequencerProto: keys not sorted ? key was ' + time + ' but assuming 0 \n');
return 0; // should never happen
}
function set_fraction(fraction) {
var keyIndex = findInterval(fraction);
// only generate event when necessary, BS Contact does not like !==
if (keyIndex != _keyIndex) {
if (_keyIndex != -1) _keyIndex = keyIndex; // check special init case
value_changed = keyValue[keyIndex];
}
fraction_changed = fraction; // also generate fraction output event
tracePrint(' set_fraction: ' + _keyIndex );
return;
}
function next(val) {
if (val) {
_keyIndex = (_keyIndex + 1)%(key.length);
value_changed = keyValue[_keyIndex];
tracePrint(' next index ' + _keyIndex);
return;
}
}
function previous(val) {
if (val) {
_keyIndex = (_keyIndex - 1 + key.length)%(key.length);
value_changed = keyValue[_keyIndex];
return;
}
}
//probably necessary to explicitly handle key and keyValue set_ and _changed
function key(val) {
tracePrint(' new key: '+ val);
key = val; // should generate key_changed event
}
function keyValue(val) {
tracePrint(' new keyValue: '+ val);
keyValue = val; // should generate keyValue_changed event
}
function tracePrint (outputValue)
{
if (traceEnabled) Browser.print (outputValue + '\n');
}
]]>
</Script>
</ProtoBody>
</ProtoDeclare>
</Scene>
</X3D>