private void PrecalculateGradient(VolumeDataInfo info) { var t = new AsyncGradientCalculator(info, this); t.Start(); StartCoroutine(ReadGradient(t)); }
private Color GetGradientSobel(VolumeDataInfo tex, int x, int y, int z) { Color result = new Color(); float[,,] kernal = { { { -1, -2, -1 }, { -2, -4, -2 }, { -1, -2, -1 } }, { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } } }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { result.r += kernal[i, j, k] * tex[x + i * 2 - 1, y + j - 1, z + k - 1].r; } } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { result.g += kernal[i, j, k] * tex[x + j - 1, y + i * 2 - 1, z + k - 1].r; } } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { result.b += kernal[i, j, k] * tex[x + j - 1, y + k - 1, z + i * 2 - 1].r; } } } result /= 32; return(result); }
protected override void ThreadFunction() { res = new VolumeDataInfo(info.width, info.height, info.thickness); for (int i = 0; i < info.width; i++) { notifier.Notify("Gradient calculating.." + (int)(100 * ((float)i / info.width)) + "%"); for (int j = 0; j < info.height; j++) { ; for (int k = 0; k < info.thickness; k++) { res[i, j, k] = GetGradientSobel(info, i, j, k); } } } }
public AsyncGradientCalculator(VolumeDataInfo info, IAsyncReaderProgressNotifier notifier) { this.info = info; this.notifier = notifier; }
public static VolumeDataInfo ReadFromFile(DescriptionFile desc, IAsyncReaderProgressNotifier notifier) { var twidth = CeilToBinary(desc.width); var theight = CeilToBinary(desc.height); var tdepth = CeilToBinary(desc.depth); var fileData = new int[twidth * theight * tdepth]; FileStream currentFile = null; bool flag = false; int?minData = null; int?maxData = null; int volumeFileIndex = 0; for (int z = 0; z < desc.depth; z++) { if (flag) { break; } for (int y = 0; y < desc.height; y++) { if (flag) { break; } for (int x = 0; x < desc.width; x++) { if (currentFile == null) { if (volumeFileIndex < desc.volumeData.Length) //we have next file { var nextFilePath = desc.volumeData[volumeFileIndex++]; currentFile = new FileStream(desc.relativePath + "/../" + nextFilePath, FileMode.Open); if (notifier != null) { notifier.Notify("Reading file.. : " + nextFilePath); } } else //all input finished. { flag = true; break; } } //read it. byte[] byData = new byte[desc.byteCount]; if (currentFile.Read(byData, 0, desc.byteCount) == 0) { x--; currentFile.Close(); currentFile = null; continue; } int data = 0; for (int i = 0; i < desc.byteCount; i++) { data <<= 8; data += byData[i]; } fileData[x + y * twidth + z * twidth * theight] = data; if (minData == null) { minData = data; } else { minData = Mathf.Min(minData.Value, data); } if (maxData == null) { maxData = data; } else { maxData = Mathf.Max(maxData.Value, data); } } } } var result = new VolumeDataInfo(twidth, theight, tdepth); for (int i = 0; i < twidth; i++) { notifier.Notify("Filling texture...(" + (int)((float)i / twidth * 100) + "%)"); for (int j = 0; j < theight; j++) { for (int k = 0; k < tdepth; k++) { var data = (float)fileData[i + j * twidth + k * theight * twidth] / (maxData.Value - minData.Value); result[i, j, k] = new Color(data, data, data, data); } } } return(result); }
protected override void ThreadFunction() { this.result = DescriptionFileReader.ReadFromFile(descFile, notifier); }