public ProceduralAsteroid(AsteroidFieldModule field, Vector4I seed, Vector3D worldPos, double size, AsteroidLayer layer) : base(field)
 {
     Seed          = seed;
     WorldPosition = worldPos;
     Rotation      = new Quaternion((float)(worldPos.X % 1), (float)(worldPos.Y % 1), (float)(worldPos.Z % 1), 1);
     Rotation.Normalize();
     Size          = (float)size;
     m_boundingBox = new BoundingBoxD(WorldPosition - Size, WorldPosition + Size);
     SeedSpecs     = layer;
     RaiseMoved();
     base.OnRemoved += HandleRemove;
 }
        private void OnEntityAdd(IMyEntity myEntity)
        {
            var planet = myEntity as MyPlanet;

            if (planet == null)
            {
                return;
            }

            List <Ob_AsteroidField> fieldsHere;

            if (!m_fieldsByPlanet.TryGetValue(planet.Generator.Id, out fieldsHere))
            {
                return;
            }
            foreach (var field in fieldsHere)
            {
                var structure = new Ob_AsteroidField();
                structure.Seed   = (int)(field.Seed ^ planet.EntityId);
                structure.Layers = new AsteroidLayer[field.Layers.Length];
                for (var i = 0; i < structure.Layers.Length; i++)
                {
                    var dst = structure.Layers[i] = new AsteroidLayer();
                    var src = field.Layers[i];
                    dst.AsteroidDensity = src.AsteroidDensity;
                    dst.AsteroidMaxSize = src.AsteroidMaxSize;
                    dst.AsteroidMinSize = src.AsteroidMinSize;
                    dst.AsteroidSpacing = src.AsteroidSpacing;
                    dst.UsableRegion    = src.UsableRegion;
                    dst.ProhibitsOre.Clear();
                    foreach (var x in src.ProhibitsOre)
                    {
                        dst.ProhibitsOre.Add(x);
                    }
                    dst.RequiresOre.Clear();
                    foreach (var x in src.RequiresOre)
                    {
                        dst.RequiresOre.Add(x);
                    }
                }
                structure.ShapeRing   = CloneUtilities.Clone(field.ShapeRing);
                structure.ShapeSphere = CloneUtilities.Clone(field.ShapeSphere);
                var rootTransform = MatrixD.CreateWorld(planet.PositionComp.WorldAABB.Center, planet.WorldMatrix.Forward, planet.WorldMatrix.Up);
                rootTransform       = rootTransform * field.Transform;
                structure.Transform = rootTransform;
                var scalingFactor = (float)planet.PositionComp.WorldAABB.HalfExtents.Max();
                if (structure.ShapeRing != null)
                {
                    structure.ShapeRing.InnerRadius *= scalingFactor;
                    structure.ShapeRing.OuterRadius *= scalingFactor;
                }
                if (structure.ShapeSphere != null)
                {
                    structure.ShapeSphere.InnerRadius *= scalingFactor;
                    structure.ShapeSphere.OuterRadius *= scalingFactor;
                }

                var module = new AsteroidFieldModule();
                module.SaveToStorage = false;
                Log(MyLogSeverity.Debug, "Adding a new asteroid field for {0}", planet.Generator.Id);
                using (this.IndentUsing())
                {
                    Log(MyLogSeverity.Debug, "Planet radius is {0}", scalingFactor);
                }
                Manager?.Register(module, structure);

                List <AsteroidFieldModule> fields;
                if (!m_fieldsByEntity.TryGetValue(planet.EntityId, out fields))
                {
                    fields = m_fieldsByEntity[planet.EntityId] = new List <AsteroidFieldModule>();
                }
                fields.Add(module);
            }
        }