Ejemplo n.º 1
0
    private void  PrecalculateGradient(VolumeDataInfo info)
    {
        var t = new AsyncGradientCalculator(info, this);

        t.Start();
        StartCoroutine(ReadGradient(t));
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
 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);
             }
         }
     }
 }
Ejemplo n.º 4
0
 public AsyncGradientCalculator(VolumeDataInfo info, IAsyncReaderProgressNotifier notifier)
 {
     this.info     = info;
     this.notifier = notifier;
 }
Ejemplo n.º 5
0
    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);
    }
Ejemplo n.º 6
0
 protected override void ThreadFunction()
 {
     this.result = DescriptionFileReader.ReadFromFile(descFile, notifier);
 }