Added a "voxelize" brush for debugging.

This commit is contained in:
Andrzej Kapolka 2015-01-17 20:17:28 -08:00
parent debc9b735d
commit 5bb441b6ef
6 changed files with 39 additions and 21 deletions

View file

@ -821,7 +821,7 @@ HeightfieldBrushTool::HeightfieldBrushTool(MetavoxelEditor* editor, const QStrin
_form->addRow("Radius:", _radius = new QDoubleSpinBox()); _form->addRow("Radius:", _radius = new QDoubleSpinBox());
_radius->setSingleStep(0.01); _radius->setSingleStep(0.01);
_radius->setMaximum(FLT_MAX); _radius->setMaximum(FLT_MAX);
_radius->setValue(1.0); _radius->setValue(5.0);
} }
bool HeightfieldBrushTool::appliesTo(const AttributePointer& attribute) const { bool HeightfieldBrushTool::appliesTo(const AttributePointer& attribute) const {
@ -975,10 +975,21 @@ QVariant HeightfieldSculptBrushTool::createEdit(bool alternate) {
HeightfieldFillBrushTool::HeightfieldFillBrushTool(MetavoxelEditor* editor) : HeightfieldFillBrushTool::HeightfieldFillBrushTool(MetavoxelEditor* editor) :
HeightfieldBrushTool(editor, "Fill Brush") { HeightfieldBrushTool(editor, "Fill Brush") {
_form->addRow("Mode:", _mode = new QComboBox());
_mode->addItem("Fill");
_mode->addItem("Voxelize");
} }
QVariant HeightfieldFillBrushTool::createEdit(bool alternate) { QVariant HeightfieldFillBrushTool::createEdit(bool alternate) {
return QVariant::fromValue(FillHeightfieldHeightEdit(_position, _radius->value())); if (_mode->currentIndex() == 0) {
return QVariant::fromValue(FillHeightfieldHeightEdit(_position, _radius->value()));
}
Sphere* sphere = new Sphere();
sphere->setTranslation(_position);
sphere->setScale(_radius->value());
return QVariant::fromValue(HeightfieldMaterialSpannerEdit(SharedObjectPointer(sphere),
SharedObjectPointer(), QColor(), false, true));
} }
HeightfieldMaterialBoxTool::HeightfieldMaterialBoxTool(MetavoxelEditor* editor) : HeightfieldMaterialBoxTool::HeightfieldMaterialBoxTool(MetavoxelEditor* editor) :

View file

@ -419,6 +419,10 @@ public:
protected: protected:
virtual QVariant createEdit(bool alternate); virtual QVariant createEdit(bool alternate);
private:
QComboBox* _mode;
}; };
/// Allows setting heightfield materials by dragging out a box. /// Allows setting heightfield materials by dragging out a box.

View file

@ -176,10 +176,11 @@ MaterialEdit::MaterialEdit(const SharedObjectPointer& material, const QColor& av
} }
HeightfieldMaterialSpannerEdit::HeightfieldMaterialSpannerEdit(const SharedObjectPointer& spanner, HeightfieldMaterialSpannerEdit::HeightfieldMaterialSpannerEdit(const SharedObjectPointer& spanner,
const SharedObjectPointer& material, const QColor& averageColor, bool paint) : const SharedObjectPointer& material, const QColor& averageColor, bool paint, bool voxelize) :
MaterialEdit(material, averageColor), MaterialEdit(material, averageColor),
spanner(spanner), spanner(spanner),
paint(paint) { paint(paint),
voxelize(voxelize) {
} }
class SpannerProjectionFetchVisitor : public SpannerVisitor { class SpannerProjectionFetchVisitor : public SpannerVisitor {
@ -246,7 +247,7 @@ void HeightfieldMaterialSpannerEdit::apply(MetavoxelData& data, const WeakShared
} }
foreach (const SharedObjectPointer& result, results) { foreach (const SharedObjectPointer& result, results) {
Spanner* newResult = static_cast<Spanner*>(result.data())->setMaterial(spanner, material, color, paint); Spanner* newResult = static_cast<Spanner*>(result.data())->setMaterial(spanner, material, color, paint, voxelize);
if (newResult != result) { if (newResult != result) {
data.replace(AttributeRegistry::getInstance()->getSpannersAttribute(), result, newResult); data.replace(AttributeRegistry::getInstance()->getSpannersAttribute(), result, newResult);
} }

View file

@ -233,17 +233,18 @@ public:
STREAM SharedObjectPointer spanner; STREAM SharedObjectPointer spanner;
STREAM bool paint; STREAM bool paint;
STREAM bool voxelize;
HeightfieldMaterialSpannerEdit(const SharedObjectPointer& spanner = SharedObjectPointer(), HeightfieldMaterialSpannerEdit(const SharedObjectPointer& spanner = SharedObjectPointer(),
const SharedObjectPointer& material = SharedObjectPointer(), const SharedObjectPointer& material = SharedObjectPointer(),
const QColor& averageColor = QColor(), bool paint = false); const QColor& averageColor = QColor(), bool paint = false, bool voxelize = false);
virtual void apply(MetavoxelData& data, const WeakSharedObjectHash& objects) const; virtual void apply(MetavoxelData& data, const WeakSharedObjectHash& objects) const;
}; };
DECLARE_STREAMABLE_METATYPE(HeightfieldMaterialSpannerEdit) DECLARE_STREAMABLE_METATYPE(HeightfieldMaterialSpannerEdit)
/// An edit that sets a region of a heightfield height. /// An edit that fills a region of a heightfield height.
class FillHeightfieldHeightEdit : public MetavoxelEdit { class FillHeightfieldHeightEdit : public MetavoxelEdit {
STREAMABLE STREAMABLE
@ -251,7 +252,7 @@ public:
STREAM glm::vec3 position; STREAM glm::vec3 position;
STREAM float radius; STREAM float radius;
FillHeightfieldHeightEdit(const glm::vec3& position = glm::vec3(), float radius = 0.0f); FillHeightfieldHeightEdit(const glm::vec3& position = glm::vec3(), float radius = 0.0f);
virtual void apply(MetavoxelData& data, const WeakSharedObjectHash& objects) const; virtual void apply(MetavoxelData& data, const WeakSharedObjectHash& objects) const;

View file

@ -120,7 +120,7 @@ Spanner* Spanner::fillHeight(const glm::vec3& position, float radius) {
} }
Spanner* Spanner::setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material, Spanner* Spanner::setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material,
const QColor& color, bool paint) { const QColor& color, bool paint, bool voxelize) {
return this; return this;
} }
@ -2129,7 +2129,7 @@ static inline bool isSet(const QVector<StackArray>& stackContents, int stackWidt
} }
HeightfieldNode* HeightfieldNode::setMaterial(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale, HeightfieldNode* HeightfieldNode::setMaterial(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale,
Spanner* spanner, const SharedObjectPointer& material, const QColor& color, bool paint, Spanner* spanner, const SharedObjectPointer& material, const QColor& color, bool paint, bool voxelize,
float normalizeScale, float normalizeOffset) { float normalizeScale, float normalizeOffset) {
if (!_height) { if (!_height) {
return this; return this;
@ -2150,8 +2150,8 @@ HeightfieldNode* HeightfieldNode::setMaterial(const glm::vec3& translation, cons
glm::vec3 nextScale = scale * glm::vec3(0.5f, 1.0f, 0.5f); glm::vec3 nextScale = scale * glm::vec3(0.5f, 1.0f, 0.5f);
HeightfieldNode* newChild = _children[i]->setMaterial(translation + HeightfieldNode* newChild = _children[i]->setMaterial(translation +
rotation * glm::vec3(i & X_MAXIMUM_FLAG ? nextScale.x : 0.0f, 0.0f, rotation * glm::vec3(i & X_MAXIMUM_FLAG ? nextScale.x : 0.0f, 0.0f,
i & Y_MAXIMUM_FLAG ? nextScale.z : 0.0f), rotation, i & Y_MAXIMUM_FLAG ? nextScale.z : 0.0f), rotation, nextScale, spanner,
nextScale, spanner, material, color, paint, normalizeScale, normalizeOffset); material, color, paint, voxelize, normalizeScale, normalizeOffset);
if (_children[i] != newChild) { if (_children[i] != newChild) {
if (newNode == this) { if (newNode == this) {
newNode = new HeightfieldNode(*this); newNode = new HeightfieldNode(*this);
@ -2399,7 +2399,8 @@ HeightfieldNode* HeightfieldNode::setMaterial(const glm::vec3& translation, cons
float oldVoxelHeight = *oldHeightLineDest * voxelScale; float oldVoxelHeight = *oldHeightLineDest * voxelScale;
float oldNextVoxelHeightX = oldHeightLineDest[1] * voxelScale; float oldNextVoxelHeightX = oldHeightLineDest[1] * voxelScale;
float oldNextVoxelHeightZ = oldHeightLineDest[heightWidth] * voxelScale; float oldNextVoxelHeightZ = oldHeightLineDest[heightWidth] * voxelScale;
for (int y = newTop; y >= newBottom; y--, entryDest--, pos -= worldStepY) { // skip the actual set if voxelizing
for (int y = voxelize ? newBottom - 1 : newTop; y >= newBottom; y--, entryDest--, pos -= worldStepY) {
int oldCurrentAlpha = stackDest->getEntryAlpha(y, oldVoxelHeight); int oldCurrentAlpha = stackDest->getEntryAlpha(y, oldVoxelHeight);
if (spanner->contains(pos)) { if (spanner->contains(pos)) {
if (hasOwnColors && !erase) { if (hasOwnColors && !erase) {
@ -3376,7 +3377,7 @@ Spanner* Heightfield::fillHeight(const glm::vec3& position, float radius) {
} }
Spanner* Heightfield::setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material, Spanner* Heightfield::setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material,
const QColor& color, bool paint) { const QColor& color, bool paint, bool voxelize) {
// first see if we're going to exceed the range limits, normalizing if necessary // first see if we're going to exceed the range limits, normalizing if necessary
Spanner* spannerData = static_cast<Spanner*>(spanner.data()); Spanner* spannerData = static_cast<Spanner*>(spanner.data());
float normalizeScale = 1.0f, normalizeOffset = 0.0f; float normalizeScale = 1.0f, normalizeOffset = 0.0f;
@ -3391,7 +3392,7 @@ Spanner* Heightfield::setMaterial(const SharedObjectPointer& spanner, const Shar
} }
newHeightfield->setRoot(HeightfieldNodePointer(_root->setMaterial(newHeightfield->getTranslation(), getRotation(), newHeightfield->setRoot(HeightfieldNodePointer(_root->setMaterial(newHeightfield->getTranslation(), getRotation(),
glm::vec3(getScale(), getScale() * newHeightfield->getAspectY(), getScale() * _aspectZ), spannerData, glm::vec3(getScale(), getScale() * newHeightfield->getAspectY(), getScale() * _aspectZ), spannerData,
material, color, paint, normalizeScale, normalizeOffset))); material, color, paint, voxelize, normalizeScale, normalizeOffset)));
return newHeightfield; return newHeightfield;
} }

View file

@ -77,14 +77,14 @@ public:
/// \return the modified spanner, or this if no modification was performed /// \return the modified spanner, or this if no modification was performed
virtual Spanner* paintHeight(const glm::vec3& position, float radius, float height); virtual Spanner* paintHeight(const glm::vec3& position, float radius, float height);
/// Attempts to fill the spanner's height (removing volumetric information). /// Attempts to fill the spanner's height (adding removing volumetric information).
/// \return the modified spanner, or this if no modification was performed /// \return the modified spanner, or this if no modification was performed
virtual Spanner* fillHeight(const glm::vec3& position, float radius); virtual Spanner* fillHeight(const glm::vec3& position, float radius);
/// Attempts to "sculpt" or "paint" with the supplied spanner. /// Attempts to "sculpt" or "paint," etc., with the supplied spanner.
/// \return the modified spanner, or this if no modification was performed /// \return the modified spanner, or this if no modification was performed
virtual Spanner* setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material, virtual Spanner* setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material,
const QColor& color, bool paint); const QColor& color, bool paint, bool voxelize);
/// Checks whether this spanner has its own colors. /// Checks whether this spanner has its own colors.
virtual bool hasOwnColors() const; virtual bool hasOwnColors() const;
@ -700,9 +700,9 @@ public:
void getRangeAfterEdit(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale, void getRangeAfterEdit(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale,
const Box& editBounds, float& minimum, float& maximum) const; const Box& editBounds, float& minimum, float& maximum) const;
HeightfieldNode* setMaterial(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale, HeightfieldNode* setMaterial(const glm::vec3& translation, const glm::quat& rotation, const glm::vec3& scale,
Spanner* spanner, const SharedObjectPointer& material, const QColor& color, bool paint, Spanner* spanner, const SharedObjectPointer& material, const QColor& color, bool paint, bool voxelize,
float normalizeScale, float normalizeOffset); float normalizeScale, float normalizeOffset);
void read(HeightfieldStreamState& state); void read(HeightfieldStreamState& state);
@ -805,7 +805,7 @@ public:
virtual Spanner* fillHeight(const glm::vec3& position, float radius); virtual Spanner* fillHeight(const glm::vec3& position, float radius);
virtual Spanner* setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material, virtual Spanner* setMaterial(const SharedObjectPointer& spanner, const SharedObjectPointer& material,
const QColor& color, bool paint); const QColor& color, bool paint, bool voxelize);
virtual bool hasOwnColors() const; virtual bool hasOwnColors() const;
virtual bool hasOwnMaterials() const; virtual bool hasOwnMaterials() const;