From 79a2e409a8f9500ebe9b03a0fd5e4dabf38980f1 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 11 Dec 2013 13:52:52 -0800 Subject: [PATCH] Basic voxel visitation with multiple attributes. --- interface/src/renderer/MetavoxelSystem.cpp | 14 +++++++ libraries/metavoxels/src/MetavoxelData.cpp | 46 +++++++++++++++++++++- libraries/metavoxels/src/MetavoxelData.h | 14 ++++--- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/interface/src/renderer/MetavoxelSystem.cpp b/interface/src/renderer/MetavoxelSystem.cpp index fea4c374f3..76ad824f65 100644 --- a/interface/src/renderer/MetavoxelSystem.cpp +++ b/interface/src/renderer/MetavoxelSystem.cpp @@ -10,6 +10,17 @@ #include "MetavoxelSystem.h" +class DebugVisitor : public MetavoxelVisitor { +public: + + virtual bool visit(const QVector& attributeValues); +}; + +bool DebugVisitor::visit(const QVector& attributeValues) { + qDebug() << decodeInline(attributeValues.at(0).getValue()) << "\n"; + return true; +} + void MetavoxelSystem::init() { MetavoxelPath p1; p1 += 0; @@ -28,5 +39,8 @@ void MetavoxelSystem::init() { AttributeValue value = _data.getAttributeValue(p2, blerp); qDebug("fliggedy bloo %g\n", decodeInline(value.getValue())); + + DebugVisitor visitor; + _data.visitVoxels(QVector() << blerp, visitor); } diff --git a/libraries/metavoxels/src/MetavoxelData.cpp b/libraries/metavoxels/src/MetavoxelData.cpp index acedea05d1..e75b51697c 100644 --- a/libraries/metavoxels/src/MetavoxelData.cpp +++ b/libraries/metavoxels/src/MetavoxelData.cpp @@ -15,9 +15,51 @@ MetavoxelData::~MetavoxelData() { } } -void MetavoxelData::visitVoxels(const QVector& attributes, VoxelVisitor* visitor) { - // map attributes to layers, indices +class Visitation { +public: + MetavoxelVisitor& visitor; + QVector nodes; + QVector attributeValues; + + void apply(); +}; + +void Visitation::apply() { + Visitation nextVisitation = { visitor, QVector(nodes.size()), attributeValues }; + for (int i = 0; i < nodes.size(); i++) { + MetavoxelNode* node = nodes.at(i); + if (node) { + nextVisitation.attributeValues[i] = node->getAttributeValue(attributeValues[i].getAttribute()); + } + } + if (!visitor.visit(nextVisitation.attributeValues)) { + return; + } + + for (int i = 0; i < MetavoxelNode::CHILD_COUNT; i++) { + bool anyChildrenPresent = false; + for (int j = 0; j < nodes.size(); j++) { + MetavoxelNode* node = nodes.at(j); + if ((nextVisitation.nodes[j] = node ? node->getChild(i) : NULL)) { + anyChildrenPresent = true; + } + } + if (anyChildrenPresent) { + nextVisitation.apply(); + } + } +} + +void MetavoxelData::visitVoxels(const QVector& attributes, MetavoxelVisitor& visitor) { + // start with the root values/defaults + Visitation firstVisitation = { visitor, QVector(attributes.size()), + QVector(attributes.size()) }; + for (int i = 0; i < attributes.size(); i++) { + firstVisitation.nodes[i] = _roots.value(attributes[i]); + firstVisitation.attributeValues[i] = attributes[i]; + } + firstVisitation.apply(); } void MetavoxelData::setAttributeValue(const MetavoxelPath& path, const AttributeValue& attributeValue) { diff --git a/libraries/metavoxels/src/MetavoxelData.h b/libraries/metavoxels/src/MetavoxelData.h index aafc0f6e44..11b9db2505 100644 --- a/libraries/metavoxels/src/MetavoxelData.h +++ b/libraries/metavoxels/src/MetavoxelData.h @@ -12,12 +12,13 @@ #include #include #include +#include #include "AttributeRegistry.h" class MetavoxelNode; class MetavoxelPath; -class VoxelVisitor; +class MetavoxelVisitor; /// The base metavoxel representation shared between server and client. class MetavoxelData { @@ -27,7 +28,7 @@ public: /// Applies the specified function to the contained voxels. /// \param attributes the list of attributes desired - void visitVoxels(const QVector& attributes, VoxelVisitor* visitor); + void visitVoxels(const QVector& attributes, MetavoxelVisitor& visitor); /// Sets the attribute value corresponding to the specified path. void setAttributeValue(const MetavoxelPath& path, const AttributeValue& attributeValue); @@ -93,13 +94,14 @@ private: QBitArray _array; }; -/// Interface for visitors to voxels. -class VoxelVisitor { +/// Interface for visitors to metavoxels. +class MetavoxelVisitor { public: - /// Visits a voxel. + /// Visits a metavoxel. /// \param attributeValues the values of the desired attributes - virtual void visit(const QVector& attributeValues) = 0; + /// \param if true, continue descending; if false, stop + virtual bool visit(const QVector& attributeValues) = 0; }; #endif /* defined(__interface__MetavoxelData__) */