public void ReplaceSurfaceExecuted(string materialName) { MainViewModel.IsBusy = true; var sourceFile = DataModel.SourceVoxelFilepath ?? DataModel.VoxelFilepath; var asteroid = new MyVoxelMap(); asteroid.Load(sourceFile, SpaceEngineersCore.Resources.GetDefaultMaterialName(), true); asteroid.ForceShellMaterial(materialName, 2); var tempfilename = TempfileUtil.NewFilename(MyVoxelMap.V2FileExtension); asteroid.Save(tempfilename); DataModel.SourceVoxelFilepath = tempfilename; MainViewModel.IsModified = true; MainViewModel.IsBusy = false; DataModel.MaterialAssets = null; DataModel.InitializeAsync(); }
private bool BuildEntity() { var filenamepart = Path.GetFileNameWithoutExtension(Filename); var filename = MainViewModel.CreateUniqueVoxelStorageName(filenamepart + MyVoxelMap.V2FileExtension); double multiplier; if (IsMultipleScale) { multiplier = MultipleScale; } else { multiplier = MaxLengthScale / Math.Max(Math.Max(OriginalModelSize.Height, OriginalModelSize.Width), OriginalModelSize.Depth); } var scale = new ScaleTransform3D(multiplier, multiplier, multiplier); var rotateTransform = MeshHelper.TransformVector(new System.Windows.Media.Media3D.Vector3D(0, 0, 0), -RotateRoll, RotateYaw - 90, RotatePitch + 90); SourceFile = TempfileUtil.NewFilename(MyVoxelMap.V2FileExtension); var model = MeshHelper.Load(Filename, ignoreErrors: true); var meshes = new List <MyVoxelRayTracer.MyMeshModel>(); var geometeries = new List <MeshGeometry3D>(); foreach (var model3D in model.Children) { var gm = (GeometryModel3D)model3D; var geometry = gm.Geometry as MeshGeometry3D; if (geometry != null) { geometeries.Add(geometry); } } meshes.Add(new MyVoxelRayTracer.MyMeshModel(geometeries.ToArray(), InsideStockMaterial.MaterialIndex, InsideStockMaterial.MaterialIndex)); #region handle dialogs and process the conversion var doCancel = false; var progressModel = new ProgressCancelModel { Title = Res.WnProgressTitle, SubTitle = Res.WnProgressTitle, DialogText = Res.WnProgressTxtTimeRemain + " " + Res.WnProgressTxtTimeCalculating }; var progressVm = new ProgressCancelViewModel(this, progressModel); progressVm.CloseRequested += delegate(object sender, EventArgs e) { doCancel = true; }; var cancelFunc = (Func <bool>) delegate { return(doCancel); }; var completedAction = (Action) delegate { progressVm.Close(); }; MyVoxelMap voxelMap = null; var action = (Action) delegate { voxelMap = MyVoxelRayTracer.ReadModelAsteroidVolmetic(model, meshes, scale, rotateTransform, TraceType, TraceCount, TraceDirection, progressModel.ResetProgress, progressModel.IncrementProgress, cancelFunc, completedAction); }; if (RunInLowPrioity) { System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.Idle; } _dialogService.ShowDialog <WindowProgressCancel>(this, progressVm, action); if (RunInLowPrioity) { System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.Normal; } #endregion if (doCancel || voxelMap == null) { IsValidEntity = false; NewEntity = null; } else { voxelMap.ForceShellMaterial(OutsideStockMaterial.Value, (byte)OutsideMaterialDepth); voxelMap.Save(SourceFile); var position = VRageMath.Vector3D.Zero; var forward = Vector3.Forward; var up = Vector3.Up; if (IsAbsolutePosition) { position = Position.ToVector3(); } else if (IsInfrontofPlayer) { // Figure out where the Character is facing, and plant the new construct centered in front of the Character, but "BuildDistance" units out in front. var lookVector = (VRageMath.Vector3D)_dataModel.CharacterPosition.Forward.ToVector3(); lookVector.Normalize(); BoundingBoxD content = voxelMap.BoundingContent.ToBoundingBoxD(); VRageMath.Vector3D?boundingIntersectPoint = content.IntersectsRayAt(content.Center, -lookVector * 5000d); if (!boundingIntersectPoint.HasValue) { boundingIntersectPoint = content.Center; } var distance = VRageMath.Vector3D.Distance(boundingIntersectPoint.Value, content.Center) + (float)BuildDistance; VRageMath.Vector3D vector = lookVector * distance; position = VRageMath.Vector3D.Add(_dataModel.CharacterPosition.Position, vector) - content.Center; } var entity = new MyObjectBuilder_VoxelMap(position, filename) { EntityId = SpaceEngineersApi.GenerateEntityId(IDType.ASTEROID), PersistentFlags = MyPersistentEntityFlags2.CastShadows | MyPersistentEntityFlags2.InScene, StorageName = Path.GetFileNameWithoutExtension(filename) }; entity.PositionAndOrientation = new MyPositionAndOrientation { Position = position, Forward = forward, Up = up }; IsValidEntity = voxelMap.BoundingContent.Size.Volume() > 0; NewEntity = entity; if (BeepWhenFinished) { System.Media.SystemSounds.Asterisk.Play(); } } return(!doCancel); }
public void FillAsteroid(MyVoxelMap asteroid, IMyVoxelFillProperties fillProperties) { var properties = (AsteroidSeedFillProperties)fillProperties; /* The full history behind this hack/crutch eludes me. * There are roids that won't change their materials unless their face materials forced to something other than current value. * So we have to do that manually by setting to a usually unused ore (uranium) and then reverting to the one we chose (=old one in case of a flaky roid) */ byte oldMaterial = asteroid.VoxelMaterial; asteroid.ForceVoxelFaceMaterial("Uraninite_01"); asteroid.ForceVoxelFaceMaterial(properties.MainMaterial.Value); // Cycle through veins info and add 'spherical' depisits to the voxel cell grid (not voxels themselves) int i; if (properties.FirstVeins > 0) { for (i = 0; i < properties.FirstVeins; i++) { asteroid.SeedMaterialSphere(properties.FirstMaterial.Value, (byte)properties.FirstRadius); } } if (properties.SecondVeins > 0) { for (i = 0; i < properties.SecondVeins; i++) { asteroid.SeedMaterialSphere(properties.SecondMaterial.Value, (byte)properties.SecondRadius); } } if (properties.ThirdVeins > 0) { for (i = 0; i < properties.ThirdVeins; i++) { asteroid.SeedMaterialSphere(properties.ThirdMaterial.Value, (byte)properties.ThirdRadius); } } if (properties.FourthVeins > 0) { for (i = 0; i < properties.FourthVeins; i++) { asteroid.SeedMaterialSphere(properties.FourthMaterial.Value, (byte)properties.FourthRadius); } } if (properties.FifthVeins > 0) { for (i = 0; i < properties.FifthVeins; i++) { asteroid.SeedMaterialSphere(properties.FifthMaterial.Value, (byte)properties.FifthRadius); } } if (properties.SixthVeins > 0) { for (i = 0; i < properties.SixthVeins; i++) { asteroid.SeedMaterialSphere(properties.SixthMaterial.Value, (byte)properties.SixthRadius); } } if (properties.SeventhVeins > 0) { for (i = 0; i < properties.SeventhVeins; i++) { asteroid.SeedMaterialSphere(properties.SeventhMaterial.Value, (byte)properties.SeventhRadius); } } // Hide the surface materials up to depth of 2 cells. asteroid.ForceShellMaterial(properties.MainMaterial.Value, 2); // This recovers material assigning ability for most roids (could be something specific to indestructibleContent property?) // And not for all, apparently :( //asteroid.ForceVoxelFaceMaterial(_dataModel.BaseMaterial.DisplayName); // don't change mattype // doesn't help //asteroid.ForceIndestructibleContent(0xff); // Alt ends }