示例#1
0
 private void OnLoadTransferFunction(RuntimeFileBrowser.DialogResult result)
 {
     if (!result.cancelled)
     {
         string extension = Path.GetExtension(result.path);
         if (extension == ".tf")
         {
             TransferFunction tf = TransferFunctionDatabase.LoadTransferFunction(result.path);
             if (tf != null)
             {
                 targetObject.transferFunction = tf;
                 targetObject.SetTransferFunctionMode(TFRenderMode.TF1D);
             }
         }
         if (extension == ".tf2d")
         {
             TransferFunction2D tf = TransferFunctionDatabase.LoadTransferFunction2D(result.path);
             if (tf != null)
             {
                 targetObject.transferFunction2D = tf;
                 targetObject.SetTransferFunctionMode(TFRenderMode.TF2D);
             }
         }
     }
 }
示例#2
0
        public static TransferFunction2D CreateTransferFunction2D()
        {
            TransferFunction2D tf2D = new TransferFunction2D();

            tf2D.AddBox(0.05f, 0.1f, 0.8f, 0.7f, Color.white, 0.4f);
            return(tf2D);
        }
示例#3
0
        public static void SaveTransferFunction2D(TransferFunction2D tf2d, string filepath)
        {
            TF2DSerialisationData data = new TF2DSerialisationData();

            data.version = TF2DSerialisationData.VERSION_ID;
            data.boxes   = new List <TransferFunction2D.TF2DBox>(tf2d.boxes);
            string jsonstring = JsonUtility.ToJson(data);

            File.WriteAllText(filepath, jsonstring);
        }
示例#4
0
        public static TransferFunction2D LoadTransferFunction2D(string filepath)
        {
            if (!File.Exists(filepath))
            {
                Debug.LogError(string.Format("File does not exist: {0}", filepath));
                return(null);
            }
            string jsonstring          = File.ReadAllText(filepath);
            TF2DSerialisationData data = JsonUtility.FromJson <TF2DSerialisationData>(jsonstring);
            TransferFunction2D    tf   = new TransferFunction2D();

            tf.boxes = data.boxes;
            return(tf);
        }
        public static VolumeRenderedObject CreateObject(VolumeDataset dataset)
        {
            GameObject           outerObject = new GameObject("VolumeRenderedObject_" + dataset.datasetName);
            VolumeRenderedObject volObj      = outerObject.AddComponent <VolumeRenderedObject>();

            GameObject meshContainer = GameObject.Instantiate((GameObject)Resources.Load("VolumeContainer"));

            meshContainer.transform.parent        = outerObject.transform;
            meshContainer.transform.localScale    = Vector3.one;
            meshContainer.transform.localPosition = Vector3.zero;
            meshContainer.transform.parent        = outerObject.transform;
            outerObject.transform.localRotation   = Quaternion.Euler(90.0f, 0.0f, 0.0f);

            MeshRenderer meshRenderer = meshContainer.GetComponent <MeshRenderer>();

            meshRenderer.sharedMaterial = new Material(meshRenderer.sharedMaterial);
            volObj.meshRenderer         = meshRenderer;
            volObj.dataset = dataset;

            const int noiseDimX    = 512;
            const int noiseDimY    = 512;
            Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY);

            TransferFunction tf        = TransferFunctionDatabase.CreateTransferFunction();
            Texture2D        tfTexture = tf.GetTexture();

            volObj.transferFunction = tf;

            TransferFunction2D tf2D = TransferFunctionDatabase.CreateTransferFunction2D();

            volObj.transferFunction2D = tf2D;

            meshRenderer.sharedMaterial.SetTexture("_DataTex", dataset.GetDataTexture());
            meshRenderer.sharedMaterial.SetTexture("_GradientTex", null);
            meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture);
            meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture);

            meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR");
            meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP");
            meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF");

            if (dataset.scaleX != 0.0f && dataset.scaleY != 0.0f && dataset.scaleZ != 0.0f)
            {
                float maxScale = Mathf.Max(dataset.scaleX, dataset.scaleY, dataset.scaleZ);
                volObj.transform.localScale = new Vector3(dataset.scaleX / maxScale, dataset.scaleY / maxScale, dataset.scaleZ / maxScale);
            }

            return(volObj);
        }
示例#6
0
        public static VolumeRenderedObject CreateObject(VolumeDataset dataset)
        {
            GameObject           obj          = GameObject.Instantiate((GameObject)Resources.Load("VolumeRenderedObject"));
            VolumeRenderedObject volObj       = obj.GetComponent <VolumeRenderedObject>();
            MeshRenderer         meshRenderer = obj.GetComponent <MeshRenderer>();

            meshRenderer.material = new Material(meshRenderer.sharedMaterial);

            volObj.dataset = dataset;

            const int noiseDimX    = 512;
            const int noiseDimY    = 512;
            Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY);

            TransferFunction tf        = TransferFunctionDatabase.CreateTransferFunction();
            Texture2D        tfTexture = tf.GetTexture();

            volObj.transferFunction = tf;

            tf.histogramTexture = HistogramTextureGenerator.GenerateHistogramTexture(dataset);

            TransferFunction2D tf2D = TransferFunctionDatabase.CreateTransferFunction2D();

            volObj.transferFunction2D = tf2D;

            meshRenderer.sharedMaterial.SetTexture("_DataTex", dataset.GetDataTexture());
            meshRenderer.sharedMaterial.SetTexture("_GradientTex", null);
            meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture);
            meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture);

            meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR");
            meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP");
            meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF");

            return(volObj);
        }
示例#7
0
        private void OnGUI()
        {
            // Update selected object
            if (volRendObject == null)
            {
                volRendObject = SelectionHelper.GetSelectedVolumeObject();
            }

            if (volRendObject == null)
            {
                return;
            }

            if (hist2DTex == null)
            {
                hist2DTex = HistogramTextureGenerator.Generate2DHistogramTexture(volRendObject.dataset);
            }

            TransferFunction2D tf2d = volRendObject.transferFunction2D;

            // Calculate GUI width (minimum of window width and window height * 2)
            float bgWidth = Mathf.Min(this.position.width - 20.0f, (this.position.height - 250.0f) * 2.0f);
            // Draw the histogram
            Rect histRect = new Rect(0.0f, 0.0f, bgWidth, bgWidth * 0.5f);

            Graphics.DrawTexture(histRect, hist2DTex);
            // Draw the TF texture (showing the rectangles)
            tfGUIMat.SetTexture("_TFTex", tf2d.GetTexture());
            Graphics.DrawTexture(histRect, tf2d.GetTexture(), tfGUIMat);

            // Handle mouse click in box
            for (int iBox = 0; iBox < tf2d.boxes.Count; iBox++)
            {
                TransferFunction2D.TF2DBox box = tf2d.boxes[iBox];
                Rect boxRect = new Rect(histRect.x + box.rect.x * histRect.width, histRect.y + (1.0f - box.rect.height - box.rect.y) * histRect.height, box.rect.width * histRect.width, box.rect.height * histRect.height);
                if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && boxRect.Contains(new Vector2(Event.current.mousePosition.x, Event.current.mousePosition.y)))
                {
                    selectedBoxIndex = iBox;
                }
            }

            float startX = histRect.x;
            float startY = histRect.y + histRect.height + 10;

            // Show GUI for editing selected rectangle
            if (selectedBoxIndex != -1)
            {
                EditorGUI.BeginChangeCheck();
                TransferFunction2D.TF2DBox box = tf2d.boxes[selectedBoxIndex];
                float oldX = box.rect.x;
                float oldY = box.rect.y;
                box.rect.x      = EditorGUI.Slider(new Rect(startX, startY, 200.0f, 20.0f), "x", box.rect.x, 0.0f, 0.99f);
                box.rect.width  = EditorGUI.Slider(new Rect(startX + 220.0f, startY, 200.0f, 20.0f), "width", oldX + box.rect.width, box.rect.x + 0.01f, 1.0f) - box.rect.x;
                box.rect.y      = EditorGUI.Slider(new Rect(startX, startY + 50, 200.0f, 20.0f), "y", box.rect.y, 0.0f, 1.0f);
                box.rect.height = EditorGUI.Slider(new Rect(startX + 220.0f, startY + 50, 200.0f, 20.0f), "height", oldY + box.rect.height, box.rect.y + 0.01f, 1.0f) - box.rect.y;
                box.colour      = EditorGUI.ColorField(new Rect(startX + 450.0f, startY + 10, 100.0f, 20.0f), box.colour);
                box.minAlpha    = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 30, 200.0f, 20.0f), "min alpha", box.minAlpha, 0.0f, 1.0f);
                box.alpha       = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 60, 200.0f, 20.0f), "max alpha", box.alpha, 0.0f, 1.0f);

                tf2d.boxes[selectedBoxIndex] = box;
                needsRegenTexture           |= EditorGUI.EndChangeCheck();
            }
            else
            {
                EditorGUI.LabelField(new Rect(startX, startY, this.position.width - startX, 50.0f), "Select a rectangle in the above view, or add a new one.");
            }

            // Add new rectangle
            if (GUI.Button(new Rect(startX, startY + 100, 110.0f, 30.0f), "Add rectangle"))
            {
                tf2d.AddBox(0.1f, 0.1f, 0.8f, 0.8f, Color.white, 0.5f);
                needsRegenTexture = true;
            }
            // Remove selected shape
            if (selectedBoxIndex != -1)
            {
                if (GUI.Button(new Rect(startX, startY + 140, 110.0f, 30.0f), "Remove selected shape"))
                {
                    tf2d.boxes.RemoveAt(selectedBoxIndex);
                    needsRegenTexture = true;
                }
            }

            if (GUI.Button(new Rect(startX, startY + 180, 110.0f, 30.0f), "Save"))
            {
                string filepath = EditorUtility.SaveFilePanel("Save transfer function", "", "default.tf2d", "tf2d");
                if (filepath != "")
                {
                    TransferFunctionDatabase.SaveTransferFunction2D(tf2d, filepath);
                }
            }
            if (GUI.Button(new Rect(startX, startY + 220, 110.0f, 30.0f), "Load"))
            {
                string filepath = EditorUtility.OpenFilePanel("Save transfer function", "", "tf2d");
                if (filepath != "")
                {
                    TransferFunction2D newTF = TransferFunctionDatabase.LoadTransferFunction2D(filepath);
                    if (newTF != null)
                    {
                        volRendObject.transferFunction2D = tf2d = newTF;
                        needsRegenTexture = true;
                    }
                }
            }

            // TODO: regenerate on add/remove/modify (and do it async)
            if (needsRegenTexture)
            {
                tf2d.GenerateTexture();
                needsRegenTexture = false;
            }

            volRendObject.SetTransferFunctionMode(TFRenderMode.TF2D);

            return;
        }