Working on guide/script support.

This commit is contained in:
Andrzej Kapolka 2013-12-16 13:44:24 -08:00
parent 5458e7a555
commit 0ca2320711
6 changed files with 65 additions and 21 deletions

View file

@ -39,16 +39,13 @@ void MetavoxelSystem::init() {
_data.setAttributeValue(p1, AttributeValue(color, encodeInline(qRgba(0xFF, 0xFF, 0xFF, 0xFF)))); _data.setAttributeValue(p1, AttributeValue(color, encodeInline(qRgba(0xFF, 0xFF, 0xFF, 0xFF))));
bool blerp = true;
_data.setAttributeValue(p1, AttributeValue(AttributeRegistry::getInstance()->getAttribute("voxelizer"), &blerp));
_buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw); _buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw);
_buffer.create(); _buffer.create();
} }
void MetavoxelSystem::simulate(float deltaTime) { void MetavoxelSystem::simulate(float deltaTime) {
_points.clear(); _points.clear();
_data.traverse(_pointVisitor); _data.guide(_pointVisitor);
_buffer.bind(); _buffer.bind();
int bytes = _points.size() * sizeof(Point); int bytes = _points.size() * sizeof(Point);
@ -104,8 +101,7 @@ void MetavoxelSystem::render() {
MetavoxelSystem::PointVisitor::PointVisitor(QVector<Point>& points) : MetavoxelSystem::PointVisitor::PointVisitor(QVector<Point>& points) :
MetavoxelVisitor(QVector<AttributePointer>() << MetavoxelVisitor(QVector<AttributePointer>() <<
AttributeRegistry::getInstance()->getColorAttribute() << AttributeRegistry::getInstance()->getColorAttribute() <<
AttributeRegistry::getInstance()->getNormalAttribute() << AttributeRegistry::getInstance()->getNormalAttribute()),
AttributeRegistry::getInstance()->getVoxelizerAttribute()),
_points(points) { _points(points) {
} }
@ -115,7 +111,6 @@ bool MetavoxelSystem::PointVisitor::visit(const MetavoxelInfo& info) {
} }
QRgb color = info.attributeValues.at(0).getInlineValue<QRgb>(); QRgb color = info.attributeValues.at(0).getInlineValue<QRgb>();
QRgb normal = info.attributeValues.at(1).getInlineValue<QRgb>(); QRgb normal = info.attributeValues.at(1).getInlineValue<QRgb>();
bool blerp = *info.attributeValues.at(2).getPointerValue<bool>();
int alpha = qAlpha(color); int alpha = qAlpha(color);
if (alpha > 0) { if (alpha > 0) {
Point point = { glm::vec4(info.minimum + glm::vec3(info.size, info.size, info.size) * 0.5f, info.size), Point point = { glm::vec4(info.minimum + glm::vec3(info.size, info.size, info.size) * 0.5f, info.size),

View file

@ -13,7 +13,7 @@ find_package(Qt5Widgets REQUIRED)
include(${MACRO_DIR}/SetupHifiLibrary.cmake) include(${MACRO_DIR}/SetupHifiLibrary.cmake)
setup_hifi_library(${TARGET_NAME}) setup_hifi_library(${TARGET_NAME})
qt5_use_modules(${TARGET_NAME} Widgets) qt5_use_modules(${TARGET_NAME} Widgets Script)
include(${MACRO_DIR}/IncludeGLM.cmake) include(${MACRO_DIR}/IncludeGLM.cmake)
include_glm(${TARGET_NAME} ${ROOT_DIR}) include_glm(${TARGET_NAME} ${ROOT_DIR})

View file

@ -7,13 +7,14 @@
// //
#include "AttributeRegistry.h" #include "AttributeRegistry.h"
#include "MetavoxelData.h"
AttributeRegistry AttributeRegistry::_instance; AttributeRegistry AttributeRegistry::_instance;
AttributeRegistry::AttributeRegistry() : AttributeRegistry::AttributeRegistry() :
_guideAttribute(registerAttribute(new PolymorphicAttribute("guide", PolymorphicDataPointer(new DefaultMetavoxelGuide())))),
_colorAttribute(registerAttribute(new QRgbAttribute("color"))), _colorAttribute(registerAttribute(new QRgbAttribute("color"))),
_normalAttribute(registerAttribute(new QRgbAttribute("normal", qRgb(0, 127, 0)))), _normalAttribute(registerAttribute(new QRgbAttribute("normal", qRgb(0, 127, 0)))) {
_voxelizerAttribute(registerAttribute(new SimplePointerAttribute<bool>("voxelizer", false))) {
} }
AttributePointer AttributeRegistry::registerAttribute(AttributePointer attribute) { AttributePointer AttributeRegistry::registerAttribute(AttributePointer attribute) {

View file

@ -44,23 +44,23 @@ public:
/// Retrieves an attribute by name. /// Retrieves an attribute by name.
AttributePointer getAttribute(const QString& name) const { return _attributes.value(name); } AttributePointer getAttribute(const QString& name) const { return _attributes.value(name); }
/// Returns a reference to the standard PolymorphicDataPointer "guide" attribute.
const AttributePointer& getGuideAttribute() const { return _guideAttribute; }
/// Returns a reference to the standard QRgb "color" attribute. /// Returns a reference to the standard QRgb "color" attribute.
const AttributePointer& getColorAttribute() const { return _colorAttribute; } const AttributePointer& getColorAttribute() const { return _colorAttribute; }
/// Returns a reference to the standard QRgb "normal" attribute. /// Returns a reference to the standard QRgb "normal" attribute.
const AttributePointer& getNormalAttribute() const { return _normalAttribute; } const AttributePointer& getNormalAttribute() const { return _normalAttribute; }
/// Returns a reference to the standard "voxelizer" attribute.
const AttributePointer& getVoxelizerAttribute() const { return _voxelizerAttribute; }
private: private:
static AttributeRegistry _instance; static AttributeRegistry _instance;
QHash<QString, AttributePointer> _attributes; QHash<QString, AttributePointer> _attributes;
AttributePointer _guideAttribute;
AttributePointer _colorAttribute; AttributePointer _colorAttribute;
AttributePointer _normalAttribute; AttributePointer _normalAttribute;
AttributePointer _voxelizerAttribute;
}; };
/// Converts a value to a void pointer. /// Converts a value to a void pointer.
@ -253,7 +253,8 @@ typedef QSharedDataPointer<PolymorphicData> PolymorphicDataPointer;
/// Provides polymorphic streaming and averaging. /// Provides polymorphic streaming and averaging.
class PolymorphicAttribute : public InlineAttribute<PolymorphicDataPointer> { class PolymorphicAttribute : public InlineAttribute<PolymorphicDataPointer> {
public:
PolymorphicAttribute(const QString& name, const PolymorphicDataPointer& defaultValue = PolymorphicDataPointer()); PolymorphicAttribute(const QString& name, const PolymorphicDataPointer& defaultValue = PolymorphicDataPointer());
virtual bool merge(void*& parent, void* children[]) const; virtual bool merge(void*& parent, void* children[]) const;

View file

@ -63,7 +63,7 @@ bool Visitation::allNodesLeaves() const {
return true; return true;
} }
void MetavoxelData::traverse(MetavoxelVisitor& visitor) { void MetavoxelData::guide(MetavoxelVisitor& visitor) {
// start with the root values/defaults // start with the root values/defaults
const float TOP_LEVEL_SIZE = 1.0f; const float TOP_LEVEL_SIZE = 1.0f;
const QVector<AttributePointer>& attributes = visitor.getAttributes(); const QVector<AttributePointer>& attributes = visitor.getAttributes();
@ -202,3 +202,19 @@ MetavoxelPath& MetavoxelPath::operator+=(int element) {
return *this; return *this;
} }
PolymorphicData* DefaultMetavoxelGuide::clone() const {
return new DefaultMetavoxelGuide();
}
void DefaultMetavoxelGuide::guide(MetavoxelTour& tour) const {
}
ScriptedMetavoxelGuide::ScriptedMetavoxelGuide(const QScriptValue& guideFunction) : _guideFunction(guideFunction) {
}
PolymorphicData* ScriptedMetavoxelGuide::clone() const {
return new ScriptedMetavoxelGuide(_guideFunction);
}
void ScriptedMetavoxelGuide::guide(MetavoxelTour& tour) const {
}

View file

@ -11,6 +11,7 @@
#include <QBitArray> #include <QBitArray>
#include <QHash> #include <QHash>
#include <QScriptValue>
#include <QVector> #include <QVector>
#include <glm/glm.hpp> #include <glm/glm.hpp>
@ -19,6 +20,7 @@
class MetavoxelNode; class MetavoxelNode;
class MetavoxelPath; class MetavoxelPath;
class MetavoxelTour;
class MetavoxelVisitor; class MetavoxelVisitor;
/// The base metavoxel representation shared between server and client. /// The base metavoxel representation shared between server and client.
@ -28,7 +30,7 @@ public:
~MetavoxelData(); ~MetavoxelData();
/// Applies the specified visitor to the contained voxels. /// Applies the specified visitor to the contained voxels.
void traverse(MetavoxelVisitor& visitor); void guide(MetavoxelVisitor& visitor);
/// Sets the attribute value corresponding to the specified path. /// Sets the attribute value corresponding to the specified path.
void setAttributeValue(const MetavoxelPath& path, const AttributeValue& attributeValue); void setAttributeValue(const MetavoxelPath& path, const AttributeValue& attributeValue);
@ -123,12 +125,41 @@ protected:
QVector<AttributePointer> _attributes; QVector<AttributePointer> _attributes;
}; };
/// Interface for objects that host metavoxel visitors. /// Interface for objects that guide metavoxel visitors.
class MetavoxelTraverser : public PolymorphicData { class MetavoxelGuide : public PolymorphicData {
public: public:
/// Applies the specified visitor to the contained voxels. /// Guides the specified visitor to the contained voxels.
virtual void traverse(MetavoxelVisitor& visitor) = 0; virtual void guide(MetavoxelTour& tour) const = 0;
};
/// Guides visitors through the explicit content of the system.
class DefaultMetavoxelGuide : public MetavoxelGuide {
public:
virtual PolymorphicData* clone() const;
virtual void guide(MetavoxelTour& tour) const;
};
/// Represents a guide implemented in Javascript.
class ScriptedMetavoxelGuide : public MetavoxelGuide {
public:
ScriptedMetavoxelGuide(const QScriptValue& guideFunction);
virtual PolymorphicData* clone() const;
virtual void guide(MetavoxelTour& tour) const;
private:
QScriptValue _guideFunction;
};
/// Contains the state associated with a tour of a metavoxel system.
class MetavoxelTour {
}; };
#endif /* defined(__interface__MetavoxelData__) */ #endif /* defined(__interface__MetavoxelData__) */