예제 #1
0
        public MyPlanetEnvironmentMapping(PlanetEnvironmentItemMapping map)
        {
            Rule  = map.Rule;
            Items = new MyMaterialEnvironmentItem[map.Items.Length];
            if (Items.Length <= 0)
            {
                CumulativeIntervals = null;
                TotalFrequency      = 0;
                return;
            }

            TotalFrequency = 0;
            for (int i = 0; i < map.Items.Length; i++)
            {
                var item = map.Items[i];

                MyObjectBuilderType type;
                if (item.TypeId != null && MyObjectBuilderType.TryParse(item.TypeId, out type))
                {
                    if (!typeof(MyObjectBuilder_BotDefinition).IsAssignableFrom((Type)type) && !typeof(MyObjectBuilder_VoxelMapStorageDefinition).IsAssignableFrom((Type)type) && !typeof(MyObjectBuilder_EnvironmentItems).IsAssignableFrom((Type)type))
                    {
                        MyLog.Default.WriteLine(String.Format("Object builder type {0} is not supported for environment items.", item.TypeId));
                        Items[i].Frequency = 0; // This should disable this item
                    }
                    else
                    {
                        Items[i] = new MyMaterialEnvironmentItem()
                        {
                            Definition        = new MyDefinitionId(type, item.SubtypeId),
                            Frequency         = map.Items[i].Density,
                            IsDetail          = map.Items[i].IsDetail,
                            IsBot             = typeof(MyObjectBuilder_BotDefinition).IsAssignableFrom((Type)type),
                            IsVoxel           = typeof(MyObjectBuilder_VoxelMapStorageDefinition).IsAssignableFrom((Type)type),
                            IsEnvironemntItem = typeof(MyObjectBuilder_EnvironmentItems).IsAssignableFrom((Type)type),
                            BaseColor         = map.Items[i].BaseColor,
                            ColorSpread       = map.Items[i].ColorSpread,
                            MaxRoll           = (float)Math.Cos(MathHelper.ToDegrees(map.Items[i].MaxRoll)),
                            Offset            = map.Items[i].Offset,
                            GroupId           = map.Items[i].GroupId,
                            GroupIndex        = map.Items[i].GroupIndex,
                            ModifierId        = map.Items[i].ModifierId,
                            ModifierIndex     = map.Items[i].ModifierIndex
                        };
                    }
                }
                else
                {
                    MyLog.Default.WriteLine(String.Format("Object builder type {0} does not exist.", item.TypeId));
                    Items[i].Frequency = 0; // This should disable this item
                }
            }

            ComputeDistribution();
        }
예제 #2
0
 public MyPlanetEnvironmentMapping(PlanetEnvironmentItemMapping map)
 {
     this.Rule  = map.Rule;
     this.Items = new MyMaterialEnvironmentItem[map.Items.Length];
     if (this.Items.Length == 0)
     {
         this.CumulativeIntervals = null;
         this.TotalFrequency      = 0f;
     }
     else
     {
         this.TotalFrequency = 0f;
         for (int i = 0; i < map.Items.Length; i++)
         {
             MyObjectBuilderType        type;
             MyPlanetEnvironmentItemDef def = map.Items[i];
             if ((def.TypeId == null) || !MyObjectBuilderType.TryParse(def.TypeId, out type))
             {
                 MyLog.Default.WriteLine($"Object builder type {def.TypeId} does not exist.");
                 this.Items[i].Frequency = 0f;
             }
             else if ((!typeof(MyObjectBuilder_BotDefinition).IsAssignableFrom((Type)type) && !typeof(MyObjectBuilder_VoxelMapStorageDefinition).IsAssignableFrom((Type)type)) && !typeof(MyObjectBuilder_EnvironmentItems).IsAssignableFrom((Type)type))
             {
                 MyLog.Default.WriteLine($"Object builder type {def.TypeId} is not supported for environment items.");
                 this.Items[i].Frequency = 0f;
             }
             else
             {
                 MyMaterialEnvironmentItem item1 = new MyMaterialEnvironmentItem();
                 item1.Definition        = new MyDefinitionId(type, def.SubtypeId);
                 item1.Frequency         = map.Items[i].Density;
                 item1.IsDetail          = map.Items[i].IsDetail;
                 item1.IsBot             = typeof(MyObjectBuilder_BotDefinition).IsAssignableFrom((Type)type);
                 item1.IsVoxel           = typeof(MyObjectBuilder_VoxelMapStorageDefinition).IsAssignableFrom((Type)type);
                 item1.IsEnvironemntItem = typeof(MyObjectBuilder_EnvironmentItems).IsAssignableFrom((Type)type);
                 item1.BaseColor         = map.Items[i].BaseColor;
                 item1.ColorSpread       = map.Items[i].ColorSpread;
                 item1.MaxRoll           = (float)Math.Cos((double)MathHelper.ToDegrees(map.Items[i].MaxRoll));
                 item1.Offset            = map.Items[i].Offset;
                 item1.GroupId           = map.Items[i].GroupId;
                 item1.GroupIndex        = map.Items[i].GroupIndex;
                 item1.ModifierId        = map.Items[i].ModifierId;
                 item1.ModifierIndex     = map.Items[i].ModifierIndex;
                 this.Items[i]           = item1;
             }
         }
         this.ComputeDistribution();
     }
 }
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);
            var ob = builder as MyObjectBuilder_PlanetGeneratorDefinition;

            if (ob.InheritFrom != null && ob.InheritFrom.Length > 0)
            {
                InheritFrom(ob.InheritFrom);
            }

            if (ob.PlanetMaps.HasValue)
            {
                PlanetMaps = ob.PlanetMaps.Value;
            }

            if (ob.HasAtmosphere.HasValue)
            {
                HasAtmosphere = ob.HasAtmosphere.Value;
            }

            if (ob.CloudLayers != null)
            {
                CloudLayers = ob.CloudLayers;
            }

            if (ob.SoundRules != null)
            {
                SoundRules = new MyPlanetEnvironmentalSoundRule[ob.SoundRules.Length];

                for (int ruleIndex = 0; ruleIndex < ob.SoundRules.Length; ++ruleIndex)
                {
                    MyPlanetEnvironmentalSoundRule sr;

                    sr = new MyPlanetEnvironmentalSoundRule()
                    {
                        Latitude           = ob.SoundRules[ruleIndex].Latitude,
                        Height             = ob.SoundRules[ruleIndex].Height,
                        SunAngleFromZenith = ob.SoundRules[ruleIndex].SunAngleFromZenith,
                        EnvironmentSound   = MyStringHash.GetOrCompute(ob.SoundRules[ruleIndex].EnvironmentSound)
                    };

                    sr.Latitude.ConvertToSine();
                    sr.SunAngleFromZenith.ConvertToCosine();
                    SoundRules[ruleIndex] = sr;
                }
            }
            if (ob.MusicCategories != null)
            {
                MusicCategories = ob.MusicCategories;
            }

            if (ob.HillParams.HasValue)
            {
                HillParams = ob.HillParams.Value;
            }

            if (ob.Atmosphere != null)
            {
                Atmosphere = ob.Atmosphere;
            }

            if (ob.GravityFalloffPower.HasValue)
            {
                GravityFalloffPower = ob.GravityFalloffPower.Value;
            }

            if (ob.HostileAtmosphereColorShift != null)
            {
                HostileAtmosphereColorShift = ob.HostileAtmosphereColorShift;
            }

            if (ob.MaterialsMaxDepth.HasValue)
            {
                MaterialsMaxDepth = ob.MaterialsMaxDepth.Value;
            }
            if (ob.MaterialsMinDepth.HasValue)
            {
                MaterialsMinDepth = ob.MaterialsMinDepth.Value;
            }

            if (ob.CustomMaterialTable != null && ob.CustomMaterialTable.Length > 0)
            {
                SurfaceMaterialTable = new MyPlanetMaterialDefinition[ob.CustomMaterialTable.Length];
                for (int i = 0; i < SurfaceMaterialTable.Length; i++)
                {
                    SurfaceMaterialTable[i] = ob.CustomMaterialTable[i].Clone() as MyPlanetMaterialDefinition;
                    if (SurfaceMaterialTable[i].Material == null && !SurfaceMaterialTable[i].HasLayers)
                    {
                        MyLog.Default.WriteLine("Custom material does not contain any material ids.");
                    }
                    else if (SurfaceMaterialTable[i].HasLayers)
                    {
                        // Make the depth cumulative so we don't have to calculate it later.
                        // If we want we can even binary search it.
                        float depth = SurfaceMaterialTable[i].Layers[0].Depth;
                        for (int j = 1; j < SurfaceMaterialTable[i].Layers.Length; j++)
                        {
                            SurfaceMaterialTable[i].Layers[j].Depth += depth;
                            depth = SurfaceMaterialTable[i].Layers[j].Depth;
                        }
                    }
                }
            }

            if (ob.DistortionTable != null && ob.DistortionTable.Length > 0)
            {
                DistortionTable = ob.DistortionTable;
            }

            if (ob.DefaultSurfaceMaterial != null)
            {
                DefaultSurfaceMaterial = ob.DefaultSurfaceMaterial;
            }

            if (ob.DefaultSubSurfaceMaterial != null)
            {
                DefaultSubSurfaceMaterial = ob.DefaultSubSurfaceMaterial;
            }

            if (ob.SurfaceGravity.HasValue)
            {
                SurfaceGravity = ob.SurfaceGravity.Value;
            }

            if (ob.AtmosphereSettings != null)
            {
                AtmosphereSettings = ob.AtmosphereSettings;
            }

            // Folder name is not inherited to avoid weirdness.
            FolderName = ob.FolderName != null ? ob.FolderName : ob.Id.SubtypeName;

            if (ob.ComplexMaterials != null && ob.ComplexMaterials.Length > 0)
            {
                MaterialGroups = new MyPlanetMaterialGroup[ob.ComplexMaterials.Length];

                for (int k = 0; k < ob.ComplexMaterials.Length; k++)
                {
                    MaterialGroups[k] = ob.ComplexMaterials[k].Clone() as MyPlanetMaterialGroup;

                    var        group        = MaterialGroups[k];
                    var        matRules     = group.MaterialRules;
                    List <int> badMaterials = new List <int>();

                    for (int i = 0; i < matRules.Length; i++)
                    {
                        if (matRules[i].Material == null && (matRules[i].Layers == null || matRules[i].Layers.Length == 0))
                        {
                            MyLog.Default.WriteLine("Material rule does not contain any material ids.");
                            badMaterials.Add(i);
                            continue;
                        }
                        else if (matRules[i].Layers != null && matRules[i].Layers.Length != 0)
                        {
                            // Make the depth cumulative so we don't have to calculate it later.
                            // If we want we can even binary search it.
                            float depth = matRules[i].Layers[0].Depth;
                            for (int j = 1; j < matRules[i].Layers.Length; j++)
                            {
                                matRules[i].Layers[j].Depth += depth;
                                depth = matRules[i].Layers[j].Depth;
                            }
                        }

                        // We use the cosine later so we precompute it here.
                        matRules[i].Slope.ConvertToCosine();
                        matRules[i].Latitude.ConvertToSine();
                        matRules[i].Longitude.ConvertToCosineLongitude();
                    }

                    if (badMaterials.Count > 0)
                    {
                        matRules = matRules.RemoveIndices(badMaterials);
                    }

                    group.MaterialRules = matRules;
                }
            }

            if (ob.EnvironmentItems != null && ob.EnvironmentItems.Length > 0)
            {
                MaterialEnvironmentMappings = new Dictionary <int, Dictionary <string, List <MyPlanetEnvironmentMapping> > >();

                for (int i = 0; i < ob.EnvironmentItems.Length; i++)
                {
                    PlanetEnvironmentItemMapping map = ob.EnvironmentItems[i];
                    if (map.Rule != null)
                    {
                        map.Rule = map.Rule.Clone() as MyPlanetSurfaceRule;
                    }
                    else
                    {
                        map.Rule = new MyPlanetSurfaceRule();
                    }
                    map.Rule.Slope.ConvertToCosine();
                    map.Rule.Latitude.ConvertToSine();
                    map.Rule.Longitude.ConvertToCosineLongitude();

                    // If the mapping does not assign a material it is ignored
                    if (map.Materials == null)
                    {
                        break;
                    }

                    if (map.Biomes == null)
                    {
                        map.Biomes = m_arrayOfZero;
                    }

                    foreach (var biome in map.Biomes)
                    {
                        Dictionary <string, List <MyPlanetEnvironmentMapping> > matmap;

                        if (MaterialEnvironmentMappings.ContainsKey(biome))
                        {
                            matmap = MaterialEnvironmentMappings[biome];
                        }
                        else
                        {
                            matmap = new Dictionary <string, List <MyPlanetEnvironmentMapping> >();
                            MaterialEnvironmentMappings.Add(biome, matmap);
                        }

                        foreach (var material in map.Materials)
                        {
                            if (!matmap.ContainsKey(material))
                            {
                                matmap.Add(material, new List <MyPlanetEnvironmentMapping>());
                            }

                            matmap[material].Add(new MyPlanetEnvironmentMapping(map));
                        }
                    }
                }
            }

            if (ob.OreMappings != null)
            {
                OreMappings = ob.OreMappings;
            }

            if (ob.MaterialBlending.HasValue)
            {
                MaterialBlending = ob.MaterialBlending.Value;
            }

            if (ob.SurfaceDetail != null)
            {
                Detail = ob.SurfaceDetail;
            }

            if (ob.AnimalSpawnInfo != null)
            {
                AnimalSpawnInfo = ob.AnimalSpawnInfo;
            }

            if (ob.NightAnimalSpawnInfo != null)
            {
                NightAnimalSpawnInfo = ob.NightAnimalSpawnInfo;
            }

            if (ob.SectorDensity.HasValue)
            {
                SectorDensity = ob.SectorDensity.Value;
            }
        }