Skip to content

Commit 174c6b0

Browse files
authored
Merge pull request #23 from nasshu2916/feature/refactore-anim
DmxPacket から AnimationClip への変換処理を変更
2 parents 37c2a03 + 8e33d4c commit 174c6b0

File tree

5 files changed

+87
-104
lines changed

5 files changed

+87
-104
lines changed

Assets/ArtNet/Editor/DmxRecorder/ConvertAnimInspector.cs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
using System.Collections.Generic;
12
using System.IO;
3+
using System.Linq;
4+
using ArtNet.Packets;
25
using UnityEditor;
36
using UnityEngine;
47

@@ -47,7 +50,12 @@ private static void ConvertAnim(ConvertAnim convertAnim)
4750
}
4851

4952
var bytes = binary.bytes;
50-
TimelineConverter timelineConverter = new(RecordData.Deserialize(bytes));
53+
var packets = RecordData.Deserialize(bytes);
54+
var universeData = packets.Select(packet => new UniverseData(packet.time / 1000f, packet.packet.Universe,
55+
packet
56+
.packet.Dmx));
57+
58+
TimelineConverter timelineConverter = new(universeData);
5159
timelineConverter.SaveDmxTimelineClips(convertAnim.OutputDirectory);
5260

5361
Debug.Log("Conversion complete");
@@ -67,17 +75,37 @@ private static void ConvertPacket(ConvertAnim convertAnim)
6775
return;
6876
}
6977

70-
var timelineSettingPath = convertAnim.OutputDirectory + "/DmxTimeline.asset";
71-
var dmxTimelineSetting = AssetDatabase.LoadAssetAtPath(timelineSettingPath, typeof(DmxTimelineSetting)) as DmxTimelineSetting;
72-
if (dmxTimelineSetting is null)
78+
var timelineSettingPath = convertAnim.OutputDirectory + "/ArtNetDmx.anim";
79+
if (AssetDatabase.LoadAssetAtPath(timelineSettingPath, typeof(AnimationClip)) is not AnimationClip artNetDmxClip)
7380
{
7481
Debug.LogError("DmxTimelineSetting is null");
7582
return;
7683
}
7784

78-
Debug.Log($"ArtNet Recorder: {dmxTimelineSetting.DmxTimelines.Count} timelines found");
79-
var timelineConverter = new TimelineConverter(dmxTimelineSetting);
80-
var dmxPackets = timelineConverter.ToDmxPackets();
85+
var timelineConverter = new TimelineConverter(artNetDmxClip);
86+
var universeDataList = timelineConverter.ToUniverseData();
87+
var dmxPackets = new List<(int, DmxPacket)>();
88+
byte sequence = 0;
89+
foreach (var universeData in universeDataList)
90+
{
91+
var packet = new DmxPacket
92+
{
93+
Sequence = sequence++,
94+
Universe = (ushort) universeData.Universe,
95+
Dmx = universeData.Values
96+
};
97+
dmxPackets.Add(((int) (universeData.Time * 1000f), packet)); ;
98+
99+
if (sequence >= 255)
100+
{
101+
sequence = 0;
102+
}
103+
else
104+
{
105+
sequence++;
106+
}
107+
}
108+
81109
var storeData = RecordData.Serialize(dmxPackets);
82110

83111

Assets/ArtNet/Editor/DmxRecorder/DmxTimelineSetting.cs

Lines changed: 0 additions & 18 deletions
This file was deleted.

Assets/ArtNet/Editor/DmxRecorder/DmxTimelineSetting.cs.meta

Lines changed: 0 additions & 3 deletions
This file was deleted.

Assets/ArtNet/Editor/DmxRecorder/RecordController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ private void Store(AnimationRecorderSettings settings)
180180
{
181181
Directory.CreateDirectory(directory);
182182
}
183-
var timelineConverter = new TimelineConverter(_recordedDmx);
183+
var universeData = _recordedDmx.Select(packet => new UniverseData(packet.Item1 / 1000f, packet.Item2
184+
.Universe, packet.Item2.Dmx));
185+
var timelineConverter = new TimelineConverter(universeData);
184186
timelineConverter.SaveDmxTimelineClips(directory);
185187
}
186188
}

Assets/ArtNet/Editor/DmxRecorder/TimelineConverter.cs

Lines changed: 49 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using ArtNet.Packets;
54
using UnityEditor;
65
using UnityEngine;
76

@@ -11,21 +10,28 @@ public class TimelineConverter
1110
{
1211
public List<TimelineUniverse> Timelines { get; } = new();
1312

14-
public TimelineConverter(IReadOnlyCollection<(int time, DmxPacket packet)> packets)
13+
public TimelineConverter(IEnumerable<UniverseData> universeData)
1514
{
16-
var groupedUniversePackets = packets.GroupBy(x => x.packet.Universe);
15+
var groupedUniverseData = universeData.GroupBy(x => x.Universe);
1716

18-
foreach (var group in groupedUniversePackets)
17+
foreach (var group in groupedUniverseData)
1918
{
20-
Timelines.Add(new TimelineUniverse(group.Key, group.ToList()));
19+
Timelines.Add(new TimelineUniverse((int) group.Key, group.ToList()));
2120
}
2221
}
2322

24-
public TimelineConverter(DmxTimelineSetting dmxTimelineSetting)
23+
public TimelineConverter(AnimationClip clip)
2524
{
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)
2729
{
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));
2935
}
3036
}
3137

@@ -36,32 +42,26 @@ public void SaveDmxTimelineClips(string directory)
3642
System.IO.Directory.CreateDirectory(directory);
3743
}
3844

39-
var dmxTimelines = new List<DmxTimeline>(Timelines.Count);
45+
var clip = new AnimationClip { name = "ArtNetDmx" };
4046
foreach (var timelineUniverse in Timelines)
4147
{
4248
var universe = timelineUniverse.Universe;
4349
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++)
4852
{
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+
}
5356
}
54-
55-
var dmxTimelineAsset = ScriptableObject.CreateInstance<DmxTimelineSetting>();
56-
dmxTimelineAsset.DmxTimelines = dmxTimelines;
57-
SaveAsset(dmxTimelineAsset, directory, "DmxTimeline.asset");
57+
SaveAsset(clip, directory, "ArtNetDmx.anim");
5858

5959
AssetDatabase.Refresh();
6060
}
6161

62-
public List<(int time, DmxPacket packet)> ToDmxPackets()
62+
public List<UniverseData> ToUniverseData()
6363
{
64-
return Timelines.SelectMany(x => x.ToDmxPackets()).OrderBy(x => x.time).ToList();
64+
return Timelines.SelectMany(x => x.ToUniverseData()).OrderBy(x => x.Time).ToList();
6565
}
6666

6767
private static void SaveAsset<T>(T asset, string directory, string fileName) where T : UnityEngine.Object
@@ -77,16 +77,16 @@ public class TimelineUniverse
7777
public int Universe { get; }
7878
private List<DmxFrameData>[] ChannelDmxFrameData { get; }
7979

80-
public TimelineUniverse(int universe, IReadOnlyCollection<(int time, DmxPacket packet)> packets)
80+
public TimelineUniverse(int groupKey, IReadOnlyCollection<UniverseData> universeData)
8181
{
82-
Universe = universe;
82+
Universe = groupKey;
8383
ChannelDmxFrameData = new List<DmxFrameData>[512];
8484

8585
for (var i = 0; i < ChannelDmxFrameData.Length; i++)
8686
{
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();
9090
}
9191
}
9292

@@ -110,17 +110,17 @@ public TimelineUniverse(int universe, AnimationClip clip)
110110
}
111111
}
112112

113-
public IEnumerable<int> AllFrameTimes()
113+
public IEnumerable<float> AllFrameTimes()
114114
{
115-
return ChannelDmxFrameData.SelectMany(x => x.Select(frameData => frameData.Millisecond)).Distinct();
115+
return ChannelDmxFrameData.SelectMany(x => x.Select(frameData => frameData.Time)).Distinct();
116116
}
117117

118-
public byte FrameValue(int channel, int time)
118+
public byte FrameValue(int channel, float time)
119119
{
120120
var dmxFrameData = ChannelDmxFrameData[channel];
121121

122122
// 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)))
124124
{
125125
return frameData.Value;
126126
}
@@ -129,8 +129,8 @@ public byte FrameValue(int channel, int time)
129129
if (dmxFrameData.Count == 0) return 0;
130130

131131
// 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;
134134

135135
// return the estimated value from frames around the specified time.
136136

@@ -139,7 +139,7 @@ public byte FrameValue(int channel, int time)
139139
var next = dmxFrameData[0];
140140
foreach (var frameData in dmxFrameData)
141141
{
142-
if (frameData.Millisecond > time)
142+
if (frameData.Time > time)
143143
{
144144
next = frameData;
145145
break;
@@ -150,34 +150,18 @@ public byte FrameValue(int channel, int time)
150150

151151
// Calculate the estimated value
152152
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;
155155
return (byte) (prev.Value + (prevDiff * timeDiff / prevDiffTime));
156156
}
157157

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()
175159
{
176160
var curves = new AnimationCurve[ChannelDmxFrameData.Length];
177161
for (var i = 0; i < ChannelDmxFrameData.Length; i++)
178162
{
179163
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();
181165
curves[i] = new AnimationCurve(keyframes);
182166
}
183167

@@ -217,16 +201,15 @@ private static bool IsOmittedFrame(
217201
{
218202
var prevDiff = current.Value - prev.Value;
219203
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;
222206

223-
return Math.Abs((float) prevDiff / prevDiffTime - (float) nextDiff / nextDiffTime) <= tolerance;
207+
return Math.Abs(prevDiff / prevDiffTime - nextDiff / nextDiffTime) <= tolerance;
224208
}
225209

226-
public IEnumerable<(int time, DmxPacket packet)> ToDmxPackets()
210+
public IEnumerable<UniverseData> ToUniverseData()
227211
{
228-
byte sequence = 0;
229-
var packets = new List<(int time, DmxPacket packet)>();
212+
var universeData = new List<UniverseData>();
230213
var allFrameTimes = AllFrameTimes().OrderBy(x => x).ToList();
231214

232215
foreach (var time in allFrameTimes)
@@ -237,30 +220,21 @@ private static bool IsOmittedFrame(
237220
dmx[i] = FrameValue(i, time);
238221
}
239222

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));
250224
}
251225

252-
return packets;
226+
return universeData;
253227
}
254228
}
255229

256230
public struct DmxFrameData
257231
{
258-
public int Millisecond { get; }
232+
public float Time { get; }
259233
public byte Value { get; }
260234

261-
public DmxFrameData(int millisecond, byte value)
235+
public DmxFrameData(float time, byte value)
262236
{
263-
Millisecond = millisecond;
237+
Time = time;
264238
Value = value;
265239
}
266240
}

0 commit comments

Comments
 (0)