private static bool ResetVoxelInArea(Vector3D Center, float Radius) { try { BoundingSphereD Sphere = new BoundingSphereD(Center, Radius); List <MyVoxelBase> Maps = MyEntities.GetEntitiesInSphere(ref Sphere).OfType <MyVoxelBase>().ToList(); if (Maps.Count == 0) { return(true); } foreach (var voxelMap in Maps) { using (voxelMap.Pin()) { if (voxelMap.MarkedForClose) { continue; } MyShapeSphere shape = new MyShapeSphere(); shape.Center = Center; shape.Radius = Radius; Vector3I minCorner; Vector3I maxCorner; Vector3I numCells; BoundingBoxD shapeAabb = shape.GetWorldBoundaries(); Vector3I StorageSize = voxelMap.Storage.Size; MyVoxelCoordSystems.WorldPositionToVoxelCoord(voxelMap.PositionLeftBottomCorner, ref shapeAabb.Min, out minCorner); MyVoxelCoordSystems.WorldPositionToVoxelCoord(voxelMap.PositionLeftBottomCorner, ref shapeAabb.Max, out maxCorner); minCorner += voxelMap.StorageMin; maxCorner += voxelMap.StorageMin; maxCorner += 1; StorageSize -= 1; Vector3I.Clamp(ref minCorner, ref Vector3I.Zero, ref StorageSize, out minCorner); Vector3I.Clamp(ref maxCorner, ref Vector3I.Zero, ref StorageSize, out maxCorner); numCells = new Vector3I((maxCorner.X - minCorner.X) / 16, (maxCorner.Y - minCorner.Y) / 16, (maxCorner.Z - minCorner.Z) / 16); minCorner = Vector3I.Max(Vector3I.One, minCorner); maxCorner = Vector3I.Max(minCorner, maxCorner - Vector3I.One); voxelMap.Storage.DeleteRange(MyStorageDataTypeFlags.ContentAndMaterial, minCorner, maxCorner, false); BoundingBoxD cutOutBox = shape.GetWorldBoundaries(); MySandboxGame.Static.Invoke(delegate { if (voxelMap.Storage != null) { voxelMap.Storage.NotifyChanged(minCorner, maxCorner, MyStorageDataTypeFlags.ContentAndMaterial); MyVoxelGenerator.NotifyVoxelChanged(MyVoxelBase.OperationType.Revert, voxelMap, ref cutOutBox); } }, "RevertShape notify"); } } return(true); } catch (Exception ex) { _log.Error(ex, "Voxel reset failed!"); return(false); } }
protected virtual bool TryDrillVoxels(MyVoxelBase voxels, Vector3D hitPosition, bool collectOre, bool onlyCheck, bool applyDamagedMaterial) { const float DISCARDING_MULTIPLIER = 3.0f; if (voxels.GetOrePriority() == MyVoxelConstants.PRIORITY_IGNORE_EXTRACTION) { return(false); } bool somethingDrilled = false; var bsphere = new MyShapeSphere() { Center = m_cutOut.Sphere.Center, Radius = (float)m_cutOut.Sphere.Radius }; if (!collectOre) { bsphere.Radius *= DISCARDING_MULTIPLIER; } float voxelsCountInPercent; MyVoxelMaterialDefinition material; MyVoxelGenerator.CutOutShapeWithProperties(voxels, bsphere, out voxelsCountInPercent, out material, m_drilledMaterialBuffer, Sync.IsServer, onlyCheck, applyDamagedMaterial); foreach (var entry in m_drilledMaterialBuffer) { somethingDrilled = (!collectOre || TryHarvestOreMaterial(entry.Key, hitPosition, entry.Value, onlyCheck)) || somethingDrilled; if (somethingDrilled && !onlyCheck) { MyDebris.Static.CreateDirectedDebris(hitPosition, MyUtils.GetRandomVector3Normalized(), 0.1f, 1, 0, MathHelper.Pi, 5, 1, 0.15f, entry.Key); } } m_drilledMaterialBuffer.Clear(); return(somethingDrilled); }
private static void VoxelPlacement() { var camera = MySector.MainCamera; if (camera == null) { return; } var offset = 0; // MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; var targetPosition = camera.Position + (Vector3D)camera.ForwardVector * 4.5f - offset; MyVoxelBase targetVoxelMap = null; foreach (var voxelMap in MySession.Static.VoxelMaps.Instances) { if (voxelMap.PositionComp.WorldAABB.Contains(targetPosition) == ContainmentType.Contains) { targetVoxelMap = voxelMap; break; } } if (targetVoxelMap == null) { return; } Vector3I targetVoxel; MyVoxelCoordSystems.WorldPositionToVoxelCoord(targetVoxelMap.PositionLeftBottomCorner, ref targetPosition, out targetVoxel); MyVoxelCoordSystems.VoxelCoordToWorldPosition(targetVoxelMap.PositionLeftBottomCorner, ref targetVoxel, out targetPosition); targetPosition += offset; var size = 3.0f; const int shapeType = 0; { BoundingBoxD aabb; MyVoxelCoordSystems.VoxelCoordToWorldAABB(targetVoxelMap.PositionLeftBottomCorner, ref targetVoxel, out aabb); VRageRender.MyRenderProxy.DebugDrawAABB(aabb, Color.Blue, 1f, 1f, true); } BoundingSphereD sphere; BoundingBoxD box; if (shapeType == 0) { sphere = new BoundingSphereD(targetPosition, size * 0.5f); VRageRender.MyRenderProxy.DebugDrawSphere(targetPosition, size * 0.5f, Color.White, 1f, true); } else if (shapeType == 1) { box = new BoundingBoxD( targetPosition - size * 0.5f, targetPosition + size * 0.5f); VRageRender.MyRenderProxy.DebugDrawAABB(box, Color.White, 1f, 1f, true); } else if (shapeType == 2) { MyVoxelCoordSystems.WorldPositionToVoxelCoord(targetVoxelMap.PositionLeftBottomCorner, ref targetPosition, out targetVoxel); //targetVoxel = Vector3I.Zero; MyVoxelCoordSystems.VoxelCoordToWorldAABB(targetVoxelMap.PositionLeftBottomCorner, ref targetVoxel, out box); VRageRender.MyRenderProxy.DebugDrawAABB(box, Vector3.One, 1f, 1f, true); } bool leftPressed = MyInput.Static.IsLeftMousePressed(); if (leftPressed) { MyShape shape; if (shapeType == 0) { shape = new MyShapeSphere() { Center = sphere.Center, Radius = (float)sphere.Radius, }; } else if (shapeType == 1 || shapeType == 2) { shape = new MyShapeBox() { Boundaries = box, }; } if (shape != null) { float dummy; MyVoxelMaterialDefinition dummy2; MyVoxelGenerator.CutOutShapeWithProperties(targetVoxelMap, shape, out dummy, out dummy2); } } }