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