/// <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"); }
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); } } }