void colorIsosurface() { if (params.isSquared && volumeData != null) volumeData.filterData(true, Float.NaN); /* if (params.isContoured && marchingSquares == null) { // if (params.isContoured && !(jvxlDataIs2dContour || params.thePlane != null)) { Logger.error("Isosurface error: Cannot contour this type of data."); return; } */ if (meshDataServer != null) { meshDataServer.fillMeshData(meshData, MeshData.MODE_GET_VERTICES, null); } jvxlData.saveVertexCount = 0; if (params.isContoured && marchingSquares != null) { initializeMapping(); params.setMapRanges(this, false); marchingSquares.setMinMax(params.valueMappedToRed, params.valueMappedToBlue); jvxlData.saveVertexCount = marchingSquares.contourVertexCount; contourVertexCount = marchingSquares.generateContourData( jvxlDataIs2dContour, (params.isSquared ? 1e-8f : 1e-4f)); jvxlData.contourValuesUsed = marchingSquares.getContourValues(); minMax = marchingSquares.getMinMax(); if (meshDataServer != null) meshDataServer.notifySurfaceGenerationCompleted(); finalizeMapping(); } applyColorScale(); jvxlData.nContours = (params.contourFromZero ? params.nContours : -1 - params.nContours); jvxlData.jvxlFileMessage = "mapped: min = " + params.valueMappedToRed + "; max = " + params.valueMappedToBlue; }
private void colorData() { float[] vertexValues = meshData.vertexValues; short[] vertexColixes = meshData.vertexColixes; meshData.polygonColixes = null; float valueBlue = jvxlData.valueMappedToBlue; float valueRed = jvxlData.valueMappedToRed; short minColorIndex = jvxlData.minColorIndex; short maxColorIndex = jvxlData.maxColorIndex; if (params.colorEncoder == null) params.colorEncoder = new ColorEncoder(null); params.colorEncoder.setRange( params.valueMappedToRed, params.valueMappedToBlue, params.isColorReversed); for (int i = meshData.vertexCount; --i >= 0; ) { float value = vertexValues[i]; if (minColorIndex >= 0) { if (value <= 0) vertexColixes[i] = minColorIndex; else if (value > 0) vertexColixes[i] = maxColorIndex; } else { if (value <= valueRed) value = valueRed; if (value >= valueBlue) value = valueBlue; vertexColixes[i] = params.colorEncoder.getColorIndex(value); } } if ((params.nContours > 0 || jvxlData.contourValues != null) && jvxlData.contourColixes == null) { int n = (jvxlData.contourValues == null ? params.nContours : jvxlData.contourValues.length); short[] colors = jvxlData.contourColixes = new short[n]; float[] values = jvxlData.contourValues; if (values == null) values = jvxlData.contourValuesUsed; if (jvxlData.contourValuesUsed == null) jvxlData.contourValuesUsed = (values == null ? new float[n] : values); float dv = (valueBlue - valueRed) / (n + 1); // n + 1 because we want n lines between n + 1 slices params.colorEncoder.setRange( params.valueMappedToRed, params.valueMappedToBlue, params.isColorReversed); for (int i = 0; i < n; i++) { float v = (values == null ? valueRed + (i + 1) * dv : values[i]); jvxlData.contourValuesUsed[i] = v; colors[i] = Graphics3D.getColixTranslucent(params.colorEncoder.getArgb(v)); } // TODO -- this strips translucency jvxlData.contourColors = Graphics3D.getHexCodes(colors); } }