From d0c0cdd82f569859f76fb148610d9af3429b8117 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 2 Nov 2016 16:31:34 -0700 Subject: [PATCH] polyvox corners stitch together reliably. surface-extractor dropdown in edit.js works again --- .../src/RenderablePolyVoxEntityItem.cpp | 128 +++++++++++------- .../src/RenderablePolyVoxEntityItem.h | 7 + scripts/system/html/js/entityProperties.js | 2 +- 3 files changed, 84 insertions(+), 53 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index a2ca2a7cfe..d1dd5cce8e 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -1035,50 +1035,53 @@ void RenderablePolyVoxEntityItem::copyUpperEdgesFromNeighbors() { return; } - EntityItemPointer currentXPNeighbor = _xPNeighbor.lock(); - EntityItemPointer currentYPNeighbor = _yPNeighbor.lock(); - EntityItemPointer currentZPNeighbor = _zPNeighbor.lock(); + auto currentXPNeighbor = getXPNeighbor(); + auto currentYPNeighbor = getYPNeighbor(); + auto currentZPNeighbor = getZPNeighbor(); - if (currentXPNeighbor) { - auto polyVoxXPNeighbor = std::dynamic_pointer_cast(currentXPNeighbor); - if (polyVoxXPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { - withWriteLock([&] { + if (currentXPNeighbor && currentXPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { + withWriteLock([&] { + for (int y = 0; y < _volData->getHeight(); y++) { + for (int z = 0; z < _volData->getDepth(); z++) { + uint8_t neighborValue = currentXPNeighbor->getVoxel(0, y, z); + if ((y == 0 || z == 0) && _volData->getVoxelAt(_volData->getWidth() - 1, y, z) != neighborValue) { + bonkNeighbors(); + } + _volData->setVoxelAt(_volData->getWidth() - 1, y, z, neighborValue); + } + } + }); + } + + + if (currentYPNeighbor && currentYPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { + withWriteLock([&] { + for (int x = 0; x < _volData->getWidth(); x++) { + for (int z = 0; z < _volData->getDepth(); z++) { + uint8_t neighborValue = currentYPNeighbor->getVoxel(x, 0, z); + if ((x == 0 || z == 0) && _volData->getVoxelAt(x, _volData->getHeight() - 1, z) != neighborValue) { + bonkNeighbors(); + } + _volData->setVoxelAt(x, _volData->getHeight() - 1, z, neighborValue); + } + } + }); + } + + + if (currentZPNeighbor && currentZPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { + withWriteLock([&] { + for (int x = 0; x < _volData->getWidth(); x++) { for (int y = 0; y < _volData->getHeight(); y++) { - for (int z = 0; z < _volData->getDepth(); z++) { - uint8_t neighborValue = polyVoxXPNeighbor->getVoxel(0, y, z); - _volData->setVoxelAt(_volData->getWidth() - 1, y, z, neighborValue); + uint8_t neighborValue = currentZPNeighbor->getVoxel(x, y, 0); + _volData->setVoxelAt(x, y, _volData->getDepth() - 1, neighborValue); + if ((x == 0 || y == 0) && _volData->getVoxelAt(x, y, _volData->getDepth() - 1) != neighborValue) { + bonkNeighbors(); } + _volData->setVoxelAt(x, y, _volData->getDepth() - 1, neighborValue); } - }); - } - } - - if (currentYPNeighbor) { - auto polyVoxYPNeighbor = std::dynamic_pointer_cast(currentYPNeighbor); - if (polyVoxYPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { - withWriteLock([&] { - for (int x = 0; x < _volData->getWidth(); x++) { - for (int z = 0; z < _volData->getDepth(); z++) { - uint8_t neighborValue = polyVoxYPNeighbor->getVoxel(x, 0, z); - _volData->setVoxelAt(x, _volData->getWidth() - 1, z, neighborValue); - } - } - }); - } - } - - if (currentZPNeighbor) { - auto polyVoxZPNeighbor = std::dynamic_pointer_cast(currentZPNeighbor); - if (polyVoxZPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { - withWriteLock([&] { - for (int x = 0; x < _volData->getWidth(); x++) { - for (int y = 0; y < _volData->getHeight(); y++) { - uint8_t neighborValue = polyVoxZPNeighbor->getVoxel(x, y, 0); - _volData->setVoxelAt(x, y, _volData->getDepth() - 1, neighborValue); - } - } - }); - } + } + }); } } @@ -1393,25 +1396,46 @@ void RenderablePolyVoxEntityItem::setZPNeighborID(const EntityItemID& zPNeighbor } } +std::shared_ptr RenderablePolyVoxEntityItem::getXNNeighbor() { + return std::dynamic_pointer_cast(_xNNeighbor.lock()); +} + +std::shared_ptr RenderablePolyVoxEntityItem::getYNNeighbor() { + return std::dynamic_pointer_cast(_yNNeighbor.lock()); +} + +std::shared_ptr RenderablePolyVoxEntityItem::getZNNeighbor() { + return std::dynamic_pointer_cast(_zNNeighbor.lock()); +} + +std::shared_ptr RenderablePolyVoxEntityItem::getXPNeighbor() { + return std::dynamic_pointer_cast(_xPNeighbor.lock()); +} + +std::shared_ptr RenderablePolyVoxEntityItem::getYPNeighbor() { + return std::dynamic_pointer_cast(_yPNeighbor.lock()); +} + +std::shared_ptr RenderablePolyVoxEntityItem::getZPNeighbor() { + return std::dynamic_pointer_cast(_zPNeighbor.lock()); +} + void RenderablePolyVoxEntityItem::bonkNeighbors() { // flag neighbors to the negative of this entity as needing to rebake their meshes. cacheNeighbors(); - EntityItemPointer currentXNNeighbor = _xNNeighbor.lock(); - EntityItemPointer currentYNNeighbor = _yNNeighbor.lock(); - EntityItemPointer currentZNNeighbor = _zNNeighbor.lock(); + auto currentXNNeighbor = getXNNeighbor(); + auto currentYNNeighbor = getYNNeighbor(); + auto currentZNNeighbor = getZNNeighbor(); - if (currentXNNeighbor && currentXNNeighbor->getType() == EntityTypes::PolyVox) { - auto polyVoxXNNeighbor = std::dynamic_pointer_cast(currentXNNeighbor); - polyVoxXNNeighbor->setVolDataDirty(); + if (currentXNNeighbor) { + currentXNNeighbor->setVolDataDirty(); } - if (currentYNNeighbor && currentYNNeighbor->getType() == EntityTypes::PolyVox) { - auto polyVoxYNNeighbor = std::dynamic_pointer_cast(currentYNNeighbor); - polyVoxYNNeighbor->setVolDataDirty(); + if (currentYNNeighbor) { + currentYNNeighbor->setVolDataDirty(); } - if (currentZNNeighbor && currentZNNeighbor->getType() == EntityTypes::PolyVox) { - auto polyVoxZNNeighbor = std::dynamic_pointer_cast(currentZNNeighbor); - polyVoxZNNeighbor->setVolDataDirty(); + if (currentZNNeighbor) { + currentZNNeighbor->setVolDataDirty(); } } diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 44186073b2..f84637ec95 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -116,6 +116,13 @@ public: virtual void setYPNeighborID(const EntityItemID& yPNeighborID) override; virtual void setZPNeighborID(const EntityItemID& zPNeighborID) override; + std::shared_ptr getXNNeighbor(); + std::shared_ptr getYNNeighbor(); + std::shared_ptr getZNNeighbor(); + std::shared_ptr getXPNeighbor(); + std::shared_ptr getYPNeighbor(); + std::shared_ptr getZPNeighbor(); + virtual void updateRegistrationPoint(const glm::vec3& value) override; void setVoxelsFromData(QByteArray uncompressedData, quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize); diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index a7dfb048b8..d6d9098e21 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -1492,7 +1492,7 @@ function loaded() { var lis = dropdown.parentNode.getElementsByTagName("li"); var text = ""; for (var i = 0; i < lis.length; i++) { - if (lis[i].getAttribute("value") === dropdown.value) { + if (String(lis[i].getAttribute("value")) === String(dropdown.value)) { text = lis[i].textContent; } }