From 380fed7aeec69a3b7001b4d8a9658e3ed3373ef1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 22 May 2015 10:37:48 -0700 Subject: [PATCH] metersToVoxelCoordinates and voxelCoordinatesToMeters --- .../src/RenderablePolyVoxEntityItem.cpp | 25 ++++++++++++++++--- .../src/RenderablePolyVoxEntityItem.h | 3 +++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index fe04d30ce3..e6f0a32e75 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -50,6 +50,23 @@ void RenderablePolyVoxEntityItem::setVoxelVolumeSize(glm::vec3 voxelVolumeSize) _volData = new PolyVox::SimpleVolume(PolyVox::Region(lowCorner, highCorner)); } +glm::vec3 RenderablePolyVoxEntityItem::metersToVoxelCoordinates(glm::vec3 metersOffCenter) { + // convert a vector from the center of the entity with units of meters to a vector with units + // of index-into-volData. + glm::vec3 dimensions = getDimensions(); + glm::vec3 scale = dimensions / _voxelVolumeSize; // meters / voxel-units + glm::vec3 voxelCoords = metersOffCenter / scale; + // the voxel volume is entirely in positive space, but the voxel space is centered at the entity's coords, so: + return voxelCoords + _voxelVolumeSize / 2.0f; +} + +glm::vec3 RenderablePolyVoxEntityItem::voxelCoordinatesToMeters(glm::vec3 voxelCoords) { + // convert a vector is voxel-space to an offset from the entity-center in meters + glm::vec3 dimensions = getDimensions(); + glm::vec3 scale = dimensions / _voxelVolumeSize; // meters / voxel-units + glm::vec3 centeredCoords = voxelCoords - _voxelVolumeSize / 2.0f; + return centeredCoords * scale; +} void RenderablePolyVoxEntityItem::setSphereInVolume(glm::vec3 center, float radius, uint8_t toValue) { // This three-level for loop iterates over every voxel in the volume @@ -100,10 +117,10 @@ void RenderablePolyVoxEntityItem::getModel() { PolyVox::SurfaceMesh polyVoxMesh; //Create a surface extractor. Comment out one of the following two lines to decide which type gets created. - // PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor - // (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); - PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor + PolyVox::CubicSurfaceExtractorWithNormals> surfaceExtractor (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); + // PolyVox::MarchingCubesSurfaceExtractor> surfaceExtractor + // (_volData, _volData->getEnclosingRegion(), &polyVoxMesh); //Execute the surface extractor. surfaceExtractor.execute(); @@ -178,7 +195,7 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { glm::vec3 axis = glm::axis(rotation); glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); glm::vec3 positionToCenter = center - position; - // make the voxel volume be centered on the entity's position + // make the rendered voxel volume be centered on the entity's position positionToCenter -= _dimensions * glm::vec3(0.5f,0.5f,0.5f); glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(scale.x, scale.y, scale.z); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index 7fbf4e980c..0c0cf82dad 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -32,6 +32,9 @@ public: virtual void setVoxelVolumeSize(glm::vec3 voxelVolumeSize); + glm::vec3 metersToVoxelCoordinates(glm::vec3 metersOffCenter); + glm::vec3 voxelCoordinatesToMeters(glm::vec3 voxelCoords); + void setSphereInVolume(glm::vec3 center, float radius, uint8_t toValue); void createSphereInVolume(glm::vec3 center, float radius); void eraseSphereInVolume(glm::vec3 center, float radius);