4 #include <miniscript/miniscript/MiniScript.h>
18 using miniscript::miniscript::MiniScript;
28 const string MiniScriptQuaternion::CLASS_NAME =
"quaternion";
29 const string MiniScriptQuaternion::TYPE_NAME =
"Quaternion";
31 void MiniScriptQuaternion::registerMethods(MiniScript* miniScript)
const {
32 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(getType());
33 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
34 const auto TYPE_MATRIX4x4 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"mat4")->getType());
37 class ScriptMethodQuaternionIdentity:
public MiniScript::ScriptMethod {
39 MiniScript* miniScript {
nullptr };
40 MiniScript::ScriptVariableType TYPE_QUATERNION;
42 ScriptMethodQuaternionIdentity(
43 MiniScript* miniScript,
44 MiniScript::ScriptVariableType TYPE_QUATERNION
46 MiniScript::ScriptMethod({}, TYPE_QUATERNION),
47 miniScript(miniScript), TYPE_QUATERNION(TYPE_QUATERNION) {
50 const string getMethodName()
override {
51 return "quaternion.identity";
53 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
55 returnValue.setType(TYPE_QUATERNION);
56 returnValue.setValue(&result);
59 miniScript->registerMethod(
new ScriptMethodQuaternionIdentity(miniScript, TYPE_QUATERNION));
63 class ScriptMethodQuaternionInvert:
public MiniScript::ScriptMethod {
65 MiniScript* miniScript {
nullptr };
66 MiniScript::ScriptVariableType TYPE_QUATERNION;
68 ScriptMethodQuaternionInvert(
69 MiniScript* miniScript,
70 MiniScript::ScriptVariableType TYPE_QUATERNION
72 MiniScript::ScriptMethod(
74 { .type = TYPE_QUATERNION, .name =
"quaternion", .optional =
false, .reference =
false, .nullable =
false },
78 miniScript(miniScript), TYPE_QUATERNION(TYPE_QUATERNION) {
81 const string getMethodName()
override {
82 return "quaternion.invert";
84 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
87 auto result = quaternion.
invert();
88 returnValue.setType(TYPE_QUATERNION);
89 returnValue.setValue(&result);
91 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
92 miniScript->startErrorScript();
96 miniScript->registerMethod(
new ScriptMethodQuaternionInvert(miniScript, TYPE_QUATERNION));
100 class ScriptMethodQuaternionRotate:
public MiniScript::ScriptMethod {
102 MiniScript* miniScript {
nullptr };
103 MiniScript::ScriptVariableType TYPE_QUATERNION;
104 MiniScript::ScriptVariableType TYPE_VECTOR3;
106 ScriptMethodQuaternionRotate(
107 MiniScript* miniScript,
108 MiniScript::ScriptVariableType TYPE_QUATERNION,
109 MiniScript::ScriptVariableType TYPE_VECTOR3
111 MiniScript::ScriptMethod(
113 { .type = TYPE_VECTOR3, .name =
"axis", .optional =
false, .reference =
false, .nullable =
false },
114 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false }
118 miniScript(miniScript),
119 TYPE_QUATERNION(TYPE_QUATERNION),
120 TYPE_VECTOR3(TYPE_VECTOR3) {
123 const string getMethodName()
override {
124 return "quaternion.rotate";
126 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
130 MiniScript::getFloatValue(argumentValues, 1, angle,
false) ==
true) {
132 returnValue.setType(TYPE_QUATERNION);
133 returnValue.setValue(&result);
135 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
136 miniScript->startErrorScript();
140 miniScript->registerMethod(
new ScriptMethodQuaternionRotate(miniScript, TYPE_QUATERNION, TYPE_VECTOR3));
144 class ScriptMethodQuaternionNormalize:
public MiniScript::ScriptMethod {
146 MiniScript* miniScript {
nullptr };
147 MiniScript::ScriptVariableType TYPE_QUATERNION;
149 ScriptMethodQuaternionNormalize(
150 MiniScript* miniScript,
151 MiniScript::ScriptVariableType TYPE_QUATERNION
153 MiniScript::ScriptMethod(
155 { .type = TYPE_QUATERNION, .name =
"quaternion", .optional =
false, .reference =
false, .nullable =
false },
159 miniScript(miniScript), TYPE_QUATERNION(TYPE_QUATERNION) {}
160 const string getMethodName()
override {
161 return "quaternion.normalize";
163 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
167 returnValue.setType(TYPE_QUATERNION);
168 returnValue.setValue(&result);
170 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
171 miniScript->startErrorScript();
175 miniScript->registerMethod(
new ScriptMethodQuaternionNormalize(miniScript, TYPE_QUATERNION));
179 class ScriptMethodQuaternionInvert:
public MiniScript::ScriptMethod {
181 MiniScript* miniScript {
nullptr };
182 MiniScript::ScriptVariableType TYPE_QUATERNION;
183 MiniScript::ScriptVariableType TYPE_VECTOR3;
185 ScriptMethodQuaternionInvert(
186 MiniScript* miniScript,
187 MiniScript::ScriptVariableType TYPE_QUATERNION,
188 MiniScript::ScriptVariableType TYPE_VECTOR3
190 MiniScript::ScriptMethod(
192 { .type = TYPE_QUATERNION, .name =
"quaternion", .optional =
false, .reference =
false, .nullable =
false },
196 miniScript(miniScript),
197 TYPE_QUATERNION(TYPE_QUATERNION),
198 TYPE_VECTOR3(TYPE_VECTOR3) {
201 const string getMethodName()
override {
202 return "quaternion.computeEulerAngles";
204 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
208 returnValue.setType(TYPE_VECTOR3);
209 returnValue.setValue(&result);
211 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
212 miniScript->startErrorScript();
216 miniScript->registerMethod(
new ScriptMethodQuaternionInvert(miniScript, TYPE_QUATERNION, TYPE_VECTOR3));
220 class ScriptMethodQuaternionComputeMatrix:
public MiniScript::ScriptMethod {
222 MiniScript::ScriptVariableType TYPE_QUATERNION;
223 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
224 MiniScript* miniScript {
nullptr };
226 ScriptMethodQuaternionComputeMatrix(
227 MiniScript* miniScript,
228 MiniScript::ScriptVariableType TYPE_QUATERNION,
229 MiniScript::ScriptVariableType TYPE_MATRIX4x4
231 MiniScript::ScriptMethod(
233 { .type = TYPE_QUATERNION, .name =
"quaternion", .optional =
false, .reference =
false, .nullable =
false },
237 miniScript(miniScript), TYPE_QUATERNION(TYPE_QUATERNION), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {
240 const string getMethodName()
override {
241 return "quaternion.computeMatrix";
243 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
247 returnValue.setType(TYPE_MATRIX4x4);
248 returnValue.setValue(&result);
250 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
251 miniScript->startErrorScript();
255 miniScript->registerMethod(
new ScriptMethodQuaternionComputeMatrix(miniScript, TYPE_QUATERNION, TYPE_MATRIX4x4));
260 if (variable.getType() != getType())
return;
261 if (variable.getValuePtr() == 0ll)
return;
263 delete static_cast<Quaternion*
>((
void*)variable.getValuePtr());
264 variable.setValuePtr(0ll);
268 if (variable.getType() != getType())
return;
272 quaternionValue = *
static_cast<const Quaternion*
>(value);
275 if (variable.getValuePtr() != 0ll) {
276 *
static_cast<Quaternion*
>((
void*)variable.getValuePtr()) = quaternionValue;
280 variable.setValuePtr((uint64_t)(
new Quaternion(quaternionValue)));
286 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
287 quaternionValue = *
static_cast<Quaternion*
>((
void*)from.getValuePtr());
290 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(getType());
291 to.setType(TYPE_QUATERNION);
292 *
static_cast<Quaternion*
>((
void*)to.getValuePtr()) = quaternionValue;
295 bool MiniScriptQuaternion::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
296 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(getType());
297 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
299 if (MiniScript::hasType(argumentValues, TYPE_QUATERNION) ==
true) {
301 if (argumentValues[0].getType() == TYPE_QUATERNION &&
302 argumentValues[1].getType() == TYPE_QUATERNION) {
309 returnValue.setType(TYPE_QUATERNION);
310 returnValue.setValue(&result);
315 if (argumentValues[0].getType() == TYPE_QUATERNION &&
316 argumentValues[1].getType() == TYPE_VECTOR3) {
323 returnValue.setType(TYPE_VECTOR3);
324 returnValue.setValue(&result);
329 if (argumentValues[0].getType() == TYPE_VECTOR3 &&
330 argumentValues[1].getType() == TYPE_QUATERNION) {
337 returnValue.setType(TYPE_VECTOR3);
338 returnValue.setValue(&result);
342 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
343 miniScript->startErrorScript();
352 bool MiniScriptQuaternion::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
356 bool MiniScriptQuaternion::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
357 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(getType());
359 if (MiniScript::hasType(argumentValues, TYPE_QUATERNION) ==
true) {
366 returnValue.setType(TYPE_QUATERNION);
367 returnValue.setValue(&result);
371 Console::println(
"add(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"add"));
372 miniScript->startErrorScript();
381 bool MiniScriptQuaternion::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
382 const auto TYPE_QUATERNION =
static_cast<MiniScript::ScriptVariableType
>(getType());
384 if (MiniScript::hasType(argumentValues, TYPE_QUATERNION) ==
true) {
391 returnValue.setType(TYPE_QUATERNION);
392 returnValue.setValue(&result);
396 Console::println(
"sub(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"sub"));
397 miniScript->startErrorScript();
417 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
418 quaternionValue = *
static_cast<Quaternion*
>((
void*)variable.getValuePtr());
422 to_string(quaternionValue[0]) +
", " +
423 to_string(quaternionValue[1]) +
", " +
424 to_string(quaternionValue[2]) +
", " +
425 to_string(quaternionValue[3]) +
")";
Quaternion class representing quaternion mathematical structure and operations with x,...
Quaternion & identity()
Creates identity quaternion.
Quaternion & add(const Quaternion &quaternion)
Adds quaternion.
Vector3 computeEulerAngles() const
Compute Euler angles.
Matrix4x4 computeMatrix() const
Computes a rotation matrix4x4 from this quaternion.
Quaternion & rotate(const Vector3 &axis, float angle)
Creates rotation quaternion.
Quaternion & sub(const Quaternion &quaternion)
Subtracts quaternion.
Quaternion & invert()
Inverts this quaternion.
Quaternion clone() const
Clones this quaternion.
Quaternion & normalize()
Normalizes this quaternion.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
static void println()
Print new line to console.
MiniScript Matrix4x4 data type.
MiniScript Quaternion 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 const string TYPE_NAME
void copyScriptVariable(MiniScript::ScriptVariable &to, const MiniScript::ScriptVariable &from) const override
void unsetScriptVariableValue(MiniScript::ScriptVariable &variable) const override
static bool getQuaternionValue(MiniScript::ScriptVariableType TYPE_QUATERNION, const span< MiniScript::ScriptVariable > &arguments, int idx, Quaternion &value, bool optional=false)
Get quaternion value from given variable.
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
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.