private static MyMaterialLayer CreatePoleLayer(MyRandom random, MyPoleParams poleParams, float startHeight, float outerRadius, ref int layerOffset) { if (m_materialsByOreType.ContainsKey("Ice") == false) { return(null); } MyMaterialLayer poleLayer = null; float poleProbability = random.NextFloat(0, 1); if (poleParams != null && poleProbability < poleParams.Probability) { layerOffset++; poleLayer = new MyMaterialLayer(); poleLayer.StartHeight = startHeight; poleLayer.EndHeight = outerRadius; poleLayer.MaterialDefinition = m_materialsByOreType["Ice"][random.Next() % m_materialsByOreType["Ice"].Count]; poleLayer.HeightEndDeviation = 0; poleLayer.HeightStartDeviation = 0; poleLayer.StartAngle = random.NextFloat(poleParams.Angle.Min, poleParams.Angle.Max); poleLayer.EndAngle = 1.0f; poleLayer.AngleStartDeviation = random.NextFloat(poleParams.AngleDeviation.Min, poleParams.AngleDeviation.Max); } return(poleLayer); }
public void ReadFrom(Stream stream) { int numMaterials = stream.ReadInt32(); Layers = new MyMaterialLayer[numMaterials]; for (int i = 0; i < numMaterials; ++i) { Layers[i] = new MyMaterialLayer(); Layers[i].StartHeight = stream.ReadFloat(); Layers[i].EndHeight = stream.ReadFloat(); Layers[i].StartAngle = stream.ReadFloat(); Layers[i].EndAngle = stream.ReadFloat(); Layers[i].HeightStartDeviation = stream.ReadFloat(); Layers[i].AngleStartDeviation = stream.ReadFloat(); Layers[i].HeightEndDeviation = stream.ReadFloat(); Layers[i].AngleEndDeviation = stream.ReadFloat(); Layers[i].MaterialDefinition = MyDefinitionManager.Static.GetVoxelMaterialDefinition(stream.ReadString()); } int numOreProbabilities = stream.ReadInt32(); OreProbabilities = new MyOreProbability[numOreProbabilities]; for (int i = 0; i < numOreProbabilities; ++i) { OreProbabilities[i] = new MyOreProbability(); OreProbabilities[i].CummulativeProbability = stream.ReadFloat(); OreProbabilities[i].OreName = stream.ReadString(); } OreStartDepth = stream.ReadFloat(); OreEndDepth = stream.ReadFloat(); }
private static MyMaterialLayer[] CreateMaterialLayers(MyPlanetGeneratorDefinition planetDefinition, bool isHostile, MyRandom random, float averagePlanetRadius, float hillHalfDeviation, float canyonHalfDeviation, ref float outerRadius, ref float innerRadius) { int numLayers = random.Next((int)planetDefinition.NumLayers.Min, (int)planetDefinition.NumLayers.Max); float startHeight = averagePlanetRadius - canyonHalfDeviation; outerRadius = averagePlanetRadius + hillHalfDeviation; innerRadius = averagePlanetRadius - canyonHalfDeviation; int layerOffset = 0; MyMaterialLayer southPoleLayer = CreatePoleLayer(random, planetDefinition.SouthPole, startHeight, outerRadius, ref layerOffset); MyMaterialLayer northPoleLayer = CreatePoleLayer(random, planetDefinition.NorthPole, startHeight, outerRadius, ref layerOffset); MyMaterialLayer[] materialLayers = new MyMaterialLayer[numLayers + layerOffset]; float endAngle = 1; float startAngle = -1; int currentLayer = 0; if (southPoleLayer != null) { materialLayers[currentLayer] = southPoleLayer; endAngle = southPoleLayer.StartAngle; currentLayer++; } if (northPoleLayer != null) { materialLayers[currentLayer] = northPoleLayer; northPoleLayer.EndAngle = northPoleLayer.StartAngle; northPoleLayer.StartAngle = -1.0f; northPoleLayer.AngleEndDeviation = northPoleLayer.AngleStartDeviation; northPoleLayer.AngleStartDeviation = 0.0f; startAngle = northPoleLayer.EndAngle; } float step = (outerRadius - innerRadius) / materialLayers.Length; float organicHeightEnd = random.NextFloat(planetDefinition.OrganicHeightEnd.Min, planetDefinition.OrganicHeightEnd.Max); float floraMaterialSpawnProbability = random.NextFloat(planetDefinition.FloraMaterialSpawnProbability.Min, planetDefinition.FloraMaterialSpawnProbability.Max); float metalsSpawnValue = random.NextFloat(0, 1); for (int i = layerOffset; i < materialLayers.Length; ++i) { float layerHeight = random.NextFloat(0, step); materialLayers[i] = new MyMaterialLayer(); materialLayers[i].StartHeight = startHeight; materialLayers[i].EndHeight = startHeight + layerHeight; materialLayers[i].StartAngle = startAngle; materialLayers[i].EndAngle = endAngle; materialLayers[i].HeightStartDeviation = random.NextFloat(0, 100.0f / (float)(i + 1)); materialLayers[i].AngleStartDeviation = 0; materialLayers[i].HeightEndDeviation = random.NextFloat(0, 100.0f / (float)(i + 1)); materialLayers[i].AngleEndDeviation = 0; MyVoxelMaterialDefinition materialDefinition = null; if (m_materialsByOreType.ContainsKey("Stone") == true) { materialDefinition = m_materialsByOreType["Stone"][random.Next() % m_materialsByOreType["Stone"].Count]; } if (planetDefinition.HasAtmosphere && isHostile == false) { if ((outerRadius - startHeight) > ((outerRadius - innerRadius) * (1 - organicHeightEnd))) { float value = random.NextFloat(0, 1); if (value > floraMaterialSpawnProbability) { materialDefinition = m_organicMaterials[random.Next() % m_organicMaterials.Count]; } else { materialDefinition = m_spawningMaterials[random.Next() % m_spawningMaterials.Count]; } } } materialLayers[i].MaterialDefinition = materialDefinition; startHeight += layerHeight; } return(materialLayers); }