4 #include <miniscript/miniscript/MiniScript.h>
18 using miniscript::miniscript::MiniScript;
28 const string MiniScriptMatrix3x3::CLASS_NAME =
"mat3";
29 const string MiniScriptMatrix3x3::TYPE_NAME =
"Matrix3x3";
31 void MiniScriptMatrix3x3::registerMethods(MiniScript* miniScript)
const {
32 const auto TYPE_MATRIX3x3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
33 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec2")->getType());
37 class ScriptMethodMatrix3x3Identity:
public MiniScript::ScriptMethod {
39 MiniScript* miniScript {
nullptr };
40 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
42 ScriptMethodMatrix3x3Identity(
43 MiniScript* miniScript,
44 MiniScript::ScriptVariableType TYPE_MATRIX3x3
46 MiniScript::ScriptMethod({}, TYPE_MATRIX3x3),
47 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
48 const string getMethodName()
override {
49 return "mat3.identity";
51 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
53 returnValue.setType(TYPE_MATRIX3x3);
54 returnValue.setValue(&result);
57 miniScript->registerMethod(
new ScriptMethodMatrix3x3Identity(miniScript, TYPE_MATRIX3x3));
61 class ScriptMethodMatrix3x3Translate:
public MiniScript::ScriptMethod {
63 MiniScript* miniScript {
nullptr };
64 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
65 MiniScript::ScriptVariableType TYPE_VECTOR2;
67 ScriptMethodMatrix3x3Translate(
68 MiniScript* miniScript,
69 MiniScript::ScriptVariableType TYPE_MATRIX3x3,
70 MiniScript::ScriptVariableType TYPE_VECTOR2
72 MiniScript::ScriptMethod(
74 { .type = TYPE_VECTOR2, .name =
"translation", .optional =
false, .reference =
false, .nullable =
false },
78 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
79 const string getMethodName()
override {
80 return "mat3.translate";
82 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
86 returnValue.setType(TYPE_MATRIX3x3);
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 ScriptMethodMatrix3x3Translate(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
98 class ScriptMethodMatrix3x3Rotate:
public MiniScript::ScriptMethod {
100 MiniScript* miniScript {
nullptr };
101 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
103 ScriptMethodMatrix3x3Rotate(
104 MiniScript* miniScript,
105 MiniScript::ScriptVariableType TYPE_MATRIX3x3
107 MiniScript::ScriptMethod(
109 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
113 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
114 const string getMethodName()
override {
115 return "mat3.rotate";
117 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
119 if (MiniScript::getFloatValue(argumentValues, 0, angle,
false) ==
true) {
121 returnValue.setType(TYPE_MATRIX3x3);
122 returnValue.setValue(&result);
124 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
125 miniScript->startErrorScript();
129 miniScript->registerMethod(
new ScriptMethodMatrix3x3Rotate(miniScript, TYPE_MATRIX3x3));
133 class ScriptMethodMatrix3x3RotateAroundTextureCenter:
public MiniScript::ScriptMethod {
135 MiniScript* miniScript {
nullptr };
136 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
138 ScriptMethodMatrix3x3RotateAroundTextureCenter(
139 MiniScript* miniScript,
140 MiniScript::ScriptVariableType TYPE_MATRIX3x3
142 MiniScript::ScriptMethod(
144 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
148 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
149 const string getMethodName()
override {
150 return "mat3.rotateAroundTextureCenter";
152 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
154 if (MiniScript::getFloatValue(argumentValues, 0, angle,
false) ==
true) {
155 const auto result = Matrix3x3::rotateAroundTextureCenter(angle);
156 returnValue.setType(TYPE_MATRIX3x3);
157 returnValue.setValue(&result);
159 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
160 miniScript->startErrorScript();
164 miniScript->registerMethod(
new ScriptMethodMatrix3x3RotateAroundTextureCenter(miniScript, TYPE_MATRIX3x3));
168 class ScriptMethodMatrix3x3RotateAroundPoint:
public MiniScript::ScriptMethod {
170 MiniScript* miniScript {
nullptr };
171 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
172 MiniScript::ScriptVariableType TYPE_VECTOR2;
174 ScriptMethodMatrix3x3RotateAroundPoint(
175 MiniScript* miniScript,
176 MiniScript::ScriptVariableType TYPE_MATRIX3x3,
177 MiniScript::ScriptVariableType TYPE_VECTOR2
179 MiniScript::ScriptMethod(
181 { .type = TYPE_VECTOR2, .name =
"point", .optional =
false, .reference =
false, .nullable =
false },
182 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"angle", .optional =
false, .reference =
false, .nullable =
false },
186 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
187 const string getMethodName()
override {
188 return "mat3.rotateAroundPoint";
190 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
194 MiniScript::getFloatValue(argumentValues, 1, angle,
false) ==
true) {
196 returnValue.setType(TYPE_MATRIX3x3);
197 returnValue.setValue(&result);
199 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
200 miniScript->startErrorScript();
204 miniScript->registerMethod(
new ScriptMethodMatrix3x3RotateAroundPoint(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
208 class ScriptMethodMatrix3x3Scale:
public MiniScript::ScriptMethod {
210 MiniScript* miniScript {
nullptr };
211 MiniScript::ScriptVariableType TYPE_MATRIX3x3;
212 MiniScript::ScriptVariableType TYPE_VECTOR2;
214 ScriptMethodMatrix3x3Scale(
215 MiniScript* miniScript,
216 MiniScript::ScriptVariableType TYPE_MATRIX3x3,
217 MiniScript::ScriptVariableType TYPE_VECTOR2
219 MiniScript::ScriptMethod({}, TYPE_MATRIX3x3),
220 miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
221 const string getMethodName()
override {
224 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
229 returnValue.setType(TYPE_MATRIX3x3);
230 returnValue.setValue(&result);
232 if (MiniScript::getFloatValue(argumentValues, 0, floatValue,
false) ==
true) {
234 returnValue.setType(TYPE_MATRIX3x3);
235 returnValue.setValue(&result);
237 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
238 miniScript->startErrorScript();
241 bool isVariadic()
const override {
246 miniScript->registerMethod(
new ScriptMethodMatrix3x3Scale(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
251 if (variable.getType() != getType())
return;
252 if (variable.getValuePtr() == 0ll)
return;
254 delete static_cast<Matrix3x3*
>((
void*)variable.getValuePtr());
255 variable.setValuePtr(0ll);
259 if (variable.getType() != getType())
return;
263 matrix3x3Value = *
static_cast<const Matrix3x3*
>(value);
266 if (variable.getValuePtr() != 0ll) {
267 *
static_cast<Matrix3x3*
>((
void*)variable.getValuePtr()) = matrix3x3Value;
271 variable.setValuePtr((uint64_t)(
new Matrix3x3(matrix3x3Value)));
277 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
278 matrix3x3Value = *
static_cast<Matrix3x3*
>((
void*)from.getValuePtr());
281 const auto TYPE_MATRIX3x3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
282 to.setType(TYPE_MATRIX3x3);
283 *
static_cast<Matrix3x3*
>((
void*)to.getValuePtr()) = matrix3x3Value;
286 bool MiniScriptMatrix3x3::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
287 const auto TYPE_MATRIX3x3 =
static_cast<MiniScript::ScriptVariableType
>(getType());
288 const auto TYPE_VECTOR2 =
static_cast<MiniScript::ScriptVariableType
>(miniScript->getDataTypeByClassName(
"vec2")->getType());
290 if (MiniScript::hasType(argumentValues, TYPE_MATRIX3x3) ==
true) {
292 if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
293 argumentValues[1].getType() == TYPE_MATRIX3x3) {
299 const auto result = a * b;
300 returnValue.setType(TYPE_MATRIX3x3);
301 returnValue.setValue(&result);
306 if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
307 argumentValues[1].getType() == TYPE_VECTOR2) {
313 const auto result = a * b;
314 returnValue.setType(TYPE_VECTOR2);
315 returnValue.setValue(&result);
320 if (argumentValues[0].getType() == TYPE_VECTOR2 &&
321 argumentValues[1].getType() == TYPE_MATRIX3x3) {
327 const auto result = b * a;
328 returnValue.setType(TYPE_VECTOR2);
329 returnValue.setValue(&result);
334 if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
335 MiniScript::ScriptVariable::isExpectedType(argumentValues[1].getType(), MiniScript::TYPE_PSEUDO_NUMBER) ==
true) {
339 MiniScript::getFloatValue(argumentValues, 1, b,
false);
341 const auto result = a * b;
342 returnValue.setType(TYPE_MATRIX3x3);
343 returnValue.setValue(&result);
348 if (MiniScript::ScriptVariable::isExpectedType(argumentValues[0].getType(), MiniScript::TYPE_PSEUDO_NUMBER) ==
true &&
349 argumentValues[1].getType() == TYPE_MATRIX3x3) {
352 MiniScript::getFloatValue(argumentValues, 0, a,
false);
355 const auto result = b * a;
356 returnValue.setType(TYPE_MATRIX3x3);
357 returnValue.setValue(&result);
361 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
362 miniScript->startErrorScript();
371 bool MiniScriptMatrix3x3::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
375 bool MiniScriptMatrix3x3::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
379 bool MiniScriptMatrix3x3::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
394 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
395 matrix3x3Value = *
static_cast<Matrix3x3*
>((
void*)variable.getValuePtr());
399 to_string(matrix3x3Value[0]) +
", " +
400 to_string(matrix3x3Value[1]) +
", " +
401 to_string(matrix3x3Value[2]) +
", " +
402 to_string(matrix3x3Value[3]) +
", " +
403 to_string(matrix3x3Value[4]) +
", " +
404 to_string(matrix3x3Value[5]) +
", " +
405 to_string(matrix3x3Value[6]) +
", " +
406 to_string(matrix3x3Value[7]) +
", " +
407 to_string(matrix3x3Value[8]) +
")";
Matrix3x3 class representing matrix3x3 mathematical structure and operations for 2d space.
Matrix3x3 & identity()
Creates identity matrix.
Matrix3x3 & setTranslation(const Vector2 &vector2)
Sets translation in matrix.
Matrix3x3 & setAxes(const Vector2 &xAxis, const Vector2 &yAxis)
Set coordinate system axes.
Matrix3x3 & scale(float scalar)
Scales by scalar.
static Matrix3x3 rotateAroundPoint(const Vector2 &point, float angle)
Creates rotation matrix that rotates around given point by given angle.
Vector2 class representing vector2 mathematical structure and operations with x, y components.
static void println()
Print new line to console.
MiniScript Matrix3x3 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 const string CLASS_NAME
static bool getMatrix3x3Value(MiniScript::ScriptVariableType TYPE_MATRIX3x3, const span< MiniScript::ScriptVariable > &arguments, int idx, Matrix3x3 &value, bool optional=false)
Get matrix3x3 value from given variable.
void setScriptVariableValue(MiniScript::ScriptVariable &variable, const void *value) const override
MiniScript Vector2 data type.
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.