[add] Added ScheduledControllerInterface.
This commit is contained in:
parent
fbc326ea96
commit
2183b74ee7
62
sjplayer/src/sjplayer/ScheduledControllerInterface.d
Normal file
62
sjplayer/src/sjplayer/ScheduledControllerInterface.d
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/// License: MIT
|
||||||
|
module sjplayer.ScheduledControllerInterface;
|
||||||
|
|
||||||
|
import std.algorithm,
|
||||||
|
std.array;
|
||||||
|
|
||||||
|
import sjscript;
|
||||||
|
|
||||||
|
import sjplayer.util.compare;
|
||||||
|
|
||||||
|
///
|
||||||
|
interface ScheduledControllerInterface {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
void Operate(float time);
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
abstract class AbstractScheduledController : ScheduledControllerInterface {
|
||||||
|
public:
|
||||||
|
/// The operations must be sorted.
|
||||||
|
this(in ParametersBlock[] operations) {
|
||||||
|
operations_ = operations;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void Operate(float time) {
|
||||||
|
scope(exit) last_operation_time_ = time;
|
||||||
|
|
||||||
|
if (next_operation_index_ >= 1) {
|
||||||
|
assert(next_operation_index_ <= operations_.length);
|
||||||
|
|
||||||
|
const last_operation = &operations_[next_operation_index_-1];
|
||||||
|
if (IsTimeInPeriod(time, last_operation.period)) {
|
||||||
|
ProcessOperation(*last_operation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FinishOperation(*last_operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next_operation_index_ >= operations_.length) return;
|
||||||
|
|
||||||
|
const next_operation = &operations_[next_operation_index_];
|
||||||
|
if (IsTimeInPeriod(time, next_operation.period)) {
|
||||||
|
PrepareOperation(*next_operation);
|
||||||
|
++next_operation_index_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
abstract void PrepareOperation(ref in ParametersBlock params);
|
||||||
|
|
||||||
|
abstract void ProcessOperation(ref in ParametersBlock params);
|
||||||
|
|
||||||
|
abstract void FinishOperation(ref in ParametersBlock params);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ParametersBlock[] operations_;
|
||||||
|
|
||||||
|
float last_operation_time_ = -1;
|
||||||
|
|
||||||
|
size_t next_operation_index_;
|
||||||
|
}
|
14
sjplayer/src/sjplayer/util/compare.d
Normal file
14
sjplayer/src/sjplayer/util/compare.d
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/// License: MIT
|
||||||
|
module sjplayer.util.compare;
|
||||||
|
|
||||||
|
import sjscript;
|
||||||
|
|
||||||
|
///
|
||||||
|
bool IsTimeInPeriod(float time, in Period period) {
|
||||||
|
return period.start <= time && time < period.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
bool IsPeriodIntersectedToPeriod(in Period p1, in Period p2) {
|
||||||
|
return p1.start < p2.end && p2.start < p1.end;
|
||||||
|
}
|
Reference in New Issue
Block a user