TDME2  1.9.200
MiniScriptMatrix3x3.cpp
Go to the documentation of this file.
1 #include <span>
2 #include <string>
3 
4 #include <miniscript/miniscript/MiniScript.h>
5 
7 
8 #include <tdme/tdme.h>
9 #include <tdme/math/Matrix3x3.h>
10 #include <tdme/math/Vector2.h>
11 #include <tdme/utilities/Console.h>
12 #include <tdme/utilities/Float.h>
14 
15 using std::span;
16 using std::string;
17 
18 using miniscript::miniscript::MiniScript;
19 
21 
27 
28 const string MiniScriptMatrix3x3::CLASS_NAME = "mat3";
29 const string MiniScriptMatrix3x3::TYPE_NAME = "Matrix3x3";
30 
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());
34  //
35  {
36  //
37  class ScriptMethodMatrix3x3Identity: public MiniScript::ScriptMethod {
38  private:
39  MiniScript* miniScript { nullptr };
40  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
41  public:
42  ScriptMethodMatrix3x3Identity(
43  MiniScript* miniScript,
44  MiniScript::ScriptVariableType TYPE_MATRIX3x3
45  ):
46  MiniScript::ScriptMethod({}, TYPE_MATRIX3x3),
47  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
48  const string getMethodName() override {
49  return "mat3.identity";
50  }
51  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
52  const auto result = Matrix3x3().identity();
53  returnValue.setType(TYPE_MATRIX3x3);
54  returnValue.setValue(&result);
55  }
56  };
57  miniScript->registerMethod(new ScriptMethodMatrix3x3Identity(miniScript, TYPE_MATRIX3x3));
58  }
59  {
60  //
61  class ScriptMethodMatrix3x3Translate: public MiniScript::ScriptMethod {
62  private:
63  MiniScript* miniScript { nullptr };
64  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
65  MiniScript::ScriptVariableType TYPE_VECTOR2;
66  public:
67  ScriptMethodMatrix3x3Translate(
68  MiniScript* miniScript,
69  MiniScript::ScriptVariableType TYPE_MATRIX3x3,
70  MiniScript::ScriptVariableType TYPE_VECTOR2
71  ):
72  MiniScript::ScriptMethod(
73  {
74  { .type = TYPE_VECTOR2, .name = "translation", .optional = false, .reference = false, .nullable = false },
75  },
76  TYPE_MATRIX3x3
77  ),
78  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
79  const string getMethodName() override {
80  return "mat3.translate";
81  }
82  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
83  Vector2 translation;
84  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, translation, false) == true) {
85  const auto result = Matrix3x3().identity().setTranslation(translation);
86  returnValue.setType(TYPE_MATRIX3x3);
87  returnValue.setValue(&result);
88  } else {
89  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
90  miniScript->startErrorScript();
91  }
92  }
93  };
94  miniScript->registerMethod(new ScriptMethodMatrix3x3Translate(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
95  }
96  {
97  //
98  class ScriptMethodMatrix3x3Rotate: public MiniScript::ScriptMethod {
99  private:
100  MiniScript* miniScript { nullptr };
101  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
102  public:
103  ScriptMethodMatrix3x3Rotate(
104  MiniScript* miniScript,
105  MiniScript::ScriptVariableType TYPE_MATRIX3x3
106  ):
107  MiniScript::ScriptMethod(
108  {
109  { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name = "angle", .optional = false, .reference = false, .nullable = false },
110  },
111  TYPE_MATRIX3x3
112  ),
113  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
114  const string getMethodName() override {
115  return "mat3.rotate";
116  }
117  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
118  float angle;
119  if (MiniScript::getFloatValue(argumentValues, 0, angle, false) == true) {
120  const auto result = Matrix3x3().identity().setAxes(angle);
121  returnValue.setType(TYPE_MATRIX3x3);
122  returnValue.setValue(&result);
123  } else {
124  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
125  miniScript->startErrorScript();
126  }
127  }
128  };
129  miniScript->registerMethod(new ScriptMethodMatrix3x3Rotate(miniScript, TYPE_MATRIX3x3));
130  }
131  {
132  //
133  class ScriptMethodMatrix3x3RotateAroundTextureCenter: public MiniScript::ScriptMethod {
134  private:
135  MiniScript* miniScript { nullptr };
136  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
137  public:
138  ScriptMethodMatrix3x3RotateAroundTextureCenter(
139  MiniScript* miniScript,
140  MiniScript::ScriptVariableType TYPE_MATRIX3x3
141  ):
142  MiniScript::ScriptMethod(
143  {
144  { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name = "angle", .optional = false, .reference = false, .nullable = false },
145  },
146  TYPE_MATRIX3x3
147  ),
148  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3) {}
149  const string getMethodName() override {
150  return "mat3.rotateAroundTextureCenter";
151  }
152  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
153  float angle;
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);
158  } else {
159  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
160  miniScript->startErrorScript();
161  }
162  }
163  };
164  miniScript->registerMethod(new ScriptMethodMatrix3x3RotateAroundTextureCenter(miniScript, TYPE_MATRIX3x3));
165  }
166  {
167  //
168  class ScriptMethodMatrix3x3RotateAroundPoint: public MiniScript::ScriptMethod {
169  private:
170  MiniScript* miniScript { nullptr };
171  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
172  MiniScript::ScriptVariableType TYPE_VECTOR2;
173  public:
174  ScriptMethodMatrix3x3RotateAroundPoint(
175  MiniScript* miniScript,
176  MiniScript::ScriptVariableType TYPE_MATRIX3x3,
177  MiniScript::ScriptVariableType TYPE_VECTOR2
178  ):
179  MiniScript::ScriptMethod(
180  {
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 },
183  },
184  TYPE_MATRIX3x3
185  ),
186  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
187  const string getMethodName() override {
188  return "mat3.rotateAroundPoint";
189  }
190  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
191  Vector2 point;
192  float angle;
193  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, point, false) == true &&
194  MiniScript::getFloatValue(argumentValues, 1, angle, false) == true) {
195  const auto result = Matrix3x3().rotateAroundPoint(point, angle);
196  returnValue.setType(TYPE_MATRIX3x3);
197  returnValue.setValue(&result);
198  } else {
199  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
200  miniScript->startErrorScript();
201  }
202  }
203  };
204  miniScript->registerMethod(new ScriptMethodMatrix3x3RotateAroundPoint(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
205  }
206  {
207  //
208  class ScriptMethodMatrix3x3Scale: public MiniScript::ScriptMethod {
209  private:
210  MiniScript* miniScript { nullptr };
211  MiniScript::ScriptVariableType TYPE_MATRIX3x3;
212  MiniScript::ScriptVariableType TYPE_VECTOR2;
213  public:
214  ScriptMethodMatrix3x3Scale(
215  MiniScript* miniScript,
216  MiniScript::ScriptVariableType TYPE_MATRIX3x3,
217  MiniScript::ScriptVariableType TYPE_VECTOR2
218  ):
219  MiniScript::ScriptMethod({}, TYPE_MATRIX3x3),
220  miniScript(miniScript), TYPE_MATRIX3x3(TYPE_MATRIX3x3), TYPE_VECTOR2(TYPE_VECTOR2) {}
221  const string getMethodName() override {
222  return "mat3.scale";
223  }
224  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
225  Vector2 vec2Value;
226  float floatValue;
227  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2Value, false) == true) {
228  const auto result = Matrix3x3().identity().scale(vec2Value);
229  returnValue.setType(TYPE_MATRIX3x3);
230  returnValue.setValue(&result);
231  } else
232  if (MiniScript::getFloatValue(argumentValues, 0, floatValue, false) == true) {
233  const auto result = Matrix3x3().identity().scale(floatValue);
234  returnValue.setType(TYPE_MATRIX3x3);
235  returnValue.setValue(&result);
236  } else {
237  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
238  miniScript->startErrorScript();
239  }
240  }
241  bool isVariadic() const override {
242  return true;
243  }
244 
245  };
246  miniScript->registerMethod(new ScriptMethodMatrix3x3Scale(miniScript, TYPE_MATRIX3x3, TYPE_VECTOR2));
247  }
248 }
249 
250 void MiniScriptMatrix3x3::unsetScriptVariableValue(MiniScript::ScriptVariable& variable) const {
251  if (variable.getType() != getType()) return;
252  if (variable.getValuePtr() == 0ll) return;
253  //
254  delete static_cast<Matrix3x3*>((void*)variable.getValuePtr());
255  variable.setValuePtr(0ll);
256 }
257 
258 void MiniScriptMatrix3x3::setScriptVariableValue(MiniScript::ScriptVariable& variable, const void* value) const {
259  if (variable.getType() != getType()) return;
260  //
261  Matrix3x3 matrix3x3Value;
262  if (value != 0ll) {
263  matrix3x3Value = *static_cast<const Matrix3x3*>(value);
264  }
265  //
266  if (variable.getValuePtr() != 0ll) {
267  *static_cast<Matrix3x3*>((void*)variable.getValuePtr()) = matrix3x3Value;
268  return;
269  }
270  //
271  variable.setValuePtr((uint64_t)(new Matrix3x3(matrix3x3Value)));
272 }
273 
274 void MiniScriptMatrix3x3::copyScriptVariable(MiniScript::ScriptVariable& to, const MiniScript::ScriptVariable& from) const {
275  //
276  Matrix3x3 matrix3x3Value;
277  if (from.getType() == getType() && from.getValuePtr() != 0ll) {
278  matrix3x3Value = *static_cast<Matrix3x3*>((void*)from.getValuePtr());
279  }
280  //
281  const auto TYPE_MATRIX3x3 = static_cast<MiniScript::ScriptVariableType>(getType());
282  to.setType(TYPE_MATRIX3x3);
283  *static_cast<Matrix3x3*>((void*)to.getValuePtr()) = matrix3x3Value;
284 }
285 
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());
289  //
290  if (MiniScript::hasType(argumentValues, TYPE_MATRIX3x3) == true) {
291  // matrix3x3 * matrix
292  if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
293  argumentValues[1].getType() == TYPE_MATRIX3x3) {
294  Matrix3x3 a;
295  Matrix3x3 b;
296  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 0, a, false);
297  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 1, b, false);
298  //
299  const auto result = a * b;
300  returnValue.setType(TYPE_MATRIX3x3);
301  returnValue.setValue(&result);
302  //
303  return true;
304  } else
305  // matrix3x3 * vec2
306  if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
307  argumentValues[1].getType() == TYPE_VECTOR2) {
308  Matrix3x3 a;
309  Vector2 b;
310  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 0, a, false);
311  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false);
312  //
313  const auto result = a * b;
314  returnValue.setType(TYPE_VECTOR2);
315  returnValue.setValue(&result);
316  //
317  return true;
318  } else
319  // vec2 * matrix3x3
320  if (argumentValues[0].getType() == TYPE_VECTOR2 &&
321  argumentValues[1].getType() == TYPE_MATRIX3x3) {
322  Vector2 a;
323  Matrix3x3 b;
324  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false);
325  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 1, b, false);
326  //
327  const auto result = b * a;
328  returnValue.setType(TYPE_VECTOR2);
329  returnValue.setValue(&result);
330  //
331  return true;
332  } else
333  // matrix3x3 * float
334  if (argumentValues[0].getType() == TYPE_MATRIX3x3 &&
335  MiniScript::ScriptVariable::isExpectedType(argumentValues[1].getType(), MiniScript::TYPE_PSEUDO_NUMBER) == true) {
336  Matrix3x3 a;
337  float b;
338  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 0, a, false);
339  MiniScript::getFloatValue(argumentValues, 1, b, false);
340  //
341  const auto result = a * b;
342  returnValue.setType(TYPE_MATRIX3x3);
343  returnValue.setValue(&result);
344  //
345  return true;
346  } else
347  // float * matrix3x3
348  if (MiniScript::ScriptVariable::isExpectedType(argumentValues[0].getType(), MiniScript::TYPE_PSEUDO_NUMBER) == true &&
349  argumentValues[1].getType() == TYPE_MATRIX3x3) {
350  float a;
351  Matrix3x3 b;
352  MiniScript::getFloatValue(argumentValues, 0, a, false);
353  MiniScriptMatrix3x3::getMatrix3x3Value(TYPE_MATRIX3x3, argumentValues, 1, b, false);
354  //
355  const auto result = b * a;
356  returnValue.setType(TYPE_MATRIX3x3);
357  returnValue.setValue(&result);
358  //
359  return true;
360  } else {
361  Console::println("mul(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("mul"));
362  miniScript->startErrorScript();
363  //
364  return false;
365  }
366  }
367  //
368  return false;
369 }
370 
371 bool MiniScriptMatrix3x3::div(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
372  return false;
373 }
374 
375 bool MiniScriptMatrix3x3::add(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
376  return false;
377 }
378 
379 bool MiniScriptMatrix3x3::sub(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
380  return false;
381 }
382 
383 const string& MiniScriptMatrix3x3::getClassName() const {
384  return CLASS_NAME;
385 }
386 
388  return TYPE_NAME;
389 }
390 
391 const string MiniScriptMatrix3x3::getValueAsString(const MiniScript::ScriptVariable& variable) const {
392  //
393  Matrix3x3 matrix3x3Value;
394  if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
395  matrix3x3Value = *static_cast<Matrix3x3*>((void*)variable.getValuePtr());
396  }
397  return
398  "Matrix3x3(" +
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]) + ")";
408 
409 }
410 
Matrix3x3 class representing matrix3x3 mathematical structure and operations for 2d space.
Definition: Matrix3x3.h:20
Matrix3x3 & identity()
Creates identity matrix.
Definition: Matrix3x3.h:128
Matrix3x3 & setTranslation(const Vector2 &vector2)
Sets translation in matrix.
Definition: Matrix3x3.h:315
Matrix3x3 & setAxes(const Vector2 &xAxis, const Vector2 &yAxis)
Set coordinate system axes.
Definition: Matrix3x3.h:240
Matrix3x3 & scale(float scalar)
Scales by scalar.
Definition: Matrix3x3.h:146
static Matrix3x3 rotateAroundPoint(const Vector2 &point, float angle)
Creates rotation matrix that rotates around given point by given angle.
Definition: Matrix3x3.h:336
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Definition: Vector2.h:20
Console class.
Definition: Console.h:29
static void println()
Print new line to console.
Definition: Console.cpp:92
Float class.
Definition: Float.h:27
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
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 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.