Skip to content

Commit

Permalink
VOXELUTIL: added scaleUp functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
mgerhardy committed Jun 6, 2023
1 parent e1366b6 commit 902ab3c
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 11 deletions.
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ General:
- Removed cvar `voxformat_marchingcubes` and replaced with `voxel_meshmode` (set to `1` to use marching cubes)
- Added new lua script `gradient.lua`
- Improved `csm` and `nvm` format support
- Added lua script for generating mazes

VoxConvert:

Expand Down
47 changes: 43 additions & 4 deletions src/modules/voxelutil/VolumeRescaler.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
*/
#pragma once

#include "app/App.h"
#include "core/Common.h"
#include "core/Trace.h"
#include "core/Color.h"
#include "voxel/MaterialColor.h"
#include "voxel/Palette.h"
#include "voxel/RawVolume.h"
#include "voxel/Voxel.h"
#include "voxel/Region.h"

Expand Down Expand Up @@ -44,8 +46,8 @@ static bool isHidden(Sampler &srcSampler) {
* be exactly half of the size of the sourceRegion.
*/
template<typename SourceVolume, typename DestVolume>
void rescaleVolume(const SourceVolume& sourceVolume, const voxel::Palette &palette, const voxel::Region& sourceRegion, DestVolume& destVolume, const voxel::Region& destRegion) {
core_trace_scoped(RescaleVolume);
void scaleDown(const SourceVolume& sourceVolume, const voxel::Palette &palette, const voxel::Region& sourceRegion, DestVolume& destVolume, const voxel::Region& destRegion) {
core_trace_scoped(ScaleVolumeDown);
typename SourceVolume::Sampler srcSampler(sourceVolume);

core::DynamicArray<glm::vec4> materialColors;
Expand Down Expand Up @@ -206,8 +208,45 @@ void rescaleVolume(const SourceVolume& sourceVolume, const voxel::Palette &palet
}

template<typename SourceVolume, typename DestVolume>
void rescaleVolume(const SourceVolume& sourceVolume, const voxel::Palette &palette, DestVolume& destVolume) {
rescaleVolume(sourceVolume, palette, sourceVolume.region(), destVolume, destVolume.region());
void scaleDown(const SourceVolume& sourceVolume, const voxel::Palette &palette, DestVolume& destVolume) {
scaleDown(sourceVolume, palette, sourceVolume.region(), destVolume, destVolume.region());
}

voxel::RawVolume *scaleUp(const voxel::RawVolume& sourceVolume) {
const voxel::Region srcRegion = sourceVolume.region();
const glm::ivec3& targetDimensions = srcRegion.getDimensionsInVoxels() * 2;
const voxel::Region destRegion(srcRegion.getLowerCorner(), srcRegion.getLowerCorner() + targetDimensions);
if (!app::App::getInstance()->hasEnoughMemory(voxel::RawVolume::size(destRegion))) {
return nullptr;
}

static const glm::ivec3 directions[8] = {glm::ivec3(0, 0, 0), glm::ivec3(1, 0, 0), glm::ivec3(0, 1, 0),
glm::ivec3(1, 1, 0), glm::ivec3(0, 0, 1), glm::ivec3(1, 0, 1),
glm::ivec3(0, 1, 1), glm::ivec3(1, 1, 1)};

voxel::RawVolume* destVolume = new voxel::RawVolume(destRegion);
voxel::RawVolume::Sampler sourceSampler(sourceVolume);
sourceSampler.setPosition(srcRegion.getLowerCorner());
for (int32_t x = srcRegion.getLowerX(); x <= srcRegion.getUpperX(); x += 1) {
voxel::RawVolume::Sampler sampler2 = sourceSampler;
for (int32_t y = srcRegion.getLowerY(); y <= srcRegion.getUpperY(); y += 1) {
voxel::RawVolume::Sampler sampler3 = sampler2;
for (int32_t z = srcRegion.getLowerZ(); z <= srcRegion.getUpperZ(); z += 1) {
const voxel::Voxel &voxel = sampler3.voxel();
if (voxel::isAir(voxel.getMaterial())) {
continue;
}
const glm::ivec3 targetPos = sampler3.position() * 2;
for (int i = 0; i < 8; ++i) {
destVolume->setVoxel(targetPos + directions[i], voxel);
}
sampler3.movePositiveZ(1);
}
sampler2.movePositiveY(1);
}
sourceSampler.movePositiveX(1);
}
return destVolume;
}

}
2 changes: 1 addition & 1 deletion src/tools/voxconvert/VoxConvert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ void VoxConvert::scale(scenegraph::SceneGraph& sceneGraph) {
const voxel::Region destRegion(srcRegion.getLowerCorner(), srcRegion.getLowerCorner() + targetDimensionsHalf);
if (destRegion.isValid()) {
voxel::RawVolume* destVolume = new voxel::RawVolume(destRegion);
voxelutil::rescaleVolume(*node.volume(), node.palette(), *destVolume);
voxelutil::scaleDown(*node.volume(), node.palette(), *destVolume);
node.setVolume(destVolume, true);
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/tools/voxedit/modules/voxedit-ui/ToolsPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ void ToolsPanel::updateEditMode(command::CommandExecutionListener &listener) {
toolbar.button(ICON_FA_CROP, "crop");
toolbar.button(ICON_FA_EXPAND, "layersize");
toolbar.button(ICON_FA_OBJECT_UNGROUP, "colortolayer");
toolbar.button(ICON_FA_COMPRESS, "scale");
toolbar.button(ICON_FA_COMPRESS, "scaledown");
toolbar.button(ICON_FK_ARROWS, "scaleup");
toolbar.button(ICON_FA_FILL_DRIP, "fillhollow");
}

Expand Down
33 changes: 29 additions & 4 deletions src/tools/voxedit/modules/voxedit-util/SceneManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,23 @@ void SceneManager::colorToNewNode(const voxel::Voxel voxelColor) {
addNodeToSceneGraph(newNode);
}

void SceneManager::scale(int nodeId) {
void SceneManager::scaleUp(int nodeId) {
voxel::RawVolume* v = volume(nodeId);
if (v == nullptr) {
return;
}
voxel::RawVolume *destVolume = voxelutil::scaleUp(*v);
if (destVolume == nullptr) {
return;
}
if (!setNewVolume(nodeId, destVolume, true)) {
delete destVolume;
return;
}
modified(nodeId, destVolume->region());
}

void SceneManager::scaleDown(int nodeId) {
voxel::RawVolume* v = volume(nodeId);
if (v == nullptr) {
return;
Expand All @@ -551,7 +567,7 @@ void SceneManager::scale(int nodeId) {
}
const voxel::Region destRegion(srcRegion.getLowerCorner(), srcRegion.getLowerCorner() + targetDimensionsHalf);
voxel::RawVolume* destVolume = new voxel::RawVolume(destRegion);
voxelutil::rescaleVolume(*v, _sceneGraph.node(nodeId).palette(), *destVolume);
voxelutil::scaleDown(*v, _sceneGraph.node(nodeId).palette(), *destVolume);
if (!setNewVolume(nodeId, destVolume, true)) {
delete destVolume;
return;
Expand Down Expand Up @@ -1551,15 +1567,24 @@ void SceneManager::construct() {
crop();
}).setHelp("Crop the current active node to the voxel boundaries");

command::Command::registerCommand("scale", [&] (const command::CmdArgs& args) {
command::Command::registerCommand("scaledown", [&] (const command::CmdArgs& args) {
const int argc = (int)args.size();
int nodeId = activeNode();
if (argc == 1) {
nodeId = core::string::toInt(args[0]);
}
scale(nodeId);
scaleDown(nodeId);
}).setHelp("Scale the current active node or the given node down").setArgumentCompleter(nodeCompleter(_sceneGraph));

command::Command::registerCommand("scaleup", [&] (const command::CmdArgs& args) {
const int argc = (int)args.size();
int nodeId = activeNode();
if (argc == 1) {
nodeId = core::string::toInt(args[0]);
}
scaleUp(nodeId);
}).setHelp("Scale the current active node or the given node up").setArgumentCompleter(nodeCompleter(_sceneGraph));

command::Command::registerCommand("colortolayer", [&] (const command::CmdArgs& args) {
const int argc = (int)args.size();
if (argc < 1) {
Expand Down
3 changes: 2 additions & 1 deletion src/tools/voxedit/modules/voxedit-util/SceneManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,8 @@ class SceneManager : public core::IComponent {

void colorToNewNode(const voxel::Voxel voxelColor);
void crop();
void scale(int nodeId);
void scaleDown(int nodeId);
void scaleUp(int nodeId);
void resizeAll(const glm::ivec3 &size);
int size() const;

Expand Down

0 comments on commit 902ab3c

Please sign in to comment.