@@ -64,6 +64,17 @@ public static extern int ConvertSecondsToTicksInternal(float seconds, int resolu
64
64
#endif
65
65
public static extern float InverseLerp ( float a , float b , float v ) ;
66
66
67
+ #if WINDOWS_BUILD || UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
68
+ [ DllImport ( "libRhythmGameUtilities.dll" , CallingConvention = CallingConvention . Cdecl ) ]
69
+ #elif MACOS_BUILD || UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
70
+ [ DllImport ( "libRhythmGameUtilities.dylib" , CallingConvention = CallingConvention . Cdecl ) ]
71
+ #elif LINUX_BUILD || UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX
72
+ [ DllImport ( "libRhythmGameUtilities.so" , CallingConvention = CallingConvention . Cdecl ) ]
73
+ #endif
74
+ public static extern IntPtr CalculateBeatBarsInternal ( int [ ] bpmChangesKeys ,
75
+ int [ ] bpmChangesValues , int bpmChangesSize , int resolution , int ts ,
76
+ bool includeHalfNotes , out int size ) ;
77
+
67
78
}
68
79
69
80
public static class Utilities
@@ -107,46 +118,21 @@ public static List<BeatBar> CalculateBeatBars(Dictionary<int, int> bpmChanges, i
107
118
{
108
119
var beatBars = new List < BeatBar > ( ) ;
109
120
110
- var keyValuePairs = GenerateAdjacentKeyPairs ( bpmChanges ) ;
121
+ var ptrArray = UtilitiesInternal . CalculateBeatBarsInternal ( bpmChanges . Keys . ToArray ( ) ,
122
+ bpmChanges . Values . ToArray ( ) , bpmChanges . Count , resolution , ts , includeHalfNotes ,
123
+ out var size ) ;
111
124
112
- foreach ( var ( startTick , endTick ) in keyValuePairs )
113
- {
114
- for ( var tick = startTick ; tick <= endTick ; tick += resolution )
115
- {
116
- beatBars . Add ( new BeatBar
117
- {
118
- Position = tick , BPM = bpmChanges [ startTick ] , TimeSignature = new [ ] { ts }
119
- } ) ;
120
-
121
- if ( includeHalfNotes && tick != endTick )
122
- {
123
- beatBars . Add ( new BeatBar
124
- {
125
- Position = tick + resolution / 2 ,
126
- BPM = bpmChanges [ startTick ] ,
127
- TimeSignature = new [ ] { ts }
128
- } ) ;
129
- }
130
- }
131
- }
125
+ var beatBarSize = Marshal . SizeOf ( typeof ( BeatBar ) ) ;
132
126
133
- return beatBars ;
134
- }
135
-
136
- public static List < Tuple < T , T > > GenerateAdjacentKeyPairs < T > ( Dictionary < T , T > dictionary )
137
- {
138
- var keys = dictionary . Keys . ToList ( ) ;
139
-
140
- keys . Sort ( ) ;
141
-
142
- var adjacentKeyPairs = new List < Tuple < T , T > > ( ) ;
143
-
144
- for ( var i = 0 ; i < keys . Count - 1 ; i += 1 )
127
+ for ( var i = 0 ; i < size ; i += 1 )
145
128
{
146
- adjacentKeyPairs . Add ( new Tuple < T , T > ( keys [ i ] , keys [ i + 1 ] ) ) ;
129
+ var beatBarSizePtr = new IntPtr ( ptrArray . ToInt64 ( ) + beatBarSize * i ) ;
130
+ var beatBar = Marshal . PtrToStructure < BeatBar > ( beatBarSizePtr ) ;
131
+
132
+ beatBars . Add ( beatBar ) ;
147
133
}
148
134
149
- return adjacentKeyPairs ;
135
+ return beatBars ;
150
136
}
151
137
152
138
}
0 commit comments