コード例 #1
0
        /// <summary>
        /// Adds all StartElements to the Scene.
        /// </summary>
        private void SetupStartElements()
        {
            _startElements.Add(new Visual3DViewModel(null, new SunLight(), "Sunlight"));
            var floor = new QuadVisual3D()
            {
                Fill   = new SolidColorBrush(Colors.LightGray),
                Point1 = new Point3D(-10, -10, -0.001),
                Point2 = new Point3D(10, -10, -0.001),
                Point3 = new Point3D(10, 10, -0.001),
                Point4 = new Point3D(-10, 10, -0.001)
            };

            _startElements.Add(new Visual3DViewModel(null, floor, "Floor"));

            var gridLines = new GridLinesVisual3D()
            {
                MinorDistance = 2,
                Thickness     = 0.02,
            };

            _startElements.Add(new Visual3DViewModel(null, gridLines, "Grid Lines"));

            AddAxisInfo(new Vector3D(5, 0, 0), new SolidColorBrush(Colors.Green), new Point3D(5.1, 0, 0), "X");
            AddAxisInfo(new Vector3D(0, 5, 0), new SolidColorBrush(Colors.Blue), new Point3D(0, 5.1, 0), "Y");
            AddAxisInfo(new Vector3D(0, 0, 5), new SolidColorBrush(Colors.Red), new Point3D(0, 0, 5.1), "Z");
        }
コード例 #2
0
        private void AddMapBackdrops(int region)
        {
            if (AppSettings.ExePlanets == null)
            {
                return;
            }

            bool showLights = this.showLightsButton.IsChecked ?? false;

            for (int flightGroupIndex = 0; flightGroupIndex < this.MissionFile.FlightGroups.Count; flightGroupIndex++)
            {
                var flightGroup = this.MissionFile.FlightGroups[flightGroupIndex];

                int    startRegion  = flightGroup.StartPointRegions[0] + 1;
                int    craftId      = flightGroup.CraftId;
                string name         = flightGroup.Name;
                int    positionX    = flightGroup.StartPoints[0].PositionX * 256;
                int    positionY    = -flightGroup.StartPoints[0].PositionY * 256;
                int    positionZ    = flightGroup.StartPoints[0].PositionZ * 256;
                string cargo        = flightGroup.Cargo;
                string specialCargo = flightGroup.SpecialCargo;
                int    planetId     = flightGroup.PlanetId;

                if (startRegion != region)
                {
                    continue;
                }

                if (planetId == 0)
                {
                    continue;
                }

                if (craftId != 183)
                {
                    continue;
                }

                if (planetId < 0 || planetId >= AppSettings.ExePlanets.Length)
                {
                    continue;
                }

                var planet = AppSettings.ExePlanets[planetId];

                if (planet.ModelIndex == 0)
                {
                    continue;
                }

                byte imageNumber;

                if (planet.DataIndex2 != 0)
                {
                    imageNumber = 0;
                }
                else if (planet.ModelIndex == 487)
                {
                    imageNumber = 0;
                }
                else
                {
                    if ((planet.Flags & 1) != 0)
                    {
                        imageNumber = flightGroup.GlobalCargoIndex;
                    }
                    else
                    {
                        imageNumber = 0;
                    }
                }

                float size = 1.0f;
                if (!string.IsNullOrEmpty(specialCargo))
                {
                    if (float.TryParse(specialCargo, NumberStyles.Float, CultureInfo.InvariantCulture, out float value))
                    {
                        size = value;
                    }
                }

                size *= AppSettings.BackdropsScale * 256 * 3;

                float colorI = 0.0f;
                float colorR = 0.0f;
                float colorG = 0.0f;
                float colorB = 0.0f;

                if (!string.IsNullOrEmpty(cargo))
                {
                    string[] parts = cargo.Split();
                    if (parts.Length == 1)
                    {
                        float.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out colorI);
                    }
                }

                if (!string.IsNullOrEmpty(name))
                {
                    string[] parts = name.Split();
                    if (parts.Length == 3)
                    {
                        float.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out colorR);
                        float.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out colorG);
                        float.TryParse(parts[2], NumberStyles.Float, CultureInfo.InvariantCulture, out colorB);
                    }
                }

                colorR *= colorI * 255;
                colorG *= colorI * 255;
                colorB *= colorI * 255;

                Utils.ComputeHeadingAngles(positionX, positionY, positionZ, out double headingXY, out double headingZ);

                string   key = planet.DataIndex1 + ", " + (planet.DataIndex2 != 0 ? planet.DataIndex2 : imageNumber);
                Material material;

                if (this._backdropModels.TryGetValue(key, out BackdropModel image))
                {
                    image.CreateMaterial();

                    material = image.Material;
                    size     = size * image.Width / 256;
                }
                else
                {
                    material = null;
                }

                var quad = new QuadVisual3D();
                quad.BeginEdit();

                quad.Point1 = new Point3D(0, 0.5, 0.5);
                quad.Point2 = new Point3D(0, -0.5, 0.5);
                quad.Point3 = new Point3D(0, -0.5, -0.5);
                quad.Point4 = new Point3D(0, 0.5, -0.5);

                quad.Material     = material;
                quad.BackMaterial = null;

                //const double scale = 100000 * 3;
                double scale = this.backdropsDistanceSlider.Value * 160 * 256;

                var transforms = new Transform3DGroup();
                transforms.Children.Add(new ScaleTransform3D(size, size, size));

                transforms.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), headingZ)));
                transforms.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), -headingXY)));

                Vector3D position = new Vector3D(positionX, positionY, positionZ);

                if (position.LengthSquared != 0)
                {
                    position.Normalize();
                }

                transforms.Children.Add(new TranslateTransform3D(position.Y * scale, -position.X * scale, position.Z * scale));

                transforms.Freeze();
                quad.Transform = transforms;

                quad.EndEdit();
                this.viewport3D.Children.Add(quad);

                if (colorI != 0.0)
                {
                    var light = new BackdropLight(Color.FromRgb((byte)colorR, (byte)colorG, (byte)colorB), new Vector3D(-position.Y, position.X, -position.Z));

                    if (showLights)
                    {
                        light.ShowLights = true;
                        light.Transform  = new ScaleTransform3D(100000, 100000, 100000);

                        var elements = (light.Children[0] as ModelVisual3D).Children.Cast <MeshElement3D>();

                        foreach (MeshElement3D element in elements)
                        {
                            element.BeginEdit();
                            element.Material     = new EmissiveMaterial(element.Fill);
                            element.BackMaterial = null;
                            element.EndEdit();
                        }
                    }

                    this.viewport3D.Children.Add(light);
                }
            }
        }