TDME2  1.9.200
MiniScriptMatrix4x4.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/Matrix4x4.h>
10 #include <tdme/utilities/Console.h>
11 #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 MiniScriptMatrix4x4::CLASS_NAME = "mat4";
29 const string MiniScriptMatrix4x4::TYPE_NAME = "Matrix4x4";
30 
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());
34  //
35  {
36  //
37  class ScriptMethodMatrix4x4Identity: public MiniScript::ScriptMethod {
38  private:
39  MiniScript* miniScript { nullptr };
40  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
41  public:
42  ScriptMethodMatrix4x4Identity(
43  MiniScript* miniScript,
44  MiniScript::ScriptVariableType TYPE_MATRIX4x4
45  ):
46  MiniScript::ScriptMethod({}, TYPE_MATRIX4x4),
47  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
48  const string getMethodName() override {
49  return "mat4.identity";
50  }
51  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
52  const auto result = Matrix4x4().identity();
53  returnValue.setType(TYPE_MATRIX4x4);
54  returnValue.setValue(&result);
55  }
56  };
57  miniScript->registerMethod(new ScriptMethodMatrix4x4Identity(miniScript, TYPE_MATRIX4x4));
58  }
59  {
60  //
61  class ScriptMethodMatrix4x4Translate: public MiniScript::ScriptMethod {
62  private:
63  MiniScript* miniScript { nullptr };
64  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
65  MiniScript::ScriptVariableType TYPE_VECTOR3;
66  public:
67  ScriptMethodMatrix4x4Translate(
68  MiniScript* miniScript,
69  MiniScript::ScriptVariableType TYPE_MATRIX4x4,
70  MiniScript::ScriptVariableType TYPE_VECTOR3
71  ):
72  MiniScript::ScriptMethod(
73  {
74  { .type = TYPE_VECTOR3, .name = "translation", .optional = false, .reference = false, .nullable = false },
75  },
76  TYPE_MATRIX4x4
77  ),
78  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
79  const string getMethodName() override {
80  return "mat4.translate";
81  }
82  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
83  Vector3 translation;
84  if (MiniScriptVector3::getVector3Value(TYPE_VECTOR3, argumentValues, 0, translation, false) == true) {
85  const auto result = Matrix4x4().identity().setTranslation(translation);
86  returnValue.setType(TYPE_MATRIX4x4);
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 ScriptMethodMatrix4x4Translate(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
95  }
96  {
97  //
98  class ScriptMethodMatrix4x4Rotate: public MiniScript::ScriptMethod {
99  private:
100  MiniScript* miniScript { nullptr };
101  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
102  MiniScript::ScriptVariableType TYPE_VECTOR3;
103  public:
104  ScriptMethodMatrix4x4Rotate(
105  MiniScript* miniScript,
106  MiniScript::ScriptVariableType TYPE_MATRIX4x4,
107  MiniScript::ScriptVariableType TYPE_VECTOR3
108  ):
109  MiniScript::ScriptMethod(
110  {
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 },
113  },
114  TYPE_MATRIX4x4
115  ),
116  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
117  const string getMethodName() override {
118  return "mat4.rotate";
119  }
120  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
121  Vector3 axis;
122  float angle;
123  if (MiniScriptVector3::getVector3Value(TYPE_VECTOR3, argumentValues, 0, axis, false) == true &&
124  MiniScript::getFloatValue(argumentValues, 1, angle, false) == true) {
125  const auto result = Matrix4x4().identity().setAxes(axis, angle);
126  returnValue.setType(TYPE_MATRIX4x4);
127  returnValue.setValue(&result);
128  } else {
129  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
130  miniScript->startErrorScript();
131  }
132  }
133  };
134  miniScript->registerMethod(new ScriptMethodMatrix4x4Rotate(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
135  }
136  {
137  //
138  class ScriptMethodMatrix4x4Scale: public MiniScript::ScriptMethod {
139  private:
140  MiniScript* miniScript { nullptr };
141  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
142  MiniScript::ScriptVariableType TYPE_VECTOR3;
143  public:
144  ScriptMethodMatrix4x4Scale(
145  MiniScript* miniScript,
146  MiniScript::ScriptVariableType TYPE_MATRIX4x4,
147  MiniScript::ScriptVariableType TYPE_VECTOR3
148  ):
149  MiniScript::ScriptMethod({}, TYPE_MATRIX4x4),
150  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
151  const string getMethodName() override {
152  return "mat4.scale";
153  }
154  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
155  Vector3 vec3Value;
156  float floatValue;
157  if (MiniScriptVector3::getVector3Value(TYPE_VECTOR3, argumentValues, 0, vec3Value, false) == true) {
158  const auto result = Matrix4x4().identity().scale(vec3Value);
159  returnValue.setType(TYPE_MATRIX4x4);
160  returnValue.setValue(&result);
161  } else
162  if (MiniScript::getFloatValue(argumentValues, 0, floatValue, false) == true) {
163  const auto result = Matrix4x4().identity().scale(floatValue);
164  returnValue.setType(TYPE_MATRIX4x4);
165  returnValue.setValue(&result);
166  } else {
167  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
168  miniScript->startErrorScript();
169  }
170  }
171  bool isVariadic() const override {
172  return true;
173  }
174 
175  };
176  miniScript->registerMethod(new ScriptMethodMatrix4x4Scale(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
177  }
178  {
179  //
180  class ScriptMethodMatrix4x4Invert: public MiniScript::ScriptMethod {
181  private:
182  MiniScript* miniScript { nullptr };
183  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
184  public:
185  ScriptMethodMatrix4x4Invert(
186  MiniScript* miniScript,
187  MiniScript::ScriptVariableType TYPE_MATRIX4x4
188  ):
189  MiniScript::ScriptMethod(
190  {
191  { .type = TYPE_MATRIX4x4, .name = "mat4", .optional = false, .reference = false, .nullable = false },
192  },
193  TYPE_MATRIX4x4
194  ),
195  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4) {}
196  const string getMethodName() override {
197  return "mat4.invert";
198  }
199  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
200  Matrix4x4 mat4;
201  if (MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, mat4, false) == true) {
202  const auto result = mat4.invert();
203  returnValue.setType(TYPE_MATRIX4x4);
204  returnValue.setValue(&result);
205  } else {
206  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
207  miniScript->startErrorScript();
208  }
209  }
210  };
211  miniScript->registerMethod(new ScriptMethodMatrix4x4Invert(miniScript, TYPE_MATRIX4x4));
212  }
213  {
214  //
215  class ScriptMethodMatrix4x4EulerAngles: public MiniScript::ScriptMethod {
216  private:
217  MiniScript* miniScript { nullptr };
218  MiniScript::ScriptVariableType TYPE_MATRIX4x4;
219  MiniScript::ScriptVariableType TYPE_VECTOR3;
220  public:
221  ScriptMethodMatrix4x4EulerAngles(
222  MiniScript* miniScript,
223  MiniScript::ScriptVariableType TYPE_MATRIX4x4,
224  MiniScript::ScriptVariableType TYPE_VECTOR3
225  ):
226  MiniScript::ScriptMethod(
227  {
228  { .type = TYPE_MATRIX4x4, .name = "mat4", .optional = false, .reference = false, .nullable = false },
229  },
230  TYPE_VECTOR3
231  ),
232  miniScript(miniScript), TYPE_MATRIX4x4(TYPE_MATRIX4x4), TYPE_VECTOR3(TYPE_VECTOR3) {}
233  const string getMethodName() override {
234  return "mat4.computeEulerAngles";
235  }
236  void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) override {
237  Matrix4x4 mat4;
238  if (MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, mat4, false) == true) {
239  const auto result = mat4.computeEulerAngles();
240  returnValue.setType(TYPE_VECTOR3);
241  returnValue.setValue(&result);
242  } else {
243  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
244  miniScript->startErrorScript();
245  }
246  }
247  };
248  miniScript->registerMethod(new ScriptMethodMatrix4x4EulerAngles(miniScript, TYPE_MATRIX4x4, TYPE_VECTOR3));
249  }
250 }
251 
252 void MiniScriptMatrix4x4::unsetScriptVariableValue(MiniScript::ScriptVariable& variable) const {
253  if (variable.getType() != getType()) return;
254  if (variable.getValuePtr() == 0ll) return;
255  //
256  delete static_cast<Matrix4x4*>((void*)variable.getValuePtr());
257  variable.setValuePtr(0ll);
258 }
259 
260 void MiniScriptMatrix4x4::setScriptVariableValue(MiniScript::ScriptVariable& variable, const void* value) const {
261  if (variable.getType() != getType()) return;
262  //
263  Matrix4x4 matrix4x4Value;
264  if (value != 0ll) {
265  matrix4x4Value = *static_cast<const Matrix4x4*>(value);
266  }
267  //
268  if (variable.getValuePtr() != 0ll) {
269  *static_cast<Matrix4x4*>((void*)variable.getValuePtr()) = matrix4x4Value;
270  return;
271  }
272  //
273  variable.setValuePtr((uint64_t)(new Matrix4x4(matrix4x4Value)));
274 }
275 
276 void MiniScriptMatrix4x4::copyScriptVariable(MiniScript::ScriptVariable& to, const MiniScript::ScriptVariable& from) const {
277  //
278  Matrix4x4 matrix4x4Value;
279  if (from.getType() == getType() && from.getValuePtr() != 0ll) {
280  matrix4x4Value = *static_cast<Matrix4x4*>((void*)from.getValuePtr());
281  }
282  //
283  const auto TYPE_MATRIX4x4 = static_cast<MiniScript::ScriptVariableType>(getType());
284  to.setType(TYPE_MATRIX4x4);
285  *static_cast<Matrix4x4*>((void*)to.getValuePtr()) = matrix4x4Value;
286 }
287 
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());
292  //
293  if (MiniScript::hasType(argumentValues, TYPE_MATRIX4x4) == true) {
294  // matrix4x4 * matrix
295  if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
296  argumentValues[1].getType() == TYPE_MATRIX4x4) {
297  Matrix4x4 a;
298  Matrix4x4 b;
299  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, a, false);
300  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 1, b, false);
301  //
302  const auto result = a * b;
303  returnValue.setType(TYPE_MATRIX4x4);
304  returnValue.setValue(&result);
305  //
306  return true;
307  } else
308  // matrix4x4 * vec4
309  if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
310  argumentValues[1].getType() == TYPE_VECTOR4) {
311  Matrix4x4 a;
312  Vector4 b;
313  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, a, false);
314  MiniScriptVector4::getVector4Value(TYPE_VECTOR4, argumentValues, 1, b, false);
315  //
316  const auto result = a * b;
317  returnValue.setType(TYPE_VECTOR4);
318  returnValue.setValue(&result);
319  //
320  return true;
321  } else
322  // vec4 * matrix4x4
323  if (argumentValues[0].getType() == TYPE_VECTOR4 &&
324  argumentValues[1].getType() == TYPE_MATRIX4x4) {
325  Vector4 a;
326  Matrix4x4 b;
327  MiniScriptVector4::getVector4Value(TYPE_VECTOR4, argumentValues, 0, a, false);
328  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 1, b, false);
329  //
330  const auto result = b * a;
331  returnValue.setType(TYPE_VECTOR4);
332  returnValue.setValue(&result);
333  //
334  return true;
335 
336  } else
337  // matrix4x4 * vec3
338  if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
339  argumentValues[1].getType() == TYPE_VECTOR3) {
340  Matrix4x4 a;
341  Vector3 b;
342  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, a, false);
343  MiniScriptVector3::getVector3Value(TYPE_VECTOR3, argumentValues, 1, b, false);
344  //
345  const auto result = a * b;
346  returnValue.setType(TYPE_VECTOR3);
347  returnValue.setValue(&result);
348  //
349  return true;
350  } else
351  // vec3 * matrix4x4
352  if (argumentValues[0].getType() == TYPE_VECTOR3 &&
353  argumentValues[1].getType() == TYPE_MATRIX4x4) {
354  Vector3 a;
355  Matrix4x4 b;
356  MiniScriptVector3::getVector3Value(TYPE_VECTOR3, argumentValues, 0, a, false);
357  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 1, b, false);
358  //
359  const auto result = b * a;
360  returnValue.setType(TYPE_VECTOR3);
361  returnValue.setValue(&result);
362  //
363  return true;
364  } else
365  // matrix4x4 * float
366  if (argumentValues[0].getType() == TYPE_MATRIX4x4 &&
367  MiniScript::ScriptVariable::isExpectedType(argumentValues[1].getType(), MiniScript::TYPE_PSEUDO_NUMBER) == true) {
368  Matrix4x4 a;
369  float b;
370  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 0, a, false);
371  MiniScript::getFloatValue(argumentValues, 1, b, false);
372  //
373  const auto result = a * b;
374  returnValue.setType(TYPE_MATRIX4x4);
375  returnValue.setValue(&result);
376  //
377  return true;
378 
379  } else
380  // float * matrix4x4
381  if (MiniScript::ScriptVariable::isExpectedType(argumentValues[0].getType(), MiniScript::TYPE_PSEUDO_NUMBER) == true &&
382  argumentValues[1].getType() == TYPE_MATRIX4x4) {
383  float a;
384  Matrix4x4 b;
385  MiniScript::getFloatValue(argumentValues, 0, a, false);
386  MiniScriptMatrix4x4::getMatrix4x4Value(TYPE_MATRIX4x4, argumentValues, 1, b, false);
387  //
388  const auto result = b * a;
389  returnValue.setType(TYPE_MATRIX4x4);
390  returnValue.setValue(&result);
391  //
392  return true;
393  } else {
394  Console::println("mul(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation("mul"));
395  miniScript->startErrorScript();
396  //
397  return false;
398  }
399  }
400  //
401  return false;
402 }
403 
404 bool MiniScriptMatrix4x4::div(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
405  return false;
406 }
407 
408 bool MiniScriptMatrix4x4::add(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
409  return false;
410 }
411 
412 bool MiniScriptMatrix4x4::sub(MiniScript* miniScript, const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue, const MiniScript::ScriptStatement& statement) const {
413  return false;
414 }
415 
416 const string& MiniScriptMatrix4x4::getClassName() const {
417  return CLASS_NAME;
418 }
419 
421  return TYPE_NAME;
422 }
423 
424 const string MiniScriptMatrix4x4::getValueAsString(const MiniScript::ScriptVariable& variable) const {
425  //
426  Matrix4x4 matrix4x4Value;
427  if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
428  matrix4x4Value = *static_cast<Matrix4x4*>((void*)variable.getValuePtr());
429  }
430  return
431  "Matrix4x4(" +
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]) + ")";
448 
449 }
450 
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Matrix4x4 & identity()
Creates identity matrix.
Definition: Matrix4x4.h:158
Matrix4x4 & scale(float scalar)
Scales by scalar.
Definition: Matrix4x4.h:183
Vector3 computeEulerAngles() const
Compute Euler angles (rotation around x, y, z axes)
Definition: Matrix4x4.h:531
Matrix4x4 & invert()
Inverts this matrix.
Definition: Matrix4x4.h:479
Matrix4x4 & setAxes(const Vector3 &xAxis, const Vector3 &yAxis, const Vector3 &zAxis)
Set coordinate system axes.
Definition: Matrix4x4.h:334
Matrix4x4 & setTranslation(const Vector3 &translation)
Set translation.
Definition: Matrix4x4.h:442
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Definition: Vector4.h:22
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 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
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.
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.