From 392ccab7034c9c67437bf552e4ce57e7db2da853 Mon Sep 17 00:00:00 2001 From: David Williams Date: Sun, 1 Jun 2014 17:23:08 +0200 Subject: [PATCH] Tidying decoding code. --- .../MarchingCubesSurfaceExtractor.h | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h index a609326f..78a48aac 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h +++ b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h @@ -49,23 +49,33 @@ namespace PolyVox DataType data; }; - // Hopefully the compiler will implement the 'Return value optimization' here, but - // performance critical code will most likely decode the vertices in a shader anyway. + Vector3DFloat decode(const Vector3DUint16& position) + { + Vector3DFloat result(position.getX(), position.getY(), position.getZ()); + result *= (1.0f / 256.0f); // Division is compile-time constant + return result; + } + + Vector3DFloat decode(const uint16_t normal) + { + uint16_t x = (normal >> 10) & 0x1F; + uint16_t y = (normal >> 5) & 0x1F; + uint16_t z = (normal) & 0x1F; + + Vector3DFloat result(x, y, z); + result *= (1.0f / 15.5f); // Division is compile-time constant + result -= Vector3DFloat(1.0f, 1.0f, 1.0f); + + return result; + } + template Vertex decode(const MarchingCubesVertex& marchingCubesVertex) { Vertex result; - result.position = Vector3DFloat(marchingCubesVertex.position.getX(), marchingCubesVertex.position.getY(), marchingCubesVertex.position.getZ()); - result.position *= (1.0 / 256.0); - - uint16_t encodedX = (marchingCubesVertex.normal >> 10) & 0x1F; - uint16_t encodedY = (marchingCubesVertex.normal >> 5) & 0x1F; - uint16_t encodedZ = (marchingCubesVertex.normal) & 0x1F; - result.normal = Vector3DFloat(encodedX, encodedY, encodedZ); - result.normal /= 15.5f; - result.normal -= Vector3DFloat(1.0f, 1.0f, 1.0f); - - result.data = marchingCubesVertex.data; + result.position = decode(marchingCubesVertex.position); + result.normal = decode(marchingCubesVertex.normal); + result.data = marchingCubesVertex.data; // Data is not encoded return result; }