Showing the changes to libraries/render-utils/src/Model.cpp (1 of 72 files). Show all
Unified · Split
| @@ -22,7 +22,6 @@ · 21 unmodified lines | ||
| 22 | 22 | #include <ViewFrustum.h> |
| 23 | 23 | |
| 24 | 24 | #include "AbstractViewStateInterface.h" |
| 25 | −#include "AnimationHandle.h" | |
| 26 | 25 | #include "Model.h" |
| 27 | 26 | #include "MeshPartPayload.h" |
| 28 | 27 | |
| @@ -91,6 +90,8 @@ void Model::setScale(const glm::vec3& scale) { · 62 unmodified lines | ||
| 91 | 90 | _scaledToFit = false; |
| 92 | 91 | } |
| 93 | 92 | |
| 93 | +const float METERS_PER_MILLIMETER = 0.01f; | |
| 94 | + | |
| 94 | 95 | void Model::setScaleInternal(const glm::vec3& scale) { |
| 95 | 96 | if (glm::distance(_scale, scale) > METERS_PER_MILLIMETER) { |
| 96 | 97 | _scale = scale; |
| @@ -120,24 +121,12 @@ void Model::enqueueLocationChange() { · 23 unmodified lines | ||
| 120 | 121 | scene->enqueuePendingChanges(pendingChanges); |
| 121 | 122 | } |
| 122 | 123 | |
| 123 | −QVector<JointState> Model::createJointStates(const FBXGeometry& geometry) { | |
| 124 | − QVector<JointState> jointStates; | |
| 125 | − for (int i = 0; i < geometry.joints.size(); ++i) { | |
| 126 | − const FBXJoint& joint = geometry.joints[i]; | |
| 127 | − // store a pointer to the FBXJoint in the JointState | |
| 128 | − JointState state(joint); | |
| 129 | − jointStates.append(state); | |
| 130 | − } | |
| 131 | − return jointStates; | |
| 132 | −}; | |
| 133 | − | |
| 134 | 124 | void Model::initJointTransforms() { |
| 135 | 125 | if (!_geometry || !_geometry->isLoaded()) { |
| 136 | 126 | return; |
| 137 | 127 | } |
| 138 | − const FBXGeometry& geometry = _geometry->getFBXGeometry(); | |
| 139 | − glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset) * geometry.offset; | |
| 140 | − _rig->initJointTransforms(parentTransform); | |
| 128 | + glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset); | |
| 129 | + _rig->setModelOffset(modelOffset); | |
| 141 | 130 | } |
| 142 | 131 | |
| 143 | 132 | void Model::init() { |
| @@ -146,14 +135,13 @@ void Model::init() { · 2 unmodified lines | ||
| 146 | 135 | void Model::reset() { |
| 147 | 136 | if (_geometry && _geometry->isLoaded()) { |
| 148 | 137 | const FBXGeometry& geometry = _geometry->getFBXGeometry(); |
| 149 | − _rig->reset(geometry.joints); | |
| 138 | + _rig->reset(geometry); | |
| 150 | 139 | } |
| 151 | 140 | } |
| 152 | 141 | |
| 153 | 142 | bool Model::updateGeometry() { |
| 154 | 143 | PROFILE_RANGE(__FUNCTION__); |
| 155 | 144 | bool needFullUpdate = false; |
| 156 | − bool needToRebuild = false; | |
| 157 | 145 | |
| 158 | 146 | if (!_geometry || !_geometry->isLoaded()) { |
| 159 | 147 | // geometry is not ready |
| @@ -162,17 +150,10 @@ bool Model::updateGeometry() { · 2 unmodified lines | ||
| 162 | 150 | |
| 163 | 151 | _needsReload = false; |
| 164 | 152 | |
| 165 | − QSharedPointer<NetworkGeometry> geometry = _geometry; | |
| 166 | − if (_rig->jointStatesEmpty()) { | |
| 167 | − const FBXGeometry& fbxGeometry = geometry->getFBXGeometry(); | |
| 168 | − if (fbxGeometry.joints.size() > 0) { | |
| 169 | − initJointStates(createJointStates(fbxGeometry)); | |
| 170 | − needToRebuild = true; | |
| 171 | − } | |
| 172 | − } | |
| 153 | + if (_rig->jointStatesEmpty() && _geometry->getFBXGeometry().joints.size() > 0) { | |
| 154 | + initJointStates(); | |
| 173 | 155 | |
| 174 | − if (needToRebuild) { | |
| 175 | − const FBXGeometry& fbxGeometry = geometry->getFBXGeometry(); | |
| 156 | + const FBXGeometry& fbxGeometry = _geometry->getFBXGeometry(); | |
| 176 | 157 | foreach (const FBXMesh& mesh, fbxGeometry.meshes) { |
| 177 | 158 | MeshState state; |
| 178 | 159 | state.clusterMatrices.resize(mesh.clusters.size()); |
| @@ -195,26 +176,11 @@ bool Model::updateGeometry() { · 16 unmodified lines | ||
| 195 | 176 | } |
| 196 | 177 | |
| 197 | 178 | // virtual |
| 198 | −void Model::initJointStates(QVector<JointState> states) { | |
| 179 | +void Model::initJointStates() { | |
| 199 | 180 | const FBXGeometry& geometry = _geometry->getFBXGeometry(); |
| 200 | − glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset) * geometry.offset; | |
| 201 | − | |
| 202 | − int rootJointIndex = geometry.rootJointIndex; | |
| 203 | − int leftHandJointIndex = geometry.leftHandJointIndex; | |
| 204 | − int leftElbowJointIndex = leftHandJointIndex >= 0 ? geometry.joints.at(leftHandJointIndex).parentIndex : -1; | |
| 205 | − int leftShoulderJointIndex = leftElbowJointIndex >= 0 ? geometry.joints.at(leftElbowJointIndex).parentIndex : -1; | |
| 206 | − int rightHandJointIndex = geometry.rightHandJointIndex; | |
| 207 | − int rightElbowJointIndex = rightHandJointIndex >= 0 ? geometry.joints.at(rightHandJointIndex).parentIndex : -1; | |
| 208 | − int rightShoulderJointIndex = rightElbowJointIndex >= 0 ? geometry.joints.at(rightElbowJointIndex).parentIndex : -1; | |
| 209 | − | |
| 210 | − _rig->initJointStates(states, parentTransform, | |
| 211 | − rootJointIndex, | |
| 212 | − leftHandJointIndex, | |
| 213 | − leftElbowJointIndex, | |
| 214 | − leftShoulderJointIndex, | |
| 215 | − rightHandJointIndex, | |
| 216 | − rightElbowJointIndex, | |
| 217 | − rightShoulderJointIndex); | |
| 181 | + glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset); | |
| 182 | + | |
| 183 | + _rig->initJointStates(geometry, modelOffset); | |
| 218 | 184 | } |
| 219 | 185 | |
| 220 | 186 | bool Model::findRayIntersectionAgainstSubMeshes(const glm::vec3& origin, const glm::vec3& direction, float& distance, |
| @@ -856,6 +822,7 @@ void Blender::run() { · 635 unmodified lines | ||
| 856 | 822 | const float NORMAL_COEFFICIENT_SCALE = 0.01f; |
| 857 | 823 | for (int i = 0, n = qMin(_blendshapeCoefficients.size(), mesh.blendshapes.size()); i < n; i++) { |
| 858 | 824 | float vertexCoefficient = _blendshapeCoefficients.at(i); |
| 825 | + const float EPSILON = 0.0001f; | |
| 859 | 826 | if (vertexCoefficient < EPSILON) { |
| 860 | 827 | continue; |
| 861 | 828 | } |
| @@ -983,9 +950,7 @@ void Model::updateRig(float deltaTime, glm::mat4 parentTransform) { · 121 unmodified lines | ||
| 983 | 950 | } |
| 984 | 951 | void Model::simulateInternal(float deltaTime) { |
| 985 | 952 | // update the world space transforms for all joints |
| 986 | − | |
| 987 | − const FBXGeometry& geometry = _geometry->getFBXGeometry(); | |
| 988 | − glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset) * geometry.offset; | |
| 953 | + glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset); | |
| 989 | 954 | updateRig(deltaTime, parentTransform); |
| 990 | 955 | } |
| 991 | 956 | void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrientation) { |
| @@ -1051,22 +1016,10 @@ void Model::updateClusterMatrices(glm::vec3 modelPosition, glm::quat modelOrient · 59 unmodified lines | ||
| 1051 | 1016 | } |
| 1052 | 1017 | } |
| 1053 | 1018 | |
| 1054 | −bool Model::setJointPosition(int jointIndex, const glm::vec3& position, const glm::quat& rotation, bool useRotation, | |
| 1055 | − int lastFreeIndex, bool allIntermediatesFree, const glm::vec3& alignment, float priority) { | |
| 1056 | − const FBXGeometry& geometry = _geometry->getFBXGeometry(); | |
| 1057 | − const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage; | |
| 1058 | − glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset) * geometry.offset; | |
| 1059 | − if (_rig->setJointPosition(jointIndex, position, rotation, useRotation, | |
| 1060 | − lastFreeIndex, allIntermediatesFree, alignment, priority, freeLineage, parentTransform)) { | |
| 1061 | − return true; | |
| 1062 | − } | |
| 1063 | − return false; | |
| 1064 | −} | |
| 1065 | − | |
| 1066 | 1019 | void Model::inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority) { |
| 1067 | 1020 | const FBXGeometry& geometry = _geometry->getFBXGeometry(); |
| 1068 | 1021 | const QVector<int>& freeLineage = geometry.joints.at(endIndex).freeLineage; |
| 1069 | − glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset) * geometry.offset; | |
| 1022 | + glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset); | |
| 1070 | 1023 | _rig->inverseKinematics(endIndex, targetPosition, targetRotation, priority, freeLineage, parentTransform); |
| 1071 | 1024 | } |
| 1072 | 1025 | |
| @@ -1125,11 +1078,7 @@ void Model::setGeometry(const QSharedPointer<NetworkGeometry>& newGeometry) { · 52 unmodified lines | ||
| 1125 | 1078 | void Model::deleteGeometry() { |
| 1126 | 1079 | _blendedVertexBuffers.clear(); |
| 1127 | 1080 | _meshStates.clear(); |
| 1128 | − if (_rig) { | |
| 1129 | − _rig->clearJointStates(); | |
| 1130 | − _rig->deleteAnimations(); | |
| 1131 | − _rig->destroyAnimGraph(); | |
| 1132 | − } | |
| 1081 | + _rig->destroyAnimGraph(); | |
| 1133 | 1082 | _blendedBlendshapeCoefficients.clear(); |
| 1134 | 1083 | } |
| 1135 | 1084 | |
| @@ -1177,8 +1126,6 @@ void Model::segregateMeshGroups() { · 41 unmodified lines | ||
| 1177 | 1126 | const FBXGeometry& geometry = networkGeometry->getFBXGeometry(); |
| 1178 | 1127 | const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes(); |
| 1179 | 1128 | |
| 1180 | − _rig->makeAnimSkeleton(geometry); | |
| 1181 | − | |
| 1182 | 1129 | // all of our mesh vectors must match in size |
| 1183 | 1130 | if ((int)networkMeshes.size() != geometry.meshes.size() || |
| 1184 | 1131 | geometry.meshes.size() != _meshStates.size()) { |