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.UnusedCompat = 0;
            }
            else
            {
                m_state.UnusedCompat = stream.ReadUInt32();

                if (m_state.UnusedCompat == 1)
                {
                    Debug.Fail("This storage is from a prototype version of planets and is no longer supported.");
                    throw new InvalidBranchException();
                }
            }

            MyCompositeShapes.AsteroidGenerators[m_state.Generator](m_state.Seed, m_state.Size, out m_data);

            m_state.Version = CURRENT_VERSION;
        }
        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.Version = CURRENT_VERSION;
            }

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

            MyCompositeShapes.AsteroidGenerators[m_state.Generator](m_state.Seed, m_state.Size, out m_data);
        }
        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)
            {
                m_materialAttributes.ReadFrom(stream);
                m_shapeAttributes.ReadFrom(stream);
                m_hillAttributes.ReadFrom(stream);
                m_canyonAttributes.ReadFrom(stream);

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

            m_state.Version = CURRENT_VERSION;
        }
        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;
        }