Exemplo n.º 1
0
        public override void Do(IDemoChartControl chartControl)
        {
            // Demo volumetric binary data from resources.
            byte[] data = Properties.Resources.skull;

            // Size of data is the same in all 3 dimensions.
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
            // For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
            // Byte, Short, Float types are supported.
            reader = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max()));

            // Initialization of rendering technique.
            var rayCasting = new VolumeIsoRayCasting
            {
                // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
                // For dynamic updates of datayou can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
                Reader = reader,
                // Geometry specify bounding box to that volume data will be fitted. Geometry can be more complex than just box.
                // Mostly it does nothave limits, you can specify even sphere.
                Geometry = new BoxVolumeGeometry
                {
                    Origin = Vector3F.Zero,
                    Size   = new Vector3F(1f),
                },
                // Parameter for ray casting technique that will specify how much steps will be on a each ray.
                // Directly effects performance and render quality. By default it is calculated automatically.
                SamplingStepCount = size,
                // Interpolation type between voxels.
                InterpolationType = VolumeInterpolationType.Linear,
                // Property that define value level for isosurface.
                IsoValue = reader.ValueRange.Min + (reader.ValueRange.Max - reader.ValueRange.Min) * 0.5f,
                // Specify iso-surface color.
                Color = new Color4(Colors.Red, 125),
                // For isosurface there is no difference which value is setted. Only 0 or another from 0 have sence.
                // 0 will increase picking performance due to item will be picked by bounding box.
                HitTestThreshold = 0.25f,
                // Set name.
                Name = "Volume"
            };

            // Bounding box.
            var cube = new Cube
            {
                Size             = new Vector3F(1f),
                Position         = new Vector3F(0.5f),
                Color            = Colors.Red,
                PresentationType = PrimitivePresentationType.Wireframe,
                Name             = "Bounds"
            };

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling = Multisampling.Low2X;

            // Setup chart data source.
            chartControl.DataSource = new RenderData[] { rayCasting, cube };

            // Start animation.
            animationHelper.Start(
                (argument) =>
            {
                if (argument > reader.ValueRange.Max)
                {
                    argument = reader.ValueRange.Min;
                }
                return(argument);
            },
                (argument) => { rayCasting.IsoValue = argument; }, reader.ValueRange.Min, 2f, 40);
        }
Exemplo n.º 2
0
        public override void Do(IDemoChartControl chartControl)
        {
            // Order-Independent transparency requres additional GPU resources, it should be used only when neccessary.
            // Multisample antialiasing and control resolution have significant effect to OIT performance.
            chartControl.IsOitEnabled = true;

            // Demo volumetric binary data from resources
            var data = Properties.Resources.skull;

            // Size of data is the same in all 3 dimensions
            var size = (int)Math.Round(Math.Pow(data.Length, 1d / 3d));

            // Link to data. Several rendering techniques can use the same data. For reader we should specify link to binary data, slice size, and value axis bounds.
            // For dynamic updates of data you can implement your own reader, basic reader interface provide neccessary methods for updating separate data regions.
            // Byte, Short, Float types are supported. The reader will be used for both ray-casting for efficient memory usage.
            var reader = new ByteIntensityImage3DReader(data, size, size, new OneAxisBounds(data.Min(), data.Max()));

            // Create volume geometry object (we'll reuse it for both ray-castings for efficient memory usage).
            var geometry = new BoxVolumeGeometry
            {
                Origin = Vector3F.Zero,
                Size   = new Vector3F(1f)
            };

            float ComputeRelativeIsoValue(float relativeValue) =>
            reader.ValueRange.Min + (reader.ValueRange.Max - reader.ValueRange.Min) * relativeValue;

            VolumeIsoRayCasting CreateRayCasting(float relativeLevel, Color4 color, string name)
            {
                return(new VolumeIsoRayCasting
                {
                    // Set ray-casting data reader.
                    Reader = reader,
                    // Set ray-casting border geometry.
                    Geometry = geometry,
                    // Set value interpolation type.
                    InterpolationType = VolumeInterpolationType.Linear,
                    // Set iso-value.
                    IsoValue = ComputeRelativeIsoValue(relativeLevel),
                    // Set surface color.
                    Color = color,
                    // Set hit-test threshold value.
                    HitTestThreshold = 0.25f,
                    // Set sampling step count.
                    SamplingStepCount = 500,
                    // Set name.
                    Name = name
                });
            }

            // Create first ray-casting.
            VolumeIsoRayCasting rayCasting = CreateRayCasting(0.4f, new Color4(Colors.Red, 125), "Volume 1");

            // Create second ray-casting.
            VolumeIsoRayCasting rayCasting2 = CreateRayCasting(0.15f, new Color4(Colors.White, 125), "Volume 2");

            // Create internal cube.
            var cube = new Cube
            {
                Size     = new Vector3F(0.5f),
                Position = new Vector3F(0.5f),
                Color    = new Color4(Colors.Green, 150),
                Name     = "Cube"
            };

            // Create border cube.
            var borderCube = new Cube
            {
                Size             = new Vector3F(1f),
                Position         = new Vector3F(0.5f),
                Color            = Colors.Red,
                PresentationType = PrimitivePresentationType.Wireframe,
                Name             = "Bounds"
            };

            // Decrease multisampling level to improve interaction experience.
            chartControl.Multisampling = Multisampling.Low2X;

            // Set chart data source.
            chartControl.DataSource = new RenderData[] { rayCasting, cube, borderCube, rayCasting2 };
        }