4 #include <miniscript/miniscript/MiniScript.h>
15 using miniscript::miniscript::MiniScript;
22 const string MiniScriptVector2::CLASS_NAME =
"vec2";
23 const string MiniScriptVector2::TYPE_NAME =
"Vector2";
25 void MiniScriptVector2::registerMethods(MiniScript* miniScript)
const {
26 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
29 class ScriptMethodVec2:
public MiniScript::ScriptMethod {
31 MiniScript* miniScript {
nullptr };
32 MiniScript::ScriptVariableType TYPE_VECTOR2;
35 MiniScript* miniScript,
36 MiniScript::ScriptVariableType TYPE_VECTOR2
38 MiniScript::ScriptMethod(
40 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"x", .optional =
false, .reference =
false, .nullable =
false },
41 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"y", .optional =
false, .reference =
false, .nullable =
false }
45 miniScript(miniScript),
46 TYPE_VECTOR2(TYPE_VECTOR2) {
49 const string getMethodName()
override {
52 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
55 if (MiniScript::getFloatValue(argumentValues, 0, xValue,
false) ==
true &&
56 MiniScript::getFloatValue(argumentValues, 1, yValue,
false) ==
true) {
57 auto result =
Vector2(xValue, yValue);
58 returnValue.setType(TYPE_VECTOR2);
59 returnValue.setValue(&result);
61 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
62 miniScript->startErrorScript();
66 miniScript->registerMethod(
new ScriptMethodVec2(miniScript, TYPE_VECTOR2));
70 class ScriptMethodVec2ComputeLength:
public MiniScript::ScriptMethod {
72 MiniScript* miniScript {
nullptr };
73 MiniScript::ScriptVariableType TYPE_VECTOR2;
75 ScriptMethodVec2ComputeLength(
76 MiniScript* miniScript,
77 MiniScript::ScriptVariableType TYPE_VECTOR2
79 MiniScript::ScriptMethod(
81 { .type = TYPE_VECTOR2, .name =
"vec2", .optional =
false, .reference =
false, .nullable =
false }
83 MiniScript::ScriptVariableType::TYPE_FLOAT
85 miniScript(miniScript),
86 TYPE_VECTOR2(TYPE_VECTOR2) {
89 const string getMethodName()
override {
90 return "vec2.computeLength";
92 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
98 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
99 miniScript->startErrorScript();
103 miniScript->registerMethod(
new ScriptMethodVec2ComputeLength(miniScript, TYPE_VECTOR2));
107 class ScriptMethodVec2ComputeLengthSquared:
public MiniScript::ScriptMethod {
109 MiniScript* miniScript {
nullptr };
110 MiniScript::ScriptVariableType TYPE_VECTOR2;
112 ScriptMethodVec2ComputeLengthSquared(
113 MiniScript* miniScript,
114 MiniScript::ScriptVariableType TYPE_VECTOR2
116 MiniScript::ScriptMethod(
118 { .type = TYPE_VECTOR2, .name =
"vec2", .optional =
false, .reference =
false, .nullable =
false }
120 MiniScript::ScriptVariableType::TYPE_FLOAT
122 miniScript(miniScript),
123 TYPE_VECTOR2(TYPE_VECTOR2) {
126 const string getMethodName()
override {
127 return "vec2.computeLengthSquared";
129 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
134 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
135 miniScript->startErrorScript();
139 miniScript->registerMethod(
new ScriptMethodVec2ComputeLengthSquared(miniScript, TYPE_VECTOR2));
143 class ScriptMethodVec2ComputeDotProduct:
public MiniScript::ScriptMethod {
145 MiniScript* miniScript {
nullptr };
146 MiniScript::ScriptVariableType TYPE_VECTOR2;
148 ScriptMethodVec2ComputeDotProduct(
149 MiniScript* miniScript,
150 MiniScript::ScriptVariableType TYPE_VECTOR2
152 MiniScript::ScriptMethod(
154 { .type = TYPE_VECTOR2, .name =
"a", .optional =
false, .reference =
false, .nullable =
false },
155 { .type = TYPE_VECTOR2, .name =
"b", .optional =
false, .reference =
false, .nullable =
false }
157 MiniScript::ScriptVariableType::TYPE_FLOAT
159 miniScript(miniScript),
160 TYPE_VECTOR2(TYPE_VECTOR2) {
163 const string getMethodName()
override {
164 return "vec2.computeDotProduct";
166 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
171 returnValue.setValue(Vector2::computeDotProduct(a, b));
173 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
174 miniScript->startErrorScript();
178 miniScript->registerMethod(
new ScriptMethodVec2ComputeDotProduct(miniScript, TYPE_VECTOR2));
182 class ScriptMethodVec2Normalize:
public MiniScript::ScriptMethod {
184 MiniScript* miniScript {
nullptr };
185 MiniScript::ScriptVariableType TYPE_VECTOR2;
187 ScriptMethodVec2Normalize(
188 MiniScript* miniScript,
189 MiniScript::ScriptVariableType TYPE_VECTOR2
191 MiniScript::ScriptMethod(
193 { .type = TYPE_VECTOR2, .name =
"vec2", .optional =
false, .reference =
false, .nullable =
false },
197 miniScript(miniScript),
198 TYPE_VECTOR2(TYPE_VECTOR2) {
201 const string getMethodName()
override {
202 return "vec2.normalize";
204 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
209 returnValue.setType(TYPE_VECTOR2);
210 returnValue.setValue(&result);
212 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
213 miniScript->startErrorScript();
217 miniScript->registerMethod(
new ScriptMethodVec2Normalize(miniScript, TYPE_VECTOR2));
221 class ScriptMethodVec2GetX:
public MiniScript::ScriptMethod {
223 MiniScript* miniScript {
nullptr };
224 MiniScript::ScriptVariableType TYPE_VECTOR2;
226 ScriptMethodVec2GetX(
227 MiniScript* miniScript,
228 MiniScript::ScriptVariableType TYPE_VECTOR2
230 MiniScript::ScriptMethod(
232 { .type = TYPE_VECTOR2, .name =
"vec2", .optional =
false, .reference =
false, .nullable =
false },
234 MiniScript::ScriptVariableType::TYPE_FLOAT
236 miniScript(miniScript),
237 TYPE_VECTOR2(TYPE_VECTOR2) {
240 const string getMethodName()
override {
243 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
246 returnValue.setValue(vec2.
getX());
248 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
249 miniScript->startErrorScript();
253 miniScript->registerMethod(
new ScriptMethodVec2GetX(miniScript, TYPE_VECTOR2));
257 class ScriptMethodVec2GetY:
public MiniScript::ScriptMethod {
259 MiniScript* miniScript {
nullptr };
260 MiniScript::ScriptVariableType TYPE_VECTOR2;
262 ScriptMethodVec2GetY(
263 MiniScript* miniScript,
264 MiniScript::ScriptVariableType TYPE_VECTOR2
266 MiniScript::ScriptMethod(
268 { .type = TYPE_VECTOR2, .name =
"vec2", .optional =
false, .reference =
false, .nullable =
false },
270 MiniScript::ScriptVariableType::TYPE_FLOAT
272 miniScript(miniScript),
273 TYPE_VECTOR2(TYPE_VECTOR2) {
276 const string getMethodName()
override {
279 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
282 returnValue.setValue(vec2.
getY());
284 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
285 miniScript->startErrorScript();
289 miniScript->registerMethod(
new ScriptMethodVec2GetY(miniScript, TYPE_VECTOR2));
294 if (variable.getType() != getType())
return;
295 if (variable.getValuePtr() == 0ll)
return;
297 delete static_cast<Vector2*
>((
void*)variable.getValuePtr());
298 variable.setValuePtr(0ll);
302 if (variable.getType() != getType())
return;
306 vector2Value = *
static_cast<const Vector2*
>(value);
309 if (variable.getValuePtr() != 0ll) {
310 *
static_cast<Vector2*
>((
void*)variable.getValuePtr()) = vector2Value;
314 variable.setValuePtr((uint64_t)(
new Vector2(vector2Value)));
320 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
321 vector2Value = *
static_cast<Vector2*
>((
void*)from.getValuePtr());
324 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
325 to.setType(TYPE_VECTOR2);
326 *
static_cast<Vector2*
>((
void*)to.getValuePtr()) = vector2Value;
329 bool MiniScriptVector2::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
330 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
332 if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) ==
true) {
336 if (argumentValues[0].getType() == TYPE_VECTOR2) {
339 if (MiniScript::getFloatValue(argumentValues, 0, f,
false) ==
true) {
342 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
343 miniScript->startErrorScript();
349 if (argumentValues[1].getType() == TYPE_VECTOR2) {
352 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
355 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
356 miniScript->startErrorScript();
362 returnValue.setType(TYPE_VECTOR2);
363 returnValue.setValue(&result);
371 bool MiniScriptVector2::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
372 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
374 if (argumentValues[0].getType() == TYPE_VECTOR2) {
381 if (argumentValues[1].getType() == TYPE_VECTOR2 &&
385 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
388 Console::println(
"div(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"div"));
389 miniScript->startErrorScript();
395 returnValue.setType(TYPE_VECTOR2);
396 returnValue.setValue(&result);
404 bool MiniScriptVector2::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
405 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
407 if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) ==
true) {
414 returnValue.setType(TYPE_VECTOR2);
415 returnValue.setValue(&result);
419 Console::println(
"add(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"add"));
420 miniScript->startErrorScript();
429 bool MiniScriptVector2::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
430 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(getType());
432 if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) ==
true) {
439 returnValue.setType(TYPE_VECTOR2);
440 returnValue.setValue(&result);
444 Console::println(
"sub(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"sub"));
445 miniScript->startErrorScript();
465 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
466 vector2Value = *
static_cast<Vector2*
>((
void*)variable.getValuePtr());
471 to_string(vector2Value.
getX()) +
", " +
472 to_string(vector2Value.
getY()) +
")";
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Vector2 & sub(float scalar)
Subtracts a scalar.
float computeLength() const
Vector2 & scale(const float scalar)
Scales by scalar.
Vector2 clone() const
Clones this vector2.
Vector2 & normalize()
Normalizes this vector2.
Vector2 & add(float scalar)
Adds a scalar.
float computeLengthSquared() const
static void println()
Print new line to console.
static bool isInfinite(float value)
Check if float is infinite.
static bool isNaN(float value)
Check if float is not a number.
MiniScript Vector2 data type.
const string & getTypeAsString() const override
bool add(MiniScript *miniScript, const span< MiniScript::ScriptVariable > &argumentValues, MiniScript::ScriptVariable &returnValue, const MiniScript::ScriptStatement &statement) const override
bool sub(MiniScript *miniScript, const span< MiniScript::ScriptVariable > &argumentValues, MiniScript::ScriptVariable &returnValue, const MiniScript::ScriptStatement &statement) const override
static bool getVector2Value(MiniScript::ScriptVariableType TYPE_VECTOR2, const span< MiniScript::ScriptVariable > &arguments, int idx, Vector2 &value, bool optional=false)
Get vector2 value from given variable.
static const string TYPE_NAME
void copyScriptVariable(MiniScript::ScriptVariable &to, const MiniScript::ScriptVariable &from) const override
void unsetScriptVariableValue(MiniScript::ScriptVariable &variable) const override
bool div(MiniScript *miniScript, const span< MiniScript::ScriptVariable > &argumentValues, MiniScript::ScriptVariable &returnValue, const MiniScript::ScriptStatement &statement) const override
const string & getClassName() const override
bool mul(MiniScript *miniScript, const span< MiniScript::ScriptVariable > &argumentValues, MiniScript::ScriptVariable &returnValue, const MiniScript::ScriptStatement &statement) const override
const string getValueAsString(const MiniScript::ScriptVariable &variable) const override
static const string CLASS_NAME
void setScriptVariableValue(MiniScript::ScriptVariable &variable, const void *value) const override