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 | 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 | 95 | void Model::setScaleInternal(const glm::vec3& scale) { |
| 96 | 96 | if (glm::distance(_scale, scale) > METERS_PER_MILLIMETER) { |
| @@ -110,11 +110,19 @@ void Model::setOffset(const glm::vec3& offset) { · 13 unmodified lines | ||
| 110 | 110 | void Model::enqueueLocationChange() { |
| 111 | 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 | 121 | render::PendingChanges pendingChanges; |
| 114 | 122 | foreach (auto itemID, _renderItems.keys()) { |
| 115 | − pendingChanges.updateItem<MeshPartPayload>(itemID, [=](MeshPartPayload& data) { | |
| 116 | − data.updateModelLocation(_translation, _rotation); | |
| 117 | − data.model->_needsUpdateClusterMatrices = true; | |
| 123 | + pendingChanges.updateItem<MeshPartPayload>(itemID, [transform, offset](MeshPartPayload& data) { | |
| 124 | + data.updateTransform(transform, offset); | |
| 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 | 504 | foreach (auto renderItem, _renderItemsSet) { |
| 497 | 505 | auto item = scene->allocateID(); |
| 498 | − auto renderData = MeshPartPayload::Pointer(renderItem); | |
| 499 | − auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | |
| 506 | + auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); | |
| 500 | 507 | pendingChanges.resetItem(item, renderPayload); |
| 501 | − pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | |
| 502 | − data.model->_needsUpdateClusterMatrices = true; | |
| 508 | + pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) { | |
| 509 | + data.notifyLocationChanged(); | |
| 503 | 510 | }); |
| 504 | 511 | _renderItems.insert(item, renderPayload); |
| 505 | 512 | somethingAdded = true; |
| @@ -523,12 +530,11 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, · 17 unmodified lines | ||
| 523 | 530 | |
| 524 | 531 | foreach (auto renderItem, _renderItemsSet) { |
| 525 | 532 | auto item = scene->allocateID(); |
| 526 | − auto renderData = MeshPartPayload::Pointer(renderItem); | |
| 527 | − auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | |
| 533 | + auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); | |
| 528 | 534 | renderPayload->addStatusGetters(statusGetters); |
| 529 | 535 | pendingChanges.resetItem(item, renderPayload); |
| 530 | − pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | |
| 531 | − data.model->_needsUpdateClusterMatrices = true; | |
| 536 | + pendingChanges.updateItem<MeshPartPayload>(item, [](MeshPartPayload& data) { | |
| 537 | + data.notifyLocationChanged(); | |
| 532 | 538 | }); |
| 533 | 539 | _renderItems.insert(item, renderPayload); |
| 534 | 540 | somethingAdded = true; |
| @@ -1135,8 +1141,14 @@ AABox Model::getPartBounds(int meshIndex, int partIndex, glm::vec3 modelPosition · 600 unmodified lines | ||
| 1135 | 1141 | |
| 1136 | 1142 | void Model::segregateMeshGroups() { |
| 1137 | 1143 | QSharedPointer<NetworkGeometry> networkGeometry; |
| 1138 | − if (_showCollisionHull && _collisionGeometry && _collisionGeometry->isLoaded()) { | |
| 1139 | − networkGeometry = _collisionGeometry; | |
| 1144 | + bool showingCollisionHull = false; | |
| 1145 | + if (_showCollisionHull && _collisionGeometry) { | |
| 1146 | + if (_collisionGeometry->isLoaded()) { | |
| 1147 | + networkGeometry = _collisionGeometry; | |
| 1148 | + showingCollisionHull = true; | |
| 1149 | + } else { | |
| 1150 | + return; | |
| 1151 | + } | |
| 1140 | 1152 | } else { |
| 1141 | 1153 | networkGeometry = _geometry; |
| 1142 | 1154 | } |
| @@ -1144,8 +1156,10 @@ void Model::segregateMeshGroups() { · 1 unmodified line | ||
| 1144 | 1156 | const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = networkGeometry->getMeshes(); |
| 1145 | 1157 | |
| 1146 | 1158 | // all of our mesh vectors must match in size |
| 1147 | − if ((int)networkMeshes.size() != geometry.meshes.size() || | |
| 1148 | − geometry.meshes.size() != _meshStates.size()) { | |
| 1159 | + auto geoMeshesSize = geometry.meshes.size(); | |
| 1160 | + if ((int)networkMeshes.size() != geoMeshesSize || | |
| 1161 | + // geometry.meshes.size() != _meshStates.size()) { | |
| 1162 | + geoMeshesSize > _meshStates.size()) { | |
| 1149 | 1163 | qDebug() << "WARNING!!!! Mesh Sizes don't match! We will not segregate mesh groups yet."; |
| 1150 | 1164 | return; |
| 1151 | 1165 | } |
| @@ -1155,15 +1169,30 @@ void Model::segregateMeshGroups() { · 3 unmodified lines | ||
| 1155 | 1169 | |
| 1156 | 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 | 1180 | // Run through all of the meshes, and place them into their segregated, but unsorted buckets |
| 1159 | 1181 | int shapeID = 0; |
| 1160 | 1182 | for (int i = 0; i < (int)networkMeshes.size(); i++) { |
| 1161 | 1183 | const FBXMesh& mesh = geometry.meshes.at(i); |
| 1184 | + const NetworkMesh& networkMesh = *(networkMeshes.at(i).get()); | |
| 1162 | 1185 | |
| 1163 | 1186 | // Create the render payloads |
| 1164 | 1187 | int totalParts = mesh.parts.size(); |
| 1165 | 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 | 1196 | shapeID++; |
| 1168 | 1197 | } |
| 1169 | 1198 | } |
| @@ -1176,15 +1205,22 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 6 unmodified lines | ||
| 1176 | 1205 | |
| 1177 | 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 | 1216 | foreach (auto renderItem, _renderItemsSet) { |
| 1180 | 1217 | auto item = scene->allocateID(); |
| 1181 | − auto renderData = MeshPartPayload::Pointer(renderItem); | |
| 1182 | − auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData); | |
| 1218 | + auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem); | |
| 1183 | 1219 | _renderItems.insert(item, renderPayload); |
| 1184 | 1220 | pendingChanges.resetItem(item, renderPayload); |
| 1185 | − pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { | |
| 1186 | − data.updateModelLocation(_translation, _rotation); | |
| 1187 | − data.model->_needsUpdateClusterMatrices = true; | |
| 1221 | + pendingChanges.updateItem<MeshPartPayload>(item, [transform,offset](MeshPartPayload& data) { | |
| 1222 | + data.updateTransform(transform, offset); | |
| 1223 | + data.notifyLocationChanged(); | |
| 1188 | 1224 | }); |
| 1189 | 1225 | } |
| 1190 | 1226 | scene->enqueuePendingChanges(pendingChanges); |