1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
- using ArtNet . Packets ;
5
4
using UnityEditor ;
6
5
using UnityEngine ;
7
6
@@ -11,21 +10,28 @@ public class TimelineConverter
11
10
{
12
11
public List < TimelineUniverse > Timelines { get ; } = new ( ) ;
13
12
14
- public TimelineConverter ( IReadOnlyCollection < ( int time , DmxPacket packet ) > packets )
13
+ public TimelineConverter ( IEnumerable < UniverseData > universeData )
15
14
{
16
- var groupedUniversePackets = packets . GroupBy ( x => x . packet . Universe ) ;
15
+ var groupedUniverseData = universeData . GroupBy ( x => x . Universe ) ;
17
16
18
- foreach ( var group in groupedUniversePackets )
17
+ foreach ( var group in groupedUniverseData )
19
18
{
20
- Timelines . Add ( new TimelineUniverse ( group . Key , group . ToList ( ) ) ) ;
19
+ Timelines . Add ( new TimelineUniverse ( ( int ) group . Key , group . ToList ( ) ) ) ;
21
20
}
22
21
}
23
22
24
- public TimelineConverter ( DmxTimelineSetting dmxTimelineSetting )
23
+ public TimelineConverter ( AnimationClip clip )
25
24
{
26
- foreach ( var timelineElement in dmxTimelineSetting . DmxTimelines )
25
+ var curveBindings = AnimationUtility . GetCurveBindings ( clip ) ;
26
+ var universePaths = curveBindings . Select ( x => x . path ) . Distinct ( ) ;
27
+ var universeRegex = new System . Text . RegularExpressions . Regex ( @"Universe(\d+)" ) ;
28
+ foreach ( var universePath in universePaths )
27
29
{
28
- Timelines . Add ( new TimelineUniverse ( timelineElement . Universe , timelineElement . DmxTimelineClip ) ) ;
30
+ var match = universeRegex . Match ( universePath ) ;
31
+ if ( match . Success == false ) continue ;
32
+
33
+ var universe = int . Parse ( match . Groups [ 1 ] . Value ) ;
34
+ Timelines . Add ( new TimelineUniverse ( universe , clip ) ) ;
29
35
}
30
36
}
31
37
@@ -36,32 +42,26 @@ public void SaveDmxTimelineClips(string directory)
36
42
System . IO . Directory . CreateDirectory ( directory ) ;
37
43
}
38
44
39
- var dmxTimelines = new List < DmxTimeline > ( Timelines . Count ) ;
45
+ var clip = new AnimationClip { name = "ArtNetDmx" } ;
40
46
foreach ( var timelineUniverse in Timelines )
41
47
{
42
48
var universe = timelineUniverse . Universe ;
43
49
timelineUniverse . ThinOutUnchangedFrames ( ) ;
44
- var clip = timelineUniverse . ToAnimationClip ( ) ;
45
- SaveAsset ( clip , directory , $ "Universe{ universe } .anim") ;
46
-
47
- var timelineElement = new DmxTimeline
50
+ var curves = timelineUniverse . AnimationCurves ( ) ;
51
+ for ( var i = 0 ; i < curves . Length ; i ++ )
48
52
{
49
- DmxTimelineClip = clip ,
50
- Universe = universe
51
- } ;
52
- dmxTimelines . Add ( timelineElement ) ;
53
+ if ( curves [ i ] . keys . Length == 0 ) continue ;
54
+ clip . SetCurve ( $ "Universe{ universe } ", typeof ( DmxData ) , $ "Ch{ i + 1 : D3} ", curves [ i ] ) ;
55
+ }
53
56
}
54
-
55
- var dmxTimelineAsset = ScriptableObject . CreateInstance < DmxTimelineSetting > ( ) ;
56
- dmxTimelineAsset . DmxTimelines = dmxTimelines ;
57
- SaveAsset ( dmxTimelineAsset , directory , "DmxTimeline.asset" ) ;
57
+ SaveAsset ( clip , directory , "ArtNetDmx.anim" ) ;
58
58
59
59
AssetDatabase . Refresh ( ) ;
60
60
}
61
61
62
- public List < ( int time , DmxPacket packet ) > ToDmxPackets ( )
62
+ public List < UniverseData > ToUniverseData ( )
63
63
{
64
- return Timelines . SelectMany ( x => x . ToDmxPackets ( ) ) . OrderBy ( x => x . time ) . ToList ( ) ;
64
+ return Timelines . SelectMany ( x => x . ToUniverseData ( ) ) . OrderBy ( x => x . Time ) . ToList ( ) ;
65
65
}
66
66
67
67
private static void SaveAsset < T > ( T asset , string directory , string fileName ) where T : UnityEngine . Object
@@ -77,16 +77,16 @@ public class TimelineUniverse
77
77
public int Universe { get ; }
78
78
private List < DmxFrameData > [ ] ChannelDmxFrameData { get ; }
79
79
80
- public TimelineUniverse ( int universe , IReadOnlyCollection < ( int time , DmxPacket packet ) > packets )
80
+ public TimelineUniverse ( int groupKey , IReadOnlyCollection < UniverseData > universeData )
81
81
{
82
- Universe = universe ;
82
+ Universe = groupKey ;
83
83
ChannelDmxFrameData = new List < DmxFrameData > [ 512 ] ;
84
84
85
85
for ( var i = 0 ; i < ChannelDmxFrameData . Length ; i ++ )
86
86
{
87
- ChannelDmxFrameData [ i ] = packets . Where ( x => x . packet . Dmx . Length > i )
88
- . Select ( x => new DmxFrameData ( x . time , x . packet . Dmx [ i ] ) )
89
- . OrderBy ( x => x . Millisecond ) . ToList ( ) ;
87
+ ChannelDmxFrameData [ i ] = universeData . Where ( x => x . Values . Length > i )
88
+ . Select ( x => new DmxFrameData ( ( float ) x . Time , x . Values [ i ] ) )
89
+ . OrderBy ( x => x . Time ) . ToList ( ) ;
90
90
}
91
91
}
92
92
@@ -110,17 +110,17 @@ public TimelineUniverse(int universe, AnimationClip clip)
110
110
}
111
111
}
112
112
113
- public IEnumerable < int > AllFrameTimes ( )
113
+ public IEnumerable < float > AllFrameTimes ( )
114
114
{
115
- return ChannelDmxFrameData . SelectMany ( x => x . Select ( frameData => frameData . Millisecond ) ) . Distinct ( ) ;
115
+ return ChannelDmxFrameData . SelectMany ( x => x . Select ( frameData => frameData . Time ) ) . Distinct ( ) ;
116
116
}
117
117
118
- public byte FrameValue ( int channel , int time )
118
+ public byte FrameValue ( int channel , float time )
119
119
{
120
120
var dmxFrameData = ChannelDmxFrameData [ channel ] ;
121
121
122
122
// If there is a frame data at the exact time, return it
123
- foreach ( var frameData in dmxFrameData . Where ( frameData => frameData . Millisecond == time ) )
123
+ foreach ( var frameData in dmxFrameData . Where ( frameData => Mathf . Approximately ( frameData . Time , time ) ) )
124
124
{
125
125
return frameData . Value ;
126
126
}
@@ -129,8 +129,8 @@ public byte FrameValue(int channel, int time)
129
129
if ( dmxFrameData . Count == 0 ) return 0 ;
130
130
131
131
// if time is out of range, return the first or last value
132
- if ( time < dmxFrameData [ 0 ] . Millisecond ) return dmxFrameData [ 0 ] . Value ;
133
- if ( time > dmxFrameData [ ^ 1 ] . Millisecond ) return dmxFrameData [ ^ 1 ] . Value ;
132
+ if ( time < dmxFrameData [ 0 ] . Time ) return dmxFrameData [ 0 ] . Value ;
133
+ if ( time > dmxFrameData [ ^ 1 ] . Time ) return dmxFrameData [ ^ 1 ] . Value ;
134
134
135
135
// return the estimated value from frames around the specified time.
136
136
@@ -139,7 +139,7 @@ public byte FrameValue(int channel, int time)
139
139
var next = dmxFrameData [ 0 ] ;
140
140
foreach ( var frameData in dmxFrameData )
141
141
{
142
- if ( frameData . Millisecond > time )
142
+ if ( frameData . Time > time )
143
143
{
144
144
next = frameData ;
145
145
break ;
@@ -150,34 +150,18 @@ public byte FrameValue(int channel, int time)
150
150
151
151
// Calculate the estimated value
152
152
var prevDiff = next . Value - prev . Value ;
153
- var prevDiffTime = next . Millisecond - prev . Millisecond ;
154
- var timeDiff = time - prev . Millisecond ;
153
+ var prevDiffTime = next . Time - prev . Time ;
154
+ var timeDiff = time - prev . Time ;
155
155
return ( byte ) ( prev . Value + ( prevDiff * timeDiff / prevDiffTime ) ) ;
156
156
}
157
157
158
- public AnimationClip ToAnimationClip ( )
159
- {
160
- var curves = ConvertAnimationCurves ( ) ;
161
- var clip = new AnimationClip
162
- {
163
- name = $ "Universe{ Universe } "
164
- } ;
165
- for ( var i = 0 ; i < curves . Length ; i ++ )
166
- {
167
- if ( curves [ i ] . keys . Length == 0 ) continue ;
168
- clip . SetCurve ( "" , typeof ( DmxData ) , $ "Ch{ i + 1 : D3} ", curves [ i ] ) ;
169
- }
170
-
171
- return clip ;
172
- }
173
-
174
- private AnimationCurve [ ] ConvertAnimationCurves ( )
158
+ public AnimationCurve [ ] AnimationCurves ( )
175
159
{
176
160
var curves = new AnimationCurve [ ChannelDmxFrameData . Length ] ;
177
161
for ( var i = 0 ; i < ChannelDmxFrameData . Length ; i ++ )
178
162
{
179
163
var keyframes = ChannelDmxFrameData [ i ]
180
- . Select ( data => new Keyframe ( data . Millisecond / 1000f , data . Value ) ) . ToArray ( ) ;
164
+ . Select ( data => new Keyframe ( data . Time , data . Value ) ) . ToArray ( ) ;
181
165
curves [ i ] = new AnimationCurve ( keyframes ) ;
182
166
}
183
167
@@ -217,16 +201,15 @@ private static bool IsOmittedFrame(
217
201
{
218
202
var prevDiff = current . Value - prev . Value ;
219
203
var nextDiff = next . Value - current . Value ;
220
- var prevDiffTime = current . Millisecond - prev . Millisecond ;
221
- var nextDiffTime = next . Millisecond - current . Millisecond ;
204
+ var prevDiffTime = current . Time - prev . Time ;
205
+ var nextDiffTime = next . Time - current . Time ;
222
206
223
- return Math . Abs ( ( float ) prevDiff / prevDiffTime - ( float ) nextDiff / nextDiffTime ) <= tolerance ;
207
+ return Math . Abs ( prevDiff / prevDiffTime - nextDiff / nextDiffTime ) <= tolerance ;
224
208
}
225
209
226
- public IEnumerable < ( int time , DmxPacket packet ) > ToDmxPackets ( )
210
+ public IEnumerable < UniverseData > ToUniverseData ( )
227
211
{
228
- byte sequence = 0 ;
229
- var packets = new List < ( int time , DmxPacket packet ) > ( ) ;
212
+ var universeData = new List < UniverseData > ( ) ;
230
213
var allFrameTimes = AllFrameTimes ( ) . OrderBy ( x => x ) . ToList ( ) ;
231
214
232
215
foreach ( var time in allFrameTimes )
@@ -237,30 +220,21 @@ private static bool IsOmittedFrame(
237
220
dmx [ i ] = FrameValue ( i , time ) ;
238
221
}
239
222
240
- var packet = new DmxPacket { Sequence = sequence , Universe = ( ushort ) Universe , Dmx = dmx } ;
241
- packets . Add ( ( time , packet ) ) ;
242
- if ( sequence >= 255 )
243
- {
244
- sequence = 0 ;
245
- }
246
- else
247
- {
248
- sequence ++ ;
249
- }
223
+ universeData . Add ( new UniverseData ( time , ( uint ) Universe , dmx ) ) ;
250
224
}
251
225
252
- return packets ;
226
+ return universeData ;
253
227
}
254
228
}
255
229
256
230
public struct DmxFrameData
257
231
{
258
- public int Millisecond { get ; }
232
+ public float Time { get ; }
259
233
public byte Value { get ; }
260
234
261
- public DmxFrameData ( int millisecond , byte value )
235
+ public DmxFrameData ( float time , byte value )
262
236
{
263
- Millisecond = millisecond ;
237
+ Time = time ;
264
238
Value = value ;
265
239
}
266
240
}
0 commit comments