4 #include <miniscript/miniscript/MiniScript.h>
12 using miniscript::miniscript::MiniScript;
22 const string MiniScriptVector3::CLASS_NAME =
"vec3";
23 const string MiniScriptVector3::TYPE_NAME =
"Vector3";
25 void MiniScriptVector3::registerMethods(MiniScript* miniScript)
const {
26 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
29 class ScriptMethodVec3:
public MiniScript::ScriptMethod {
31 MiniScript* miniScript {
nullptr };
32 MiniScript::ScriptVariableType TYPE_VECTOR3;
35 MiniScript* miniScript,
36 MiniScript::ScriptVariableType TYPE_VECTOR3
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 },
42 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"z", .optional =
false, .reference =
false, .nullable =
false }
46 miniScript(miniScript),
47 TYPE_VECTOR3(TYPE_VECTOR3) {
50 const string getMethodName()
override {
53 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
58 if (MiniScript::getFloatValue(argumentValues, 0, xValue,
false) ==
true &&
59 MiniScript::getFloatValue(argumentValues, 1, yValue,
false) ==
true &&
60 MiniScript::getFloatValue(argumentValues, 2, zValue,
false) ==
true) {
61 auto result =
Vector3(xValue, yValue, zValue);
62 returnValue.setType(TYPE_VECTOR3);
63 returnValue.setValue(&result);
65 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
66 miniScript->startErrorScript();
70 miniScript->registerMethod(
new ScriptMethodVec3(miniScript, TYPE_VECTOR3));
74 class ScriptMethodVec3ComputeLength:
public MiniScript::ScriptMethod {
76 MiniScript* miniScript {
nullptr };
77 MiniScript::ScriptVariableType TYPE_VECTOR3;
79 ScriptMethodVec3ComputeLength(
80 MiniScript* miniScript,
81 MiniScript::ScriptVariableType TYPE_VECTOR3
83 MiniScript::ScriptMethod(
85 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false }
87 MiniScript::ScriptVariableType::TYPE_FLOAT
89 miniScript(miniScript),
90 TYPE_VECTOR3(TYPE_VECTOR3) {
93 const string getMethodName()
override {
94 return "vec3.computeLength";
96 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
102 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
103 miniScript->startErrorScript();
107 miniScript->registerMethod(
new ScriptMethodVec3ComputeLength(miniScript, TYPE_VECTOR3));
111 class ScriptMethodVec3ComputeLengthSquared:
public MiniScript::ScriptMethod {
113 MiniScript* miniScript {
nullptr };
114 MiniScript::ScriptVariableType TYPE_VECTOR3;
116 ScriptMethodVec3ComputeLengthSquared(
117 MiniScript* miniScript,
118 MiniScript::ScriptVariableType TYPE_VECTOR3
120 MiniScript::ScriptMethod(
122 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false }
124 MiniScript::ScriptVariableType::TYPE_FLOAT
126 miniScript(miniScript),
127 TYPE_VECTOR3(TYPE_VECTOR3) {
130 const string getMethodName()
override {
131 return "vec3.computeLengthSquared";
133 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
138 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
139 miniScript->startErrorScript();
143 miniScript->registerMethod(
new ScriptMethodVec3ComputeLengthSquared(miniScript, TYPE_VECTOR3));
147 class ScriptMethodVec3ComputeDotProduct:
public MiniScript::ScriptMethod {
149 MiniScript* miniScript {
nullptr };
150 MiniScript::ScriptVariableType TYPE_VECTOR3;
152 ScriptMethodVec3ComputeDotProduct(
153 MiniScript* miniScript,
154 MiniScript::ScriptVariableType TYPE_VECTOR3
156 MiniScript::ScriptMethod(
158 { .type = TYPE_VECTOR3, .name =
"a", .optional =
false, .reference =
false, .nullable =
false },
159 { .type = TYPE_VECTOR3, .name =
"b", .optional =
false, .reference =
false, .nullable =
false }
161 MiniScript::ScriptVariableType::TYPE_FLOAT
163 miniScript(miniScript),
164 TYPE_VECTOR3(TYPE_VECTOR3) {
167 const string getMethodName()
override {
168 return "vec3.computeDotProduct";
170 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
175 returnValue.setValue(Vector3::computeDotProduct(a, b));
177 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
178 miniScript->startErrorScript();
182 miniScript->registerMethod(
new ScriptMethodVec3ComputeDotProduct(miniScript, TYPE_VECTOR3));
186 class ScriptMethodVec3ComputeCrossProduct:
public MiniScript::ScriptMethod {
188 MiniScript* miniScript {
nullptr };
189 MiniScript::ScriptVariableType TYPE_VECTOR3;
191 ScriptMethodVec3ComputeCrossProduct(
192 MiniScript* miniScript,
193 MiniScript::ScriptVariableType TYPE_VECTOR3
195 MiniScript::ScriptMethod(
197 { .type = TYPE_VECTOR3, .name =
"a", .optional =
false, .reference =
false, .nullable =
false },
198 { .type = TYPE_VECTOR3, .name =
"b", .optional =
false, .reference =
false, .nullable =
false }
202 miniScript(miniScript),
203 TYPE_VECTOR3(TYPE_VECTOR3) {
206 const string getMethodName()
override {
207 return "vec3.computeCrossProduct";
209 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
214 auto result = Vector3::computeCrossProduct(a, b);
215 returnValue.setType(TYPE_VECTOR3);
216 returnValue.setValue(&result);
218 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
219 miniScript->startErrorScript();
223 miniScript->registerMethod(
new ScriptMethodVec3ComputeCrossProduct(miniScript, TYPE_VECTOR3));
227 class ScriptMethodVec3Normalize:
public MiniScript::ScriptMethod {
229 MiniScript* miniScript {
nullptr };
230 MiniScript::ScriptVariableType TYPE_VECTOR3;
232 ScriptMethodVec3Normalize(
233 MiniScript* miniScript,
234 MiniScript::ScriptVariableType TYPE_VECTOR3
236 MiniScript::ScriptMethod(
238 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false },
242 miniScript(miniScript),
243 TYPE_VECTOR3(TYPE_VECTOR3) {
246 const string getMethodName()
override {
247 return "vec3.normalize";
249 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
254 returnValue.setType(TYPE_VECTOR3);
255 returnValue.setValue(&result);
257 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
258 miniScript->startErrorScript();
262 miniScript->registerMethod(
new ScriptMethodVec3Normalize(miniScript, TYPE_VECTOR3));
266 class ScriptMethodVec3ComputeAngle:
public MiniScript::ScriptMethod {
268 MiniScript* miniScript {
nullptr };
269 MiniScript::ScriptVariableType TYPE_VECTOR3;
271 ScriptMethodVec3ComputeAngle(
272 MiniScript* miniScript,
273 MiniScript::ScriptVariableType TYPE_VECTOR3
275 MiniScript::ScriptMethod(
277 { .type = TYPE_VECTOR3, .name =
"a", .optional =
false, .reference =
false, .nullable =
false },
278 { .type = TYPE_VECTOR3, .name =
"b", .optional =
false, .reference =
false, .nullable =
false },
279 { .type = TYPE_VECTOR3, .name =
"n", .optional =
false, .reference =
false, .nullable =
false },
281 MiniScript::ScriptVariableType::TYPE_FLOAT
283 miniScript(miniScript),
284 TYPE_VECTOR3(TYPE_VECTOR3) {
287 const string getMethodName()
override {
288 return "vec3.computeAngle";
290 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
297 returnValue.setValue(Vector3::computeAngle(a, b, n));
299 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
300 miniScript->startErrorScript();
304 miniScript->registerMethod(
new ScriptMethodVec3ComputeAngle(miniScript, TYPE_VECTOR3));
308 class ScriptMethodVec3GetX:
public MiniScript::ScriptMethod {
310 MiniScript* miniScript {
nullptr };
311 MiniScript::ScriptVariableType TYPE_VECTOR3;
313 ScriptMethodVec3GetX(
314 MiniScript* miniScript,
315 MiniScript::ScriptVariableType TYPE_VECTOR3
317 MiniScript::ScriptMethod(
319 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false },
321 MiniScript::ScriptVariableType::TYPE_FLOAT
323 miniScript(miniScript),
324 TYPE_VECTOR3(TYPE_VECTOR3) {
327 const string getMethodName()
override {
330 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
333 returnValue.setValue(vec3.
getX());
335 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
336 miniScript->startErrorScript();
340 miniScript->registerMethod(
new ScriptMethodVec3GetX(miniScript, TYPE_VECTOR3));
344 class ScriptMethodVec3GetY:
public MiniScript::ScriptMethod {
346 MiniScript* miniScript {
nullptr };
347 MiniScript::ScriptVariableType TYPE_VECTOR3;
349 ScriptMethodVec3GetY(
350 MiniScript* miniScript,
351 MiniScript::ScriptVariableType TYPE_VECTOR3
353 MiniScript::ScriptMethod(
355 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false },
357 MiniScript::ScriptVariableType::TYPE_FLOAT
359 miniScript(miniScript),
360 TYPE_VECTOR3(TYPE_VECTOR3) {
363 const string getMethodName()
override {
366 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
369 returnValue.setValue(vec3.
getY());
371 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
372 miniScript->startErrorScript();
376 miniScript->registerMethod(
new ScriptMethodVec3GetY(miniScript, TYPE_VECTOR3));
380 class ScriptMethodVec3GetZ:
public MiniScript::ScriptMethod {
382 MiniScript* miniScript {
nullptr };
383 MiniScript::ScriptVariableType TYPE_VECTOR3;
385 ScriptMethodVec3GetZ(
386 MiniScript* miniScript,
387 MiniScript::ScriptVariableType TYPE_VECTOR3
389 MiniScript::ScriptMethod(
391 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false },
393 MiniScript::ScriptVariableType::TYPE_FLOAT
395 miniScript(miniScript),
396 TYPE_VECTOR3(TYPE_VECTOR3) {
399 const string getMethodName()
override {
402 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
405 returnValue.setValue(vec3.
getZ());
407 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
408 miniScript->startErrorScript();
412 miniScript->registerMethod(
new ScriptMethodVec3GetZ(miniScript, TYPE_VECTOR3));
417 if (variable.getType() != getType())
return;
418 if (variable.getValuePtr() == 0ll)
return;
420 delete static_cast<Vector3*
>((
void*)variable.getValuePtr());
421 variable.setValuePtr(0ll);
425 if (variable.getType() != getType())
return;
429 vector3Value = *
static_cast<const Vector3*
>(value);
432 if (variable.getValuePtr() != 0ll) {
433 *
static_cast<Vector3*
>((
void*)variable.getValuePtr()) = vector3Value;
437 variable.setValuePtr((uint64_t)(
new Vector3(vector3Value)));
443 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
444 vector3Value = *
static_cast<Vector3*
>((
void*)from.getValuePtr());
447 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
448 to.setType(TYPE_VECTOR3);
449 *
static_cast<Vector3*
>((
void*)to.getValuePtr()) = vector3Value;
452 bool MiniScriptVector3::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
453 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
455 if (MiniScript::hasType(argumentValues, TYPE_VECTOR3) ==
true) {
459 if (argumentValues[0].getType() == TYPE_VECTOR3) {
462 if (MiniScript::getFloatValue(argumentValues, 0, f,
false) ==
true) {
465 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
466 miniScript->startErrorScript();
471 if (argumentValues[1].getType() == TYPE_VECTOR3) {
474 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
477 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
478 miniScript->startErrorScript();
483 returnValue.setType(TYPE_VECTOR3);
484 returnValue.setValue(&result);
492 bool MiniScriptVector3::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
493 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
495 if (argumentValues[0].getType() == TYPE_VECTOR3) {
502 if (argumentValues[1].getType() == TYPE_VECTOR3 &&
506 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
509 Console::println(
"div(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"div"));
510 miniScript->startErrorScript();
515 returnValue.setType(TYPE_VECTOR3);
516 returnValue.setValue(&result);
524 bool MiniScriptVector3::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
525 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
527 if (MiniScript::hasType(argumentValues, TYPE_VECTOR3) ==
true) {
533 returnValue.setType(TYPE_VECTOR3);
534 returnValue.setValue(&result);
538 Console::println(
"add(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"add"));
539 miniScript->startErrorScript();
548 bool MiniScriptVector3::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
549 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
551 if (MiniScript::hasType(argumentValues, TYPE_VECTOR3) ==
true) {
557 returnValue.setType(TYPE_VECTOR3);
558 returnValue.setValue(&result);
562 Console::println(
"sub(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"sub"));
563 miniScript->startErrorScript();
583 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
584 vector3Value = *
static_cast<Vector3*
>((
void*)variable.getValuePtr());
589 to_string(vector3Value.
getX()) +
", " +
590 to_string(vector3Value.
getY()) +
", " +
591 to_string(vector3Value.
getZ()) +
")";
Vector3 class representing vector3 mathematical structure and operations with x, y,...
float computeLength() const
Vector3 & add(float scalar)
Adds a scalar.
float computeLengthSquared() const
Vector3 clone() const
Clones this vector3.
Vector3 & sub(float scalar)
Subtracts a scalar.
Vector3 & scale(float scalar)
Scales by scalar.
Vector3 & normalize()
Normalizes this vector3.
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 Vector3 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 getVector3Value(MiniScript::ScriptVariableType TYPE_VECTOR3, const span< MiniScript::ScriptVariable > &arguments, int idx, Vector3 &value, bool optional=false)
Get vector3 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