polyvox corners stitch together reliably. surface-extractor dropdown in edit.js works again

This commit is contained in:
Seth Alves 2016-11-02 16:31:34 -07:00
parent 3d160cca75
commit d0c0cdd82f
3 changed files with 84 additions and 53 deletions

View file

@ -1035,50 +1035,53 @@ void RenderablePolyVoxEntityItem::copyUpperEdgesFromNeighbors() {
return; return;
} }
EntityItemPointer currentXPNeighbor = _xPNeighbor.lock(); auto currentXPNeighbor = getXPNeighbor();
EntityItemPointer currentYPNeighbor = _yPNeighbor.lock(); auto currentYPNeighbor = getYPNeighbor();
EntityItemPointer currentZPNeighbor = _zPNeighbor.lock(); auto currentZPNeighbor = getZPNeighbor();
if (currentXPNeighbor) { if (currentXPNeighbor && currentXPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) {
auto polyVoxXPNeighbor = std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(currentXPNeighbor); withWriteLock([&] {
if (polyVoxXPNeighbor->getVoxelVolumeSize() == _voxelVolumeSize) { for (int y = 0; y < _volData->getHeight(); y++) {
withWriteLock([&] { 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 y = 0; y < _volData->getHeight(); y++) {
for (int z = 0; z < _volData->getDepth(); z++) { uint8_t neighborValue = currentZPNeighbor->getVoxel(x, y, 0);
uint8_t neighborValue = polyVoxXPNeighbor->getVoxel(0, y, z); _volData->setVoxelAt(x, y, _volData->getDepth() - 1, neighborValue);
_volData->setVoxelAt(_volData->getWidth() - 1, y, z, 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<RenderablePolyVoxEntityItem>(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<RenderablePolyVoxEntityItem>(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> RenderablePolyVoxEntityItem::getXNNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_xNNeighbor.lock());
}
std::shared_ptr<RenderablePolyVoxEntityItem> RenderablePolyVoxEntityItem::getYNNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_yNNeighbor.lock());
}
std::shared_ptr<RenderablePolyVoxEntityItem> RenderablePolyVoxEntityItem::getZNNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_zNNeighbor.lock());
}
std::shared_ptr<RenderablePolyVoxEntityItem> RenderablePolyVoxEntityItem::getXPNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_xPNeighbor.lock());
}
std::shared_ptr<RenderablePolyVoxEntityItem> RenderablePolyVoxEntityItem::getYPNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_yPNeighbor.lock());
}
std::shared_ptr<RenderablePolyVoxEntityItem> RenderablePolyVoxEntityItem::getZPNeighbor() {
return std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(_zPNeighbor.lock());
}
void RenderablePolyVoxEntityItem::bonkNeighbors() { void RenderablePolyVoxEntityItem::bonkNeighbors() {
// flag neighbors to the negative of this entity as needing to rebake their meshes. // flag neighbors to the negative of this entity as needing to rebake their meshes.
cacheNeighbors(); cacheNeighbors();
EntityItemPointer currentXNNeighbor = _xNNeighbor.lock(); auto currentXNNeighbor = getXNNeighbor();
EntityItemPointer currentYNNeighbor = _yNNeighbor.lock(); auto currentYNNeighbor = getYNNeighbor();
EntityItemPointer currentZNNeighbor = _zNNeighbor.lock(); auto currentZNNeighbor = getZNNeighbor();
if (currentXNNeighbor && currentXNNeighbor->getType() == EntityTypes::PolyVox) { if (currentXNNeighbor) {
auto polyVoxXNNeighbor = std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(currentXNNeighbor); currentXNNeighbor->setVolDataDirty();
polyVoxXNNeighbor->setVolDataDirty();
} }
if (currentYNNeighbor && currentYNNeighbor->getType() == EntityTypes::PolyVox) { if (currentYNNeighbor) {
auto polyVoxYNNeighbor = std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(currentYNNeighbor); currentYNNeighbor->setVolDataDirty();
polyVoxYNNeighbor->setVolDataDirty();
} }
if (currentZNNeighbor && currentZNNeighbor->getType() == EntityTypes::PolyVox) { if (currentZNNeighbor) {
auto polyVoxZNNeighbor = std::dynamic_pointer_cast<RenderablePolyVoxEntityItem>(currentZNNeighbor); currentZNNeighbor->setVolDataDirty();
polyVoxZNNeighbor->setVolDataDirty();
} }
} }

View file

@ -116,6 +116,13 @@ public:
virtual void setYPNeighborID(const EntityItemID& yPNeighborID) override; virtual void setYPNeighborID(const EntityItemID& yPNeighborID) override;
virtual void setZPNeighborID(const EntityItemID& zPNeighborID) override; virtual void setZPNeighborID(const EntityItemID& zPNeighborID) override;
std::shared_ptr<RenderablePolyVoxEntityItem> getXNNeighbor();
std::shared_ptr<RenderablePolyVoxEntityItem> getYNNeighbor();
std::shared_ptr<RenderablePolyVoxEntityItem> getZNNeighbor();
std::shared_ptr<RenderablePolyVoxEntityItem> getXPNeighbor();
std::shared_ptr<RenderablePolyVoxEntityItem> getYPNeighbor();
std::shared_ptr<RenderablePolyVoxEntityItem> getZPNeighbor();
virtual void updateRegistrationPoint(const glm::vec3& value) override; virtual void updateRegistrationPoint(const glm::vec3& value) override;
void setVoxelsFromData(QByteArray uncompressedData, quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize); void setVoxelsFromData(QByteArray uncompressedData, quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize);

View file

@ -1492,7 +1492,7 @@ function loaded() {
var lis = dropdown.parentNode.getElementsByTagName("li"); var lis = dropdown.parentNode.getElementsByTagName("li");
var text = ""; var text = "";
for (var i = 0; i < lis.length; i++) { 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; text = lis[i].textContent;
} }
} }