Moved normal encoding logic.
This commit is contained in:
		| @@ -64,6 +64,20 @@ namespace PolyVox | |||||||
| 		return result; | 		return result; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	inline uint16_t encodeNormal(const Vector3DFloat& normal) | ||||||
|  | 	{ | ||||||
|  | 		Vector3DFloat v3dNormal = normal; | ||||||
|  | 		v3dNormal += Vector3DFloat(1.0f, 1.0f, 1.0f); | ||||||
|  | 		uint16_t encodedX = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getX() * 15.5f)); | ||||||
|  | 		uint16_t encodedY = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getY() * 15.5f)); | ||||||
|  | 		uint16_t encodedZ = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getZ() * 15.5f)); | ||||||
|  | 		POLYVOX_ASSERT(encodedX < 32, "Encoded value out of range"); | ||||||
|  | 		POLYVOX_ASSERT(encodedY < 32, "Encoded value out of range"); | ||||||
|  | 		POLYVOX_ASSERT(encodedZ < 32, "Encoded value out of range"); | ||||||
|  | 		uint16_t encodedNormal = (encodedX << 10) | (encodedY << 5) | encodedZ; | ||||||
|  | 		return encodedNormal; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/// Decodes a normal from a MarchingCubesVertex | 	/// Decodes a normal from a MarchingCubesVertex | ||||||
| 	inline Vector3DFloat decode(const uint16_t encodedNormal) | 	inline Vector3DFloat decode(const uint16_t encodedNormal) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -451,21 +451,12 @@ namespace PolyVox | |||||||
| 						v3dNormal.normalise(); | 						v3dNormal.normalise(); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
| 					v3dNormal += Vector3DFloat(1.0f, 1.0f, 1.0f); |  | ||||||
| 					uint16_t encodedX = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getX() * 15.5f)); |  | ||||||
| 					uint16_t encodedY = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getY() * 15.5f)); |  | ||||||
| 					uint16_t encodedZ = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getZ() * 15.5f)); |  | ||||||
| 					POLYVOX_ASSERT(encodedX < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedY < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedZ < 32, "Encoded value out of range"); |  | ||||||
| 					uint16_t encodedNormal = (encodedX << 10) | (encodedY << 5) | encodedZ; |  | ||||||
|  |  | ||||||
| 					// Allow the controller to decide how the material should be derived from the voxels. | 					// Allow the controller to decide how the material should be derived from the voxels. | ||||||
| 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v100, fInterp); | 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v100, fInterp); | ||||||
|  |  | ||||||
| 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | ||||||
| 					surfaceVertex.encodedPosition = v3dScaledPosition; | 					surfaceVertex.encodedPosition = v3dScaledPosition; | ||||||
| 					surfaceVertex.encodedNormal = encodedNormal; | 					surfaceVertex.encodedNormal = encodeNormal(v3dNormal); | ||||||
| 					surfaceVertex.data = uMaterial; | 					surfaceVertex.data = uMaterial; | ||||||
|  |  | ||||||
| 					const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | 					const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | ||||||
| @@ -494,21 +485,12 @@ namespace PolyVox | |||||||
| 						v3dNormal.normalise(); | 						v3dNormal.normalise(); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
| 					v3dNormal += Vector3DFloat(1.0f, 1.0f, 1.0f); |  | ||||||
| 					uint16_t encodedX = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getX() * 15.5f)); |  | ||||||
| 					uint16_t encodedY = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getY() * 15.5f)); |  | ||||||
| 					uint16_t encodedZ = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getZ() * 15.5f)); |  | ||||||
| 					POLYVOX_ASSERT(encodedX < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedY < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedZ < 32, "Encoded value out of range"); |  | ||||||
| 					uint16_t encodedNormal = (encodedX << 10) | (encodedY << 5) | encodedZ; |  | ||||||
|  |  | ||||||
| 					// Allow the controller to decide how the material should be derived from the voxels. | 					// Allow the controller to decide how the material should be derived from the voxels. | ||||||
| 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v010, fInterp); | 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v010, fInterp); | ||||||
|  |  | ||||||
| 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | ||||||
| 					surfaceVertex.encodedPosition = v3dScaledPosition; | 					surfaceVertex.encodedPosition = v3dScaledPosition; | ||||||
| 					surfaceVertex.encodedNormal = encodedNormal; | 					surfaceVertex.encodedNormal = encodeNormal(v3dNormal); | ||||||
| 					surfaceVertex.data = uMaterial; | 					surfaceVertex.data = uMaterial; | ||||||
|  |  | ||||||
| 					uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | 					uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | ||||||
| @@ -536,21 +518,12 @@ namespace PolyVox | |||||||
| 						v3dNormal.normalise(); | 						v3dNormal.normalise(); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
| 					v3dNormal += Vector3DFloat(1.0f, 1.0f, 1.0f); |  | ||||||
| 					uint16_t encodedX = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getX() * 15.5f)); |  | ||||||
| 					uint16_t encodedY = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getY() * 15.5f)); |  | ||||||
| 					uint16_t encodedZ = static_cast<uint16_t>(roundToNearestInteger(v3dNormal.getZ() * 15.5f)); |  | ||||||
| 					POLYVOX_ASSERT(encodedX < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedY < 32, "Encoded value out of range"); |  | ||||||
| 					POLYVOX_ASSERT(encodedZ < 32, "Encoded value out of range"); |  | ||||||
| 					uint16_t encodedNormal = (encodedX << 10) | (encodedY << 5) | encodedZ; |  | ||||||
|  |  | ||||||
| 					// Allow the controller to decide how the material should be derived from the voxels. | 					// Allow the controller to decide how the material should be derived from the voxels. | ||||||
| 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v001, fInterp); | 					const typename VolumeType::VoxelType uMaterial = m_controller.blendMaterials(v000, v001, fInterp); | ||||||
|  |  | ||||||
| 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | 					MarchingCubesVertex<typename VolumeType::VoxelType> surfaceVertex; | ||||||
| 					surfaceVertex.encodedPosition = v3dScaledPosition; | 					surfaceVertex.encodedPosition = v3dScaledPosition; | ||||||
| 					surfaceVertex.encodedNormal = encodedNormal; | 					surfaceVertex.encodedNormal = encodeNormal(v3dNormal); | ||||||
| 					surfaceVertex.data = uMaterial; | 					surfaceVertex.data = uMaterial; | ||||||
|  |  | ||||||
| 					const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | 					const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user