6 #include <miniscript/miniscript/MiniScript.h>
19 using miniscript::miniscript::MiniScript;
30 const string MiniScriptTransform::CLASS_NAME =
"transform";
31 const string MiniScriptTransform::TYPE_NAME =
"Transform";
33 void MiniScriptTransform::registerMethods(MiniScript* miniScript)
const {
34 const auto TYPE_TRANSFORM =
static_cast<MiniScript::ScriptVariableType
>(getType());
35 const auto TYPE_MATRIX4x4 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"mat4")->getType());
36 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"quaternion")->getType());
37 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
41 class ScriptMethodTransformAxisZ:
public MiniScript::ScriptMethod {
43 MiniScript* miniScript {
nullptr };
44 MiniScript::ScriptVariableType TYPE_VECTOR3;
46 ScriptMethodTransformAxisZ(
47 MiniScript* miniScript,
48 MiniScript::ScriptVariableType TYPE_VECTOR3
50 MiniScript::ScriptMethod({}, TYPE_VECTOR3),
51 miniScript(miniScript), TYPE_VECTOR3(TYPE_VECTOR3) {}
52 const string getMethodName()
override {
53 return "transform.AXIS_Z";
55 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
56 auto result =
Vector3(0.0f, 0.0f, 1.0f);
57 returnValue.setType(TYPE_VECTOR3);
58 returnValue.setValue(&result);
61 miniScript->registerMethod(
new ScriptMethodTransformAxisZ(miniScript, TYPE_VECTOR3));
65 class ScriptMethodTransformAxisY:
public MiniScript::ScriptMethod {
67 MiniScript* miniScript {
nullptr };
68 MiniScript::ScriptVariableType TYPE_VECTOR3;
70 ScriptMethodTransformAxisY(
71 MiniScript* miniScript,
72 MiniScript::ScriptVariableType TYPE_VECTOR3
74 MiniScript::ScriptMethod({}, TYPE_VECTOR3),
75 miniScript(miniScript), TYPE_VECTOR3(TYPE_VECTOR3) {}
76 const string getMethodName()
override {
77 return "transform.AXIS_Y";
79 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
80 auto result =
Vector3(0.0f, 1.0f, 0.0f);
81 returnValue.setType(TYPE_VECTOR3);
82 returnValue.setValue(&result);
85 miniScript->registerMethod(
new ScriptMethodTransformAxisY(miniScript, TYPE_VECTOR3));
89 class ScriptMethodTransformAxisX:
public MiniScript::ScriptMethod {
91 MiniScript* miniScript {
nullptr };
92 MiniScript::ScriptVariableType TYPE_VECTOR3;
94 ScriptMethodTransformAxisX(
95 MiniScript* miniScript,
96 MiniScript::ScriptVariableType TYPE_VECTOR3
98 MiniScript::ScriptMethod({}, TYPE_VECTOR3),
99 miniScript(miniScript), TYPE_VECTOR3(TYPE_VECTOR3) {}
100 const string getMethodName()
override {
101 return "transform.AXIS_X";
103 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
104 auto result =
Vector3(1.0f, 0.0f, 0.0f);
105 returnValue.setType(TYPE_VECTOR3);
106 returnValue.setValue(&result);
109 miniScript->registerMethod(
new ScriptMethodTransformAxisX(miniScript, TYPE_VECTOR3));
113 class ScriptMethodTransform:
public MiniScript::ScriptMethod {
115 MiniScript* miniScript {
nullptr };
116 MiniScript::ScriptVariableType TYPE_TRANSFORM;
117 MiniScript::ScriptVariableType TYPE_VECTOR3;
119 ScriptMethodTransform(
120 MiniScript* miniScript,
121 MiniScript::ScriptVariableType TYPE_TRANSFORM,
122 MiniScript::ScriptVariableType TYPE_VECTOR3
124 MiniScript::ScriptMethod(
126 { .type = TYPE_VECTOR3, .name =
"translation", .optional =
true, .reference =
false, .nullable =
false },
127 { .type = TYPE_VECTOR3, .name =
"scale", .optional =
true, .reference =
false, .nullable =
false },
128 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"rotationZ", .optional =
true, .reference =
false, .nullable =
false },
129 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"rotationY", .optional =
true, .reference =
false, .nullable =
false },
130 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"rotationX", .optional =
true, .reference =
false, .nullable =
false },
134 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
135 const string getMethodName()
override {
138 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
143 if (argumentValues.size() >= 1) {
147 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
148 miniScript->startErrorScript();
152 if (argumentValues.size() >= 2) {
156 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
157 miniScript->startErrorScript();
165 for (
auto i = 2; i < argumentValues.size() && i < 5; i++) {
166 if (MiniScript::getFloatValue(argumentValues, i, floatValue,
true) ==
true) {
169 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
170 miniScript->startErrorScript();
175 returnValue.setType(TYPE_TRANSFORM);
176 returnValue.setValue(&result);
180 miniScript->registerMethod(
new ScriptMethodTransform(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
184 class ScriptMethodTransformGetTranslation:
public MiniScript::ScriptMethod {
186 MiniScript* miniScript {
nullptr };
187 MiniScript::ScriptVariableType TYPE_TRANSFORM;
188 MiniScript::ScriptVariableType TYPE_VECTOR3;
190 ScriptMethodTransformGetTranslation(
191 MiniScript* miniScript,
192 MiniScript::ScriptVariableType TYPE_TRANSFORM,
193 MiniScript::ScriptVariableType TYPE_VECTOR3
195 MiniScript::ScriptMethod(
197 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
201 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
202 const string getMethodName()
override {
203 return "transform.getTranslation";
205 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
210 returnValue.setType(TYPE_VECTOR3);
211 returnValue.setValue(&result);
213 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
214 miniScript->startErrorScript();
218 miniScript->registerMethod(
new ScriptMethodTransformGetTranslation(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
222 class ScriptMethodTransformSetTranslation:
public MiniScript::ScriptMethod {
224 MiniScript* miniScript {
nullptr };
225 MiniScript::ScriptVariableType TYPE_TRANSFORM;
226 MiniScript::ScriptVariableType TYPE_VECTOR3;
228 ScriptMethodTransformSetTranslation(
229 MiniScript* miniScript,
230 MiniScript::ScriptVariableType TYPE_TRANSFORM,
231 MiniScript::ScriptVariableType TYPE_VECTOR3
233 MiniScript::ScriptMethod(
235 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
true, .nullable =
false },
236 { .type = TYPE_VECTOR3, .name =
"translation", .optional =
false, .reference =
false, .nullable =
false },
238 MiniScript::ScriptVariableType::TYPE_NULL
240 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
241 const string getMethodName()
override {
242 return "transform.setTranslation";
244 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
252 argumentValues[0].setType(TYPE_TRANSFORM);
253 argumentValues[0].setValue(&transform);
256 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
257 miniScript->startErrorScript();
261 miniScript->registerMethod(
new ScriptMethodTransformSetTranslation(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
265 class ScriptMethodTransformGetScale:
public MiniScript::ScriptMethod {
267 MiniScript* miniScript {
nullptr };
268 MiniScript::ScriptVariableType TYPE_TRANSFORM;
269 MiniScript::ScriptVariableType TYPE_VECTOR3;
271 ScriptMethodTransformGetScale(
272 MiniScript* miniScript,
273 MiniScript::ScriptVariableType TYPE_TRANSFORM,
274 MiniScript::ScriptVariableType TYPE_VECTOR3
276 MiniScript::ScriptMethod(
278 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
282 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
283 const string getMethodName()
override {
284 return "transform.getScale";
286 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
289 const auto& result = transform.
getScale();
291 returnValue.setType(TYPE_VECTOR3);
292 returnValue.setValue(&result);
294 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
295 miniScript->startErrorScript();
299 miniScript->registerMethod(
new ScriptMethodTransformGetScale(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
303 class ScriptMethodTransformSetScale:
public MiniScript::ScriptMethod {
305 MiniScript* miniScript {
nullptr };
306 MiniScript::ScriptVariableType TYPE_TRANSFORM;
307 MiniScript::ScriptVariableType TYPE_VECTOR3;
309 ScriptMethodTransformSetScale(
310 MiniScript* miniScript,
311 MiniScript::ScriptVariableType TYPE_TRANSFORM,
312 MiniScript::ScriptVariableType TYPE_VECTOR3
314 MiniScript::ScriptMethod(
316 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
true, .nullable =
false },
317 { .type = TYPE_VECTOR3, .name =
"scale", .optional =
false, .reference =
false, .nullable =
false },
319 MiniScript::ScriptVariableType::TYPE_NULL
321 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
322 const string getMethodName()
override {
323 return "transform.setScale";
325 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
333 argumentValues[0].setType(TYPE_TRANSFORM);
334 argumentValues[0].setValue(&transform);
336 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
337 miniScript->startErrorScript();
341 miniScript->registerMethod(
new ScriptMethodTransformSetScale(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
345 class ScriptMethodTransformGetRotationAxis:
public MiniScript::ScriptMethod {
347 MiniScript* miniScript {
nullptr };
348 MiniScript::ScriptVariableType TYPE_TRANSFORM;
349 MiniScript::ScriptVariableType TYPE_VECTOR3;
351 ScriptMethodTransformGetRotationAxis(
352 MiniScript* miniScript,
353 MiniScript::ScriptVariableType TYPE_TRANSFORM,
354 MiniScript::ScriptVariableType TYPE_VECTOR3
356 MiniScript::ScriptMethod(
358 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
359 { .type = MiniScript::ScriptVariableType::TYPE_INTEGER, .name =
"idx", .optional =
false, .reference =
false, .nullable =
false },
363 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
364 const string getMethodName()
override {
365 return "transform.getRotationAxis";
367 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
371 MiniScript::getIntegerValue(argumentValues, 1, idx,
false) ==
true) {
375 returnValue.setType(TYPE_VECTOR3);
376 returnValue.setValue(&result);
378 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": rotation index invalid: " + to_string(idx) +
" / " + to_string(transform.
getRotationCount()));
379 miniScript->startErrorScript();
382 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
383 miniScript->startErrorScript();
387 miniScript->registerMethod(
new ScriptMethodTransformGetRotationAxis(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
391 class ScriptMethodTransformGetRotationAngle:
public MiniScript::ScriptMethod {
393 MiniScript* miniScript {
nullptr };
394 MiniScript::ScriptVariableType TYPE_TRANSFORM;
396 ScriptMethodTransformGetRotationAngle(
397 MiniScript* miniScript,
398 MiniScript::ScriptVariableType TYPE_TRANSFORM
400 MiniScript::ScriptMethod(
402 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
403 { .type = MiniScript::ScriptVariableType::TYPE_INTEGER, .name =
"idx", .optional =
false, .reference =
false, .nullable =
false },
405 MiniScript::ScriptVariableType::TYPE_FLOAT
407 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM) {}
408 const string getMethodName()
override {
409 return "transform.getRotationAngle";
411 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
415 MiniScript::getIntegerValue(argumentValues, 1, idx,
false) ==
true) {
419 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": rotation index invalid: " + to_string(idx) +
" / " + to_string(transform.
getRotationCount()));
420 miniScript->startErrorScript();
423 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
424 miniScript->startErrorScript();
428 miniScript->registerMethod(
new ScriptMethodTransformGetRotationAngle(miniScript, TYPE_TRANSFORM));
432 class ScriptMethodTransformSetRotationAngle:
public MiniScript::ScriptMethod {
434 MiniScript* miniScript {
nullptr };
435 MiniScript::ScriptVariableType TYPE_TRANSFORM;
437 ScriptMethodTransformSetRotationAngle(
438 MiniScript* miniScript,
439 MiniScript::ScriptVariableType TYPE_TRANSFORM
441 MiniScript::ScriptMethod(
443 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
true, .nullable =
false },
444 { .type = MiniScript::ScriptVariableType::TYPE_INTEGER, .name =
"idx", .optional =
false, .reference =
false, .nullable =
false },
445 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
447 MiniScript::ScriptVariableType::TYPE_NULL
449 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM) {}
450 const string getMethodName()
override {
451 return "transform.setRotationAngle";
453 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
458 MiniScript::getIntegerValue(argumentValues, 1, idx,
false) ==
true &&
459 MiniScript::getFloatValue(argumentValues, 2, angle,
false) ==
true) {
464 argumentValues[0].setType(TYPE_TRANSFORM);
465 argumentValues[0].setValue(&transform);
467 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": rotation index invalid: " + to_string(idx) +
" / " + to_string(transform.
getRotationCount()));
468 miniScript->startErrorScript();
471 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
472 miniScript->startErrorScript();
476 miniScript->registerMethod(
new ScriptMethodTransformSetRotationAngle(miniScript, TYPE_TRANSFORM));
480 class ScriptMethodTransformRotate:
public MiniScript::ScriptMethod {
482 MiniScript* miniScript {
nullptr };
483 MiniScript::ScriptVariableType TYPE_TRANSFORM;
484 MiniScript::ScriptVariableType TYPE_VECTOR3;
486 ScriptMethodTransformRotate(
487 MiniScript* miniScript,
488 MiniScript::ScriptVariableType TYPE_TRANSFORM,
489 MiniScript::ScriptVariableType TYPE_VECTOR3
491 MiniScript::ScriptMethod(
493 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
494 { .type = TYPE_VECTOR3, .name =
"vec3", .optional =
false, .reference =
false, .nullable =
false },
498 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
499 const string getMethodName()
override {
500 return "transform.rotate";
502 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
510 returnValue.setType(TYPE_VECTOR3);
511 returnValue.setValue(&result);
513 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
514 miniScript->startErrorScript();
518 miniScript->registerMethod(
new ScriptMethodTransformRotate(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
522 class ScriptMethodTransformApplyRotation:
public MiniScript::ScriptMethod {
524 MiniScript* miniScript {
nullptr };
525 MiniScript::ScriptVariableType TYPE_TRANSFORM;
526 MiniScript::ScriptVariableType TYPE_VECTOR3;
528 ScriptMethodTransformApplyRotation(
529 MiniScript* miniScript,
530 MiniScript::ScriptVariableType TYPE_TRANSFORM,
531 MiniScript::ScriptVariableType TYPE_VECTOR3
533 MiniScript::ScriptMethod(
535 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
true, .nullable =
false },
536 { .type = TYPE_VECTOR3, .name =
"axis", .optional =
false, .reference =
false, .nullable =
false },
537 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
539 MiniScript::ScriptVariableType::TYPE_NULL
541 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_VECTOR3(TYPE_VECTOR3) {}
542 const string getMethodName()
override {
543 return "transform.applyRotation";
545 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
551 MiniScript::getFloatValue(argumentValues, 2, angle,
false) ==
true) {
567 argumentValues[0].setType(TYPE_TRANSFORM);
568 argumentValues[0].setValue(&transform);
570 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
571 miniScript->startErrorScript();
575 miniScript->registerMethod(
new ScriptMethodTransformApplyRotation(miniScript, TYPE_TRANSFORM, TYPE_VECTOR3));
579 class ScriptMethodTransformInterpolateRotation:
public MiniScript::ScriptMethod {
581 MiniScript* miniScript {
nullptr };
583 ScriptMethodTransformInterpolateRotation(MiniScript* miniScript):
584 MiniScript::ScriptMethod(
586 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"currentAngle", .optional =
false, .reference =
false, .nullable =
false },
587 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"targetAngle", .optional =
false, .reference =
false, .nullable =
false },
588 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"timePassedSeconds", .optional =
false, .reference =
false, .nullable =
false },
589 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"degreesPerSeconds", .optional =
false, .reference =
false, .nullable =
false },
590 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"interpolatedAngle", .optional =
false, .reference =
true, .nullable =
false },
592 MiniScript::ScriptVariableType::TYPE_BOOLEAN
594 miniScript(miniScript) {}
595 const string getMethodName()
override {
596 return "transform.interpolateRotation";
598 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
601 float timePassedSeconds;
602 float degreesPerSeconds;
603 float interpolatedAngle = 0.0f;
604 if (argumentValues.size() == 5 &&
605 MiniScript::getFloatValue(argumentValues, 0, currentAngle) ==
true &&
606 MiniScript::getFloatValue(argumentValues, 1, targetAngle) ==
true &&
607 MiniScript::getFloatValue(argumentValues, 2, timePassedSeconds) ==
true &&
608 MiniScript::getFloatValue(argumentValues, 3, degreesPerSeconds) ==
true) {
609 returnValue = Rotation::interpolate(currentAngle, targetAngle, timePassedSeconds, degreesPerSeconds, interpolatedAngle);
610 argumentValues[4].setValue(interpolatedAngle);
612 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
613 miniScript->startErrorScript();
617 miniScript->registerMethod(
new ScriptMethodTransformInterpolateRotation(miniScript));
621 class ScriptMethodTransformGetTransformMatrix:
public MiniScript::ScriptMethod {
623 MiniScript* miniScript {
nullptr };
624 MiniScript::ScriptVariableType TYPE_TRANSFORM;
625 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
627 ScriptMethodTransformGetTransformMatrix(
628 MiniScript* miniScript,
629 MiniScript::ScriptVariableType TYPE_TRANSFORM,
630 MiniScript::ScriptVariableType TYPE_MATRIX4x4
632 MiniScript::ScriptMethod(
634 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
638 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
639 const string getMethodName()
override {
640 return "transform.getTransformMatrix";
642 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
647 returnValue.setType(TYPE_MATRIX4x4);
648 returnValue.setValue(&result);
650 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
651 miniScript->startErrorScript();
655 miniScript->registerMethod(
new ScriptMethodTransformGetTransformMatrix(miniScript, TYPE_TRANSFORM, TYPE_MATRIX4x4));
659 class ScriptMethodTransformGetRotationsQuaternion:
public MiniScript::ScriptMethod {
661 MiniScript* miniScript {
nullptr };
662 MiniScript::ScriptVariableType TYPE_TRANSFORM;
663 MiniScript::ScriptVariableType TYPE_QUATERNION;
665 ScriptMethodTransformGetRotationsQuaternion(
666 MiniScript* miniScript,
667 MiniScript::ScriptVariableType TYPE_TRANSFORM,
668 MiniScript::ScriptVariableType TYPE_QUATERNION
670 MiniScript::ScriptMethod(
672 { .type = TYPE_TRANSFORM, .name =
"transform", .optional =
false, .reference =
false, .nullable =
false },
676 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_QUATERNION(TYPE_QUATERNION) {}
677 const string getMethodName()
override {
678 return "transform.getRotationsQuaternion";
680 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
685 returnValue.setType(TYPE_QUATERNION);
686 returnValue.setValue(&result);
688 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
689 miniScript->startErrorScript();
693 miniScript->registerMethod(
new ScriptMethodTransformGetRotationsQuaternion(miniScript, TYPE_TRANSFORM, TYPE_QUATERNION));
697 class ScriptMethodTransformFromMatrix:
public MiniScript::ScriptMethod {
699 MiniScript* miniScript {
nullptr };
700 MiniScript::ScriptVariableType TYPE_TRANSFORM;
701 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
703 ScriptMethodTransformFromMatrix(
704 MiniScript* miniScript,
705 MiniScript::ScriptVariableType TYPE_TRANSFORM,
706 MiniScript::ScriptVariableType TYPE_MATRIX4x4
708 MiniScript::ScriptMethod(
710 { .type = TYPE_MATRIX4x4, .name =
"transformMatrix", .optional =
false, .reference =
false, .nullable =
false },
714 miniScript(miniScript), TYPE_TRANSFORM(TYPE_TRANSFORM), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
715 const string getMethodName()
override {
716 return "transform.fromMatrix";
718 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
722 result.
fromMatrix(transformMatrix, RotationOrder::ZYX);
723 returnValue.setType(TYPE_TRANSFORM);
724 returnValue.setValue(&result);
726 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
727 miniScript->startErrorScript();
731 miniScript->registerMethod(
new ScriptMethodTransformFromMatrix(miniScript, TYPE_TRANSFORM, TYPE_MATRIX4x4));
736 if (variable.getType() != getType())
return;
737 if (variable.getValuePtr() == 0ll)
return;
739 delete static_cast<Transform*
>((
void*)variable.getValuePtr());
740 variable.setValuePtr(0ll);
744 if (variable.getType() != getType())
return;
748 transformValue = *
static_cast<const Transform*
>(value);
751 if (variable.getValuePtr() != 0ll) {
752 *
static_cast<Transform*
>((
void*)variable.getValuePtr()) = transformValue;
756 variable.setValuePtr((uint64_t)(
new Transform(transformValue)));
762 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
763 transformValue = *
static_cast<Transform*
>((
void*)from.getValuePtr());
766 const auto TYPE_TRANSFORM =
static_cast<MiniScript::ScriptVariableType
>(getType());
767 to.setType(TYPE_TRANSFORM);
768 *
static_cast<Transform*
>((
void*)to.getValuePtr()) = transformValue;
771 bool MiniScriptTransform::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
772 const auto TYPE_TRANSFORM =
static_cast<MiniScript::ScriptVariableType
>(getType());
773 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
775 if (MiniScript::hasType(argumentValues, TYPE_TRANSFORM) ==
true) {
777 if (argumentValues[0].getType() == TYPE_TRANSFORM &&
778 argumentValues[1].getType() == TYPE_VECTOR3) {
785 returnValue.setType(TYPE_VECTOR3);
786 returnValue.setValue(&result);
791 if (argumentValues[0].getType() == TYPE_VECTOR3 &&
792 argumentValues[1].getType() == TYPE_TRANSFORM) {
799 returnValue.setType(TYPE_VECTOR3);
800 returnValue.setValue(&result);
804 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
805 miniScript->startErrorScript();
814 bool MiniScriptTransform::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
818 bool MiniScriptTransform::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
822 bool MiniScriptTransform::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
837 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
838 transformValue = *
static_cast<Transform*
>((
void*)variable.getValuePtr());
843 "Transform(translation: Vector3(" +
852 result+=
", rotations: (axis: Vector3(" +
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Vector3 computeEulerAngles() const
Compute Euler angles (rotation around x, y, z axes)
Vector3 class representing vector3 mathematical structure and operations with x, y,...
static void println()
Print new line to console.
MiniScript Matrix4x4 data type.
static bool getMatrix4x4Value(MiniScript::ScriptVariableType TYPE_MATRIX4x4, const span< MiniScript::ScriptVariable > &arguments, int idx, Matrix4x4 &value, bool optional=false)
Get matrix4x4 value from given variable.
MiniScript Quaternion data type.
MiniScript Vector3 data type.
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.