4 #include <miniscript/miniscript/MiniScript.h>
18 using miniscript::miniscript::MiniScript;
28 const string MiniScriptMatrix4x4::CLASS_NAME =
"mat4";
29 const string MiniScriptMatrix4x4::TYPE_NAME =
"Matrix4x4";
31 void MiniScriptMatrix4x4::registerMethods(MiniScript* miniScript)
const {
32 const auto TYPE_MATRIX4x4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
33 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
37 class ScriptMethodMatrix4x4Identity:
public MiniScript::ScriptMethod {
39 MiniScript* miniScript {
nullptr };
40 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
42 ScriptMethodMatrix4x4Identity(
43 MiniScript* miniScript,
44 MiniScript::ScriptVariableType TYPE_MATRIX4x4
46 MiniScript::ScriptMethod({}, TYPE_MATRIX4x4),
47 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
48 const string getMethodName()
override {
49 return "mat4.identity";
51 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
53 returnValue.setType(TYPE_MATRIX4x4);
54 returnValue.setValue(&result);
57 miniScript->registerMethod(
new ScriptMethodMatrix4x4Identity(miniScript, TYPE_MATRIX4x4));
61 class ScriptMethodMatrix4x4Translate:
public MiniScript::ScriptMethod {
63 MiniScript* miniScript {
nullptr };
64 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
65 MiniScript::ScriptVariableType TYPE_VECTOR3;
67 ScriptMethodMatrix4x4Translate(
68 MiniScript* miniScript,
69 MiniScript::ScriptVariableType TYPE_MATRIX4x4,
70 MiniScript::ScriptVariableType TYPE_VECTOR3
72 MiniScript::ScriptMethod(
74 { .type = TYPE_VECTOR3, .name =
"translation", .optional =
false, .reference =
false, .nullable =
false },
78 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
79 const string getMethodName()
override {
80 return "mat4.translate";
82 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
86 returnValue.setType(TYPE_MATRIX4x4);
87 returnValue.setValue(&result);
89 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
90 miniScript->startErrorScript();
94 miniScript->registerMethod(
new ScriptMethodMatrix4x4Translate(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
98 class ScriptMethodMatrix4x4Rotate:
public MiniScript::ScriptMethod {
100 MiniScript* miniScript {
nullptr };
101 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
102 MiniScript::ScriptVariableType TYPE_VECTOR3;
104 ScriptMethodMatrix4x4Rotate(
105 MiniScript* miniScript,
106 MiniScript::ScriptVariableType TYPE_MATRIX4x4,
107 MiniScript::ScriptVariableType TYPE_VECTOR3
109 MiniScript::ScriptMethod(
111 { .type = TYPE_VECTOR3, .name =
"axis", .optional =
false, .reference =
false, .nullable =
false },
112 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
116 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
117 const string getMethodName()
override {
118 return "mat4.rotate";
120 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
124 MiniScript::getFloatValue(argumentValues, 1, angle,
false) ==
true) {
126 returnValue.setType(TYPE_MATRIX4x4);
127 returnValue.setValue(&result);
129 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
130 miniScript->startErrorScript();
134 miniScript->registerMethod(
new ScriptMethodMatrix4x4Rotate(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
138 class ScriptMethodMatrix4x4Scale:
public MiniScript::ScriptMethod {
140 MiniScript* miniScript {
nullptr };
141 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
142 MiniScript::ScriptVariableType TYPE_VECTOR3;
144 ScriptMethodMatrix4x4Scale(
145 MiniScript* miniScript,
146 MiniScript::ScriptVariableType TYPE_MATRIX4x4,
147 MiniScript::ScriptVariableType TYPE_VECTOR3
149 MiniScript::ScriptMethod({}, TYPE_MATRIX4x4),
150 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
151 const string getMethodName()
override {
154 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
159 returnValue.setType(TYPE_MATRIX4x4);
160 returnValue.setValue(&result);
162 if (MiniScript::getFloatValue(argumentValues, 0, floatValue,
false) ==
true) {
164 returnValue.setType(TYPE_MATRIX4x4);
165 returnValue.setValue(&result);
167 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
168 miniScript->startErrorScript();
171 bool isVariadic()
const override {
176 miniScript->registerMethod(
new ScriptMethodMatrix4x4Scale(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
180 class ScriptMethodMatrix4x4Invert:
public MiniScript::ScriptMethod {
182 MiniScript* miniScript {
nullptr };
183 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
185 ScriptMethodMatrix4x4Invert(
186 MiniScript* miniScript,
187 MiniScript::ScriptVariableType TYPE_MATRIX4x4
189 MiniScript::ScriptMethod(
191 { .type = TYPE_MATRIX4x4, .name =
"mat4", .optional =
false, .reference =
false, .nullable =
false },
195 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
196 const string getMethodName()
override {
197 return "mat4.invert";
199 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
202 const auto result = mat4.
invert();
203 returnValue.setType(TYPE_MATRIX4x4);
204 returnValue.setValue(&result);
206 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
207 miniScript->startErrorScript();
211 miniScript->registerMethod(
new ScriptMethodMatrix4x4Invert(miniScript, TYPE_MATRIX4x4));
215 class ScriptMethodMatrix4x4EulerAngles:
public MiniScript::ScriptMethod {
217 MiniScript* miniScript {
nullptr };
218 MiniScript::ScriptVariableType TYPE_MATRIX4x4;
219 MiniScript::ScriptVariableType TYPE_VECTOR3;
221 ScriptMethodMatrix4x4EulerAngles(
222 MiniScript* miniScript,
223 MiniScript::ScriptVariableType TYPE_MATRIX4x4,
224 MiniScript::ScriptVariableType TYPE_VECTOR3
226 MiniScript::ScriptMethod(
228 { .type = TYPE_MATRIX4x4, .name =
"mat4", .optional =
false, .reference =
false, .nullable =
false },
232 miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
233 const string getMethodName()
override {
234 return "mat4.computeEulerAngles";
236 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
240 returnValue.setType(TYPE_VECTOR3);
241 returnValue.setValue(&result);
243 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
244 miniScript->startErrorScript();
248 miniScript->registerMethod(
new ScriptMethodMatrix4x4EulerAngles(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
253 if (variable.getType() != getType())
return;
254 if (variable.getValuePtr() == 0ll)
return;
256 delete static_cast<Matrix4x4*
>((
void*)variable.getValuePtr());
257 variable.setValuePtr(0ll);
261 if (variable.getType() != getType())
return;
265 matrix4x4Value = *
static_cast<const Matrix4x4*
>(value);
268 if (variable.getValuePtr() != 0ll) {
269 *
static_cast<Matrix4x4*
>((
void*)variable.getValuePtr()) = matrix4x4Value;
273 variable.setValuePtr((uint64_t)(
new Matrix4x4(matrix4x4Value)));
279 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
280 matrix4x4Value = *
static_cast<Matrix4x4*
>((
void*)from.getValuePtr());
283 const auto TYPE_MATRIX4x4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
284 to.setType(TYPE_MATRIX4x4);
285 *
static_cast<Matrix4x4*
>((
void*)to.getValuePtr()) = matrix4x4Value;
288 bool MiniScriptMatrix4x4::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
289 const auto TYPE_MATRIX4x4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
290 const auto TYPE_VECTOR3 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec3")->getType());
291 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec4")->getType());
293 if (MiniScript::hasType(argumentValues, TYPE_MATRIX4x4) ==
true) {
295 if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
296 argumentValues[1].getType() == TYPE_MATRIX4x4) {
302 const auto result = a * b;
303 returnValue.setType(TYPE_MATRIX4x4);
304 returnValue.setValue(&result);
309 if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
310 argumentValues[1].getType() == TYPE_VECTOR4) {
316 const auto result = a * b;
317 returnValue.setType(TYPE_VECTOR4);
318 returnValue.setValue(&result);
323 if (argumentValues[0].getType() == TYPE_VECTOR4 &&
324 argumentValues[1].getType() == TYPE_MATRIX4x4) {
330 const auto result = b * a;
331 returnValue.setType(TYPE_VECTOR4);
332 returnValue.setValue(&result);
338 if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
339 argumentValues[1].getType() == TYPE_VECTOR3) {
345 const auto result = a * b;
346 returnValue.setType(TYPE_VECTOR3);
347 returnValue.setValue(&result);
352 if (argumentValues[0].getType() == TYPE_VECTOR3 &&
353 argumentValues[1].getType() == TYPE_MATRIX4x4) {
359 const auto result = b * a;
360 returnValue.setType(TYPE_VECTOR3);
361 returnValue.setValue(&result);
366 if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
367 MiniScript::ScriptVariable::isExpectedType(argumentValues[1].getType(), MiniScript::TYPE_PSEUDO_NUMBER) ==
true) {
371 MiniScript::getFloatValue(argumentValues, 1, b,
false);
373 const auto result = a * b;
374 returnValue.setType(TYPE_MATRIX4x4);
375 returnValue.setValue(&result);
381 if (MiniScript::ScriptVariable::isExpectedType(argumentValues[0].getType(), MiniScript::TYPE_PSEUDO_NUMBER) ==
true &&
382 argumentValues[1].getType() == TYPE_MATRIX4x4) {
385 MiniScript::getFloatValue(argumentValues, 0, a,
false);
388 const auto result = b * a;
389 returnValue.setType(TYPE_MATRIX4x4);
390 returnValue.setValue(&result);
394 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
395 miniScript->startErrorScript();
404 bool MiniScriptMatrix4x4::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
408 bool MiniScriptMatrix4x4::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
412 bool MiniScriptMatrix4x4::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
427 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
428 matrix4x4Value = *
static_cast<Matrix4x4*
>((
void*)variable.getValuePtr());
432 to_string(matrix4x4Value[0]) +
", " +
433 to_string(matrix4x4Value[1]) +
", " +
434 to_string(matrix4x4Value[2]) +
", " +
435 to_string(matrix4x4Value[3]) +
", " +
436 to_string(matrix4x4Value[4]) +
", " +
437 to_string(matrix4x4Value[5]) +
", " +
438 to_string(matrix4x4Value[6]) +
", " +
439 to_string(matrix4x4Value[7]) +
", " +
440 to_string(matrix4x4Value[8]) +
", " +
441 to_string(matrix4x4Value[9]) +
", " +
442 to_string(matrix4x4Value[10]) +
", " +
443 to_string(matrix4x4Value[11]) +
", " +
444 to_string(matrix4x4Value[12]) +
", " +
445 to_string(matrix4x4Value[13]) +
", " +
446 to_string(matrix4x4Value[14]) +
", " +
447 to_string(matrix4x4Value[15]) +
")";
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Matrix4x4 & identity()
Creates identity matrix.
Matrix4x4 & scale(float scalar)
Scales by scalar.
Vector3 computeEulerAngles() const
Compute Euler angles (rotation around x, y, z axes)
Matrix4x4 & invert()
Inverts this matrix.
Matrix4x4 & setAxes(const Vector3 &xAxis, const Vector3 &yAxis, const Vector3 &zAxis)
Set coordinate system axes.
Matrix4x4 & setTranslation(const Vector3 &translation)
Set translation.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Vector4 class representing vector4 mathematical structure and operations with x, y,...
static void println()
Print new line to console.
MiniScript Matrix4x4 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
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 bool getMatrix4x4Value(MiniScript::ScriptVariableType TYPE_MATRIX4x4, const span< MiniScript::ScriptVariable > &arguments, int idx, Matrix4x4 &value, bool optional=false)
Get matrix4x4 value from given variable.
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.
MiniScript Vector4 data type.
static bool getVector4Value(MiniScript::ScriptVariableType TYPE_VECTOR4, const span< MiniScript::ScriptVariable > &arguments, int idx, Vector4 &value, bool optional=false)
Get vector4 value from given variable.