private void LoadMaterialSoundsInheritance(MyPhysicalMaterialDefinition material)
        {
            var thisMaterial = material.Id.SubtypeId;
            if (!m_loaded.Add(thisMaterial))
                return;
            if (material.InheritFrom != MyStringHash.NullOrEmpty)
            {
                MyPhysicalMaterialDefinition def;
                if (MyDefinitionManager.Static.TryGetDefinition<MyPhysicalMaterialDefinition>(new MyDefinitionId(typeof(MyObjectBuilder_PhysicalMaterialDefinition), material.InheritFrom), out def))
                {
                    if (!m_loaded.Contains(material.InheritFrom))
                        LoadMaterialSoundsInheritance(def);
                    foreach (var generalSound in def.GeneralSounds)
                    {
                        material.GeneralSounds[generalSound.Key] = generalSound.Value;
                    }
                }
                foreach (var type in MaterialDictionary.Keys)
                {
                    if (!MaterialDictionary[type].ContainsKey(thisMaterial))
                        MaterialDictionary[type][thisMaterial] = new Dictionary<MyStringHash, MaterialProperties>(MyStringHash.Comparer);
                    MaterialProperties? selfProps =  null;
                    if (!MaterialDictionary[type].ContainsKey(material.InheritFrom))
                        continue;
                    foreach (var pair in MaterialDictionary[type][material.InheritFrom])
                    {
                        if(pair.Key == material.InheritFrom)
                        {
                            selfProps = pair.Value;
                            continue;
                        }
                        // parent should no longer override
                        if (MaterialDictionary[type][thisMaterial].ContainsKey(pair.Key))
                        {
                            if (MaterialDictionary[type][pair.Key].ContainsKey(thisMaterial))
                            {
                                continue;
                            }
                            MaterialDictionary[type][pair.Key][thisMaterial] = pair.Value;
                        }
                        else
                        {
                            MaterialDictionary[type][thisMaterial][pair.Key] = pair.Value;
                            Debug.Assert(MaterialDictionary[type].ContainsKey(pair.Key));
                            MaterialDictionary[type][pair.Key][thisMaterial] = pair.Value;
                        }
                    }

                    if (selfProps != null)
                    {
                        MaterialDictionary[type][thisMaterial][thisMaterial] = selfProps.Value;
                        MaterialDictionary[type][thisMaterial][material.InheritFrom] = selfProps.Value;
                        MaterialDictionary[type][material.InheritFrom][thisMaterial] = selfProps.Value;
                    }
                }
            }
        }
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);

            var ob = builder as MyObjectBuilder_PhysicalModelDefinition;
            MyDebug.AssertDebug(ob != null);

            this.Model = ob.Model;
            this.PhysicalMaterial = MyDestructionData.GetPhysicalMaterial(this, ob.PhysicalMaterial);
            this.Mass = ob.Mass;
        }
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);

            var ob = builder as MyObjectBuilder_PhysicalModelDefinition;

            MyDebug.AssertDebug(ob != null);

            this.Model            = ob.Model;
            this.PhysicalMaterial = MyDestructionData.GetPhysicalMaterial(this, ob.PhysicalMaterial);
            this.Mass             = ob.Mass;
        }
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);

            var ob = builder as MyObjectBuilder_PhysicalModelDefinition;
            MyDebug.AssertDebug(ob != null);

            this.Model = ob.Model;
            if (GetType() == typeof (MyCubeBlockDefinition) || GetType().IsSubclassOf(typeof (MyCubeBlockDefinition)))
                this.PhysicalMaterial = MyDestructionData.GetPhysicalMaterial(this, ob.PhysicalMaterial);
            else
                m_material = ob.PhysicalMaterial;
            this.Mass = ob.Mass;
        }
Esempio n. 5
0
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);
            MyObjectBuilder_PhysicalModelDefinition definition = builder as MyObjectBuilder_PhysicalModelDefinition;

            this.Model = definition.Model;
            if ((base.GetType() == typeof(MyCubeBlockDefinition)) || base.GetType().IsSubclassOf(typeof(MyCubeBlockDefinition)))
            {
                this.PhysicalMaterial = MyDestructionData.GetPhysicalMaterial(this, definition.PhysicalMaterial);
            }
            else
            {
                this.m_material = definition.PhysicalMaterial;
            }
            this.Mass = definition.Mass;
        }
        protected override void Init(MyObjectBuilder_DefinitionBase builder)
        {
            base.Init(builder);

            var ob = builder as MyObjectBuilder_PhysicalModelDefinition;

            MyDebug.AssertDebug(ob != null);

            this.Model = ob.Model;
            if (GetType() == typeof(MyCubeBlockDefinition) || GetType().IsSubclassOf(typeof(MyCubeBlockDefinition)))
            {
                this.PhysicalMaterial = MyDestructionData.GetPhysicalMaterial(this, ob.PhysicalMaterial);
            }
            else
            {
                m_material = ob.PhysicalMaterial;
            }
            this.Mass = ob.Mass;
        }
        private void LoadMaterialSoundsInheritance(MyPhysicalMaterialDefinition material)
        {
            var thisMaterial = material.Id.SubtypeId;
            if (!m_loaded.Add(thisMaterial))
                return;
            if (material.InheritSoundsFrom != MyStringHash.NullOrEmpty)
            {
                MyPhysicalMaterialDefinition def;
                if (MyDefinitionManager.Static.TryGetDefinition<MyPhysicalMaterialDefinition>(new MyDefinitionId(typeof(MyObjectBuilder_PhysicalMaterialDefinition), material.InheritSoundsFrom), out def))
                {
                    if (!m_loaded.Contains(material.InheritSoundsFrom))
                        LoadMaterialSoundsInheritance(def);
                    foreach (var generalSound in def.GeneralSounds)
                    {
                        material.GeneralSounds[generalSound.Key] = generalSound.Value;
                    }
                }
                foreach (var type in MaterialCues.Keys)
                {
                    if (!MaterialCues[type].ContainsKey(thisMaterial))
                        MaterialCues[type][thisMaterial] = new Dictionary<MyStringHash, MySoundPair>(MyStringHash.Comparer);
                    MySoundPair selfCue =  null;
                    foreach (var pair in MaterialCues[type][material.InheritSoundsFrom])
                    {
                        if(pair.Key == material.InheritSoundsFrom)
                        {
                            selfCue = pair.Value;
                            continue;
                        }
                        MaterialCues[type][thisMaterial][pair.Key] = pair.Value;
                        Debug.Assert(MaterialCues[type].ContainsKey(pair.Key));
                        MaterialCues[type][pair.Key][thisMaterial] = pair.Value;
                    }

                    if (selfCue != null)
                    {
                        MaterialCues[type][thisMaterial][thisMaterial] = selfCue;
                        MaterialCues[type][thisMaterial][material.InheritSoundsFrom] = selfCue;
                        MaterialCues[type][material.InheritSoundsFrom][thisMaterial] = selfCue;
                    }
                }
            }
        }
        private void LoadMaterialSounds(MyPhysicalMaterialDefinition material)
        {
            var thisMaterial = material.Id.SubtypeId;
            foreach (var materialSounds in material.CollisionSounds)
            {
                var type = materialSounds.Key;
                if (!MaterialCues.ContainsKey(type))
                    MaterialCues[type] = new Dictionary<MyStringHash, Dictionary<MyStringHash, MySoundPair>>(MyStringHash.Comparer);
                if (!MaterialCues[type].ContainsKey(thisMaterial))
                    MaterialCues[type][thisMaterial] = new Dictionary<MyStringHash, MySoundPair>(MyStringHash.Comparer);
                foreach (var otherMaterial in materialSounds.Value)
                {
                    MaterialCues[type][thisMaterial][otherMaterial.Key] = otherMaterial.Value;

                    //add the sound in oposite direction if not defined
                    if (!MaterialCues[type].ContainsKey(otherMaterial.Key))
                        MaterialCues[type][otherMaterial.Key] = new Dictionary<MyStringHash, MySoundPair>(MyStringHash.Comparer);
                    if (!MaterialCues[type][otherMaterial.Key].ContainsKey(thisMaterial))
                        MaterialCues[type][otherMaterial.Key][thisMaterial] = otherMaterial.Value;
                }
            }
        }
        public static MyPhysicalMaterialDefinition GetPhysicalMaterial(MyPhysicalModelDefinition modelDef, string physicalMaterial)
        {
            if (m_physicalMaterials == null)
            {
                m_physicalMaterials = new Dictionary<string, MyPhysicalMaterialDefinition>();
                foreach (var physMat in MyDefinitionManager.Static.GetPhysicalMaterialDefinitions())
                {
                    m_physicalMaterials.Add(physMat.Id.SubtypeName, physMat);
                }

                m_physicalMaterials["Default"] = new MyPhysicalMaterialDefinition()
                {
                    Density = 1920,
                    HorisontalTransmissionMultiplier = 1,
                    HorisontalFragility = 2,
                    CollisionMultiplier = 1.4f,
                    SupportMultiplier = 1.5f             
                };
            }

            if(MyPerGameSettings.Destruction == false)
            {
              return m_physicalMaterials["Default"];
            }

            if (!string.IsNullOrEmpty(physicalMaterial))
            {
                if (m_physicalMaterials.ContainsKey(physicalMaterial))
                    return m_physicalMaterials[physicalMaterial];
                else
                {
                    string s = "ERROR: Physical material " + physicalMaterial + " does not exist!";
                    System.Diagnostics.Debug.Fail(s);
                    MyLog.Default.WriteLine(s);
                }
            }

            //MyLog.Default.WriteLine("WARNING: " + modelDef.Id.SubtypeName + " has no physical material specified, trying to autodetect from name");


            if (modelDef.Id.SubtypeName.Contains("Stone"))
            {
                return m_physicalMaterials["Stone"];
            }

            if (modelDef.Id.SubtypeName.Contains("Wood"))
            {
                return m_physicalMaterials["Wood"];
            }

            if (modelDef.Id.SubtypeName.Contains("Timber"))
            {
                return m_physicalMaterials["Wood"];
            }


            //MyLog.Default.WriteLine("WARNING: Unable to find proper physical material for " + modelDef.Id.SubtypeName + ", using Default");
            return m_physicalMaterials["Default"];
        }
        private void LoadMaterialProperties(MyPhysicalMaterialDefinition material)
        {
            var thisMaterial = material.Id.SubtypeId;
            foreach (var materialSounds in material.CollisionProperties)
            {
                var type = materialSounds.Key;
                if (!MaterialDictionary.ContainsKey(type))
                    MaterialDictionary[type] = new Dictionary<MyStringHash, Dictionary<MyStringHash, MaterialProperties>>(MyStringHash.Comparer);
                if (!MaterialDictionary[type].ContainsKey(thisMaterial))
                    MaterialDictionary[type][thisMaterial] = new Dictionary<MyStringHash, MaterialProperties>(MyStringHash.Comparer);
                foreach (var otherMaterial in materialSounds.Value)
                {
                    MaterialDictionary[type][thisMaterial][otherMaterial.Key] = new MaterialProperties(otherMaterial.Value.Sound, otherMaterial.Value.ParticleEffect, otherMaterial.Value.ImpactSoundCues);

                    //add the sound in oposite direction if not defined
                    if (!MaterialDictionary[type].ContainsKey(otherMaterial.Key))
                        MaterialDictionary[type][otherMaterial.Key] = new Dictionary<MyStringHash, MaterialProperties>(MyStringHash.Comparer);
                    if (!MaterialDictionary[type][otherMaterial.Key].ContainsKey(thisMaterial))
                        MaterialDictionary[type][otherMaterial.Key][thisMaterial] = new MaterialProperties(otherMaterial.Value.Sound, otherMaterial.Value.ParticleEffect, otherMaterial.Value.ImpactSoundCues);
                }
            }
        }