void generateSurfaceData() {
		cubeCountX = voxelData.length - 1;
		cubeCountY = voxelData[0].length - 1;
		cubeCountZ = voxelData[0][0].length - 1;
		fractionData = new StringBuffer();
		strFractionTemp = (isJvxl ? jvxlEdgeDataRead : "");
		fractionPtr = 0;
		if (thePlane != null) {
			contourVertexCount = 0;
			contourType = getContourType(thePlane);
		}
		else if (isContoured) {
			contourVertexCount = 0;
			contourType = 2;
		}
		if (!isSilent || logMessages) {
			Logger.info("cutoff=" + cutoff + " voxel cubes=" + cubeCountX + "," + cubeCountY + "," + cubeCountZ + ","
					+ " total=" + (cubeCountX * cubeCountY * cubeCountZ));
			Logger.info("resolutions(x,y,z)=" + 1 / volumetricVectors[0].length() + "," + 1
					/ volumetricVectors[1].length() + "," + 1 / volumetricVectors[2].length());
		}

		int[][] isoPointIndexes = new int[cubeCountY * cubeCountZ][12];
		for (int i = cubeCountY * cubeCountZ; --i >= 0;)
			isoPointIndexes[i] = new int[12];
		int insideCount = 0, outsideCount = 0, surfaceCount = 0;
		for (int x = cubeCountX; --x >= 0;) {
			for (int y = cubeCountY; --y >= 0;) {
				for (int z = cubeCountZ; --z >= 0;) {
					int[] voxelPointIndexes = propagateNeighborPointIndexes(x, y, z, isoPointIndexes);
					int insideMask = 0;
					for (int i = 8; --i >= 0;) {
						Point3i offset = cubeVertexOffsets[i];
						float voxelValue = voxelData[x + offset.x][y + offset.y][z + offset.z];
						vertexValues[i] = voxelValue;
						if (logCube)
							vertexPoints[i].set(x + offset.x, y + offset.y, z + offset.z);
						if (isInside(voxelValue, cutoff))
							insideMask |= 1 << i;
					}

					if (insideMask == 0) {
						++outsideCount;
						continue;
					}
					if (insideMask == 0xFF) {
						++insideCount;
						continue;
					}
					++surfaceCount;
					if (!processOneCubical(insideMask, cutoff, voxelPointIndexes, x, y, z) || isContoured)
						continue;

					byte[] triangles = triangleTable[insideMask];
					for (int i = triangles.length; (i -= 3) >= 0;) {
						if (!isCutoffAbsolute
								|| checkCutoff(voxelPointIndexes[triangles[i]], voxelPointIndexes[triangles[i + 1]],
										voxelPointIndexes[triangles[i + 2]]))
							currentMesh.addTriangle(voxelPointIndexes[triangles[i]],
									voxelPointIndexes[triangles[i + 1]], voxelPointIndexes[triangles[i + 2]]);
					}
				}
			}
		}
		if (isJvxl) {
			fractionData = new StringBuffer();
			fractionData.append(jvxlEdgeDataRead);
		}
		fractionData.append('\n'); // from generateSurfaceData
		if (!isSilent || logMessages)
			Logger.info("insideCount=" + insideCount + " outsideCount=" + outsideCount + " surfaceCount="
					+ surfaceCount + " total=" + (insideCount + outsideCount + surfaceCount));
	}