TDME2  1.9.200
MiniScriptVector2.cpp
Go to the documentation of this file.
1 #include <span>
2 #include <string>
3 
4 #include <miniscript/miniscript/MiniScript.h>
5 
6 #include <tdme/tdme.h>
7 #include <tdme/math/Vector2.h>
9 #include <tdme/utilities/Float.h>
11 
12 using std::span;
13 using std::string;
14 
15 using miniscript::miniscript::MiniScript;
16 
21 
22 const string MiniScriptVector2::CLASS_NAME = "vec2";
23 const string MiniScriptVector2::TYPE_NAME = "Vector2";
24 
25 void MiniScriptVector2::registerMethods(MiniScript* miniScript) const {
26  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
27  {
28  //
29  class ScriptMethodVec2: public MiniScript::ScriptMethod {
30  private:
31  MiniScript* miniScript { nullptr };
32  MiniScript::ScriptVariableType TYPE_VECTOR2;
33  public:
34  ScriptMethodVec2(
35  MiniScript* miniScript,
36  MiniScript::ScriptVariableType TYPE_VECTOR2
37  ):
38  MiniScript::ScriptMethod(
39  {
40  { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name = "x", .optional = false, .reference = false, .nullable = false },
41  { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name = "y", .optional = false, .reference = false, .nullable = false }
42  },
43  TYPE_VECTOR2
44  ),
45  miniScript(miniScript),
46  TYPE_VECTOR2(TYPE_VECTOR2) {
47  //
48  }
49  const string getMethodName() override {
50  return "vec2";
51  }
52  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
53  float xValue;
54  float yValue;
55  if (MiniScript::getFloatValue(argumentValues, 0, xValue, false) == true &&
56  MiniScript::getFloatValue(argumentValues, 1, yValue, false) == true) {
57  auto result = Vector2(xValue, yValue);
58  returnValue.setType(TYPE_VECTOR2);
59  returnValue.setValue(&result);
60  } else {
61  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
62  miniScript->startErrorScript();
63  }
64  }
65  };
66  miniScript->registerMethod(new ScriptMethodVec2(miniScript, TYPE_VECTOR2));
67  }
68  {
69  //
70  class ScriptMethodVec2ComputeLength: public MiniScript::ScriptMethod {
71  private:
72  MiniScript* miniScript { nullptr };
73  MiniScript::ScriptVariableType TYPE_VECTOR2;
74  public:
75  ScriptMethodVec2ComputeLength(
76  MiniScript* miniScript,
77  MiniScript::ScriptVariableType TYPE_VECTOR2
78  ):
79  MiniScript::ScriptMethod(
80  {
81  { .type = TYPE_VECTOR2, .name = "vec2", .optional = false, .reference = false, .nullable = false }
82  },
83  MiniScript::ScriptVariableType::TYPE_FLOAT
84  ),
85  miniScript(miniScript),
86  TYPE_VECTOR2(TYPE_VECTOR2) {
87  //
88  }
89  const string getMethodName() override {
90  return "vec2.computeLength";
91  }
92  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
93  Vector2 vec2;
94  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2, false) == true) {
95  auto length = vec2.computeLength();
96  returnValue.setValue(Float::isInfinite(length) == true || Float::isNaN(length) == true?0.0f:length);
97  } else {
98  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
99  miniScript->startErrorScript();
100  }
101  }
102  };
103  miniScript->registerMethod(new ScriptMethodVec2ComputeLength(miniScript, TYPE_VECTOR2));
104  }
105  {
106  //
107  class ScriptMethodVec2ComputeLengthSquared: public MiniScript::ScriptMethod {
108  private:
109  MiniScript* miniScript { nullptr };
110  MiniScript::ScriptVariableType TYPE_VECTOR2;
111  public:
112  ScriptMethodVec2ComputeLengthSquared(
113  MiniScript* miniScript,
114  MiniScript::ScriptVariableType TYPE_VECTOR2
115  ):
116  MiniScript::ScriptMethod(
117  {
118  { .type = TYPE_VECTOR2, .name = "vec2", .optional = false, .reference = false, .nullable = false }
119  },
120  MiniScript::ScriptVariableType::TYPE_FLOAT
121  ),
122  miniScript(miniScript),
123  TYPE_VECTOR2(TYPE_VECTOR2) {
124  //
125  }
126  const string getMethodName() override {
127  return "vec2.computeLengthSquared";
128  }
129  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
130  Vector2 vec2;
131  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2, false) == true) {
132  returnValue.setValue(vec2.computeLengthSquared());
133  } else {
134  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
135  miniScript->startErrorScript();
136  }
137  }
138  };
139  miniScript->registerMethod(new ScriptMethodVec2ComputeLengthSquared(miniScript, TYPE_VECTOR2));
140  }
141  {
142  //
143  class ScriptMethodVec2ComputeDotProduct: public MiniScript::ScriptMethod {
144  private:
145  MiniScript* miniScript { nullptr };
146  MiniScript::ScriptVariableType TYPE_VECTOR2;
147  public:
148  ScriptMethodVec2ComputeDotProduct(
149  MiniScript* miniScript,
150  MiniScript::ScriptVariableType TYPE_VECTOR2
151  ):
152  MiniScript::ScriptMethod(
153  {
154  { .type = TYPE_VECTOR2, .name = "a", .optional = false, .reference = false, .nullable = false },
155  { .type = TYPE_VECTOR2, .name = "b", .optional = false, .reference = false, .nullable = false }
156  },
157  MiniScript::ScriptVariableType::TYPE_FLOAT
158  ),
159  miniScript(miniScript),
160  TYPE_VECTOR2(TYPE_VECTOR2) {
161  //
162  }
163  const string getMethodName() override {
164  return "vec2.computeDotProduct";
165  }
166  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
167  Vector2 a;
168  Vector2 b;
169  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false) == true &&
170  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false) == true) {
171  returnValue.setValue(Vector2::computeDotProduct(a, b));
172  } else {
173  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
174  miniScript->startErrorScript();
175  }
176  }
177  };
178  miniScript->registerMethod(new ScriptMethodVec2ComputeDotProduct(miniScript, TYPE_VECTOR2));
179  }
180  {
181  //
182  class ScriptMethodVec2Normalize: public MiniScript::ScriptMethod {
183  private:
184  MiniScript* miniScript { nullptr };
185  MiniScript::ScriptVariableType TYPE_VECTOR2;
186  public:
187  ScriptMethodVec2Normalize(
188  MiniScript* miniScript,
189  MiniScript::ScriptVariableType TYPE_VECTOR2
190  ):
191  MiniScript::ScriptMethod(
192  {
193  { .type = TYPE_VECTOR2, .name = "vec2", .optional = false, .reference = false, .nullable = false },
194  },
195  TYPE_VECTOR2
196  ),
197  miniScript(miniScript),
198  TYPE_VECTOR2(TYPE_VECTOR2) {
199  //
200  }
201  const string getMethodName() override {
202  return "vec2.normalize";
203  }
204  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
205  Vector2 vec2;
206  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2, false) == true) {
207  auto length = vec2.computeLength();
208  auto result = length < Math::EPSILON || Float::isInfinite(length) == true || Float::isNaN(length) == true?Vector2(0.0f, 0.0f):vec2.normalize();
209  returnValue.setType(TYPE_VECTOR2);
210  returnValue.setValue(&result);
211  } else {
212  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
213  miniScript->startErrorScript();
214  }
215  }
216  };
217  miniScript->registerMethod(new ScriptMethodVec2Normalize(miniScript, TYPE_VECTOR2));
218  }
219  {
220  //
221  class ScriptMethodVec2GetX: public MiniScript::ScriptMethod {
222  private:
223  MiniScript* miniScript { nullptr };
224  MiniScript::ScriptVariableType TYPE_VECTOR2;
225  public:
226  ScriptMethodVec2GetX(
227  MiniScript* miniScript,
228  MiniScript::ScriptVariableType TYPE_VECTOR2
229  ):
230  MiniScript::ScriptMethod(
231  {
232  { .type = TYPE_VECTOR2, .name = "vec2", .optional = false, .reference = false, .nullable = false },
233  },
234  MiniScript::ScriptVariableType::TYPE_FLOAT
235  ),
236  miniScript(miniScript),
237  TYPE_VECTOR2(TYPE_VECTOR2) {
238  //
239  }
240  const string getMethodName() override {
241  return "vec2.getX";
242  }
243  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
244  Vector2 vec2;
245  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2, false) == true) {
246  returnValue.setValue(vec2.getX());
247  } else {
248  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
249  miniScript->startErrorScript();
250  }
251  }
252  };
253  miniScript->registerMethod(new ScriptMethodVec2GetX(miniScript, TYPE_VECTOR2));
254  }
255  {
256  //
257  class ScriptMethodVec2GetY: public MiniScript::ScriptMethod {
258  private:
259  MiniScript* miniScript { nullptr };
260  MiniScript::ScriptVariableType TYPE_VECTOR2;
261  public:
262  ScriptMethodVec2GetY(
263  MiniScript* miniScript,
264  MiniScript::ScriptVariableType TYPE_VECTOR2
265  ):
266  MiniScript::ScriptMethod(
267  {
268  { .type = TYPE_VECTOR2, .name = "vec2", .optional = false, .reference = false, .nullable = false },
269  },
270  MiniScript::ScriptVariableType::TYPE_FLOAT
271  ),
272  miniScript(miniScript),
273  TYPE_VECTOR2(TYPE_VECTOR2) {
274  //
275  }
276  const string getMethodName() override {
277  return "vec2.getY";
278  }
279  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
280  Vector2 vec2;
281  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, vec2, false) == true) {
282  returnValue.setValue(vec2.getY());
283  } else {
284  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
285  miniScript->startErrorScript();
286  }
287  }
288  };
289  miniScript->registerMethod(new ScriptMethodVec2GetY(miniScript, TYPE_VECTOR2));
290  }
291 }
292 
293 void MiniScriptVector2::unsetScriptVariableValue(MiniScript::ScriptVariable& variable) const {
294  if (variable.getType() != getType()) return;
295  if (variable.getValuePtr() == 0ll) return;
296  //
297  delete static_cast<Vector2*>((void*)variable.getValuePtr());
298  variable.setValuePtr(0ll);
299 }
300 
301 void MiniScriptVector2::setScriptVariableValue(MiniScript::ScriptVariable& variable, const void* value) const {
302  if (variable.getType() != getType()) return;
303  //
304  Vector2 vector2Value;
305  if (value != 0ll) {
306  vector2Value = *static_cast<const Vector2*>(value);
307  }
308  //
309  if (variable.getValuePtr() != 0ll) {
310  *static_cast<Vector2*>((void*)variable.getValuePtr()) = vector2Value;
311  return;
312  }
313  //
314  variable.setValuePtr((uint64_t)(new Vector2(vector2Value)));
315 }
316 
317 void MiniScriptVector2::copyScriptVariable(MiniScript::ScriptVariable& to, const MiniScript::ScriptVariable& from) const {
318  //
319  Vector2 vector2Value;
320  if (from.getType() == getType() && from.getValuePtr() != 0ll) {
321  vector2Value = *static_cast<Vector2*>((void*)from.getValuePtr());
322  }
323  //
324  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
325  to.setType(TYPE_VECTOR2);
326  *static_cast<Vector2*>((void*)to.getValuePtr()) = vector2Value;
327 }
328 
329 bool MiniScriptVector2::mul(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
330  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
331  //
332  if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) == true) {
333  float f;
334  // a
335  Vector2 a;
336  if (argumentValues[0].getType() == TYPE_VECTOR2) {
337  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false);
338  } else
339  if (MiniScript::getFloatValue(argumentValues, 0, f, false) == true) {
340  a = Vector2(f, f);
341  } else {
342  Console::println("mul(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("mul"));
343  miniScript->startErrorScript();
344  //
345  return false;
346  }
347  // b
348  Vector2 b;
349  if (argumentValues[1].getType() == TYPE_VECTOR2) {
350  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false);
351  } else
352  if (MiniScript::getFloatValue(argumentValues, 1, f, false) == true) {
353  b = Vector2(f, f);
354  } else {
355  Console::println("mul(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("mul"));
356  miniScript->startErrorScript();
357  //
358  return false;
359  }
360  //
361  auto result = a.clone().scale(b);
362  returnValue.setType(TYPE_VECTOR2);
363  returnValue.setValue(&result);
364  //
365  return true;
366  }
367  //
368  return false;
369 }
370 
371 bool MiniScriptVector2::div(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
372  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
373  //
374  if (argumentValues[0].getType() == TYPE_VECTOR2) {
375  Vector2 a;
376  Vector2 b;
377  float f;
378  // a
379  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false);
380  // b
381  if (argumentValues[1].getType() == TYPE_VECTOR2 &&
382  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false) == true) {
383  // nop
384  } else
385  if (MiniScript::getFloatValue(argumentValues, 1, f, false) == true) {
386  b = Vector2(f, f);
387  } else {
388  Console::println("div(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("div"));
389  miniScript->startErrorScript();
390  //
391  return false;
392  }
393  //
394  auto result = a / b;
395  returnValue.setType(TYPE_VECTOR2);
396  returnValue.setValue(&result);
397  //
398  return true;
399  }
400  //
401  return false;
402 }
403 
404 bool MiniScriptVector2::add(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
405  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
406  //
407  if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) == true) {
408  Vector2 a;
409  Vector2 b;
410  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false) == true &&
411  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false) == true) {
412  //
413  auto result = a.clone().add(b);
414  returnValue.setType(TYPE_VECTOR2);
415  returnValue.setValue(&result);
416  //
417  return true;
418  } else {
419  Console::println("add(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("add"));
420  miniScript->startErrorScript();
421  //
422  return false;
423  }
424  }
425  //
426  return false;
427 }
428 
429 bool MiniScriptVector2::sub(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
430  const auto TYPE_VECTOR2 = static_cast<MiniScript::ScriptVariableType>(getType());
431  //
432  if (MiniScript::hasType(argumentValues, TYPE_VECTOR2) == true) {
433  Vector2 a;
434  Vector2 b;
435  if (MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 0, a, false) == true &&
436  MiniScriptVector2::getVector2Value(TYPE_VECTOR2, argumentValues, 1, b, false) == true) {
437  //
438  auto result = a.clone().sub(b);
439  returnValue.setType(TYPE_VECTOR2);
440  returnValue.setValue(&result);
441  //
442  return true;
443  } else {
444  Console::println("sub(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("sub"));
445  miniScript->startErrorScript();
446  //
447  return false;
448  }
449  }
450  //
451  return false;
452 }
453 
454 const string& MiniScriptVector2::getClassName() const {
455  return CLASS_NAME;
456 }
457 
458 const string& MiniScriptVector2::getTypeAsString() const {
459  return TYPE_NAME;
460 }
461 
462 const string MiniScriptVector2::getValueAsString(const MiniScript::ScriptVariable& variable) const {
463  //
464  Vector2 vector2Value;
465  if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
466  vector2Value = *static_cast<Vector2*>((void*)variable.getValuePtr());
467  }
468  //
469  return
470  "Vector2(" +
471  to_string(vector2Value.getX()) + ", " +
472  to_string(vector2Value.getY()) + ")";
473 
474 }
475 
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Definition: Vector2.h:20
float getY() const
Definition: Vector2.h:111
Vector2 & sub(float scalar)
Subtracts a scalar.
Definition: Vector2.h:152
float getX() const
Definition: Vector2.h:94
float computeLength() const
Definition: Vector2.h:229
Vector2 & scale(const float scalar)
Scales by scalar.
Definition: Vector2.h:174
Vector2 clone() const
Clones this vector2.
Definition: Vector2.h:265
Vector2 & normalize()
Normalizes this vector2.
Definition: Vector2.h:209
Vector2 & add(float scalar)
Adds a scalar.
Definition: Vector2.h:130
float computeLengthSquared() const
Definition: Vector2.h:236
Console class.
Definition: Console.h:29
static void println()
Print new line to console.
Definition: Console.cpp:92
Float class.
Definition: Float.h:27
static bool isInfinite(float value)
Check if float is infinite.
Definition: Float.h:75
static bool isNaN(float value)
Check if float is not a number.
Definition: Float.h:66
MiniScript Vector2 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 bool getVector2Value(MiniScript::ScriptVariableType TYPE_VECTOR2, const span< MiniScript::ScriptVariable > &arguments, int idx, Vector2 &value, bool optional=false)
Get vector2 value from given variable.
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
void setScriptVariableValue(MiniScript::ScriptVariable &variable, const void *value) const override