Smoothing Update

This commit is contained in:
Josef 2025-01-16 08:20:32 +01:00
parent 3ca59f8dab
commit 31704452be
16 changed files with 1013 additions and 55 deletions

View File

@ -0,0 +1,57 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class DelayedList : Action
{
[Export]
public float durationInbetween = 0.1f;
[Export]
public float growDuration = 0.0f;
[Export]
public TimeLine timeLine;
[Export]
public Action[] actions;
/** <summary for="field triggerDirectChildren">Whether to execute Action child nodes</summary>*/
[Export]
public bool triggerDirectChildren = true;
protected override void _OnTrigger()
{
var list = new List<Action>();
list.AddRange( actions );
if ( triggerDirectChildren )
{
list.AddRange( Nodes.GetDirectChildren<Action>( this ) );
}
var offset = 0f;
var grow = 0f;
for ( int i = 0; i < list.Count; i++ )
{
TimeLineScheduler.ScheduleEventIn( timeLine, offset,
id =>
{
Action.Trigger( list[ i ] );
}
);
grow += growDuration;
offset += durationInbetween + grow;
}
}
}
}

View File

@ -0,0 +1,57 @@
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class Repeat : Action
{
[Export]
public float duration;
[Export]
public int numRepeats;
[Export]
public TimeLine timeLine;
[Export]
public Action action;
[Export]
public Action onBeforeFirst;
[Export]
public Action onAfterLast;
protected override void _OnTrigger()
{
for ( int i = 0; i < numRepeats; i++ )
{
TimeLineScheduler.ScheduleEventIn( timeLine, i * duration,
id =>
{
if ( i == 0 )
{
Action.Trigger( onBeforeFirst );
}
Action.Trigger( action );
if ( i == ( numRepeats - 1 ) )
{
Action.Trigger( onAfterLast );
}
}
);
}
}
}
}

View File

@ -0,0 +1,73 @@
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class TimeLooper : Node
{
bool _active = false;
[Export]
public bool active
{
get => _active;
set
{
SetActive( value );
}
}
[Export]
public float duration;
[Export]
public float offset;
[Export]
public TimeLine timeLine;
[Export]
public Action action;
int _eventID = -1;
void SetActive( bool active )
{
if ( active == _active || Engine.IsEditorHint() )
{
return;
}
_active = active;
if ( _active )
{
if ( _eventID != -1 )
{
TimeLineScheduler.RemoveEvent( timeLine, _eventID );
return;
}
_eventID = TimeLineScheduler.ScheduleLoopEvent( timeLine, duration, offset, id => Action.Trigger( action ) );
}
else
{
if ( _eventID == -1 )
{
return;
}
TimeLineScheduler.RemoveEvent( timeLine, _eventID );
_eventID = -1;
}
}
}
}

View File

@ -43,11 +43,12 @@ namespace Rokojori
if ( positionSmoothing != null && positionSmoothing is FrameSmoothing fra )
{
if ( _lastFrames != fra.frames )
{
_lastFrames = fra.frames;
var coefficient = fra.GetCoefficientForFrames( fra.frames );
var coefficient = FrameSmoothing.GetCoefficientForFrames( fra.frames );
var framesOn60hz = fra.frames * ( 1f / 60f );

View File

@ -22,5 +22,32 @@ namespace Rokojori
exp.coefficient = coefficient;
return exp.ComputeDuration();
}
public static float ComputeCoefficientForFrames( int numFrames, float treshold = 1f/60f * 0.02f )
{
var lowDurationCoefficient = 500f;
var highDurationCoefficient = 0.1f;
if ( numFrames < 1 )
{
return lowDurationCoefficient;
}
var framesDuration = numFrames * 1/60f;
var minMaxSearch = new MinMaxSearch<float>(
( a, b, t ) => Mathf.Lerp( a, b, t ),
( c ) => ExpSmoothing.GetDurationForCoefficient( c )
);
var coefficient = minMaxSearch.Find( framesDuration, lowDurationCoefficient, highDurationCoefficient, treshold );
return coefficient;
}
}
}

View File

@ -11,10 +11,10 @@ namespace Rokojori
[Export( PropertyHint.Range, "0,600")]
public int frames = 10;
static Dictionary<int,float> _framesToCoefficient = new Dictionary<int, float>();
protected override float _ComputeInterpolationAmount( float delta )
{
frames = Mathf.Clamp( frames, 0, 600 );
if ( frames <= 0 )
{
return 1;
@ -24,43 +24,10 @@ namespace Rokojori
return 1f - Mathf.Exp( -coefficient * delta );
}
public float GetCoefficientForFrames( int frames )
public static float GetCoefficientForFrames( int frames )
{
if ( ! _framesToCoefficient.ContainsKey( frames ) )
{
_framesToCoefficient[ frames ] = ComputeCoefficientForFrames( frames );
}
return _framesToCoefficient[ frames ];
return FrameSmoothingTable.Get( frames );
}
static float ComputeCoefficientForFrames( int numFrames, float treshold = 1f/60f * 0.1f )
{
var framesDuration = numFrames * 1/60f;
var minMaxSearch = new MinMaxSearch<float>(
( a, b, t ) => Mathf.Lerp( a, b, t ),
( c ) => ExpSmoothing.GetDurationForCoefficient( c )
);
var lowDurationCoefficient = 100000f;
var highDurationCoefficient = 0.1f;
RJLog.Log( "Finding coefficient for frames", numFrames, ">>", framesDuration, "s" );
var coefficient = minMaxSearch.Find( framesDuration, lowDurationCoefficient, highDurationCoefficient, treshold );
RJLog.Log( "Found coefficient:", coefficient, ">> duration", ExpSmoothing.GetDurationForCoefficient( coefficient )._FF(), "s" );
return coefficient;
}
}
}

View File

@ -0,0 +1,633 @@
using System.Collections;
using System.Collections.Generic;
using Godot;
namespace Rokojori
{
public class FrameSmoothingTable
{
public const int num = 601;
public static float Get( int key )
{
return data[ key ];
}
public static void ComputeAndSaveTable( string path )
{
var computed = new float[ FrameSmoothingTable.num ];
for ( int i = 0; i < num; i++ )
{
computed[ i ] = ExpSmoothing.ComputeCoefficientForFrames( i );
}
FilesSync.SaveUTF8( path, Lists.Join( Lists.From( computed ), "f,\n" ) );
}
static readonly float[] data = new float[]
{
500f,
283.581298828125f,
139.73373413085938f,
92.77377319335938f,
69.44607543945312f,
55.49477767944336f,
46.21171569824219f,
39.58964157104492f,
34.627803802490234f,
30.771270751953125f,
27.687593460083008f,
25.16560173034668f,
23.06490135192871f,
21.287748336791992f,
19.7650146484375f,
18.445554733276367f,
17.291311264038086f,
16.27288246154785f,
15.367767333984375f,
14.558114051818848f,
13.829330444335938f,
13.170221328735352f,
12.57108211517334f,
12.024028778076172f,
11.522516250610352f,
11.061280250549316f,
10.63553524017334f,
10.241303443908691f,
9.87530517578125f,
9.534504890441895f,
9.216452598571777f,
8.918947219848633f,
8.640054702758789f,
8.378063201904297f,
8.131572723388672f,
7.899065971374512f,
7.679544448852539f,
7.471868515014648f,
7.275096893310547f,
7.088548183441162f,
6.911216735839844f,
6.7425761222839355f,
6.58193302154541f,
6.428795337677002f,
6.282650947570801f,
6.1429643630981445f,
6.009374618530273f,
5.881429195404053f,
5.758898735046387f,
5.641271591186523f,
5.528425216674805f,
5.41996431350708f,
5.3156914710998535f,
5.215364456176758f,
5.118772029876709f,
5.0256500244140625f,
4.935863971710205f,
4.849242210388184f,
4.765618801116943f,
4.684786319732666f,
4.6067047119140625f,
4.5311479568481445f,
4.458031177520752f,
4.387297630310059f,
4.3186798095703125f,
4.252230644226074f,
4.18775749206543f,
4.1252570152282715f,
4.064601898193359f,
4.005623817443848f,
3.948420763015747f,
3.8927950859069824f,
3.8386731147766113f,
3.7860772609710693f,
3.7349131107330322f,
3.6851160526275635f,
3.636634349822998f,
3.589371681213379f,
3.5433261394500732f,
3.4984500408172607f,
3.4547362327575684f,
3.41206955909729f,
3.3704464435577393f,
3.329827070236206f,
3.2901761531829834f,
3.251462697982788f,
3.213653802871704f,
3.176679849624634f,
3.1405816078186035f,
3.105264902114868f,
3.070765256881714f,
3.0370264053344727f,
3.003992795944214f,
2.9717040061950684f,
2.940070390701294f,
2.9091360569000244f,
2.8788161277770996f,
2.8491201400756836f,
2.820035696029663f,
2.791569709777832f,
2.763646364212036f,
2.7362406253814697f,
2.709437608718872f,
2.6831271648406982f,
2.6572930812835693f,
2.6320114135742188f,
2.6071770191192627f,
2.582808494567871f,
2.5588653087615967f,
2.5353894233703613f,
2.512341022491455f,
2.489710807800293f,
2.4674808979034424f,
2.445652723312378f,
2.4241487979888916f,
2.403071403503418f,
2.382392168045044f,
2.3620100021362305f,
2.3419981002807617f,
2.3223023414611816f,
2.3029582500457764f,
2.2839038372039795f,
2.265169858932495f,
2.2467894554138184f,
2.228628396987915f,
2.210813045501709f,
2.1932532787323f,
2.1759724617004395f,
2.1590123176574707f,
2.142235279083252f,
2.125772714614868f,
2.109534740447998f,
2.0935709476470947f,
2.077817678451538f,
2.0623042583465576f,
2.047018051147461f,
2.0319600105285645f,
2.0171475410461426f,
2.00252366065979f,
1.9881082773208618f,
1.9739007949829102f,
1.9598971605300903f,
1.9460855722427368f,
1.932471752166748f,
1.9190549850463867f,
1.905813455581665f,
1.8927764892578125f,
1.8798773288726807f,
1.8671958446502686f,
1.8546583652496338f,
1.8422939777374268f,
1.8300729990005493f,
1.8180501461029053f,
1.8061472177505493f,
1.794433355331421f,
1.7828596830368042f,
1.771410346031189f,
1.7601466178894043f,
1.7490057945251465f,
1.7379857301712036f,
1.7271277904510498f,
1.7163945436477661f,
1.7058008909225464f,
1.6953409910202026f,
1.685006022453308f,
1.6747899055480957f,
1.6646863222122192f,
1.6547212600708008f,
1.6448748111724854f,
1.63514244556427f,
1.6255245208740234f,
1.6160211563110352f,
1.606610894203186f,
1.5973433256149292f,
1.5881503820419312f,
1.5790756940841675f,
1.570091724395752f,
1.5612257719039917f,
1.5524506568908691f,
1.5437687635421753f,
1.5351957082748413f,
1.5267354249954224f,
1.5183507204055786f,
1.510025143623352f,
1.5018233060836792f,
1.493721842765808f,
1.4856828451156616f,
1.4777395725250244f,
1.4698690176010132f,
1.462095022201538f,
1.4544039964675903f,
1.4467787742614746f,
1.4392509460449219f,
1.431795358657837f,
1.4244188070297241f,
1.4171051979064941f,
1.409865140914917f,
1.4027140140533447f,
1.3956362009048462f,
1.388612985610962f,
1.3816556930541992f,
1.3748058080673218f,
1.3679734468460083f,
1.3612393140792847f,
1.3545730113983154f,
1.3479712009429932f,
1.3414026498794556f,
1.334961175918579f,
1.3285306692123413f,
1.3221654891967773f,
1.3158795833587646f,
1.3096164464950562f,
1.303462028503418f,
1.297347068786621f,
1.291259765625f,
1.2852731943130493f,
1.2793049812316895f,
1.2734116315841675f,
1.2675613164901733f,
1.2617697715759277f,
1.2560545206069946f,
1.2503502368927002f,
1.2447389364242554f,
1.2391352653503418f,
1.233640432357788f,
1.228132724761963f,
1.2227063179016113f,
1.2173126935958862f,
1.2119815349578857f,
1.2066696882247925f,
1.2014259099960327f,
1.1962333917617798f,
1.19107186794281f,
1.1859670877456665f,
1.1808918714523315f,
1.1758713722229004f,
1.1708842515945435f,
1.165951132774353f,
1.1610461473464966f,
1.1561956405639648f,
1.1513667106628418f,
1.14658522605896f,
1.1418571472167969f,
1.1371469497680664f,
1.132511854171753f,
1.1278595924377441f,
1.1233044862747192f,
1.1187365055084229f,
1.114235520362854f,
1.1097650527954102f,
1.1053249835968018f,
1.1008992195129395f,
1.096550464630127f,
1.0922147035598755f,
1.0879191160202026f,
1.0836459398269653f,
1.0793945789337158f,
1.075201392173767f,
1.0710294246673584f,
1.0668925046920776f,
1.0627957582473755f,
1.0587204694747925f,
1.0546735525131226f,
1.0506591796875f,
1.0466867685317993f,
1.042757511138916f,
1.0388169288635254f,
1.0349215269088745f,
1.0310591459274292f,
1.0272457599639893f,
1.0234252214431763f,
1.019643783569336f,
1.015916347503662f,
1.0121873617172241f,
1.0084819793701172f,
1.0048153400421143f,
1.0011717081069946f,
0.9975594282150269f,
0.9939855337142944f,
0.9903967976570129f,
0.9868771433830261f,
0.9833724498748779f,
0.9798818826675415f,
0.9764040112495422f,
0.9729690551757812f,
0.9695543050765991f,
0.9661747813224792f,
0.9627928733825684f,
0.9594693183898926f,
0.9561452269554138f,
0.9528394341468811f,
0.9495774507522583f,
0.946311354637146f,
0.9431012272834778f,
0.9398893117904663f,
0.9366958737373352f,
0.933527946472168f,
0.9303995370864868f,
0.9272783994674683f,
0.9241516590118408f,
0.9210768342018127f,
0.9180124998092651f,
0.9149739146232605f,
0.9119710922241211f,
0.9089577198028564f,
0.9059733748435974f,
0.903017520904541f,
0.9000647664070129f,
0.8971512317657471f,
0.8942551016807556f,
0.8913599848747253f,
0.8884860873222351f,
0.8856471180915833f,
0.8828186392784119f,
0.880012035369873f,
0.8772291541099548f,
0.8744516372680664f,
0.8716967701911926f,
0.8689366579055786f,
0.8662132620811462f,
0.8635026216506958f,
0.860801100730896f,
0.858134925365448f,
0.8554983735084534f,
0.8528401255607605f,
0.8502227663993835f,
0.8476150035858154f,
0.8450098633766174f,
0.8424324989318848f,
0.8398773074150085f,
0.837332010269165f,
0.8348090052604675f,
0.8322899341583252f,
0.8297901153564453f,
0.8272949457168579f,
0.8248292803764343f,
0.8223952651023865f,
0.8199321627616882f,
0.8175209164619446f,
0.8151203393936157f,
0.8127100467681885f,
0.8103369474411011f,
0.8079510927200317f,
0.8055998086929321f,
0.8032541275024414f,
0.8009384870529175f,
0.7986142039299011f,
0.7963138222694397f,
0.794023871421814f,
0.7917568683624268f,
0.7894957065582275f,
0.7872359752655029f,
0.7850046753883362f,
0.7827632427215576f,
0.780563235282898f,
0.7783754467964172f,
0.7761781811714172f,
0.7739938497543335f,
0.7718440890312195f,
0.7696950435638428f,
0.7675509452819824f,
0.7654231190681458f,
0.7633078694343567f,
0.7612106800079346f,
0.7591174244880676f,
0.7570306062698364f,
0.7549625039100647f,
0.7529008984565735f,
0.7508677244186401f,
0.7488330602645874f,
0.7467980980873108f,
0.7447925806045532f,
0.74278724193573f,
0.7408173680305481f,
0.7388277649879456f,
0.7368583679199219f,
0.7348807454109192f,
0.7329365015029907f,
0.7310168743133545f,
0.7290605902671814f,
0.7271442413330078f,
0.7252537608146667f,
0.723365068435669f,
0.7214744687080383f,
0.7195754647254944f,
0.717719554901123f,
0.7158574461936951f,
0.713990330696106f,
0.712158203125f,
0.7103239893913269f,
0.7085238099098206f,
0.7066835165023804f,
0.7048863768577576f,
0.703105628490448f,
0.7013306617736816f,
0.6995511651039124f,
0.6977716684341431f,
0.6960317492485046f,
0.6942790746688843f,
0.6925272941589355f,
0.6907827854156494f,
0.689068615436554f,
0.687347412109375f,
0.6856591105461121f,
0.683970034122467f,
0.682276725769043f,
0.6805812120437622f,
0.6789281964302063f,
0.6772623658180237f,
0.6756013631820679f,
0.6739364862442017f,
0.6722993850708008f,
0.6706674098968506f,
0.6690364480018616f,
0.6674287915229797f,
0.6658235192298889f,
0.6642293334007263f,
0.6626189351081848f,
0.6610497236251831f,
0.6594691276550293f,
0.6578971147537231f,
0.656342625617981f,
0.6547721028327942f,
0.6532281041145325f,
0.6517037749290466f,
0.6501580476760864f,
0.6486419439315796f,
0.6471200585365295f,
0.6455984711647034f,
0.6440840363502502f,
0.6425923109054565f,
0.6411044597625732f,
0.6396147012710571f,
0.6381545066833496f,
0.6366636753082275f,
0.6352079510688782f,
0.6337451338768005f,
0.6323150396347046f,
0.6308498382568359f,
0.6294164061546326f,
0.6279890537261963f,
0.6265745759010315f,
0.6251498460769653f,
0.6237500905990601f,
0.6223452091217041f,
0.6209344267845154f,
0.6195322275161743f,
0.6181548833847046f,
0.6167780756950378f,
0.6154120564460754f,
0.6140302419662476f,
0.6126852035522461f,
0.6113117337226868f,
0.6099634766578674f,
0.6086242198944092f,
0.6072999835014343f,
0.6059572696685791f,
0.6046338677406311f,
0.6033122539520264f,
0.6020045876502991f,
0.6006863713264465f,
0.5994002223014832f,
0.5980745553970337f,
0.5967887043952942f,
0.5955021977424622f,
0.5942328572273254f,
0.5929514765739441f,
0.5916818976402283f,
0.5904273390769958f,
0.5891685485839844f,
0.5879052877426147f,
0.5866508483886719f,
0.5854105949401855f,
0.5841827392578125f,
0.5829448103904724f,
0.5817262530326843f,
0.5804857015609741f,
0.5792888402938843f,
0.5780552625656128f,
0.5768483877182007f,
0.5756462216377258f,
0.5744789242744446f,
0.5732737183570862f,
0.5720958113670349f,
0.5708903074264526f,
0.5697146058082581f,
0.5685422420501709f,
0.5673736333847046f,
0.5662209391593933f,
0.5650529861450195f,
0.5639082789421082f,
0.5627579092979431f,
0.5616170167922974f,
0.5604658722877502f,
0.5593448281288147f,
0.558205246925354f,
0.5570909976959229f,
0.5559751987457275f,
0.5548509359359741f,
0.5537335872650146f,
0.552649974822998f,
0.5515282154083252f,
0.5504438877105713f,
0.5493456721305847f,
0.5482402443885803f,
0.5471789240837097f,
0.5460887551307678f,
0.5449970960617065f,
0.5439370274543762f,
0.5428534150123596f,
0.5417964458465576f,
0.5407297015190125f,
0.5396756529808044f,
0.538644552230835f,
0.5375834703445435f,
0.5365545749664307f,
0.5354890823364258f,
0.5344588160514832f,
0.53342604637146f,
0.5324010848999023f,
0.5313923954963684f,
0.5303633809089661f,
0.5293594002723694f,
0.5283269286155701f,
0.5273261070251465f,
0.5263199210166931f,
0.5253220200538635f,
0.5243186950683594f,
0.5233476758003235f,
0.5223479866981506f,
0.5213702917098999f,
0.5203649401664734f,
0.5193970799446106f,
0.5184254050254822f,
0.5174447298049927f,
0.516491711139679f,
0.5155284404754639f,
0.514551043510437f,
0.5136093497276306f,
0.5126588344573975f,
0.5117171406745911f,
0.5107676386833191f,
0.5098287463188171f,
0.5088873505592346f,
0.5079407095909119f,
0.5070165395736694f,
0.5060779452323914f,
0.5051640868186951f,
0.5042357444763184f,
0.503326952457428f,
0.5024080872535706f,
0.5014938712120056f,
0.5005781054496765f,
0.49968376755714417f,
0.49877265095710754f,
0.4978860020637512f,
0.49696969985961914f,
0.4960835874080658f,
0.49519139528274536f,
0.4943094551563263f,
0.4934454560279846f,
0.4925616383552551f,
0.4916682839393616f,
0.4908157289028168f,
0.4899247884750366f,
0.4890671372413635f,
0.48820558190345764f,
0.48733872175216675f,
0.4864858090877533f,
0.48562294244766235f,
0.4847657382488251f,
0.4839414954185486f,
0.4830806255340576f,
0.4822426438331604f,
0.48139166831970215f,
0.480558305978775f,
0.47972649335861206f,
0.4788912832736969f,
0.4780619144439697f,
0.47723937034606934f,
0.47642940282821655f,
0.4756017029285431f,
0.47477471828460693f,
0.4739650785923004f,
0.4731660485267639f,
0.4723406136035919f,
0.4715345501899719f,
0.47073766589164734f,
0.4699311852455139f,
0.46913012862205505f,
0.4683624804019928f,
0.46754929423332214f,
0.46675416827201843f,
0.4659850001335144f,
0.4651834964752197f,
0.4644103944301605f,
0.46363675594329834f,
0.46285971999168396f,
0.4620875120162964f,
0.4613165557384491f,
0.4605373442173004f
};
}
}

View File

@ -0,0 +1,30 @@
using System.Collections;
using System.Collections.Generic;
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class FrameSmoothingTableGenerator:Node
{
[Export]
public string path;
[Export]
public bool compute
{
get { return false; }
set
{
if ( ! value )
{
return;
}
FrameSmoothingTable.ComputeAndSaveTable( path );
}
}
}
}

View File

@ -4,8 +4,6 @@ using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class Smoothing: Resource
{
float _currentFloat = 0;
@ -99,7 +97,7 @@ namespace Rokojori
return 0;
}
public virtual float ComputeDuration( float delta = 1f/240f, float tresholdValue = 0.05f )
public virtual float ComputeDuration( float delta = 1f/480f, float tresholdValue = 0.01f )
{
var cached = _currentFloat;

View File

@ -111,5 +111,23 @@ namespace Rokojori
return samples * OneSampleToBeats( bpm, sampleRate );
}
public static float GetNextLoopPosition( float position, float loopDuration, float loopOffset )
{
position -= loopOffset;
position = Mathf.CeilToInt( position / loopDuration ) * loopDuration;
return position + loopOffset;
}
public static float GetPreviousLoopPosition( float position, float loopDuration, float loopOffset )
{
position -= loopOffset;
position = Mathf.FloorToInt( position / loopDuration ) * loopDuration;
return position + loopOffset;
}
}
}

View File

@ -14,5 +14,19 @@ namespace Rokojori
public bool persistent;
public float position;
public bool wasInside = false;
public bool looping = false;
public float loopDuration = 0;
public float GetNextLoopPosition( float timelinePosition )
{
return MathAudio.GetNextLoopPosition( timelinePosition, loopDuration, position );
}
public float GetPreviousLoopPosition( float timelinePosition )
{
return MathAudio.GetPreviousLoopPosition( timelinePosition, loopDuration, position );
}
}
}

View File

@ -164,15 +164,25 @@ namespace Rokojori
return normalized;
}
public void ScheduleEvent( int timeLineIndex, float position, int callbackID, bool isPersistent )
{
var runner = _runners[ timeLineIndex ];
runner.ScheduleEvent( position, callbackID, isPersistent );
}
public void ScheduleLoopEvent( int timeLineIndex, float loopDuration, float loopOffset, int callbackID, bool isPersistent )
{
var runner = _runners[ timeLineIndex ];
runner.ScheduleLoopEvent( loopDuration, loopOffset, callbackID, isPersistent );
}
public void RemoveEvent( int timeLineIndex, int eventID )
{
var runner = _runners[ timeLineIndex ];
runner.RemoveEvent( eventID );
}
public void ScheduleSpan( int timeLineIndex, float start, float end, int callbackID, bool isPersistent )
{
var runner = _runners[ timeLineIndex ];

View File

@ -120,6 +120,13 @@ namespace Rokojori
void ProcessForward( TimeLineManager manager )
{
if ( requestedRemovals.Count > 0 )
{
requestedRemovals.Sort();
Lists.RemoveIncreasingSortedIndices( events, requestedRemovals );
requestedRemovals.Clear();
}
List<int> eventRemovals = null;
List<int> spanRemovals = null;
@ -130,9 +137,19 @@ namespace Rokojori
{
var eventPosition = events[ i ].position;
// 0 1 2 3 4 5
// Last 3, Position 4
//
if ( events[ i ].looping )
{
var next = events[ i ].GetNextLoopPosition( lastPosition );
var previous = events[ i ].GetPreviousLoopPosition( position );
if ( next != previous )
{
continue;
}
eventPosition = next;
}
if ( ! RangeDouble.ContainsExclusiveMax( lastPosition, position, eventPosition ) )
{
if ( events[ i ].wasInside )
@ -149,6 +166,13 @@ namespace Rokojori
"event:", eventPosition
);
// 0 1 2 3 4 5
// Last 3, Position 4
//
// manager.EmitSignal( TimeLineManager.SignalName.OnEvent, events[ i ].id );
manager.onEvent.DispatchEvent( events[ i ].id );
events[ i ].wasInside = true;
@ -222,6 +246,14 @@ namespace Rokojori
}
}
List<int> requestedRemovals = new List<int>();
public void RemoveEvent( int eventID )
{
requestedRemovals.Add( eventID );
}
public void ScheduleEvent( float position, int callbackID, bool isPersistent )
{
var tle = new TimeLineEvent();
@ -232,6 +264,18 @@ namespace Rokojori
events.Add( tle );
}
public void ScheduleLoopEvent( float loopDuration, float loopOffset, int callbackID, bool isPersistent )
{
var tle = new TimeLineEvent();
tle.position = loopOffset;
tle.looping = true;
tle.loopDuration = loopDuration;
tle.id = callbackID;
tle.persistent = isPersistent;
events.Add( tle );
}
public void ScheduleSpan( float start, float end, int callbackID, bool isPersistent )
{
var tse = new TimeLineSpan();

View File

@ -17,14 +17,21 @@ namespace Rokojori
return scheduler._ScheduleEventIn( timeLine, offset, action, persistent );
}
int _ScheduleEventIn( TimeLine timeLine, float offset, Action<int> action, bool persistent = false )
{
var tm = Unique<TimeLineManager>.Get();
var tIndex = tm.GetTimeLineIndex( timeLine );
var position = tm.GetPosition( tIndex ) + offset;
return _ScheduleEventAt( timeLine, position, action, persistent );
}
public static int ScheduleEventAt( TimeLine timeLine, float position, Action<int> action, bool persistent = false )
{
var scheduler = Unique<TimeLineScheduler>.Get();
return scheduler._ScheduleEventAt( timeLine, position, action, persistent );
}
int _ScheduleEventAt( TimeLine timeLine, float position, Action<int> action, bool persistent = false )
{
AttachListeners();
@ -36,12 +43,28 @@ namespace Rokojori
return id;
}
int _ScheduleEventIn( TimeLine timeLine, float offset, Action<int> action, bool persistent = false )
public static int ScheduleLoopEvent( TimeLine timeLine, float loopDuration, float loopOffset, Action<int> action, bool persistent = false )
{
var scheduler = Unique<TimeLineScheduler>.Get();
return scheduler._ScheduleLoopEvent( timeLine, loopDuration, loopOffset, action, persistent );
}
int _ScheduleLoopEvent( TimeLine timeLine, float loopDuration, float loopOffset, Action<int> action, bool persistent = false )
{
AttachListeners();
var tm = Unique<TimeLineManager>.Get();
var tIndex = tm.GetTimeLineIndex( timeLine );
var id = tm.CreateID();
_eventActions[ id ] = action;
tm.ScheduleLoopEvent( tIndex, loopDuration, loopOffset, id, persistent );
return id;
}
public static void RemoveEvent( TimeLine timeLine, int id )
{
var tm = Unique<TimeLineManager>.Get();
var tIndex = tm.GetTimeLineIndex( timeLine );
var position = tm.GetPosition( tIndex ) + offset;
return _ScheduleEventAt( timeLine, position, action, persistent );
tm.RemoveEvent( tIndex, id );
}

View File

@ -8,8 +8,9 @@ namespace Rokojori
{
public class Lists
public static class Lists
{
public static void Sort<T>( List<T> data, Func<T,float> getValue )
{
ValueSorter<T>.SortList( data, getValue );
@ -303,6 +304,11 @@ namespace Rokojori
}
/*public static string Join<T>( this List<T> list, string seperator = "," )
{
var sb = new StringBuilder();
}*/
public static string Join<T>( List<T> array, string seperator = ", " )
{