Showing the changes to libraries/render-utils/src/Model.cpp (1 of 182 files). Show all
Unified · Split
| @@ -90,7 +90,7 @@ void Model::setScale(const glm::vec3& scale) { · 89 unmodified lines | |||
| 90 | _scaledToFit = false; | 90 | _scaledToFit = false; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | const float METERS_PER_MILLIMETER = 0.01f; | 93 | const float METERS_PER_MILLIMETER = 0.01f; |
| 94 | 94 | ||
| 95 | void Model::setScaleInternal(const glm::vec3& scale) { | 95 | void Model::setScaleInternal(const glm::vec3& scale) { |
| 96 | if (glm::distance(_scale, scale) > METERS_PER_MILLIMETER) { | 96 | if (glm::distance(_scale, scale) > METERS_PER_MILLIMETER) { |
| @@ -110,11 +110,19 @@ void Model::setOffset(const glm::vec3& offset) { · 13 unmodified lines | |||
| 110 | void Model::enqueueLocationChange() { | 110 | void Model::enqueueLocationChange() { |
| 111 | render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); | 111 | render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); |
| 112 | 112 | ||
| 113 | Transform transform; | ||
| 114 | transform.setTranslation(_translation); | ||
| 115 | transform.setRotation(_rotation); | ||
| 116 | |||
| 117 | Transform offset; | ||
| 118 | offset.setScale(_scale); | ||
| 119 | offset.postTranslate(_offset); | ||
| 120 | |||
| 113 | render::PendingChanges pendingChanges; | 121 | render::PendingChanges pendingChanges; |
| 114 | foreach (auto itemID, _renderItems.keys()) { | 122 | foreach (auto itemID, _renderItems.keys()) { |
| 115 | pendingChanges.updateItem<MeshPartPayload>(itemID, [=](MeshPartPayload& data) { | 123 | pendingChanges.updateItem<MeshPartPayload>(itemID, [transform, offset](MeshPartPayload& data) { |
| 116 | data.updateModelLocation(_translation, _rotation); | 124 | data.updateTransform(transform, offset); |
| 117 | data.model->_needsUpdateClusterMatrices = true; | 125 | data.notifyLocationChanged(); |
| 118 | }); | 126 | }); |
| 119 | } | 127 | } |
| 120 | 128 | ||
| @@ -495,11 +503,10 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 374 unmodified lines | |||
| 495 | 503 | ||
| 496 | foreach (auto renderItem, _renderItemsSet) { | 504 | foreach (auto renderItem, _renderItemsSet) { |
| 497 | auto item = scene->allocateID(); | 505 | auto item = scene->allocateID(); |
| 498 | auto renderData = MeshPartPayload::Pointer(renderItem); | 506 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); |
| 499 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | ||
| 500 | pendingChanges.resetItem(item, renderPayload); | 507 | pendingChanges.resetItem(item, renderPayload); |
| 501 | pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | 508 | pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) { |
| 502 | data.model->_needsUpdateClusterMatrices = true; | 509 | data.notifyLocationChanged(); |
| 503 | }); | 510 | }); |
| 504 | _renderItems.insert(item, renderPayload); | 511 | _renderItems.insert(item, renderPayload); |
| 505 | somethingAdded = true; | 512 | somethingAdded = true; |
| @@ -523,12 +530,11 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, · 17 unmodified lines | |||
| 523 | 530 | ||
| 524 | foreach (auto renderItem, _renderItemsSet) { | 531 | foreach (auto renderItem, _renderItemsSet) { |
| 525 | auto item = scene->allocateID(); | 532 | auto item = scene->allocateID(); |
| 526 | auto renderData = MeshPartPayload::Pointer(renderItem); | 533 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); |
| 527 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | ||
| 528 | renderPayload->addStatusGetters(statusGetters); | 534 | renderPayload->addStatusGetters(statusGetters); |
| 529 | pendingChanges.resetItem(item, renderPayload); | 535 | pendingChanges.resetItem(item, renderPayload); |
| 530 | pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | 536 | pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) { |
| 531 | data.model->_needsUpdateClusterMatrices = true; | 537 | data.notifyLocationChanged(); |
| 532 | }); | 538 | }); |
| 533 | _renderItems.insert(item, renderPayload); | 539 | _renderItems.insert(item, renderPayload); |
| 534 | somethingAdded = true; | 540 | somethingAdded = true; |
| @@ -1135,8 +1141,14 @@ AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition · 600 unmodified lines | |||
| 1135 | 1141 | ||
| 1136 | void Model::segregateMeshGroups() { | 1142 | void Model::segregateMeshGroups() { |
| 1137 | QSharedPointer<NetworkGeometry> networkGeometry; | 1143 | QSharedPointer<NetworkGeometry> networkGeometry; |
| 1138 | if (_showCollisionHull && _collisionGeometry && _collisionGeometry->isLoaded()) { | 1144 | bool showingCollisionHull = false; |
| 1139 | networkGeometry = _collisionGeometry; | 1145 | if (_showCollisionHull && _collisionGeometry) { |
| 1146 | if (_collisionGeometry->isLoaded()) { | ||
| 1147 | networkGeometry = _collisionGeometry; | ||
| 1148 | showingCollisionHull = true; | ||
| 1149 | } else { | ||
| 1150 | return; | ||
| 1151 | } | ||
| 1140 | } else { | 1152 | } else { |
| 1141 | networkGeometry = _geometry; | 1153 | networkGeometry = _geometry; |
| 1142 | } | 1154 | } |
| @@ -1144,8 +1156,10 @@ void Model::segregateMeshGroups() { · 1 unmodified line | |||
| 1144 | const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes(); | 1156 | const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes(); |
| 1145 | 1157 | ||
| 1146 | // all of our mesh vectors must match in size | 1158 | // all of our mesh vectors must match in size |
| 1147 | if ((int)networkMeshes.size() != geometry.meshes.size() || | 1159 | auto geoMeshesSize = geometry.meshes.size(); |
| 1148 | geometry.meshes.size() != _meshStates.size()) { | 1160 | if ((int)networkMeshes.size() != geoMeshesSize || |
| 1161 | // geometry.meshes.size() != _meshStates.size()) { | ||
| 1162 | geoMeshesSize > _meshStates.size()) { | ||
| 1149 | qDebug() << "WARNING!!!! Mesh Sizes don't match! We will not segregate mesh groups yet."; | 1163 | qDebug() << "WARNING!!!! Mesh Sizes don't match! We will not segregate mesh groups yet."; |
| 1150 | return; | 1164 | return; |
| 1151 | } | 1165 | } |
| @@ -1155,15 +1169,30 @@ void Model::segregateMeshGroups() { · 3 unmodified lines | |||
| 1155 | 1169 | ||
| 1156 | _renderItemsSet.clear(); | 1170 | _renderItemsSet.clear(); |
| 1157 | 1171 | ||
| 1172 | Transform transform; | ||
| 1173 | transform.setTranslation(_translation); | ||
| 1174 | transform.setRotation(_rotation); | ||
| 1175 | |||
| 1176 | Transform offset; | ||
| 1177 | offset.setScale(_scale); | ||
| 1178 | offset.postTranslate(_offset); | ||
| 1179 | |||
| 1158 | // Run through all of the meshes, and place them into their segregated, but unsorted buckets | 1180 | // Run through all of the meshes, and place them into their segregated, but unsorted buckets |
| 1159 | int shapeID = 0; | 1181 | int shapeID = 0; |
| 1160 | for (int i = 0; i < (int)networkMeshes.size(); i++) { | 1182 | for (int i = 0; i < (int)networkMeshes.size(); i++) { |
| 1161 | const FBXMesh& mesh = geometry.meshes.at(i); | 1183 | const FBXMesh& mesh = geometry.meshes.at(i); |
| 1184 | const NetworkMesh& networkMesh = *(networkMeshes.at(i).get()); | ||
| 1162 | 1185 | ||
| 1163 | // Create the render payloads | 1186 | // Create the render payloads |
| 1164 | int totalParts = mesh.parts.size(); | 1187 | int totalParts = mesh.parts.size(); |
| 1165 | for (int partIndex = 0; partIndex < totalParts; partIndex++) { | 1188 | for (int partIndex = 0; partIndex < totalParts; partIndex++) { |
| 1166 | _renderItemsSet << std::make_shared<MeshPartPayload>(this, i, partIndex, shapeID, _translation, _rotation); | 1189 | if (showingCollisionHull) { |
| 1190 | _renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform, offset); | ||
| 1191 | |||
| 1192 | } else { | ||
| 1193 | _renderItemsSet << std::make_shared<ModelMeshPartPayload>(this, i, partIndex, shapeID, transform, offset); | ||
| 1194 | } | ||
| 1195 | |||
| 1167 | shapeID++; | 1196 | shapeID++; |
| 1168 | } | 1197 | } |
| 1169 | } | 1198 | } |
| @@ -1176,15 +1205,22 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 6 unmodified lines | |||
| 1176 | 1205 | ||
| 1177 | render::PendingChanges pendingChanges; | 1206 | render::PendingChanges pendingChanges; |
| 1178 | 1207 | ||
| 1208 | Transform transform; | ||
| 1209 | transform.setTranslation(_translation); | ||
| 1210 | transform.setRotation(_rotation); | ||
| 1211 | |||
| 1212 | Transform offset; | ||
| 1213 | offset.setScale(_scale); | ||
| 1214 | offset.postTranslate(_offset); | ||
| 1215 | |||
| 1179 | foreach (auto renderItem, _renderItemsSet) { | 1216 | foreach (auto renderItem, _renderItemsSet) { |
| 1180 | auto item = scene->allocateID(); | 1217 | auto item = scene->allocateID(); |
| 1181 | auto renderData = MeshPartPayload::Pointer(renderItem); | 1218 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); |
| 1182 | auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | ||
| 1183 | _renderItems.insert(item, renderPayload); | 1219 | _renderItems.insert(item, renderPayload); |
| 1184 | pendingChanges.resetItem(item, renderPayload); | 1220 | pendingChanges.resetItem(item, renderPayload); |
| 1185 | pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | 1221 | pendingChanges.updateItem<MeshPartPayload>(item, [transform,offset](MeshPartPayload& data) { |
| 1186 | data.updateModelLocation(_translation, _rotation); | 1222 | data.updateTransform(transform, offset); |
| 1187 | data.model->_needsUpdateClusterMatrices = true; | 1223 | data.notifyLocationChanged(); |
| 1188 | }); | 1224 | }); |
| 1189 | } | 1225 | } |
| 1190 | scene->enqueuePendingChanges(pendingChanges); | 1226 | scene->enqueuePendingChanges(pendingChanges); |