[add] Added CircleElementScheduledController.
This commit is contained in:
parent
ecbed62b80
commit
803b4132af
48
sjplayer/src/sjplayer/CircleElementScheduledController.d
Normal file
48
sjplayer/src/sjplayer/CircleElementScheduledController.d
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/// License: MIT
|
||||||
|
module sjplayer.CircleElementScheduledController;
|
||||||
|
|
||||||
|
import gl4d;
|
||||||
|
|
||||||
|
import sjscript;
|
||||||
|
|
||||||
|
import sjplayer.CircleElement,
|
||||||
|
sjplayer.ScheduledControllerInterface,
|
||||||
|
sjplayer.VarStoreInterface;
|
||||||
|
|
||||||
|
///
|
||||||
|
class CircleElementScheduledController :
|
||||||
|
AbstractScheduledControllerWithOperationImpl {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
this(
|
||||||
|
CircleElement element,
|
||||||
|
in VarStoreInterface varstore,
|
||||||
|
in ParametersBlock[] operations) {
|
||||||
|
super(varstore, operations);
|
||||||
|
element_ = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
override void PrepareOperation(ref in ParametersBlock params) {
|
||||||
|
element_.alive = true;
|
||||||
|
element_.damage = 0;
|
||||||
|
element_.nearness_coe = 0;
|
||||||
|
element_.matrix = mat3.identity;
|
||||||
|
element_.weight = 1;
|
||||||
|
element_.smooth = 0;
|
||||||
|
element_.color = vec4(1, 1, 1, 1);
|
||||||
|
}
|
||||||
|
override void FinalizeOperation(ref in ParametersBlock params) {
|
||||||
|
element_.alive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
override float GetVariable(string name) const {
|
||||||
|
throw new Exception("not implemented"); // TODO:
|
||||||
|
}
|
||||||
|
override void SetParameter(ref in Parameter param) {
|
||||||
|
throw new Exception("not implemented"); // TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
CircleElement element_;
|
||||||
|
}
|
@ -2,11 +2,14 @@
|
|||||||
module sjplayer.ScheduledControllerInterface;
|
module sjplayer.ScheduledControllerInterface;
|
||||||
|
|
||||||
import std.algorithm,
|
import std.algorithm,
|
||||||
std.array;
|
std.array,
|
||||||
|
std.exception,
|
||||||
|
std.format;
|
||||||
|
|
||||||
import sjscript;
|
import sjscript;
|
||||||
|
|
||||||
import sjplayer.util.compare;
|
import sjplayer.VarStoreInterface,
|
||||||
|
sjplayer.util.compare;
|
||||||
|
|
||||||
///
|
///
|
||||||
interface ScheduledControllerInterface {
|
interface ScheduledControllerInterface {
|
||||||
@ -34,7 +37,7 @@ abstract class AbstractScheduledController : ScheduledControllerInterface {
|
|||||||
ProcessOperation(*last_operation);
|
ProcessOperation(*last_operation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FinishOperation(*last_operation);
|
FinalizeOperation(*last_operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next_operation_index_ >= operations_.length) return;
|
if (next_operation_index_ >= operations_.length) return;
|
||||||
@ -51,7 +54,7 @@ abstract class AbstractScheduledController : ScheduledControllerInterface {
|
|||||||
|
|
||||||
abstract void ProcessOperation(ref in ParametersBlock params);
|
abstract void ProcessOperation(ref in ParametersBlock params);
|
||||||
|
|
||||||
abstract void FinishOperation(ref in ParametersBlock params);
|
abstract void FinalizeOperation(ref in ParametersBlock params);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const ParametersBlock[] operations_;
|
const ParametersBlock[] operations_;
|
||||||
@ -60,3 +63,48 @@ abstract class AbstractScheduledController : ScheduledControllerInterface {
|
|||||||
|
|
||||||
size_t next_operation_index_;
|
size_t next_operation_index_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
abstract class AbstractScheduledControllerWithOperationImpl :
|
||||||
|
AbstractScheduledController {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
this(in VarStoreInterface varstore, in ParametersBlock[] operations) {
|
||||||
|
super(operations);
|
||||||
|
varstore_ = varstore;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static struct VarStore {
|
||||||
|
public:
|
||||||
|
float opIndex(string name) {
|
||||||
|
float result = void;
|
||||||
|
if (!this_.GetVariable(name).collectException(result)) return result;
|
||||||
|
if (!this_.varstore_[name] .collectException(result)) return result;
|
||||||
|
if (!this_.user_vars_[name] .collectException(result)) return result;
|
||||||
|
throw new Exception("unknown variable %s".format(name));
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
AbstractScheduledControllerWithOperationImpl this_;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void ProcessOperation(ref in ParametersBlock params) {
|
||||||
|
foreach (const ref param; params.parameters) {
|
||||||
|
if (param.name.length >= 2 && param.name[0..2] == "__") {
|
||||||
|
user_vars_[param.name[2..$]] =
|
||||||
|
param.rhs.CalculateExpression(VarStore(this));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SetParameter(param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract float GetVariable(string name) const;
|
||||||
|
|
||||||
|
abstract void SetParameter(ref in Parameter param);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const VarStoreInterface varstore_;
|
||||||
|
|
||||||
|
float[string] user_vars_;
|
||||||
|
}
|
||||||
|
@ -13,6 +13,7 @@ import sjscript.Token,
|
|||||||
public {
|
public {
|
||||||
import sjscript.Expression,
|
import sjscript.Expression,
|
||||||
sjscript.ParametersBlock,
|
sjscript.ParametersBlock,
|
||||||
|
sjscript.calculate,
|
||||||
sjscript.exception;
|
sjscript.exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user