4 #include <miniscript/miniscript/MiniScript.h>
15 using miniscript::miniscript::MiniScript;
22 const string MiniScriptVector4::CLASS_NAME =
"vec4";
23 const string MiniScriptVector4::TYPE_NAME =
"Vector4";
25 void MiniScriptVector4::registerMethods(MiniScript* miniScript)
const {
26 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
29 class ScriptMethodVec4:
public MiniScript::ScriptMethod {
31 MiniScript* miniScript {
nullptr };
32 MiniScript::ScriptVariableType TYPE_VECTOR4;
35 MiniScript* miniScript,
36 MiniScript::ScriptVariableType TYPE_VECTOR4
38 MiniScript::ScriptMethod(
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 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"z", .optional =
false, .reference =
false, .nullable =
false },
43 { .type = MiniScript::ScriptVariableType::TYPE_FLOAT, .name =
"w", .optional =
false, .reference =
false, .nullable =
false }
47 miniScript(miniScript),
48 TYPE_VECTOR4(TYPE_VECTOR4) {
52 const string getMethodName()
override {
55 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
61 if (MiniScript::getFloatValue(argumentValues, 0, xValue,
false) ==
true &&
62 MiniScript::getFloatValue(argumentValues, 1, yValue,
false) ==
true &&
63 MiniScript::getFloatValue(argumentValues, 2, zValue,
false) ==
true &&
64 MiniScript::getFloatValue(argumentValues, 3, wValue,
false) ==
true) {
65 auto result =
Vector4(xValue, yValue, zValue, wValue);
66 returnValue.setType(TYPE_VECTOR4);
67 returnValue.setValue(&result);
69 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
70 miniScript->startErrorScript();
74 miniScript->registerMethod(
new ScriptMethodVec4(miniScript, TYPE_VECTOR4));
78 class ScriptMethodVec4ComputeLength:
public MiniScript::ScriptMethod {
80 MiniScript* miniScript {
nullptr };
81 MiniScript::ScriptVariableType TYPE_VECTOR4;
83 ScriptMethodVec4ComputeLength(
84 MiniScript* miniScript,
85 MiniScript::ScriptVariableType TYPE_VECTOR4
87 MiniScript::ScriptMethod(
89 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false }
91 MiniScript::ScriptVariableType::TYPE_FLOAT
93 miniScript(miniScript),
94 TYPE_VECTOR4(TYPE_VECTOR4) {
97 const string getMethodName()
override {
98 return "vec4.computeLength";
100 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
106 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
107 miniScript->startErrorScript();
111 miniScript->registerMethod(
new ScriptMethodVec4ComputeLength(miniScript, TYPE_VECTOR4));
115 class ScriptMethodVec4ComputeLengthSquared:
public MiniScript::ScriptMethod {
117 MiniScript* miniScript {
nullptr };
118 MiniScript::ScriptVariableType TYPE_VECTOR4;
120 ScriptMethodVec4ComputeLengthSquared(
121 MiniScript* miniScript,
122 MiniScript::ScriptVariableType TYPE_VECTOR4
124 MiniScript::ScriptMethod(
126 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false }
128 MiniScript::ScriptVariableType::TYPE_FLOAT
130 miniScript(miniScript),
131 TYPE_VECTOR4(TYPE_VECTOR4) {
134 const string getMethodName()
override {
135 return "vec4.computeLengthSquared";
137 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
142 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
143 miniScript->startErrorScript();
147 miniScript->registerMethod(
new ScriptMethodVec4ComputeLengthSquared(miniScript, TYPE_VECTOR4));
151 class ScriptMethodVec4ComputeDotProduct:
public MiniScript::ScriptMethod {
153 MiniScript* miniScript {
nullptr };
154 MiniScript::ScriptVariableType TYPE_VECTOR4;
156 ScriptMethodVec4ComputeDotProduct(
157 MiniScript* miniScript,
158 MiniScript::ScriptVariableType TYPE_VECTOR4
160 MiniScript::ScriptMethod(
162 { .type = TYPE_VECTOR4, .name =
"a", .optional =
false, .reference =
false, .nullable =
false },
163 { .type = TYPE_VECTOR4, .name =
"b", .optional =
false, .reference =
false, .nullable =
false }
165 MiniScript::ScriptVariableType::TYPE_FLOAT
167 miniScript(miniScript),
168 TYPE_VECTOR4(TYPE_VECTOR4) {
171 const string getMethodName()
override {
172 return "vec4.computeDotProduct";
174 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
179 returnValue.setValue(Vector4::computeDotProduct(a, b));
181 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
182 miniScript->startErrorScript();
186 miniScript->registerMethod(
new ScriptMethodVec4ComputeDotProduct(miniScript, TYPE_VECTOR4));
190 class ScriptMethodVec4Normalize:
public MiniScript::ScriptMethod {
192 MiniScript* miniScript {
nullptr };
193 MiniScript::ScriptVariableType TYPE_VECTOR4;
195 ScriptMethodVec4Normalize(
196 MiniScript* miniScript,
197 MiniScript::ScriptVariableType TYPE_VECTOR4
199 MiniScript::ScriptMethod(
201 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false },
205 miniScript(miniScript),
206 TYPE_VECTOR4(TYPE_VECTOR4) {
209 const string getMethodName()
override {
210 return "vec4.normalize";
212 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
217 returnValue.setType(TYPE_VECTOR4);
218 returnValue.setValue(&result);
220 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
221 miniScript->startErrorScript();
225 miniScript->registerMethod(
new ScriptMethodVec4Normalize(miniScript, TYPE_VECTOR4));
229 class ScriptMethodVec4GetX:
public MiniScript::ScriptMethod {
231 MiniScript* miniScript {
nullptr };
232 MiniScript::ScriptVariableType TYPE_VECTOR4;
234 ScriptMethodVec4GetX(
235 MiniScript* miniScript,
236 MiniScript::ScriptVariableType TYPE_VECTOR4
238 MiniScript::ScriptMethod(
240 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false },
242 MiniScript::ScriptVariableType::TYPE_FLOAT
244 miniScript(miniScript),
245 TYPE_VECTOR4(TYPE_VECTOR4) {
248 const string getMethodName()
override {
251 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
254 returnValue.setValue(vec4.
getX());
256 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
257 miniScript->startErrorScript();
261 miniScript->registerMethod(
new ScriptMethodVec4GetX(miniScript, TYPE_VECTOR4));
265 class ScriptMethodVec4GetY:
public MiniScript::ScriptMethod {
267 MiniScript* miniScript {
nullptr };
268 MiniScript::ScriptVariableType TYPE_VECTOR4;
270 ScriptMethodVec4GetY(
271 MiniScript* miniScript,
272 MiniScript::ScriptVariableType TYPE_VECTOR4
274 MiniScript::ScriptMethod(
276 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false },
278 MiniScript::ScriptVariableType::TYPE_FLOAT
280 miniScript(miniScript),
281 TYPE_VECTOR4(TYPE_VECTOR4) {
284 const string getMethodName()
override {
287 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
290 returnValue.setValue(vec4.
getY());
292 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
293 miniScript->startErrorScript();
297 miniScript->registerMethod(
new ScriptMethodVec4GetY(miniScript, TYPE_VECTOR4));
301 class ScriptMethodVec4GetZ:
public MiniScript::ScriptMethod {
303 MiniScript* miniScript {
nullptr };
304 MiniScript::ScriptVariableType TYPE_VECTOR4;
306 ScriptMethodVec4GetZ(
307 MiniScript* miniScript,
308 MiniScript::ScriptVariableType TYPE_VECTOR4
310 MiniScript::ScriptMethod(
312 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false },
314 MiniScript::ScriptVariableType::TYPE_FLOAT
316 miniScript(miniScript),
317 TYPE_VECTOR4(TYPE_VECTOR4) {
320 const string getMethodName()
override {
323 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
326 returnValue.setValue(vec4.
getZ());
328 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
329 miniScript->startErrorScript();
333 miniScript->registerMethod(
new ScriptMethodVec4GetZ(miniScript, TYPE_VECTOR4));
337 class ScriptMethodVec4GetW:
public MiniScript::ScriptMethod {
339 MiniScript* miniScript {
nullptr };
340 MiniScript::ScriptVariableType TYPE_VECTOR4;
342 ScriptMethodVec4GetW(
343 MiniScript* miniScript,
344 MiniScript::ScriptVariableType TYPE_VECTOR4
346 MiniScript::ScriptMethod(
348 { .type = TYPE_VECTOR4, .name =
"vec4", .optional =
false, .reference =
false, .nullable =
false },
350 MiniScript::ScriptVariableType::TYPE_FLOAT
352 miniScript(miniScript),
353 TYPE_VECTOR4(TYPE_VECTOR4) {
356 const string getMethodName()
override {
359 void executeMethod(span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
override {
362 returnValue.setValue(vec4.
getW());
364 Console::println(getMethodName() +
"(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
365 miniScript->startErrorScript();
369 miniScript->registerMethod(
new ScriptMethodVec4GetW(miniScript, TYPE_VECTOR4));
374 if (variable.getType() != getType())
return;
375 if (variable.getValuePtr() == 0ll)
return;
377 delete static_cast<Vector4*
>((
void*)variable.getValuePtr());
378 variable.setValuePtr(0ll);
382 if (variable.getType() != getType())
return;
386 vector4Value = *
static_cast<const Vector4*
>(value);
389 if (variable.getValuePtr() != 0ll) {
390 *
static_cast<Vector4*
>((
void*)variable.getValuePtr()) = vector4Value;
394 variable.setValuePtr((uint64_t)(
new Vector4(vector4Value)));
400 if (from.getType() == getType() && from.getValuePtr() != 0ll) {
401 vector4Value = *
static_cast<Vector4*
>((
void*)from.getValuePtr());
404 to.setType(
static_cast<MiniScript::ScriptVariableType
>(getType()));
405 *
static_cast<Vector4*
>((
void*)to.getValuePtr()) = vector4Value;
408 bool MiniScriptVector4::mul(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
409 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
411 if (MiniScript::hasType(argumentValues, TYPE_VECTOR4) ==
true) {
415 if (argumentValues[0].getType() == TYPE_VECTOR4) {
418 if (MiniScript::getFloatValue(argumentValues, 0, f,
false) ==
true) {
421 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
422 miniScript->startErrorScript();
428 if (argumentValues[1].getType() == TYPE_VECTOR4) {
431 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
434 Console::println(
"mul(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"mul"));
435 miniScript->startErrorScript();
441 returnValue.setType(TYPE_VECTOR4);
442 returnValue.setValue(&result);
450 bool MiniScriptVector4::div(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
451 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
453 if (argumentValues[0].getType() == TYPE_VECTOR4) {
460 if (argumentValues[1].getType() == TYPE_VECTOR4 &&
464 if (MiniScript::getFloatValue(argumentValues, 1, f,
false) ==
true) {
467 Console::println(
"div(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"div"));
468 miniScript->startErrorScript();
474 returnValue.setType(TYPE_VECTOR4);
475 returnValue.setValue(&result);
484 bool MiniScriptVector4::add(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
485 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
488 if (MiniScript::hasType(argumentValues, TYPE_VECTOR4) ==
true) {
495 returnValue.setType(TYPE_VECTOR4);
496 returnValue.setValue(&result);
500 Console::println(
"add(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"add"));
501 miniScript->startErrorScript();
510 bool MiniScriptVector4::sub(MiniScript* miniScript,
const span<MiniScript::ScriptVariable>& argumentValues, MiniScript::ScriptVariable& returnValue,
const MiniScript::ScriptStatement& statement)
const {
511 const auto TYPE_VECTOR4 =
static_cast<MiniScript::ScriptVariableType
>(getType());
514 if (MiniScript::hasType(argumentValues, TYPE_VECTOR4) ==
true) {
521 returnValue.setType(TYPE_VECTOR4);
522 returnValue.setValue(&result);
526 Console::println(
"sub(): " + miniScript->getStatementInformation(statement) +
": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(
"sub"));
527 miniScript->startErrorScript();
547 if (variable.getType() == getType() && variable.getValuePtr() != 0ll) {
548 vector4Value = *
static_cast<Vector4*
>((
void*)variable.getValuePtr());
553 to_string(vector4Value.
getX()) +
", " +
554 to_string(vector4Value.
getY()) +
", " +
555 to_string(vector4Value.
getZ()) +
", " +
556 to_string(vector4Value.
getW()) +
")";
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Vector4 clone() const
Clones this vector4.
float computeLength() const
Vector4 & normalize()
Normalizes this vector4.
Vector4 & sub(float scalar)
Subtracts a scalar.
float computeLengthSquared() const
Vector4 & scale(float scalar)
Scales this vector4.
Vector4 & add(float scalar)
Adds a scalar.
static void println()
Print new line to console.
static bool isInfinite(float value)
Check if float is infinite.
static bool isNaN(float value)
Check if float is not a number.
MiniScript Vector4 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 getVector4Value(MiniScript::ScriptVariableType TYPE_VECTOR4, const span< MiniScript::ScriptVariable > &arguments, int idx, Vector4 &value, bool optional=false)
Get vector4 value from given variable.
void setScriptVariableValue(MiniScript::ScriptVariable &variable, const void *value) const override