private void RemoveAllAsteroids(MyGuiControlButton sender) { MyCsgShapePlanetShapeAttributes shapeAttributes = new MyCsgShapePlanetShapeAttributes(); shapeAttributes.Seed = 12345; shapeAttributes.Diameter = 60; shapeAttributes.Radius = 60 / 2.0f; shapeAttributes.DeviationScale = 0.003f; float maxHillSize = 10; float planetHalfDeviation = (shapeAttributes.Diameter * shapeAttributes.DeviationScale) / 2.0f; float hillHalfDeviation = planetHalfDeviation * maxHillSize; float canyonHalfDeviation = 1; float averagePlanetRadius = shapeAttributes.Radius - hillHalfDeviation; float outerRadius = averagePlanetRadius + hillHalfDeviation; float innerRadius = averagePlanetRadius - canyonHalfDeviation; float atmosphereRadius = MathHelper.Max(outerRadius, averagePlanetRadius * 1.08f); float minPlanetRadius = MathHelper.Min(innerRadius, averagePlanetRadius - planetHalfDeviation * 2 * 2.5f); MyCsgShapePlanetMaterialAttributes materialAttributes = new MyCsgShapePlanetMaterialAttributes(); materialAttributes.OreStartDepth = innerRadius; materialAttributes.OreEndDepth = innerRadius; materialAttributes.OreEndDepth = MathHelper.Max(materialAttributes.OreEndDepth, 0); materialAttributes.OreStartDepth = MathHelper.Max(materialAttributes.OreStartDepth, 0); materialAttributes.OreProbabilities = new MyOreProbability[10]; for (int i = 0; i < 10; ++i) { materialAttributes.OreProbabilities[i] = new MyOreProbability(); materialAttributes.OreProbabilities[i].OreName = "Ice_01"; materialAttributes.OreProbabilities[i].CummulativeProbability = 0.0f; } shapeAttributes.AveragePlanetRadius = averagePlanetRadius; IMyStorageDataProvider dataProvider = MyCompositeShapeProvider.CreatePlanetShape(0, ref shapeAttributes, maxHillSize, ref materialAttributes); IMyStorage storage = new MyOctreeStorage(dataProvider, MyVoxelCoordSystems.FindBestOctreeSize(shapeAttributes.Diameter)); MyStorageDataCache cache = new MyStorageDataCache(); cache.Resize(storage.Size); Vector3I start = Vector3I.Zero; Vector3I end = storage.Size; storage.ReadRange(cache, MyStorageDataTypeFlags.Content, 1, ref start, ref end); dataProvider.ReleaseHeightMaps(); }
private static MyPlanet CreatePlanet(string storageName, ref Vector3D positionMinCorner, int seed, float size, long entityId, ref DictionaryValuesReader <MyDefinitionId, MyPlanetGeneratorDefinition> planetDefinitions) { if (MyFakes.ENABLE_PLANETS == false) { //return null; } m_materialsByOreType.Clear(); m_oreProbalities.Clear(); m_spawningMaterials.Clear(); m_organicMaterials.Clear(); foreach (var planetGeneratorDefinition in planetDefinitions) { var random = MyRandom.Instance; using (var stateToken = random.PushSeed(seed)) { BuildOreProbabilities(planetGeneratorDefinition); FillMaterialCollections(); MyCsgShapePlanetShapeAttributes shapeAttributes = new MyCsgShapePlanetShapeAttributes(); shapeAttributes.Seed = seed; shapeAttributes.Diameter = size; shapeAttributes.Radius = size / 2.0f; shapeAttributes.DeviationScale = random.NextFloat(planetGeneratorDefinition.Deviation.Min, planetGeneratorDefinition.Deviation.Max); float maxHillSize = random.NextFloat(planetGeneratorDefinition.HillParams.SizeRatio.Min, planetGeneratorDefinition.HillParams.SizeRatio.Max); float planetHalfDeviation = (shapeAttributes.Diameter * shapeAttributes.DeviationScale) / 2.0f; float hillHalfDeviation = planetHalfDeviation * maxHillSize; float canyonHalfDeviation = 1; float averagePlanetRadius = shapeAttributes.Radius - hillHalfDeviation; float outerRadius = averagePlanetRadius + hillHalfDeviation; float innerRadius = averagePlanetRadius - canyonHalfDeviation; float atmosphereRadius = MathHelper.Max(outerRadius, averagePlanetRadius * 1.08f); float minPlanetRadius = MathHelper.Min(innerRadius, averagePlanetRadius - planetHalfDeviation * 2 * 2.5f); MyCsgShapePlanetMaterialAttributes materialAttributes = new MyCsgShapePlanetMaterialAttributes(); materialAttributes.OreStartDepth = innerRadius - random.NextFloat(planetGeneratorDefinition.MaterialsMinDepth.Min, planetGeneratorDefinition.MaterialsMinDepth.Max); materialAttributes.OreEndDepth = innerRadius - random.NextFloat(planetGeneratorDefinition.MaterialsMaxDepth.Min, planetGeneratorDefinition.MaterialsMaxDepth.Max); materialAttributes.OreEndDepth = MathHelper.Max(materialAttributes.OreEndDepth, 0); materialAttributes.OreStartDepth = MathHelper.Max(materialAttributes.OreStartDepth, 0); bool isHostile = random.NextFloat(0, 1) < planetGeneratorDefinition.HostilityProbability; materialAttributes.OreProbabilities = new MyOreProbability[m_oreProbalities.Count]; for (int i = 0; i < m_oreProbalities.Count; ++i) { materialAttributes.OreProbabilities[i] = m_oreProbalities[i]; materialAttributes.OreProbabilities[i].CummulativeProbability /= m_oreCummulativeProbability; } shapeAttributes.AveragePlanetRadius = averagePlanetRadius; IMyStorage storage = new MyOctreeStorage(MyCompositeShapeProvider.CreatePlanetShape(0, ref shapeAttributes, hillHalfDeviation, ref materialAttributes), MyVoxelCoordSystems.FindBestOctreeSize(size)); float redAtmosphereShift = isHostile ? random.NextFloat(planetGeneratorDefinition.HostileAtmosphereColorShift.R.Min, planetGeneratorDefinition.HostileAtmosphereColorShift.R.Max) : 0; float greenAtmosphereShift = isHostile ? random.NextFloat(planetGeneratorDefinition.HostileAtmosphereColorShift.G.Min, planetGeneratorDefinition.HostileAtmosphereColorShift.G.Max) : 0; float blueAtmosphereShift = isHostile ? random.NextFloat(planetGeneratorDefinition.HostileAtmosphereColorShift.B.Min, planetGeneratorDefinition.HostileAtmosphereColorShift.B.Max) : 0; Vector3 atmosphereWavelengths = new Vector3(0.650f + redAtmosphereShift, 0.570f + greenAtmosphereShift, 0.475f + blueAtmosphereShift); atmosphereWavelengths.X = MathHelper.Clamp(atmosphereWavelengths.X, 0.1f, 1.0f); atmosphereWavelengths.Y = MathHelper.Clamp(atmosphereWavelengths.Y, 0.1f, 1.0f); atmosphereWavelengths.Z = MathHelper.Clamp(atmosphereWavelengths.Z, 0.1f, 1.0f); float gravityFalloff = random.NextFloat(planetGeneratorDefinition.GravityFalloffPower.Min, planetGeneratorDefinition.GravityFalloffPower.Max); var voxelMap = new MyPlanet(); voxelMap.EntityId = entityId; MyPlanetInitArguments planetInitArguments; planetInitArguments.StorageName = storageName; planetInitArguments.Storage = storage; planetInitArguments.PositionMinCorner = positionMinCorner; planetInitArguments.AveragePlanetRadius = averagePlanetRadius; planetInitArguments.AtmosphereRadius = atmosphereRadius; planetInitArguments.MaximumHillRadius = averagePlanetRadius + hillHalfDeviation; planetInitArguments.MinimumSurfaceRadius = minPlanetRadius; planetInitArguments.HasAtmosphere = planetGeneratorDefinition.HasAtmosphere; planetInitArguments.AtmosphereWavelengths = atmosphereWavelengths; planetInitArguments.MaxOxygen = isHostile ? 0.0f : 1.0f; planetInitArguments.GravityFalloff = gravityFalloff; planetInitArguments.MarkAreaEmpty = false; voxelMap.Init(planetInitArguments); MyEntities.Add(voxelMap); m_materialsByOreType.Clear(); m_oreProbalities.Clear(); m_spawningMaterials.Clear(); m_organicMaterials.Clear(); return(voxelMap); } } return(null); }