Tidying up...
This commit is contained in:
		| @@ -5,6 +5,7 @@ | ||||
| #include "IndexedSurfacePatch.h" | ||||
| #include "RegionGeometry.h" | ||||
| #include "Utility.h" | ||||
| #include "VoxelFilters.h" | ||||
|  | ||||
| #include <vector> | ||||
|  | ||||
| @@ -73,49 +74,4 @@ namespace PolyVox | ||||
| 			++iterSurfaceVertex; | ||||
| 		} //while(iterSurfaceVertex != vecVertices.end()) | ||||
| 	} | ||||
|  | ||||
| 	float computeSmoothedVoxel(BlockVolumeIterator<boost::uint8_t>& volIter) | ||||
| 	{ | ||||
| 		assert(volIter.getPosX() >= 1); | ||||
| 		assert(volIter.getPosY() >= 1); | ||||
| 		assert(volIter.getPosZ() >= 1); | ||||
| 		assert(volIter.getPosX() < volIter.getVolume().getSideLength() - 2); | ||||
| 		assert(volIter.getPosY() < volIter.getVolume().getSideLength() - 2); | ||||
| 		assert(volIter.getPosZ() < volIter.getVolume().getSideLength() - 2); | ||||
|  | ||||
| 		float sum = 0.0; | ||||
|  | ||||
| 		if(volIter.peekVoxel1nx1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		if(volIter.peekVoxel0px1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.getVoxel() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		if(volIter.peekVoxel1px1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		sum /= 27.0f; | ||||
| 		return sum; | ||||
| 	} | ||||
| } | ||||
| @@ -129,22 +129,22 @@ namespace PolyVox | ||||
| 				if((x==regSlice.getLowerCorner().getX()) && (y==regSlice.getLowerCorner().getY())) | ||||
| 				{ | ||||
| 					volIter.setPosition(x,y,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v000 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v000 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v100 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v100 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v010 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v010 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v110 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v110 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					volIter.setPosition(x,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v001 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v001 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v101 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v101 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v011 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v011 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel);		 | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel);		 | ||||
|  | ||||
| 					if (v000 == 0) iCubeIndex |= 1; | ||||
| 					if (v100 == 0) iCubeIndex |= 2; | ||||
| @@ -158,14 +158,14 @@ namespace PolyVox | ||||
| 				else if((x>regSlice.getLowerCorner().getX()) && y==regSlice.getLowerCorner().getY()) | ||||
| 				{ | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v100 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v100 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v110 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v110 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v101 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v101 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					//x | ||||
| 					uint8_t iPreviousCubeIndexX = bitmask[getDecimatedIndex(x- offset.getX()-uStepSize,y- offset.getY())]; | ||||
| @@ -193,14 +193,14 @@ namespace PolyVox | ||||
| 				else if((x==regSlice.getLowerCorner().getX()) && (y>regSlice.getLowerCorner().getY())) | ||||
| 				{ | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v010 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v010 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v110 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v110 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v011 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v011 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					//y | ||||
| 					uint8_t iPreviousCubeIndexY = bitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY()-uStepSize)]; | ||||
| @@ -228,10 +228,10 @@ namespace PolyVox | ||||
| 				else | ||||
| 				{ | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()); | ||||
| 					const uint8_t v110 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v110 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 					//y | ||||
| 					uint8_t iPreviousCubeIndexY = bitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY()-uStepSize)]; | ||||
| @@ -298,13 +298,13 @@ namespace PolyVox | ||||
| 				if((x==regSlice.getLowerCorner().getX()) && (y==regSlice.getLowerCorner().getY())) | ||||
| 				{ | ||||
| 					volIter.setPosition(x,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v001 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v001 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v101 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v101 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v011 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v011 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel);	 | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel);	 | ||||
|  | ||||
| 					//z | ||||
| 					uint8_t iPreviousCubeIndexZ = previousBitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY())]; | ||||
| @@ -318,9 +318,9 @@ namespace PolyVox | ||||
| 				else if((x>regSlice.getLowerCorner().getX()) && y==regSlice.getLowerCorner().getY()) | ||||
| 				{ | ||||
| 					volIter.setPosition(x+uStepSize,y,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v101 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v101 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel);	 | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel);	 | ||||
|  | ||||
| 					//z | ||||
| 					uint8_t iPreviousCubeIndexZ = previousBitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY())]; | ||||
| @@ -342,9 +342,9 @@ namespace PolyVox | ||||
| 				else if((x==regSlice.getLowerCorner().getX()) && (y>regSlice.getLowerCorner().getY())) | ||||
| 				{ | ||||
| 					volIter.setPosition(x,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v011 = volIter.getMaxedVoxel(uLevel); | ||||
| 					const uint8_t v011 = volIter.getSubSampledVoxel(uLevel); | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel);	 | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel);	 | ||||
|  | ||||
| 					//z | ||||
| 					uint8_t iPreviousCubeIndexZ = previousBitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY())]; | ||||
| @@ -366,7 +366,7 @@ namespace PolyVox | ||||
| 				else | ||||
| 				{ | ||||
| 					volIter.setPosition(x+uStepSize,y+uStepSize,regSlice.getLowerCorner().getZ()+uStepSize); | ||||
| 					const uint8_t v111 = volIter.getMaxedVoxel(uLevel);	 | ||||
| 					const uint8_t v111 = volIter.getSubSampledVoxel(uLevel);	 | ||||
|  | ||||
| 					//z | ||||
| 					uint8_t iPreviousCubeIndexZ = previousBitmask[getDecimatedIndex(x- offset.getX(),y- offset.getY())]; | ||||
| @@ -418,7 +418,7 @@ namespace PolyVox | ||||
| 				const uint16_t z = regSlice.getLowerCorner().getZ(); | ||||
|  | ||||
| 				volIter.setPosition(x,y,z); | ||||
| 				const uint8_t v000 = volIter.getMaxedVoxel(uLevel); | ||||
| 				const uint8_t v000 = volIter.getSubSampledVoxel(uLevel); | ||||
|  | ||||
| 				//Determine the index into the edge table which tells us which vertices are inside of the surface | ||||
| 				uint8_t iCubeIndex = bitmask[getDecimatedIndex(x - offset.getX(),y - offset.getY())]; | ||||
| @@ -435,7 +435,7 @@ namespace PolyVox | ||||
| 					if(x != regSlice.getUpperCorner().getX()) | ||||
| 					{ | ||||
| 						volIter.setPosition(x + uStepSize,y,z); | ||||
| 						const uint8_t v100 = volIter.getMaxedVoxel(uLevel); | ||||
| 						const uint8_t v100 = volIter.getSubSampledVoxel(uLevel); | ||||
| 						const Vector3DFloat v3dPosition(x - offset.getX() + 0.5f * uStepSize, y - offset.getY(), z - offset.getZ()); | ||||
| 						const Vector3DFloat v3dNormal(v000 > v100 ? 1.0f : -1.0f,0.0,0.0); | ||||
| 						const uint8_t uMaterial = v000 | v100; //Because one of these is 0, the or operation takes the max. | ||||
| @@ -449,7 +449,7 @@ namespace PolyVox | ||||
| 					if(y != regSlice.getUpperCorner().getY()) | ||||
| 					{ | ||||
| 						volIter.setPosition(x,y + uStepSize,z); | ||||
| 						const uint8_t v010 = volIter.getMaxedVoxel(uLevel); | ||||
| 						const uint8_t v010 = volIter.getSubSampledVoxel(uLevel); | ||||
| 						const Vector3DFloat v3dPosition(x - offset.getX(), y - offset.getY() + 0.5f * uStepSize, z - offset.getZ()); | ||||
| 						const Vector3DFloat v3dNormal(0.0,v000 > v010 ? 1.0f : -1.0f,0.0); | ||||
| 						const uint8_t uMaterial = v000 | v010; //Because one of these is 0, the or operation takes the max. | ||||
| @@ -463,7 +463,7 @@ namespace PolyVox | ||||
| 					//if(z != regSlice.getUpperCorner.getZ()) | ||||
| 					{ | ||||
| 						volIter.setPosition(x,y,z + uStepSize); | ||||
| 						const uint8_t v001 = volIter.getMaxedVoxel(uLevel); | ||||
| 						const uint8_t v001 = volIter.getSubSampledVoxel(uLevel); | ||||
| 						const Vector3DFloat v3dPosition(x - offset.getX(), y - offset.getY(), z - offset.getZ() + 0.5f * uStepSize); | ||||
| 						const Vector3DFloat v3dNormal(0.0,0.0,v000 > v001 ? 1.0f : -1.0f); | ||||
| 						const uint8_t uMaterial = v000 | v001; //Because one of these is 0, the or operation takes the max. | ||||
| @@ -606,21 +606,21 @@ namespace PolyVox | ||||
| 		//while(volIter.moveForwardInRegionXYZ()) | ||||
| 		//{		 | ||||
| 			volIter.setPosition(x,y,z); | ||||
| 			const uint8_t v000 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v000 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x+2,y,z); | ||||
| 			const uint8_t v100 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v100 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x,y+2,z); | ||||
| 			const uint8_t v010 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v010 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x+2,y+2,z); | ||||
| 			const uint8_t v110 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v110 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x,y,z+2); | ||||
| 			const uint8_t v001 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v001 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x+2,y,z+2); | ||||
| 			const uint8_t v101 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v101 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x,y+2,z+2); | ||||
| 			const uint8_t v011 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v011 = volIter.getSubSampledVoxel(1); | ||||
| 			volIter.setPosition(x+2,y+2,z+2); | ||||
| 			const uint8_t v111 = volIter.getMaxedVoxel(1); | ||||
| 			const uint8_t v111 = volIter.getSubSampledVoxel(1); | ||||
|  | ||||
| 			//Determine the index into the edge table which tells us which vertices are inside of the surface | ||||
| 			uint8_t iCubeIndex = 0; | ||||
|   | ||||
							
								
								
									
										51
									
								
								PolyVoxCore/source/VoxelFilters.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								PolyVoxCore/source/VoxelFilters.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| #include "VoxelFilters.h" | ||||
|  | ||||
| #include "BlockVolumeIterator.h" | ||||
|  | ||||
| namespace PolyVox | ||||
| { | ||||
| 	float computeSmoothedVoxel(BlockVolumeIterator<boost::uint8_t>& volIter) | ||||
| 	{ | ||||
| 		assert(volIter.getPosX() >= 1); | ||||
| 		assert(volIter.getPosY() >= 1); | ||||
| 		assert(volIter.getPosZ() >= 1); | ||||
| 		assert(volIter.getPosX() < volIter.getVolume().getSideLength() - 2); | ||||
| 		assert(volIter.getPosY() < volIter.getVolume().getSideLength() - 2); | ||||
| 		assert(volIter.getPosZ() < volIter.getVolume().getSideLength() - 2); | ||||
|  | ||||
| 		float sum = 0.0; | ||||
|  | ||||
| 		if(volIter.peekVoxel1nx1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1nx1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		if(volIter.peekVoxel0px1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.getVoxel() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel0px1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		if(volIter.peekVoxel1px1ny1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1ny0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1ny1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px0py1pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py1nz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py0pz() != 0) sum += 1.0f; | ||||
| 		if(volIter.peekVoxel1px1py1pz() != 0) sum += 1.0f; | ||||
|  | ||||
| 		sum /= 27.0f; | ||||
| 		return sum; | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user