From a50bb8413efb3a78cecbdf6f60e197e602d55822 Mon Sep 17 00:00:00 2001 From: David Williams Date: Wed, 18 Mar 2009 20:44:05 +0000 Subject: [PATCH] Work on new OpenGL example. --- examples/OpenGL/CMakeLists.txt | 2 + examples/OpenGL/Shapes.cpp | 46 +++++++++++++++++++++++ examples/OpenGL/Shapes.h | 9 +++++ examples/OpenGL/main.cpp | 68 +++++++--------------------------- 4 files changed, 71 insertions(+), 54 deletions(-) create mode 100644 examples/OpenGL/Shapes.cpp create mode 100644 examples/OpenGL/Shapes.h diff --git a/examples/OpenGL/CMakeLists.txt b/examples/OpenGL/CMakeLists.txt index 4c4e7e3f..86dadc73 100644 --- a/examples/OpenGL/CMakeLists.txt +++ b/examples/OpenGL/CMakeLists.txt @@ -6,6 +6,7 @@ PROJECT(OpenGLExample) SET(SRC_FILES glew/glew.c main.cpp + shapes.cpp ) #Projects headers files @@ -13,6 +14,7 @@ SET(INC_FILES glew/glew.h glew/glxew.h glew/wglew.h + shapes.h ) ADD_DEFINITIONS(-DGLEW_STATIC) diff --git a/examples/OpenGL/Shapes.cpp b/examples/OpenGL/Shapes.cpp new file mode 100644 index 00000000..d11c529a --- /dev/null +++ b/examples/OpenGL/Shapes.cpp @@ -0,0 +1,46 @@ +#include "Shapes.h" + +using namespace PolyVox; + +void createSphereInVolume(BlockVolume& volData, float fRadius, uint8 uValue) +{ + //This vector hold the position of the center of the volume + Vector3DFloat v3dVolCenter(volData.getSideLength() / 2, volData.getSideLength() / 2, volData.getSideLength() / 2); + + //This three-level for loop iterates over every voxel in the volume + for (int z = 0; z < volData.getSideLength(); z++) + { + for (int y = 0; y < volData.getSideLength(); y++) + { + for (int x = 0; x < volData.getSideLength(); 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(); + + //If the current voxel is less than 'radius' units from the center + //then we make it solid, otherwise we make it empty space. + if(fDistToCenter <= fRadius) + { + volData.setVoxelAt(x,y,z, uValue); + } + } + } + } +} + +void createCubeInVolume(BlockVolume& volData, Vector3DUint16 lowerCorner, Vector3DUint16 upperCorner, uint8 uValue) +{ + //This three-level for loop iterates over every voxel between the specified corners + for (int z = lowerCorner.getZ(); z <= upperCorner.getZ(); z++) + { + for (int y = lowerCorner.getY(); y <= upperCorner.getY(); y++) + { + for (int x = lowerCorner.getX() ; x <= upperCorner.getX(); x++) + { + volData.setVoxelAt(x,y,z, uValue); + } + } + } +} \ No newline at end of file diff --git a/examples/OpenGL/Shapes.h b/examples/OpenGL/Shapes.h new file mode 100644 index 00000000..e9d903c3 --- /dev/null +++ b/examples/OpenGL/Shapes.h @@ -0,0 +1,9 @@ +#ifndef __OpenGLExample_Shapes_H__ +#define __OpenGLExample_Shapes_H__ + +#include "PolyVoxCore/BlockVolume.h" + +void createSphereInVolume(PolyVox::BlockVolume& volData, float fRadius, PolyVox::uint8 uValue); +void createCubeInVolume(PolyVox::BlockVolume& volData, PolyVox::Vector3DUint16 lowerCorner, PolyVox::Vector3DUint16 upperCorner, PolyVox::uint8 uValue); + +#endif //__OpenGLExample_Shapes_H__ \ No newline at end of file diff --git a/examples/OpenGL/main.cpp b/examples/OpenGL/main.cpp index d13c41e4..eb5de17d 100644 --- a/examples/OpenGL/main.cpp +++ b/examples/OpenGL/main.cpp @@ -3,9 +3,11 @@ #include "PolyVoxCore/SurfaceExtractors.h" #include "PolyVoxCore/Utility.h" +#include "Shapes.h" + #include // Standard Header For Most Programs -//#define USE_OPENGL_VERTEX_BUFFERS_OBJECTS +#define USE_OPENGL_VERTEX_BUFFERS_OBJECTS #ifdef USE_OPENGL_VERTEX_BUFFERS_OBJECTS #ifdef WIN32 @@ -154,48 +156,7 @@ OpenGLSurfacePatch BuildOpenGLSurfacePatch(IndexedSurfacePatch& isp) } #endif -void createSphere(float fRadius, uint8 uValue) -{ - //This vector hold the position of the center of the volume - Vector3DFloat v3dVolCenter(g_volData.getSideLength() / 2, g_volData.getSideLength() / 2, g_volData.getSideLength() / 2); - //This three-level for loop iterates over every voxel in the volume - for (int z = 0; z < g_volData.getSideLength(); z++) - { - for (int y = 0; y < g_volData.getSideLength(); y++) - { - for (int x = 0; x < g_volData.getSideLength(); 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(); - - //If the current voxel is less than 'radius' units from the center - //then we make it solid, otherwise we make it empty space. - if(fDistToCenter <= fRadius) - { - g_volData.setVoxelAt(x,y,z, uValue); - } - } - } - } -} - -void createCube(Vector3DUint16 lowerCorner, Vector3DUint16 upperCorner, uint8 uValue) -{ - //This three-level for loop iterates over every voxel between the specified corners - for (int z = lowerCorner.getZ(); z <= upperCorner.getZ(); z++) - { - for (int y = lowerCorner.getY(); y <= upperCorner.getY(); y++) - { - for (int x = lowerCorner.getX() ; x <= upperCorner.getX(); x++) - { - g_volData.setVoxelAt(x,y,z, uValue); - } - } - } -} void timerFunc(int value) { @@ -428,18 +389,18 @@ void main ( int argc, char** argv ) // Create Main Function For Bringing It Al uint16 minPos = 0; uint16 midPos = g_volData.getSideLength() / 2; uint16 maxPos = g_volData.getSideLength() - 1; - createCube(Vector3DUint16(minPos, minPos, minPos), Vector3DUint16(maxPos, maxPos, maxPos), 0); + createCubeInVolume(g_volData, Vector3DUint16(minPos, minPos, minPos), Vector3DUint16(maxPos, maxPos, maxPos), 0); - createSphere(50.0f, 5); - createSphere(40.0f, 4); - createSphere(30.0f, 3); - createSphere(20.0f, 2); - createSphere(10.0f, 1); + createSphereInVolume(g_volData, 50.0f, 5); + createSphereInVolume(g_volData, 40.0f, 4); + createSphereInVolume(g_volData, 30.0f, 3); + createSphereInVolume(g_volData, 20.0f, 2); + createSphereInVolume(g_volData, 10.0f, 1); - createCube(Vector3DUint16(minPos, minPos, minPos), Vector3DUint16(midPos-1, midPos-1, midPos-1), 0); - createCube(Vector3DUint16(midPos+1, midPos+1, minPos), Vector3DUint16(maxPos, maxPos, midPos-1), 0); - createCube(Vector3DUint16(midPos+1, minPos, midPos+1), Vector3DUint16(maxPos, midPos-1, maxPos), 0); - createCube(Vector3DUint16(minPos, midPos+1, midPos+1), Vector3DUint16(midPos-1, maxPos, maxPos), 0); + createCubeInVolume(g_volData, Vector3DUint16(minPos, minPos, minPos), Vector3DUint16(midPos-1, midPos-1, midPos-1), 0); + createCubeInVolume(g_volData, Vector3DUint16(midPos+1, midPos+1, minPos), Vector3DUint16(maxPos, maxPos, midPos-1), 0); + createCubeInVolume(g_volData, Vector3DUint16(midPos+1, minPos, midPos+1), Vector3DUint16(maxPos, midPos-1, maxPos), 0); + createCubeInVolume(g_volData, Vector3DUint16(minPos, midPos+1, midPos+1), Vector3DUint16(midPos-1, maxPos, maxPos), 0); //Our volume is broken down into cuboid regions, and we create one mesh for each region. //This three-level for loop iterates over each region. @@ -483,5 +444,4 @@ void main ( int argc, char** argv ) // Create Main Function For Bringing It Al init (); glutMainLoop ( ); // Initialize The Main Loop -} - +} \ No newline at end of file