From fd297f1c03649220ee2859f3661a35776949eccc Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 21 Dec 2017 10:36:41 -0800 Subject: [PATCH 1/6] convert negative relative indices to absolute indices --- libraries/fbx/src/OBJReader.cpp | 22 +++++++++++++++++++++- libraries/render-utils/src/Model.cpp | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/libraries/fbx/src/OBJReader.cpp b/libraries/fbx/src/OBJReader.cpp index 315c6a86d2..6659e879a0 100644 --- a/libraries/fbx/src/OBJReader.cpp +++ b/libraries/fbx/src/OBJReader.cpp @@ -457,13 +457,33 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi // vertex-index/texture-index // vertex-index/texture-index/surface-normal-index QByteArray token = tokenizer.getDatum(); - if (!isdigit(token[0])) { // Tokenizer treats line endings as whitespace. Non-digit indicates done; + auto firstChar = token[0]; + // Tokenizer treats line endings as whitespace. Non-digit and non-negative sign indicates done; + if (!isdigit(firstChar) && firstChar != '-') { tokenizer.pushBackToken(OBJTokenizer::DATUM_TOKEN); break; } QList parts = token.split('/'); assert(parts.count() >= 1); assert(parts.count() <= 3); + // If indices are negative relative indices then adjust them to absolute indices based on current vector sizes + // Also add 1 to each index as 1 will be subtracted later on from each index in OBJFace::add + int part0 = parts[0].toInt(); + if (part0 < 0) { + parts[0].setNum(vertices.size() - abs(part0) + 1); + } + if (parts.count() > 1) { + int part1 = parts[1].toInt(); + if (part1 < 0) { + parts[1].setNum(textureUVs.size() - abs(part1) + 1); + } + if (parts.count() > 2) { + int part2 = parts[2].toInt(); + if (part2 < 0) { + parts[2].setNum(normals.size() - abs(part2) + 1); + } + } + } const QByteArray noData {}; face.add(parts[0], (parts.count() > 1) ? parts[1] : noData, (parts.count() > 2) ? parts[2] : noData, vertices, vertexColors); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c4bc435691..55da589448 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -163,7 +163,7 @@ void Model::setScale(const glm::vec3& scale) { _scaledToFit = false; } -const float SCALE_CHANGE_EPSILON = 0.001f; +const float SCALE_CHANGE_EPSILON = 0.000001f; void Model::setScaleInternal(const glm::vec3& scale) { if (glm::distance(_scale, scale) > SCALE_CHANGE_EPSILON) { From f800a6d6fc09abedf4991371904ea8026ec2ea81 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 21 Dec 2017 17:00:27 -0800 Subject: [PATCH 2/6] scale change --- libraries/render-utils/src/Model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 55da589448..d64d841100 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -163,7 +163,7 @@ void Model::setScale(const glm::vec3& scale) { _scaledToFit = false; } -const float SCALE_CHANGE_EPSILON = 0.000001f; +const float SCALE_CHANGE_EPSILON = 0.0000001f; void Model::setScaleInternal(const glm::vec3& scale) { if (glm::distance(_scale, scale) > SCALE_CHANGE_EPSILON) { From 74fc7037496ccd1bef6d1ccd1c96a701028a9c2c Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 22 Dec 2017 16:41:35 -0800 Subject: [PATCH 3/6] merge --- interface/resources/qml/js/Utils.jsc | Bin 6596 -> 6516 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/interface/resources/qml/js/Utils.jsc b/interface/resources/qml/js/Utils.jsc index ab20e996b9469915ac6a89901da175143e6b5024..8da68e4e192018ee2b4f3d835ec91f36f0161eca 100644 GIT binary patch delta 522 zcmX?N{KZJ8u*@VmC9xz?kb!}Lk&~5STcM<00wV*14l4u0rhn_zD^;ej?k>4g!mi%G zd85u0My4%nlMgYvF+C98%*ABHq-@E+z>vm}$&ka4%3#Hy4~8yaRtiHBLn1>mL-yoY zme9>xSavcq8f?zvxX;LFu-T8xhB-~cvzy7I+abZT(?w;5Z?~9lcMw!410*y7MW_HI z)PW*Y0TOCJ7HViFnI&N2cysApZo@sr}K+4E}OiT-VC&A*2iV;C72bXXY}mb_f{tI)LMb*EnX9J{G= zWjE?fVPxWFpL~eXjmbb{GZ&K)lcEI!149}^CPNNGDuWe+J{UTKSV!qu$P@xQv&;%5r0+3J# zickeer~z51p@D&c!LzePrQ-kp|4@m^A9y8vAm%nqfJ$c|q`_`zm;seYK$lnmm56{y zI39Phm>j})kdv7eWRZ)?jLG}?J(xDJOx`D`JXuG8Z}JL$VaC6c_wai&DZm7I_&)Iq z-167~3SS0>5B8H41jOnE9)IGGd+4!a)=UuiXrJc6pLZgSU+*D*n>GUj15EV<2e8B^ z{2Kn8s9?FPGD3MA9~ zMq$_Fat`Uu69ftv87(F=3MGm|!vW+*kU5~R2l;h#rBDLn Date: Thu, 28 Dec 2017 11:56:39 -0800 Subject: [PATCH 4/6] fix scaling threshold --- libraries/shared/src/Transform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/Transform.cpp b/libraries/shared/src/Transform.cpp index 3e29c38add..eeb726ba72 100644 --- a/libraries/shared/src/Transform.cpp +++ b/libraries/shared/src/Transform.cpp @@ -19,7 +19,7 @@ #include "shared/JSONHelpers.h" void Transform::evalRotationScale(Quat& rotation, Vec3& scale, const Mat3& rotationScaleMatrix) { - const float ACCURACY_THREASHOLD = 0.00001f; + const float ACCURACY_THREASHOLD = 0.000001f; // Following technique taken from: // http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html From 307867a91fd5ac991827ff9eb5e31585cbb24912 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 4 Jan 2018 16:53:35 -0800 Subject: [PATCH 5/6] adjust to for loop --- libraries/fbx/src/OBJReader.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libraries/fbx/src/OBJReader.cpp b/libraries/fbx/src/OBJReader.cpp index 6659e879a0..6071d3cb35 100644 --- a/libraries/fbx/src/OBJReader.cpp +++ b/libraries/fbx/src/OBJReader.cpp @@ -468,19 +468,19 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi assert(parts.count() <= 3); // If indices are negative relative indices then adjust them to absolute indices based on current vector sizes // Also add 1 to each index as 1 will be subtracted later on from each index in OBJFace::add - int part0 = parts[0].toInt(); - if (part0 < 0) { - parts[0].setNum(vertices.size() - abs(part0) + 1); - } - if (parts.count() > 1) { - int part1 = parts[1].toInt(); - if (part1 < 0) { - parts[1].setNum(textureUVs.size() - abs(part1) + 1); - } - if (parts.count() > 2) { - int part2 = parts[2].toInt(); - if (part2 < 0) { - parts[2].setNum(normals.size() - abs(part2) + 1); + for (int i = 0; i < parts.count(); ++i) { + int part = parts[i].toInt(); + if (part < 0) { + switch (i) { + case 0: + parts[i].setNum(vertices.size() - abs(part) + 1); + break; + case 1: + parts[i].setNum(textureUVs.size() - abs(part) + 1); + break; + case 2: + parts[i].setNum(normals.size() - abs(part) + 1); + break; } } } From 7558b0046769692ac494bbf2dc97fbebd5e7ae09 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 4 Jan 2018 17:49:39 -0800 Subject: [PATCH 6/6] better fix for model scale floor, remove abs --- libraries/fbx/src/OBJReader.cpp | 6 +++--- libraries/shared/src/Transform.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/fbx/src/OBJReader.cpp b/libraries/fbx/src/OBJReader.cpp index 6071d3cb35..7fb916efde 100644 --- a/libraries/fbx/src/OBJReader.cpp +++ b/libraries/fbx/src/OBJReader.cpp @@ -473,13 +473,13 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi if (part < 0) { switch (i) { case 0: - parts[i].setNum(vertices.size() - abs(part) + 1); + parts[i].setNum(vertices.size() + part + 1); break; case 1: - parts[i].setNum(textureUVs.size() - abs(part) + 1); + parts[i].setNum(textureUVs.size() + part + 1); break; case 2: - parts[i].setNum(normals.size() - abs(part) + 1); + parts[i].setNum(normals.size() + part + 1); break; } } diff --git a/libraries/shared/src/Transform.cpp b/libraries/shared/src/Transform.cpp index eeb726ba72..67da2f6911 100644 --- a/libraries/shared/src/Transform.cpp +++ b/libraries/shared/src/Transform.cpp @@ -19,7 +19,7 @@ #include "shared/JSONHelpers.h" void Transform::evalRotationScale(Quat& rotation, Vec3& scale, const Mat3& rotationScaleMatrix) { - const float ACCURACY_THREASHOLD = 0.000001f; + const float ACCURACY_THREASHOLD = 0.00001f; // Following technique taken from: // http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html @@ -49,7 +49,7 @@ void Transform::evalRotationScale(Quat& rotation, Vec3& scale, const Mat3& rotat // extract scale of the matrix as the length of each axis Mat3 scaleMat = glm::inverse(rotationMat) * rotationScaleMatrix; - scale = glm::max(Vec3(ACCURACY_THREASHOLD), Vec3(scaleMat[0][0], scaleMat[1][1], scaleMat[2][2])); + scale = Vec3(scaleMat[0][0], scaleMat[1][1], scaleMat[2][2]); // Let's work on a local matrix containing rotation only Mat3 matRot(