public static MyStorageBase LoadRandomizedVoxelMapPrefab(string prefabFilePath)
        {
            var storage = MyStorageBase.LoadFromFile(prefabFilePath);

            storage.DataProvider = MyCompositeShapeProvider.CreateAsteroidShape(
                MyUtils.GetRandomInt(int.MaxValue - 1) + 1,
                storage.Size.AbsMax() * MyVoxelConstants.VOXEL_SIZE_IN_METRES,
                MySession.Static.Settings.VoxelGeneratorVersion);
            storage.Reset(MyStorageDataTypeFlags.Material);
            return(storage);
        }
        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();
        }
Esempio n. 3
0
        IMyVoxelMap IMyVoxelMaps.CreateVoxelMapFromStorageName(string storageName, string prefabVoxelMapName, Vector3D position)
        {
            var filePath = MyWorldGenerator.GetVoxelPrefabPath(prefabVoxelMapName);
            var storage  = MyStorageBase.LoadFromFile(filePath);

            if (storage == null)
            {
                return(null);
            }
            storage.DataProvider = MyCompositeShapeProvider.CreateAsteroidShape(0,
                                                                                storage.Size.AbsMax() * MyVoxelConstants.VOXEL_SIZE_IN_METRES,
                                                                                MySession.Static.Settings.VoxelGeneratorVersion);
            return(MyWorldGenerator.AddVoxelMap(storageName, storage, position));
        }
        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);
        }
 public static MyStorageBase CreateProceduralAsteroidStorage(int seed, float radius)
 {
     return(new MyOctreeStorage(MyCompositeShapeProvider.CreateAsteroidShape(seed, radius, 0), MyVoxelCoordSystems.FindBestOctreeSize(radius)));
 }
 public static MyStorageBase CreateProceduralAsteroidStorage(int seed, float radius, float deviationScale)
 {
     return(new MyOctreeStorage(MyCompositeShapeProvider.CreateAsteroidShape(seed, radius, 0), FindBestOctreeSize(radius)));
 }