public MyCompositeLayeredOreDeposit(MyCsgShapeBase shape, MyMaterialLayer[] materialLayers,IMyModule noise, MyCompositeOrePlanetDeposit oresDeposits) :
     base(shape, null)
 {
     m_materialLayers = materialLayers;
     m_noise = noise;
     m_oreDeposits = oresDeposits;
 }
Esempio n. 2
0
        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();
        }
 public MyCompositeLayeredOreDeposit(MyCsgShapeBase shape, MyMaterialLayer[] materialLayers,IMyModule noise) :
     base(shape, null)
 {
     m_materialLayers = materialLayers;
     m_noise = noise;
 }
        void IMyStorageDataProvider.ReadFrom(ref MyOctreeStorage.ChunkHeader header, Stream stream, ref bool isOldFormat)
        {
            m_state.Version = stream.ReadUInt32();
            if (m_state.Version != CURRENT_VERSION)
            {
                // Making sure this gets saved in new format and serialized cache holding old format is discarded.
                isOldFormat = true;
            }

            m_state.Generator = stream.ReadInt32();
            m_state.Seed = stream.ReadInt32();
            m_state.Size = stream.ReadFloat();

            if (m_state.Version == VERSION_WITHOUT_PLANETS)
            {
                m_state.IsPlanet = 0;
            }
            else
            {
                m_state.IsPlanet = stream.ReadUInt32();
            }

            if (m_state.IsPlanet != 0)
            {

                int numMaterials = stream.ReadInt32();
                m_materialLayers = new MyMaterialLayer[numMaterials];
                for (int i = 0; i < numMaterials; ++i)
                {
                    m_materialLayers[i] = new MyMaterialLayer();
                    m_materialLayers[i].StartHeight = stream.ReadFloat();
                    m_materialLayers[i].EndHeight = stream.ReadFloat();
                    m_materialLayers[i].MaterialName = stream.ReadString();
                    m_materialLayers[i].StartAngle = stream.ReadFloat();
                    m_materialLayers[i].EndAngle = stream.ReadFloat();
                    m_materialLayers[i].HeightStartDeviation = stream.ReadFloat();
                    m_materialLayers[i].AngleStartDeviation = stream.ReadFloat();
                    m_materialLayers[i].HeightEndDeviation = stream.ReadFloat();
                    m_materialLayers[i].AngleEndDeviation = stream.ReadFloat();
                }

                m_shapeAttributes.Seed = stream.ReadInt32();
                m_shapeAttributes.Radius = stream.ReadFloat();
                m_shapeAttributes.NoiseFrequency = stream.ReadFloat();
                m_shapeAttributes.DeviationScale = stream.ReadFloat();
                m_shapeAttributes.NormalNoiseFrequency = stream.ReadFloat();
                m_shapeAttributes.LayerDeviationNoiseFreqeuncy = stream.ReadFloat();
                m_shapeAttributes.LayerDeviationSeed = stream.ReadInt32();

                m_hillAttributes.BlendTreshold = stream.ReadFloat();
                m_hillAttributes.Treshold = stream.ReadFloat();
                m_hillAttributes.SizeRatio = stream.ReadFloat();
                m_hillAttributes.NumNoises = stream.ReadInt32();
                m_hillAttributes.Frequency = stream.ReadFloat();

                m_canyonAttributes.BlendTreshold = stream.ReadFloat();
                m_canyonAttributes.Treshold = stream.ReadFloat();
                m_canyonAttributes.SizeRatio = stream.ReadFloat();
                m_canyonAttributes.NumNoises = stream.ReadInt32();
                m_canyonAttributes.Frequency = stream.ReadFloat();

                MyCompositeShapes.PlanetGenerators[m_state.Generator](ref m_shapeAttributes,ref m_hillAttributes, ref m_canyonAttributes, m_materialLayers, out m_data);
            }
            else
            {
                MyCompositeShapes.AsteroidGenerators[m_state.Generator](m_state.Seed, m_state.Size, out m_data);
            }

            m_state.Version = CURRENT_VERSION;
        }
        // Do NOT use! Work in progress which is likely to change, breaking all saves that use this.
        private static MyCompositeShapeProvider CreatePlanetShape(int generatorEntry,
            ref MyCsgShapePlanetShapeAttributes shapeAttributes,
            ref MyCsgShapePlanetHillAttributes hillAttributes,
            ref MyCsgShapePlanetHillAttributes canyonAttributes,
            MyMaterialLayer[] materialLevels)
        {
            var result = new MyCompositeShapeProvider();
            result.m_state.Version = CURRENT_VERSION;
            result.m_state.Generator = generatorEntry;
            result.m_state.Seed = shapeAttributes.Seed;
            result.m_state.Size = shapeAttributes.Radius;
            result.m_state.IsPlanet = 1;
            result.m_materialLayers = materialLevels;
            result.m_shapeAttributes = shapeAttributes;
            result.m_hillAttributes = hillAttributes;
            result.m_canyonAttributes = canyonAttributes;

            MyCompositeShapes.PlanetGenerators[result.m_state.Generator](ref shapeAttributes, ref hillAttributes, ref canyonAttributes, materialLevels, out result.m_data);

            return result;
        }
        private static void PlanetGenerator(ref MyCsgShapePlanetShapeAttributes shapeAttributes, ref MyCsgShapePlanetHillAttributes hillAttributes, ref MyCsgShapePlanetHillAttributes canyonAttributes, MyMaterialLayer[] materialLevels, out MyCompositeShapeGeneratedData data)
        {
            var random = MyRandom.Instance;
            using (var stateToken = random.PushSeed(shapeAttributes.Seed))
            {
                data = new MyCompositeShapeGeneratedData();
                data.FilledShapes = new MyCsgShapeBase[1];
                data.RemovedShapes = new MyCsgShapeBase[0];


                data.MacroModule = new MyBillowFast(quality: MyNoiseQuality.Low,seed: shapeAttributes.Seed, frequency: shapeAttributes.NoiseFrequency / shapeAttributes.Radius, layerCount: 4);

                data.DetailModule = new MyBillowFast(
                           seed: shapeAttributes.Seed,
                           quality: MyNoiseQuality.Low,
                           frequency: shapeAttributes.NoiseFrequency / shapeAttributes.Radius,
                           layerCount: 1);

                float halfSize = shapeAttributes.Radius * 0.5f;
                float storageSize = VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(shapeAttributes.Radius);
                float halfStorageSize = storageSize * 0.5f;
                float storageOffset = halfStorageSize - halfSize;

                data.FilledShapes[0] = new MyCsgShapePlanet(
                                        random,
                                        new Vector3(halfStorageSize),
                                        ref shapeAttributes,
                                        ref hillAttributes,
                                        ref canyonAttributes,
                                        detailFrequency: 0.09f,
                                        deviationFrequency: 10.0f);


                foreach (var material in MyDefinitionManager.Static.GetVoxelMaterialDefinitions())
                {
                    if (material.MinedOre == "Stone") // Surface
                    {
                        m_surfaceMaterials.Add(material);
                    }
                }

                data.DefaultMaterial = m_surfaceMaterials[(int)random.Next() % m_surfaceMaterials.Count];

                int depositCount = 1;
                data.Deposits = new MyCompositeShapeOreDeposit[depositCount];

                MyMaterialLayer[] materialLayers = new MyMaterialLayer[materialLevels.Length];

                float surfaceSize = (shapeAttributes.Radius/2.0f) * (1 - shapeAttributes.DeviationScale * hillAttributes.SizeRatio);
                for (int i = 0; i < materialLayers.Length; ++i)
                {
                    materialLayers[i] = new MyMaterialLayer();
                    materialLayers[i].StartHeight = materialLevels[i].StartHeight + surfaceSize;
                    materialLayers[i].EndHeight = materialLevels[i].EndHeight + surfaceSize;
                    materialLayers[i].MaterialDefinition = GetMaterialByName(materialLevels[i].MaterialName);
                    materialLayers[i].StartAngle = materialLevels[i].StartAngle;
                    materialLayers[i].EndAngle = materialLevels[i].EndAngle;
                    materialLayers[i].HeightStartDeviation = materialLevels[i].HeightStartDeviation;
                    materialLayers[i].AngleStartDeviation = materialLevels[i].AngleStartDeviation;
                    materialLayers[i].HeightEndDeviation = materialLevels[i].HeightEndDeviation;
                    materialLayers[i].AngleEndDeviation = materialLevels[i].AngleEndDeviation;
                }

                for (int i = 0; i < depositCount; ++i)
                {
                    data.Deposits[i] = new MyCompositeLayeredOreDeposit(new MyCsgSimpleSphere(
                                                                        new Vector3(halfStorageSize), halfSize), materialLayers, 
                                                                        new MyBillowFast(layerCount:3, 
                                                                        seed:shapeAttributes.LayerDeviationSeed,frequency: shapeAttributes.LayerDeviationNoiseFreqeuncy / shapeAttributes.Radius));
                }

                m_surfaceMaterials.Clear();
                m_coreMaterials.Clear();
            }
        }
 private static void PlanetGenerator0(ref MyCsgShapePlanetShapeAttributes shapeAttributes, ref MyCsgShapePlanetHillAttributes hillAttributes, ref MyCsgShapePlanetHillAttributes canyonAttributes, MyMaterialLayer[] materialLevels, out MyCompositeShapeGeneratedData data)
 {
     PlanetGenerator(ref shapeAttributes, ref hillAttributes, ref canyonAttributes, materialLevels, out data);
 }
        private static MyMaterialLayer[] CreateMaterialLayers(MyPlanetDefinition 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 metalsHeightEnd = random.NextFloat(planetDefinition.MetalsHeightEndHostile.Min, planetDefinition.MetalsHeightEndHostile.Max);
            float floraMaterialSpawnProbability = random.NextFloat(planetDefinition.FloraMaterialSpawnProbability.Min, planetDefinition.FloraMaterialSpawnProbability.Max);
            float metalsSpawnProbability = random.NextFloat(planetDefinition.MetalsSpawnProbability.Min, planetDefinition.MetalsSpawnProbability.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];
                        }
                    }
                }
                else
                {
                    if (metalsSpawnValue < metalsSpawnProbability)
                    {
                        if ((outerRadius - startHeight) > ((outerRadius - innerRadius) * (1 - metalsHeightEnd)))
                        {
                            MyOreProbability probablity = GetOre(random.NextFloat(0, 1));
                            if (probablity != null)
                            {
                                materialLayers[i].EndHeight = materialLayers[i].StartHeight - 1;
                                materialLayers[i].HeightStartDeviation *= probablity.Probability;
                                materialLayers[i].HeightEndDeviation *= probablity.Probability;

                                materialDefinition = m_materialsByOreType[probablity.OreName][random.Next() % m_materialsByOreType[probablity.OreName].Count];
                            }
                        }
                    }
                }

                materialLayers[i].MaterialDefinition = materialDefinition;
                startHeight += layerHeight;
            }
            return materialLayers;
        }
        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 static MyStorageBase CreatePlanetStorage(
     ref MyCsgShapePlanetShapeAttributes shapeAttributes,
     ref MyCsgShapePlanetHillAttributes hillAttributes,
     ref MyCsgShapePlanetHillAttributes canyonAttributes,
     MyMaterialLayer[] materialLayers)
 {
     //return new MyOctreeStorage(
     //    MyCompositeShapeProvider.CreatePlanetShape(0, ref shapeAttributes, ref hillAttributes, ref canyonAttributes, materialLayers),
     //    FindBestOctreeSize(shapeAttributes.Radius));
     return null;
 }
        void IMyStorageDataProvider.ReadFrom(ref MyOctreeStorage.ChunkHeader header, Stream stream, ref bool isOldFormat)
        {
            m_state.Version = stream.ReadUInt32();
            if (m_state.Version != CURRENT_VERSION)
            {
                // Making sure this gets saved in new format and serialized cache holding old format is discarded.
                isOldFormat = true;
            }

            m_state.Generator = stream.ReadInt32();
            m_state.Seed      = stream.ReadInt32();
            m_state.Size      = stream.ReadFloat();

            if (m_state.Version == VERSION_WITHOUT_PLANETS)
            {
                m_state.IsPlanet = 0;
            }
            else
            {
                m_state.IsPlanet = stream.ReadUInt32();
            }

            if (m_state.IsPlanet != 0)
            {
                int numMaterials = stream.ReadInt32();
                m_materialLayers = new MyMaterialLayer[numMaterials];
                for (int i = 0; i < numMaterials; ++i)
                {
                    m_materialLayers[i]                      = new MyMaterialLayer();
                    m_materialLayers[i].StartHeight          = stream.ReadFloat();
                    m_materialLayers[i].EndHeight            = stream.ReadFloat();
                    m_materialLayers[i].MaterialName         = stream.ReadString();
                    m_materialLayers[i].StartAngle           = stream.ReadFloat();
                    m_materialLayers[i].EndAngle             = stream.ReadFloat();
                    m_materialLayers[i].HeightStartDeviation = stream.ReadFloat();
                    m_materialLayers[i].AngleStartDeviation  = stream.ReadFloat();
                    m_materialLayers[i].HeightEndDeviation   = stream.ReadFloat();
                    m_materialLayers[i].AngleEndDeviation    = stream.ReadFloat();
                }

                m_shapeAttributes.Seed                         = stream.ReadInt32();
                m_shapeAttributes.Radius                       = stream.ReadFloat();
                m_shapeAttributes.NoiseFrequency               = stream.ReadFloat();
                m_shapeAttributes.DeviationScale               = stream.ReadFloat();
                m_shapeAttributes.NormalNoiseFrequency         = stream.ReadFloat();
                m_shapeAttributes.LayerDeviationNoiseFreqeuncy = stream.ReadFloat();
                m_shapeAttributes.LayerDeviationSeed           = stream.ReadInt32();

                m_hillAttributes.BlendTreshold = stream.ReadFloat();
                m_hillAttributes.Treshold      = stream.ReadFloat();
                m_hillAttributes.SizeRatio     = stream.ReadFloat();
                m_hillAttributes.NumNoises     = stream.ReadInt32();
                m_hillAttributes.Frequency     = stream.ReadFloat();

                m_canyonAttributes.BlendTreshold = stream.ReadFloat();
                m_canyonAttributes.Treshold      = stream.ReadFloat();
                m_canyonAttributes.SizeRatio     = stream.ReadFloat();
                m_canyonAttributes.NumNoises     = stream.ReadInt32();
                m_canyonAttributes.Frequency     = stream.ReadFloat();

                MyCompositeShapes.PlanetGenerators[m_state.Generator](ref m_shapeAttributes, ref m_hillAttributes, ref m_canyonAttributes, m_materialLayers, out m_data);
            }
            else
            {
                MyCompositeShapes.AsteroidGenerators[m_state.Generator](m_state.Seed, m_state.Size, out m_data);
            }

            m_state.Version = CURRENT_VERSION;
        }
Esempio n. 12
0
        private static void PlanetGenerator(ref MyCsgShapePlanetShapeAttributes shapeAttributes, ref MyCsgShapePlanetHillAttributes hillAttributes, ref MyCsgShapePlanetHillAttributes canyonAttributes, MyMaterialLayer[] materialLevels, out MyCompositeShapeGeneratedData data)
        {
            var random = MyRandom.Instance;

            using (var stateToken = random.PushSeed(shapeAttributes.Seed))
            {
                data = new MyCompositeShapeGeneratedData();
                data.FilledShapes  = new MyCsgShapeBase[1];
                data.RemovedShapes = new MyCsgShapeBase[0];


                data.MacroModule = new MyBillowFast(quality: MyNoiseQuality.Low, seed: shapeAttributes.Seed, frequency: shapeAttributes.NoiseFrequency / shapeAttributes.Radius, layerCount: 4);

                data.DetailModule = new MyBillowFast(
                    seed: shapeAttributes.Seed,
                    quality: MyNoiseQuality.Low,
                    frequency: shapeAttributes.NoiseFrequency / shapeAttributes.Radius,
                    layerCount: 1);

                float halfSize        = shapeAttributes.Radius * 0.5f;
                float storageSize     = VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(shapeAttributes.Radius);
                float halfStorageSize = storageSize * 0.5f;
                float storageOffset   = halfStorageSize - halfSize;

                data.FilledShapes[0] = new MyCsgShapePlanet(
                    random,
                    new Vector3(halfStorageSize),
                    ref shapeAttributes,
                    ref hillAttributes,
                    ref canyonAttributes,
                    detailFrequency: 0.09f,
                    deviationFrequency: 10.0f);


                foreach (var material in MyDefinitionManager.Static.GetVoxelMaterialDefinitions())
                {
                    if (material.MinedOre == "Stone") // Surface
                    {
                        m_surfaceMaterials.Add(material);
                    }
                }

                data.DefaultMaterial = m_surfaceMaterials[(int)random.Next() % m_surfaceMaterials.Count];

                int depositCount = 1;
                data.Deposits = new MyCompositeShapeOreDeposit[depositCount];

                MyMaterialLayer[] materialLayers = new MyMaterialLayer[materialLevels.Length];

                float surfaceSize = (shapeAttributes.Radius / 2.0f) * (1 - shapeAttributes.DeviationScale * hillAttributes.SizeRatio);
                for (int i = 0; i < materialLayers.Length; ++i)
                {
                    materialLayers[i]                      = new MyMaterialLayer();
                    materialLayers[i].StartHeight          = materialLevels[i].StartHeight + surfaceSize;
                    materialLayers[i].EndHeight            = materialLevels[i].EndHeight + surfaceSize;
                    materialLayers[i].MaterialDefinition   = GetMaterialByName(materialLevels[i].MaterialName);
                    materialLayers[i].StartAngle           = materialLevels[i].StartAngle;
                    materialLayers[i].EndAngle             = materialLevels[i].EndAngle;
                    materialLayers[i].HeightStartDeviation = materialLevels[i].HeightStartDeviation;
                    materialLayers[i].AngleStartDeviation  = materialLevels[i].AngleStartDeviation;
                    materialLayers[i].HeightEndDeviation   = materialLevels[i].HeightEndDeviation;
                    materialLayers[i].AngleEndDeviation    = materialLevels[i].AngleEndDeviation;
                }

                for (int i = 0; i < depositCount; ++i)
                {
                    data.Deposits[i] = new MyCompositeLayeredOreDeposit(new MyCsgSimpleSphere(
                                                                            new Vector3(halfStorageSize), halfSize), materialLayers,
                                                                        new MyBillowFast(layerCount: 3,
                                                                                         seed: shapeAttributes.LayerDeviationSeed, frequency: shapeAttributes.LayerDeviationNoiseFreqeuncy / shapeAttributes.Radius));
                }

                m_surfaceMaterials.Clear();
                m_coreMaterials.Clear();
            }
        }