History

don't render raw compound collision geometry

Andrew Meadows committed 10 years ago

Commit fe419851 parent 191b7f04 files · +22 −31Browse files

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

Unified · Split

libraries/render-utils/src/Model.cpp+19−27
@@ -121,15 +121,17 @@ Model::~Model() { · 120 unmodified lines
121AbstractViewStateInterface* Model::_viewState = NULL;121AbstractViewStateInterface* Model::_viewState = NULL;
122 122
123void Model::setShowCollisionMesh(bool value) {123void Model::setShowCollisionMesh(bool value) {
124 if (_showCollisionGeometry != value) {124 if (_readyToShowCollisionGeometry) {
125 _showCollisionGeometry = value;125 if (_showCollisionGeometry != value) {
126 _needsFixupInScene = true;126 _showCollisionGeometry = value;
127 _needsFixupInScene = true;
128 }
127 }129 }
128}130}
129 131
130bool Model::needsFixupInScene() const {132bool Model::needsFixupInScene() const {
131 if ((_needsFixupInScene || !_addedToScene) && !_needsReload && isLoaded()) {133 if ((_needsFixupInScene || !_addedToScene) && !_needsReload && isLoaded()) {
132 if (_showCollisionGeometry && _collisionGeometry) {134 if (_showCollisionGeometry && _readyToShowCollisionGeometry && _collisionGeometry) {
133 return true;135 return true;
134 }136 }
135 if (!_meshStates.isEmpty() || (_renderGeometry && _renderGeometry->getMeshes().empty())) {137 if (!_meshStates.isEmpty() || (_renderGeometry && _renderGeometry->getMeshes().empty())) {
@@ -241,8 +243,6 @@ void Model::updateRenderItems() { · 105 unmodified lines
241 243
242 // collision mesh does not share the same unit scale as the FBX file's mesh: only apply offset244 // collision mesh does not share the same unit scale as the FBX file's mesh: only apply offset
243 Transform collisionMeshOffset;245 Transform collisionMeshOffset;
244 // adebug FIXME: recover correct behavior for collisionURL shapes
245 //collisionMeshOffset.postTranslate(self->_offset);
246 collisionMeshOffset.setIdentity();246 collisionMeshOffset.setIdentity();
247 foreach (auto itemID, self->_collisionRenderItems.keys()) {247 foreach (auto itemID, self->_collisionRenderItems.keys()) {
248 pendingChanges.updateItem<MeshPartPayload>(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) {248 pendingChanges.updateItem<MeshPartPayload>(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) {
@@ -614,13 +614,13 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr<render::Scene> scen · 365 unmodified lines
614bool Model::addToScene(std::shared_ptr<render::Scene> scene,614bool Model::addToScene(std::shared_ptr<render::Scene> scene,
615 render::PendingChanges& pendingChanges,615 render::PendingChanges& pendingChanges,
616 render::Item::Status::Getters& statusGetters) {616 render::Item::Status::Getters& statusGetters) {
617 bool readyToRender = (_showCollisionGeometry && _collisionGeometry) || isLoaded();617 bool readyToRender = (_showCollisionGeometry && _readyToShowCollisionGeometry && _collisionGeometry) || isLoaded();
618 if (!_addedToScene && readyToRender) {618 if (!_addedToScene && readyToRender) {
619 createRenderItemSet();619 createRenderItemSet();
620 }620 }
621 621
622 bool somethingAdded = false;622 bool somethingAdded = false;
623 if (_showCollisionGeometry && _collisionGeometry) {623 if (_showCollisionGeometry && _readyToShowCollisionGeometry && _collisionGeometry) {
624 if (_collisionRenderItems.empty()) {624 if (_collisionRenderItems.empty()) {
625 foreach (auto renderItem, _collisionRenderItemsSet) {625 foreach (auto renderItem, _collisionRenderItemsSet) {
626 auto item = scene->allocateID();626 auto item = scene->allocateID();
@@ -1258,7 +1258,7 @@ AABox Model::getRenderableMeshBound() const { · 631 unmodified lines
1258}1258}
1259 1259
1260void Model::createRenderItemSet() {1260void Model::createRenderItemSet() {
1261 if (_showCollisionGeometry && _collisionGeometry) {1261 if (_showCollisionGeometry && _readyToShowCollisionGeometry && _collisionGeometry) {
1262 if (_collisionRenderItemsSet.empty()) {1262 if (_collisionRenderItemsSet.empty()) {
1263 createCollisionRenderItemSet();1263 createCollisionRenderItemSet();
1264 }1264 }
@@ -1321,18 +1321,6 @@ void Model::createCollisionRenderItemSet() { · 56 unmodified lines
1321 // We should not have any existing renderItems if we enter this section of code1321 // We should not have any existing renderItems if we enter this section of code
1322 Q_ASSERT(_collisionRenderItemsSet.isEmpty());1322 Q_ASSERT(_collisionRenderItemsSet.isEmpty());
1323 1323
1324 Transform transform;
1325 transform.setIdentity();
1326 // adebug FIXME: recover correct behavior for collisionURL
1327 //transform.setTranslation(_translation);
1328 //transform.setRotation(_rotation);
1329
1330 Transform offset;
1331 // adebug FIXME: recover correct behavior for collisionURL
1332 offset.setIdentity();
1333 //offset.setScale(_scale);
1334 //offset.postTranslate(_offset);
1335
1336 // Run through all of the meshes, and place them into their segregated, but unsorted buckets1324 // Run through all of the meshes, and place them into their segregated, but unsorted buckets
1337 uint32_t numMeshes = (uint32_t)meshes.size();1325 uint32_t numMeshes = (uint32_t)meshes.size();
1338 for (uint32_t i = 0; i < numMeshes; i++) {1326 for (uint32_t i = 0; i < numMeshes; i++) {
@@ -1345,7 +1333,7 @@ void Model::createCollisionRenderItemSet() { · 6 unmodified lines
1345 int numParts = (int)mesh->getNumParts();1333 int numParts = (int)mesh->getNumParts();
1346 for (int partIndex = 0; partIndex < numParts; partIndex++) {1334 for (int partIndex = 0; partIndex < numParts; partIndex++) {
1347 model::MaterialPointer& material = _collisionMaterials[partIndex % NUM_COLLISION_HULL_COLORS];1335 model::MaterialPointer& material = _collisionMaterials[partIndex % NUM_COLLISION_HULL_COLORS];
1348 _collisionRenderItemsSet << std::make_shared<MeshPartPayload>(mesh, partIndex, material, transform, offset);1336 _collisionRenderItemsSet << std::make_shared<MeshPartPayload>(mesh, partIndex, material);
1349 }1337 }
1350 }1338 }
1351}1339}
@@ -1365,7 +1353,7 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 13 unmodified lines
1365 render::PendingChanges pendingChanges;1353 render::PendingChanges pendingChanges;
1366 1354
1367 bool addedPendingChanges = false;1355 bool addedPendingChanges = false;
1368 if (_showCollisionGeometry && _collisionGeometry) {1356 if (_showCollisionGeometry && _readyToShowCollisionGeometry && _collisionGeometry) {
1369 foreach (auto renderItem, _collisionRenderItemsSet) {1357 foreach (auto renderItem, _collisionRenderItemsSet) {
1370 auto item = scene->allocateID();1358 auto item = scene->allocateID();
1371 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);1359 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderItem);
@@ -1387,7 +1375,7 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 15 unmodified lines
1387 scene->enqueuePendingChanges(pendingChanges);1375 scene->enqueuePendingChanges(pendingChanges);
1388 // NOTE: updateRender items enqueues identical pendingChanges (using a lambda)1376 // NOTE: updateRender items enqueues identical pendingChanges (using a lambda)
1389 // so it looks like we're doing double work here, but I don't want to remove the call1377 // so it looks like we're doing double work here, but I don't want to remove the call
1390 // for fear there is some sideeffect we'll miss. -- Andrew 2016.07.211378 // for fear there is some side effect we'll miss. -- Andrew 2016.07.21
1391 // TODO: figure out if we really need this call to updateRenderItems() or not.1379 // TODO: figure out if we really need this call to updateRenderItems() or not.
1392 updateRenderItems();1380 updateRenderItems();
1393 }1381 }
@@ -1410,11 +1398,15 @@ void Model::setCollisionMesh(model::MeshPointer mesh) { · 16 unmodified lines
1410 _collisionWatcher.stopWatching();1398 _collisionWatcher.stopWatching();
1411 _collisionGeometry = std::make_shared<CollisionRenderGeometry>(mesh);1399 _collisionGeometry = std::make_shared<CollisionRenderGeometry>(mesh);
1412 1400
1401 // HACK: we don't want to show the _collisionGeometry until we're ready (e.g. it has been created)
1402 // hence we track whether it has been created using _readyToShowCollisionGeoemtry, because there
1403 // is an ambiguous case where _collisionGeometry is valid (from CompoundURL) but has not yet been
1404 // properly computed (zeroed offset transform) using the CollisionRenderMeshCache.
1405 //
1406 // TODO: At the moment we create the collision mesh for every model that has a collision shape
1407 // as soon as we know the shape, but we SHOULD only ever create the render mesh when we need it.
1413 if (_showCollisionGeometry) {1408 if (_showCollisionGeometry) {
1414 _needsFixupInScene = true;1409 _needsFixupInScene = true;
1415 // TODO: need to trigger:
1416 // (a) reconstruction of RenderItems
1417 // (b) and reinsertion into scene if we are showing collision geometry
1418 }1410 }
1419}1411}
1420 1412