Showing the changes to libraries/shared/src/RegisteredMetaTypes.cpp (1 of 139 files). Show all
Unified · Split
| @@ -639,6 +639,81 @@ void mat4FromScriptValue(const QScriptValue& object, glm::mat4& mat4) { · 638 unmodified lines | ||
| 639 | 639 | mat4[3][3] = object.property("r3c3").toVariant().toFloat(); |
| 640 | 640 | } |
| 641 | 641 | |
| 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 | + | |
| 642 | 717 | QScriptValue qVectorVec3ColorToScriptValue(QScriptEngine* engine, const QVector<glm::vec3>& vector) { |
| 643 | 718 | QScriptValue array = engine->newArray(); |
| 644 | 719 | for (int i = 0; i < vector.size(); i++) { |