void generateContourData(float contourCutoff) {

		/*
		 * Y 3 ---2---- 2 | | | | 3 1 | | 0 ---0---- 1 X
		 */

		int[][] isoPointIndexes2d = new int[squareCountY][4];
		for (int i = squareCountY; --i >= 0;)
			isoPointIndexes2d[i][0] = isoPointIndexes2d[i][1] = isoPointIndexes2d[i][2] = isoPointIndexes2d[i][3] = -1; // new
		// int[4];

		if (Math.abs(contourCutoff) < 0.0001)
			contourCutoff = (contourCutoff <= 0 ? -0.0001f : 0.0001f);
		int insideCount = 0, outsideCount = 0, contourCount = 0;
		for (int x = squareCountX; --x >= 0;) {
			for (int y = squareCountY; --y >= 0;) {
				int[] pixelPointIndexes = propagateNeighborPointIndexes2d(x, y, isoPointIndexes2d);
				int insideMask = 0;
				for (int i = 4; --i >= 0;) {
					Point3i offset = squareVertexOffsets[i];
					float vertexValue = pixelData[x + offset.x][y + offset.y];
					vertexValues2d[i] = vertexValue;
					if (isInside2d(vertexValue, contourCutoff))
						insideMask |= 1 << i;
				}
				if (insideMask == 0) {
					++outsideCount;
					continue;
				}
				if (insideMask == 0x0F) {
					++insideCount;
					planarSquares[x * squareCountY + y].addEdgeMask(contourIndex, 0, 0x0F);
					continue;
				}
				++contourCount;
				processOneQuadrilateral(insideMask, contourCutoff, pixelPointIndexes, x, y);
			}
		}

		if (logMessages)
			Logger.info("contourCutoff=" + contourCutoff + " pixel squares=" + squareCountX + "," + squareCountY + ","
					+ " total=" + (squareCountX * squareCountY) + "\n" + " insideCount=" + insideCount
					+ " outsideCount=" + outsideCount + " contourCount=" + contourCount + " total="
					+ (insideCount + outsideCount + contourCount));
	}