Beispiel #1
0
        void AddLight(Point physicalPosition, AquaPoint scaledPosition)
        {
            _lights.Add(scaledPosition);

            var geometry = pLights.Data as PathGeometry;

            var figure = new PathFigure();

            figure.StartPoint = physicalPosition;
            figure.Segments.Add(new LineSegment(physicalPosition, isStroked: true));

            geometry.Figures.Add(figure);
        }
Beispiel #2
0
        private void imgDisplay_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (tbConfigureLights.IsChecked ?? false)
            {
                AquaLib.aqua_get_frame_size(_context, out int width, out int height);

                var physicalPosition = e.GetPosition(imgDisplay);

                var scaledPosition = new AquaPoint(
                    physicalPosition.X * width / imgDisplay.ActualWidth,
                    physicalPosition.Y * height / imgDisplay.ActualHeight);

                AddLight(physicalPosition, scaledPosition);
            }
        }
Beispiel #3
0
        private void tbConfigureLights_Click(object sender, RoutedEventArgs e)
        {
            if (tbConfigureLights.IsChecked ?? false)
            {
                if (_context == IntPtr.Zero)
                {
                    tbConfigureLights.IsChecked = false;
                    return;
                }

                if (_lightMap != IntPtr.Zero)
                {
                    AquaLib.aqua_free_light_map(_lightMap);
                }

                _lights.Clear();
                _lightMap          = IntPtr.Zero;
                _lightMapBuffer    = null;
                pLights.Data       = new PathGeometry();
                imgLightMap.Source = null;

                if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
                {
                    const int NumLights = 300;

                    AquaLib.aqua_get_frame_size(_context, out int width, out int height);

                    double totalArea    = width * height * 2;
                    double areaPerLight = totalArea / NumLights;

                    double squareSide = Math.Sqrt(areaPerLight);

                    double x = squareSide * 0.25;
                    double y = squareSide * 0.5;

                    double minX = squareSide * 0.25;
                    double maxX = width - squareSide * 0.25;
                    int    dx   = 1;

                    double xScale = imgDisplay.ActualWidth / width;
                    double yScale = imgDisplay.ActualHeight / height;

                    for (int i = 0; i < NumLights; i++)
                    {
                        var scaledPosition   = new AquaPoint(x, y);
                        var physicalPosition = new Point(x * xScale, y * yScale);

                        AddLight(physicalPosition, scaledPosition);

                        x += dx * (squareSide * 0.5);

                        if ((dx > 0) && (x > maxX))
                        {
                            x  = 2 * maxX - x;
                            y += squareSide;
                            dx = -1;
                        }
                        else if ((dx < 0) && (x < minX))
                        {
                            x  = 2 * minX - x;
                            y += squareSide;
                            dx = +1;
                        }
                    }

                    tbConfigureLights.IsChecked = false;
                }
            }

            if (!(tbConfigureLights.IsChecked ?? false))
            {
                if (_lights.Count > 0)
                {
                    try
                    {
                        _lightMap = AquaLib.aqua_generate_light_map(_context, _lights.Count, _lights.ToArray());

                        AquaLib.aqua_light_map_get_light_for_pixel(_lightMap, out int width, out int height, null);
                        _lightMapBuffer = new int[width * height];
                        AquaLib.aqua_light_map_get_light_for_pixel(_lightMap, out width, out height, _lightMapBuffer);

                        AquaLib.aqua_light_map_get_light_pixel_count(_lightMap, out int numLights, null);

                        int[] randomColor = new int[numLights];

                        int opaque = unchecked ((int)0xFF000000);

                        for (int i = 0; i < numLights; i++)
                        {
                            randomColor[i] = opaque | _rnd.Next(0, 16777216);
                        }

                        int[] imageBuffer = new int[width * height];

                        for (int i = 0; i < imageBuffer.Length; i++)
                        {
                            if (_lightMapBuffer[i] >= 0)
                            {
                                imageBuffer[i] = randomColor[_lightMapBuffer[i]];
                            }
                        }

                        imgLightMap.Source = BitmapSource.Create(
                            width,
                            height,
                            96.0,
                            96.0,
                            PixelFormats.Pbgra32,
                            null,
                            imageBuffer,
                            width * 4);
                    }
                    catch
                    {
                        if (_lightMap != IntPtr.Zero)
                        {
                            AquaLib.aqua_free_light_map(_lightMap);
                        }

                        _lightMap = IntPtr.Zero;

                        throw;
                    }
                }
            }
        }