Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************************************************
- Copyright (c) 2005-2009 David Williams
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source
- distribution.
- *******************************************************************************/
- #include "OpenGLWidget.h"
- #include "PolyVoxCore/CubicSurfaceExtractorWithNormals.h"
- #include "PolyVoxCore/LowPassFilter.h"
- #include "PolyVoxCore/MarchingCubesSurfaceExtractor.h"
- #include "PolyVoxCore/RawVolume.h"
- #include "PolyVoxCore/SurfaceMesh.h"
- #include "PolyVoxCore/SimpleVolume.h"
- #include <QApplication>
- //Use the PolyVox namespace
- using namespace PolyVox;
- void createSphereInVolume(SimpleVolume<uint8_t>& volData, float fRadius)
- {
- //This vector hold the position of the center of the volume
- Vector3DFloat v3dVolCenter(volData.getWidth() / 2, volData.getHeight() / 2, volData.getDepth() / 2);
- //This three-level for loop iterates over every voxel in the volume
- for (int z = 0; z < volData.getDepth(); z++)
- {
- for (int y = 0; y < volData.getHeight(); y++)
- {
- for (int x = 0; x < volData.getWidth(); x++)
- {
- //Store our current position as a vector...
- Vector3DFloat v3dCurrentPos(x,y,z);
- //And compute how far the current position is from the center of the volume
- float fDistToCenter = (v3dCurrentPos - v3dVolCenter).length();
- uint8_t uVoxelValue = 0;
- //If the current voxel is less than 'radius' units from the center then we make it solid.
- if(fDistToCenter <= fRadius)
- {
- //Our new voxel value
- uVoxelValue = 255;
- }
- //Wrte the voxel value into the volume
- volData.setVoxelAt(x, y, z, uVoxelValue);
- }
- }
- }
- }
- int main(int argc, char *argv[])
- {
- // Show logs
- setTraceStream(&(std::cout));
- //Create and show the Qt OpenGL window
- QApplication app(argc, argv);
- OpenGLWidget openGLWidget(0);
- openGLWidget.show();
- //Create an empty volume and then place a sphere in it
- SimpleVolume<uint8_t> volData(PolyVox::Region(Vector3DInt32(0,0,0), Vector3DInt32(63, 63, 63)));
- createSphereInVolume(volData, 30);
- // Smooth
- RawVolume<uint8_t> tempVolume(volData.getEnclosingRegion());
- LowPassFilter< SimpleVolume<uint8_t>, RawVolume<uint8_t>, int16_t > pass1(&volData, PolyVox::Region(volData.getEnclosingRegion()), &tempVolume, PolyVox::Region(volData.getEnclosingRegion()), 3);
- pass1.executeSAT();
- LowPassFilter< RawVolume<uint8_t>, SimpleVolume<uint8_t>, int16_t > pass2(&tempVolume, PolyVox::Region(volData.getEnclosingRegion()), &volData, PolyVox::Region(volData.getEnclosingRegion()), 3);
- pass2.executeSAT();
- //A mesh object to hold the result of surface extraction
- SurfaceMesh<PositionMaterialNormal> mesh;
- //Create a surface extractor. Comment out one of the following two lines to decide which type gets created.
- //CubicSurfaceExtractorWithNormals< SimpleVolume<uint8_t> > surfaceExtractor(&volData, volData.getEnclosingRegion(), &mesh);
- MarchingCubesSurfaceExtractor< SimpleVolume<uint8_t> > surfaceExtractor(&volData, volData.getEnclosingRegion(), &mesh);
- //Execute the surface extractor.
- surfaceExtractor.execute();
- //Pass the surface to the OpenGL window
- openGLWidget.setSurfaceMeshToRender(mesh);
- //Run the message pump.
- return app.exec();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement