History

Update users of NetworkGeometry

Zach Pomerantz committed 10 years ago

Commit 3e9e0831 parent 7f05e4414 files · +159 −205Browse files

Showing the changes to libraries/render-utils/src/Model.cpp (1 of 14 files). Show all

Unified · Split

libraries/render-utils/src/Model.cpp+55−76
@@ -30,7 +30,7 @@ · 29 unmodified lines
30using namespace std;30using namespace std;
31 31
32static int nakedModelPointerTypeId = qRegisterMetaType<ModelPointer>();32static int nakedModelPointerTypeId = qRegisterMetaType<ModelPointer>();
33static int weakNetworkGeometryPointerTypeId = qRegisterMetaType<QWeakPointer<NetworkGeometry> >();33static int weakNetworkGeometryPointerTypeId = qRegisterMetaType<std::weak_ptr<NetworkGeometry> >();
34static int vec3VectorTypeId = qRegisterMetaType<QVector<glm::vec3> >();34static int vec3VectorTypeId = qRegisterMetaType<QVector<glm::vec3> >();
35float Model::FAKE_DIMENSION_PLACEHOLDER = -1.0f;35float Model::FAKE_DIMENSION_PLACEHOLDER = -1.0f;
36#define HTTP_INVALID_COM "http://invalid.com"36#define HTTP_INVALID_COM "http://invalid.com"
@@ -74,12 +74,12 @@ Model::~Model() { · 37 unmodified lines
74 74
75AbstractViewStateInterface* Model::_viewState = NULL;75AbstractViewStateInterface* Model::_viewState = NULL;
76 76
77bool Model::needsFixupInScene() {77bool Model::needsFixupInScene() const {
78 if (readyToAddToScene()) {78 if (readyToAddToScene()) {
79 // Once textures are loaded, fixup if they are now transparent79 // Once textures are loaded, fixup if they are now transparent
80 if (!_needsReload && _needsUpdateTransparentTextures && _geometry->isLoadedWithTextures()) {80 if (_needsUpdateTransparentTextures && _geometry->getGeometry()->areTexturesLoaded()) {
81 _needsUpdateTransparentTextures = false;81 _needsUpdateTransparentTextures = false;
82 if (_hasTransparentTextures != _geometry->hasTransparentTextures()) {82 if (_hasTransparentTextures != _geometry->getGeometry()->hasTransparentTextures()) {
83 return true;83 return true;
84 }84 }
85 }85 }
@@ -150,19 +150,18 @@ void Model::enqueueLocationChange() { · 64 unmodified lines
150}150}
151 151
152void Model::initJointTransforms() {152void Model::initJointTransforms() {
153 if (!_geometry || !_geometry->isLoaded()) {153 if (isLoaded()) {
154 return;154 glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset);
155 _rig->setModelOffset(modelOffset);
155 }156 }
156 glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset);
157 _rig->setModelOffset(modelOffset);
158}157}
159 158
160void Model::init() {159void Model::init() {
161}160}
162 161
163void Model::reset() {162void Model::reset() {
164 if (_geometry && _geometry->isLoaded()) {163 if (isLoaded()) {
165 const FBXGeometry& geometry = _geometry->getFBXGeometry();164 const FBXGeometry& geometry = getFBXGeometry();
166 _rig->reset(geometry);165 _rig->reset(geometry);
167 }166 }
168}167}
@@ -171,17 +170,16 @@ bool Model::updateGeometry() { · 2 unmodified lines
171 PROFILE_RANGE(__FUNCTION__);170 PROFILE_RANGE(__FUNCTION__);
172 bool needFullUpdate = false;171 bool needFullUpdate = false;
173 172
174 if (!_geometry || !_geometry->isLoaded()) {173 if (!isLoaded()) {
175 // geometry is not ready
176 return false;174 return false;
177 }175 }
178 176
179 _needsReload = false;177 _needsReload = false;
180 178
181 if (_rig->jointStatesEmpty() && _geometry->getFBXGeometry().joints.size() > 0) {179 if (_rig->jointStatesEmpty() && getFBXGeometry().joints.size() > 0) {
182 initJointStates();180 initJointStates();
183 181
184 const FBXGeometry& fbxGeometry = _geometry->getFBXGeometry();182 const FBXGeometry& fbxGeometry = getFBXGeometry();
185 foreach (const FBXMesh& mesh, fbxGeometry.meshes) {183 foreach (const FBXMesh& mesh, fbxGeometry.meshes) {
186 MeshState state;184 MeshState state;
187 state.clusterMatrices.resize(mesh.clusters.size());185 state.clusterMatrices.resize(mesh.clusters.size());
@@ -205,7 +203,7 @@ bool Model::updateGeometry() { · 17 unmodified lines
205 203
206// virtual204// virtual
207void Model::initJointStates() {205void Model::initJointStates() {
208 const FBXGeometry& geometry = _geometry->getFBXGeometry();206 const FBXGeometry& geometry = getFBXGeometry();
209 glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset);207 glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset);
210 208
211 _rig->initJointStates(geometry, modelOffset);209 _rig->initJointStates(geometry, modelOffset);
@@ -248,7 +246,7 @@ bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const g · 36 unmodified lines
248 glm::vec3 subMeshSurfaceNormal;246 glm::vec3 subMeshSurfaceNormal;
249 int subMeshIndex = 0;247 int subMeshIndex = 0;
250 248
251 const FBXGeometry& geometry = _geometry->getFBXGeometry();249 const FBXGeometry& geometry = getFBXGeometry();
252 250
253 // If we hit the models box, then consider the submeshes...251 // If we hit the models box, then consider the submeshes...
254 _mutex.lock();252 _mutex.lock();
@@ -367,7 +365,7 @@ void Model::recalculateMeshBoxes(bool pickAgainstTriangles) { · 112 unmodified lines
367 bool calculatedMeshTrianglesNeeded = pickAgainstTriangles && !_calculatedMeshTrianglesValid;365 bool calculatedMeshTrianglesNeeded = pickAgainstTriangles && !_calculatedMeshTrianglesValid;
368 366
369 if (!_calculatedMeshBoxesValid || calculatedMeshTrianglesNeeded || (!_calculatedMeshPartBoxesValid && pickAgainstTriangles) ) {367 if (!_calculatedMeshBoxesValid || calculatedMeshTrianglesNeeded || (!_calculatedMeshPartBoxesValid && pickAgainstTriangles) ) {
370 const FBXGeometry& geometry = _geometry->getFBXGeometry();368 const FBXGeometry& geometry = getFBXGeometry();
371 int numberOfMeshes = geometry.meshes.size();369 int numberOfMeshes = geometry.meshes.size();
372 _calculatedMeshBoxes.resize(numberOfMeshes);370 _calculatedMeshBoxes.resize(numberOfMeshes);
373 _calculatedMeshTriangles.clear();371 _calculatedMeshTriangles.clear();
@@ -478,7 +476,7 @@ void Model::recalculateMeshBoxes(bool pickAgainstTriangles) { · 104 unmodified lines
478 476
479void Model::renderSetup(RenderArgs* args) {477void Model::renderSetup(RenderArgs* args) {
480 // set up dilated textures on first render after load/simulate478 // set up dilated textures on first render after load/simulate
481 const FBXGeometry& geometry = _geometry->getFBXGeometry();479 const FBXGeometry& geometry = getFBXGeometry();
482 if (_dilatedTextures.isEmpty()) {480 if (_dilatedTextures.isEmpty()) {
483 foreach (const FBXMesh& mesh, geometry.meshes) {481 foreach (const FBXMesh& mesh, geometry.meshes) {
484 QVector<QSharedPointer<Texture> > dilated;482 QVector<QSharedPointer<Texture> > dilated;
@@ -627,7 +625,7 @@ Extents Model::getBindExtents() const { · 142 unmodified lines
627 if (!isActive()) {625 if (!isActive()) {
628 return Extents();626 return Extents();
629 }627 }
630 const Extents& bindExtents = _geometry->getFBXGeometry().bindExtents;628 const Extents& bindExtents = getFBXGeometry().bindExtents;
631 Extents scaledExtents = { bindExtents.minimum * _scale, bindExtents.maximum * _scale };629 Extents scaledExtents = { bindExtents.minimum * _scale, bindExtents.maximum * _scale };
632 return scaledExtents;630 return scaledExtents;
633}631}
@@ -636,12 +634,12 @@ Extents Model::getMeshExtents() const { · 2 unmodified lines
636 if (!isActive()) {634 if (!isActive()) {
637 return Extents();635 return Extents();
638 }636 }
639 const Extents& extents = _geometry->getFBXGeometry().meshExtents;637 const Extents& extents = getFBXGeometry().meshExtents;
640 638
641 // even though our caller asked for "unscaled" we need to include any fst scaling, translation, and rotation, which639 // even though our caller asked for "unscaled" we need to include any fst scaling, translation, and rotation, which
642 // is captured in the offset matrix640 // is captured in the offset matrix
643 glm::vec3 minimum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));641 glm::vec3 minimum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));
644 glm::vec3 maximum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));642 glm::vec3 maximum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));
645 Extents scaledExtents = { minimum * _scale, maximum * _scale };643 Extents scaledExtents = { minimum * _scale, maximum * _scale };
646 return scaledExtents;644 return scaledExtents;
647}645}
@@ -651,12 +649,12 @@ Extents Model::getUnscaledMeshExtents() const { · 3 unmodified lines
651 return Extents();649 return Extents();
652 }650 }
653 651
654 const Extents& extents = _geometry->getFBXGeometry().meshExtents;652 const Extents& extents = getFBXGeometry().meshExtents;
655 653
656 // even though our caller asked for "unscaled" we need to include any fst scaling, translation, and rotation, which654 // even though our caller asked for "unscaled" we need to include any fst scaling, translation, and rotation, which
657 // is captured in the offset matrix655 // is captured in the offset matrix
658 glm::vec3 minimum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));656 glm::vec3 minimum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));
659 glm::vec3 maximum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));657 glm::vec3 maximum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));
660 Extents scaledExtents = { minimum, maximum };658 Extents scaledExtents = { minimum, maximum };
661 659
662 return scaledExtents;660 return scaledExtents;
@@ -665,8 +663,8 @@ Extents Model::getUnscaledMeshExtents() const { · 2 unmodified lines
665Extents Model::calculateScaledOffsetExtents(const Extents& extents,663Extents Model::calculateScaledOffsetExtents(const Extents& extents,
666 glm::vec3 modelPosition, glm::quat modelOrientation) const {664 glm::vec3 modelPosition, glm::quat modelOrientation) const {
667 // we need to include any fst scaling, translation, and rotation, which is captured in the offset matrix665 // we need to include any fst scaling, translation, and rotation, which is captured in the offset matrix
668 glm::vec3 minimum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));666 glm::vec3 minimum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.minimum, 1.0f));
669 glm::vec3 maximum = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));667 glm::vec3 maximum = glm::vec3(getFBXGeometry().offset * glm::vec4(extents.maximum, 1.0f));
670 668
671 Extents scaledOffsetExtents = { ((minimum + _offset) * _scale),669 Extents scaledOffsetExtents = { ((minimum + _offset) * _scale),
672 ((maximum + _offset) * _scale) };670 ((maximum + _offset) * _scale) };
@@ -686,7 +684,7 @@ AABox Model::calculateScaledOffsetAABox(const AABox& box, glm::vec3 modelPositio · 13 unmodified lines
686 684
687glm::vec3 Model::calculateScaledOffsetPoint(const glm::vec3& point) const {685glm::vec3 Model::calculateScaledOffsetPoint(const glm::vec3& point) const {
688 // we need to include any fst scaling, translation, and rotation, which is captured in the offset matrix686 // we need to include any fst scaling, translation, and rotation, which is captured in the offset matrix
689 glm::vec3 offsetPoint = glm::vec3(_geometry->getFBXGeometry().offset * glm::vec4(point, 1.0f));687 glm::vec3 offsetPoint = glm::vec3(getFBXGeometry().offset * glm::vec4(point, 1.0f));
690 glm::vec3 scaledPoint = ((offsetPoint + _offset) * _scale);688 glm::vec3 scaledPoint = ((offsetPoint + _offset) * _scale);
691 glm::vec3 rotatedPoint = _rotation * scaledPoint;689 glm::vec3 rotatedPoint = _rotation * scaledPoint;
692 glm::vec3 translatedPoint = rotatedPoint + _translation;690 glm::vec3 translatedPoint = rotatedPoint + _translation;
@@ -714,11 +712,11 @@ void Model::setJointTranslation(int index, bool valid, const glm::vec3& translat · 21 unmodified lines
714}712}
715 713
716int Model::getParentJointIndex(int jointIndex) const {714int Model::getParentJointIndex(int jointIndex) const {
717 return (isActive() && jointIndex != -1) ? _geometry->getFBXGeometry().joints.at(jointIndex).parentIndex : -1;715 return (isActive() && jointIndex != -1) ? getFBXGeometry().joints.at(jointIndex).parentIndex : -1;
718}716}
719 717
720int Model::getLastFreeJointIndex(int jointIndex) const {718int Model::getLastFreeJointIndex(int jointIndex) const {
721 return (isActive() && jointIndex != -1) ? _geometry->getFBXGeometry().joints.at(jointIndex).freeLineage.last() : -1;719 return (isActive() && jointIndex != -1) ? getFBXGeometry().joints.at(jointIndex).freeLineage.last() : -1;
722}720}
723 721
724void Model::setURL(const QUrl& url) {722void Model::setURL(const QUrl& url) {
@@ -743,29 +741,16 @@ void Model::setURL(const QUrl& url) { · 18 unmodified lines
743 invalidCalculatedMeshBoxes();741 invalidCalculatedMeshBoxes();
744 deleteGeometry();742 deleteGeometry();
745 743
746 _geometry.reset(new NetworkGeometry(url, false, QVariantHash()));744 _geometry = DependencyManager::get<ModelCache>()->getGeometry(url);
747 onInvalidate();745 onInvalidate();
748}746}
749 747
750const QSharedPointer<NetworkGeometry> Model::getCollisionGeometry(bool delayLoad)
751{
752 if (_collisionGeometry.isNull() && !_collisionUrl.isEmpty()) {
753 _collisionGeometry.reset(new NetworkGeometry(_collisionUrl, delayLoad, QVariantHash()));
754 }
755
756 if (_collisionGeometry && _collisionGeometry->isLoaded()) {
757 return _collisionGeometry;
758 }
759
760 return QSharedPointer<NetworkGeometry>();
761}
762
763void Model::setCollisionModelURL(const QUrl& url) {748void Model::setCollisionModelURL(const QUrl& url) {
764 if (_collisionUrl == url) {749 if (_collisionUrl == url) {
765 return;750 return;
766 }751 }
767 _collisionUrl = url;752 _collisionUrl = url;
768 _collisionGeometry.reset(new NetworkGeometry(url, false, QVariantHash()));753 _collisionGeometry = DependencyManager::get<ModelCache>()->getGeometry(url);
769}754}
770 755
771bool Model::getJointPositionInWorldFrame(int jointIndex, glm::vec3& position) const {756bool Model::getJointPositionInWorldFrame(int jointIndex, glm::vec3& position) const {
@@ -815,13 +800,13 @@ QStringList Model::getJointNames() const { · 43 unmodified lines
815 Q_RETURN_ARG(QStringList, result));800 Q_RETURN_ARG(QStringList, result));
816 return result;801 return result;
817 }802 }
818 return isActive() ? _geometry->getFBXGeometry().getJointNames() : QStringList();803 return isActive() ? getFBXGeometry().getJointNames() : QStringList();
819}804}
820 805
821class Blender : public QRunnable {806class Blender : public QRunnable {
822public:807public:
823 808
824 Blender(ModelPointer model, int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,809 Blender(ModelPointer model, int blendNumber, const std::weak_ptr<NetworkGeometry>& geometry,
825 const QVector<FBXMesh>& meshes, const QVector<float>& blendshapeCoefficients);810 const QVector<FBXMesh>& meshes, const QVector<float>& blendshapeCoefficients);
826 811
827 virtual void run();812 virtual void run();
@@ -830,12 +815,12 @@ private: · 2 unmodified lines
830 815
831 ModelPointer _model;816 ModelPointer _model;
832 int _blendNumber;817 int _blendNumber;
833 QWeakPointer<NetworkGeometry> _geometry;818 std::weak_ptr<NetworkGeometry> _geometry;
834 QVector<FBXMesh> _meshes;819 QVector<FBXMesh> _meshes;
835 QVector<float> _blendshapeCoefficients;820 QVector<float> _blendshapeCoefficients;
836};821};
837 822
838Blender::Blender(ModelPointer model, int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,823Blender::Blender(ModelPointer model, int blendNumber, const std::weak_ptr<NetworkGeometry>& geometry,
839 const QVector<FBXMesh>& meshes, const QVector<float>& blendshapeCoefficients) :824 const QVector<FBXMesh>& meshes, const QVector<float>& blendshapeCoefficients) :
840 _model(model),825 _model(model),
841 _blendNumber(blendNumber),826 _blendNumber(blendNumber),
@@ -878,7 +863,7 @@ void Blender::run() { · 36 unmodified lines
878 // post the result to the geometry cache, which will dispatch to the model if still alive863 // post the result to the geometry cache, which will dispatch to the model if still alive
879 QMetaObject::invokeMethod(DependencyManager::get<ModelBlender>().data(), "setBlendedVertices",864 QMetaObject::invokeMethod(DependencyManager::get<ModelBlender>().data(), "setBlendedVertices",
880 Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber),865 Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber),
881 Q_ARG(const QWeakPointer<NetworkGeometry>&, _geometry), Q_ARG(const QVector<glm::vec3>&, vertices),866 Q_ARG(const std::weak_ptr<NetworkGeometry>&, _geometry), Q_ARG(const QVector<glm::vec3>&, vertices),
882 Q_ARG(const QVector<glm::vec3>&, normals));867 Q_ARG(const QVector<glm::vec3>&, normals));
883}868}
884 869
@@ -1010,7 +995,7 @@ void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrient · 125 unmodified lines
1010 return;995 return;
1011 }996 }
1012 _needsUpdateClusterMatrices = false;997 _needsUpdateClusterMatrices = false;
1013 const FBXGeometry& geometry = _geometry->getFBXGeometry();998 const FBXGeometry& geometry = getFBXGeometry();
1014 glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),999 glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1015 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),1000 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1016 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),1001 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
@@ -1067,26 +1052,26 @@ void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrient · 50 unmodified lines
1067}1052}
1068 1053
1069void Model::inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority) {1054void Model::inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority) {
1070 const FBXGeometry& geometry = _geometry->getFBXGeometry();1055 const FBXGeometry& geometry = getFBXGeometry();
1071 const QVector<int>& freeLineage = geometry.joints.at(endIndex).freeLineage;1056 const QVector<int>& freeLineage = geometry.joints.at(endIndex).freeLineage;
1072 glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset);1057 glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset);
1073 _rig->inverseKinematics(endIndex, targetPosition, targetRotation, priority, freeLineage, parentTransform);1058 _rig->inverseKinematics(endIndex, targetPosition, targetRotation, priority, freeLineage, parentTransform);
1074}1059}
1075 1060
1076bool Model::restoreJointPosition(int jointIndex, float fraction, float priority) {1061bool Model::restoreJointPosition(int jointIndex, float fraction, float priority) {
1077 const FBXGeometry& geometry = _geometry->getFBXGeometry();1062 const FBXGeometry& geometry = getFBXGeometry();
1078 const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;1063 const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;
1079 return _rig->restoreJointPosition(jointIndex, fraction, priority, freeLineage);1064 return _rig->restoreJointPosition(jointIndex, fraction, priority, freeLineage);
1080}1065}
1081 1066
1082float Model::getLimbLength(int jointIndex) const {1067float Model::getLimbLength(int jointIndex) const {
1083 const FBXGeometry& geometry = _geometry->getFBXGeometry();1068 const FBXGeometry& geometry = getFBXGeometry();
1084 const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;1069 const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;
1085 return _rig->getLimbLength(jointIndex, freeLineage, _scale, geometry.joints);1070 return _rig->getLimbLength(jointIndex, freeLineage, _scale, geometry.joints);
1086}1071}
1087 1072
1088bool Model::maybeStartBlender() {1073bool Model::maybeStartBlender() {
1089 const FBXGeometry& fbxGeometry = _geometry->getFBXGeometry();1074 const FBXGeometry& fbxGeometry = getFBXGeometry();
1090 if (fbxGeometry.hasBlendedMeshes()) {1075 if (fbxGeometry.hasBlendedMeshes()) {
1091 QThreadPool::globalInstance()->start(new Blender(getThisPointer(), ++_blendNumber, _geometry,1076 QThreadPool::globalInstance()->start(new Blender(getThisPointer(), ++_blendNumber, _geometry,
1092 fbxGeometry.meshes, _blendshapeCoefficients));1077 fbxGeometry.meshes, _blendshapeCoefficients));
@@ -1095,13 +1080,13 @@ bool Model::maybeStartBlender() { · 2 unmodified lines
1095 return false;1080 return false;
1096}1081}
1097 1082
1098void Model::setBlendedVertices(int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,1083void Model::setBlendedVertices(int blendNumber, const std::weak_ptr<NetworkGeometry>& geometry,
1099 const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {1084 const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {
1100 if (_geometry != geometry || _blendedVertexBuffers.empty() || blendNumber < _appliedBlendNumber) {1085 if (_geometry != geometry.lock() || _blendedVertexBuffers.empty() || blendNumber < _appliedBlendNumber) {
1101 return;1086 return;
1102 }1087 }
1103 _appliedBlendNumber = blendNumber;1088 _appliedBlendNumber = blendNumber;
1104 const FBXGeometry& fbxGeometry = _geometry->getFBXGeometry();1089 const FBXGeometry& fbxGeometry = getFBXGeometry();
1105 int index = 0;1090 int index = 0;
1106 for (int i = 0; i < fbxGeometry.meshes.size(); i++) {1091 for (int i = 0; i < fbxGeometry.meshes.size(); i++) {
1107 const FBXMesh& mesh = fbxGeometry.meshes.at(i);1092 const FBXMesh& mesh = fbxGeometry.meshes.at(i);
@@ -1118,13 +1103,6 @@ void Model::setBlendedVertices(int blendNumber, const QWeakPointer<NetworkGeomet · 10 unmodified lines
1118 }1103 }
1119}1104}
1120 1105
1121void Model::setGeometry(const QSharedPointer<NetworkGeometry>& newGeometry) {
1122 if (_geometry == newGeometry) {
1123 return;
1124 }
1125 _geometry = newGeometry;
1126}
1127
1128void Model::deleteGeometry() {1106void Model::deleteGeometry() {
1129 _blendedVertexBuffers.clear();1107 _blendedVertexBuffers.clear();
1130 _meshStates.clear();1108 _meshStates.clear();
@@ -1134,7 +1112,7 @@ void Model::deleteGeometry() { · 3 unmodified lines
1134 1112
1135AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition, glm::quat modelOrientation) const {1113AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition, glm::quat modelOrientation) const {
1136 1114
1137 if (!_geometry || !_geometry->isLoaded()) {1115 if (!isLoaded()) {
1138 return AABox();1116 return AABox();
1139 }1117 }
1140 1118
@@ -1143,10 +1121,10 @@ AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition · 2 unmodified lines
1143 bool isSkinned = state.clusterMatrices.size() > 1;1121 bool isSkinned = state.clusterMatrices.size() > 1;
1144 if (isSkinned) {1122 if (isSkinned) {
1145 // if we're skinned return the entire mesh extents because we can't know for sure our clusters don't move us1123 // if we're skinned return the entire mesh extents because we can't know for sure our clusters don't move us
1146 return calculateScaledOffsetAABox(_geometry->getFBXGeometry().meshExtents, modelPosition, modelOrientation);1124 return calculateScaledOffsetAABox(getFBXGeometry().meshExtents, modelPosition, modelOrientation);
1147 }1125 }
1148 }1126 }
1149 if (_geometry->getFBXGeometry().meshes.size() > meshIndex) {1127 if (getFBXGeometry().meshes.size() > meshIndex) {
1150 1128
1151 // FIX ME! - This is currently a hack because for some mesh parts our efforts to calculate the bounding1129 // FIX ME! - This is currently a hack because for some mesh parts our efforts to calculate the bounding
1152 // box of the mesh part fails. It seems to create boxes that are not consistent with where the1130 // box of the mesh part fails. It seems to create boxes that are not consistent with where the
@@ -1160,27 +1138,28 @@ AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition · 7 unmodified lines
1160 // return _calculatedMeshBoxes[meshIndex];1138 // return _calculatedMeshBoxes[meshIndex];
1161 //1139 //
1162 // If we not skinned use the bounds of the subMesh for all it's parts1140 // If we not skinned use the bounds of the subMesh for all it's parts
1163 const FBXMesh& mesh = _geometry->getFBXGeometry().meshes.at(meshIndex);1141 const FBXMesh& mesh = getFBXGeometry().meshes.at(meshIndex);
1164 return calculateScaledOffsetExtents(mesh.meshExtents, modelPosition, modelOrientation);1142 return calculateScaledOffsetExtents(mesh.meshExtents, modelPosition, modelOrientation);
1165 }1143 }
1166 return AABox();1144 return AABox();
1167}1145}
1168 1146
1169void Model::segregateMeshGroups() {1147void Model::segregateMeshGroups() {
1170 QSharedPointer<NetworkGeometry> networkGeometry;1148 NetworkGeometry::Pointer networkGeometry;
1171 bool showingCollisionHull = false;1149 bool showingCollisionHull = false;
1172 if (_showCollisionHull && _collisionGeometry) {1150 if (_showCollisionHull && _collisionGeometry) {
1173 if (_collisionGeometry->isLoaded()) {1151 if (isCollisionLoaded()) {
1174 networkGeometry = _collisionGeometry;1152 networkGeometry = _collisionGeometry;
1175 showingCollisionHull = true;1153 showingCollisionHull = true;
1176 } else {1154 } else {
1177 return;1155 return;
1178 }1156 }
1179 } else {1157 } else {
1158 assert(isLoaded());
1180 networkGeometry = _geometry;1159 networkGeometry = _geometry;
1181 }1160 }
1182 const FBXGeometry& geometry = networkGeometry->getFBXGeometry();1161 const FBXGeometry& geometry = networkGeometry->getGeometry()->getGeometry();
1183 const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes();1162 const auto& networkMeshes = networkGeometry->getGeometry()->getMeshes();
1184 1163
1185 // all of our mesh vectors must match in size1164 // all of our mesh vectors must match in size
1186 auto geoMeshesSize = geometry.meshes.size();1165 auto geoMeshesSize = geometry.meshes.size();
@@ -1208,7 +1187,7 @@ void Model::segregateMeshGroups() { · 21 unmodified lines
1208 int shapeID = 0;1187 int shapeID = 0;
1209 for (int i = 0; i < (int)networkMeshes.size(); i++) {1188 for (int i = 0; i < (int)networkMeshes.size(); i++) {
1210 const FBXMesh& mesh = geometry.meshes.at(i);1189 const FBXMesh& mesh = geometry.meshes.at(i);
1211 const NetworkMesh& networkMesh = *(networkMeshes.at(i).get());1190 const auto& networkMesh = networkMeshes.at(i);
1212 1191
1213 // Create the render payloads1192 // Create the render payloads
1214 int totalParts = mesh.parts.size();1193 int totalParts = mesh.parts.size();
@@ -1220,7 +1199,7 @@ void Model::segregateMeshGroups() { · 5 unmodified lines
1220 _collisionHullMaterial->setMetallic(0.02f);1199 _collisionHullMaterial->setMetallic(0.02f);
1221 _collisionHullMaterial->setRoughness(0.5f);1200 _collisionHullMaterial->setRoughness(0.5f);
1222 }1201 }
1223 _renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh._mesh, partIndex, _collisionHullMaterial, transform, offset);1202 _renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh, partIndex, _collisionHullMaterial, transform, offset);
1224 } else {1203 } else {
1225 _renderItemsSet << std::make_shared<ModelMeshPartPayload>(this, i, partIndex, shapeID, transform, offset);1204 _renderItemsSet << std::make_shared<ModelMeshPartPayload>(this, i, partIndex, shapeID, transform, offset);
1226 }1205 }
@@ -1285,7 +1264,7 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) { · 58 unmodified lines
1285}1264}
1286 1265
1287void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber,1266void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber,
1288 const QWeakPointer<NetworkGeometry>& geometry, const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {1267 const std::weak_ptr<NetworkGeometry>& geometry, const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals) {
1289 if (model) {1268 if (model) {
1290 model->setBlendedVertices(blendNumber, geometry, vertices, normals);1269 model->setBlendedVertices(blendNumber, geometry, vertices, normals);
1291 }1270 }