History

Merge remote-tracking branch 'upstream/master' into stencil2

SamGondelman committed 7 years ago

Commit 06fbc842 parents e7d12dc 2a7ef5c139 files · +5776 −1853Browse files

Showing the changes to libraries/shared/src/RegisteredMetaTypes.cpp (1 of 139 files). Show all

Unified · Split

libraries/shared/src/RegisteredMetaTypes.cpp+75−0
@@ -639,6 +639,81 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { · 638 unmodified lines
639639 mat4[3][3] = object.property("r3c3").toVariant().toFloat();
640640 }
641641
642+QVariant mat4ToVariant(const glm::mat4& mat4) {
643+ if (mat4 != mat4) {
644+ // NaN
645+ return QVariant();
646+ }
647+ QVariantMap object;
648+
649+ object["r0c0"] = mat4[0][0];
650+ object["r1c0"] = mat4[0][1];
651+ object["r2c0"] = mat4[0][2];
652+ object["r3c0"] = mat4[0][3];
653+ object["r0c1"] = mat4[1][0];
654+ object["r1c1"] = mat4[1][1];
655+ object["r2c1"] = mat4[1][2];
656+ object["r3c1"] = mat4[1][3];
657+ object["r0c2"] = mat4[2][0];
658+ object["r1c2"] = mat4[2][1];
659+ object["r2c2"] = mat4[2][2];
660+ object["r3c2"] = mat4[2][3];
661+ object["r0c3"] = mat4[3][0];
662+ object["r1c3"] = mat4[3][1];
663+ object["r2c3"] = mat4[3][2];
664+ object["r3c3"] = mat4[3][3];
665+
666+ return object;
667+}
668+
669+glm::mat4 mat4FromVariant(const QVariant& object, bool& valid) {
670+ glm::mat4 mat4;
671+ valid = false;
672+ if (!object.isValid() || object.isNull()) {
673+ return mat4;
674+ } else {
675+ const static auto getElement = [](const QVariantMap& map, const char * key, float& value, bool& everyConversionValid) {
676+ auto variantValue = map[key];
677+ if (variantValue.canConvert<float>()) {
678+ value = variantValue.toFloat();
679+ } else {
680+ everyConversionValid = false;
681+ }
682+ };
683+
684+ auto map = object.toMap();
685+ bool everyConversionValid = true;
686+
687+ getElement(map, "r0c0", mat4[0][0], everyConversionValid);
688+ getElement(map, "r1c0", mat4[0][1], everyConversionValid);
689+ getElement(map, "r2c0", mat4[0][2], everyConversionValid);
690+ getElement(map, "r3c0", mat4[0][3], everyConversionValid);
691+ getElement(map, "r0c1", mat4[1][0], everyConversionValid);
692+ getElement(map, "r1c1", mat4[1][1], everyConversionValid);
693+ getElement(map, "r2c1", mat4[1][2], everyConversionValid);
694+ getElement(map, "r3c1", mat4[1][3], everyConversionValid);
695+ getElement(map, "r0c2", mat4[2][0], everyConversionValid);
696+ getElement(map, "r1c2", mat4[2][1], everyConversionValid);
697+ getElement(map, "r2c2", mat4[2][2], everyConversionValid);
698+ getElement(map, "r3c2", mat4[2][3], everyConversionValid);
699+ getElement(map, "r0c3", mat4[3][0], everyConversionValid);
700+ getElement(map, "r1c3", mat4[3][1], everyConversionValid);
701+ getElement(map, "r2c3", mat4[3][2], everyConversionValid);
702+ getElement(map, "r3c3", mat4[3][3], everyConversionValid);
703+
704+ if (everyConversionValid) {
705+ valid = true;
706+ }
707+
708+ return mat4;
709+ }
710+}
711+
712+glm::mat4 mat4FromVariant(const QVariant& object) {
713+ bool valid = false;
714+ return mat4FromVariant(object, valid);
715+}
716+
642717 QScriptValue qVectorVec3ColorToScriptValue(QScriptEngine* engine, const QVector<glm::vec3>& vector) {
643718 QScriptValue array = engine->newArray();
644719 for (int i = 0; i < vector.size(); i++) {