public override void GenerateObjects(List <MyObjectSeed> objectsList) { ProfilerShort.Begin("GenerateObjects"); foreach (var objectSeed in objectsList) { if (objectSeed.Generated) { continue; } objectSeed.Generated = true; using (MyRandom.Instance.PushSeed(GetObjectIdSeed(objectSeed))) { ProfilerShort.Begin("Planet"); var bbox = objectSeed.BoundingVolume; MyGamePruningStructure.GetAllVoxelMapsInBox(ref bbox, m_tmpVoxelMapsList); String storageName = string.Format("Planet_{0}_{1}_{2}_{3}_{4}", objectSeed.CellId.X, objectSeed.CellId.Y, objectSeed.CellId.Z, objectSeed.Index, objectSeed.Seed); bool exists = false; foreach (var voxelMap in m_tmpVoxelMapsList) { if (voxelMap.StorageName == storageName) { exists = true; break; } } m_tmpVoxelMapsList.Clear(); if (!exists) { var planet = MyWorldGenerator.AddPlanet(storageName, objectSeed.BoundingVolume.Center - VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(objectSeed.Size) / 2, objectSeed.Seed, objectSeed.Size, GetPlanetEntityId(objectSeed)); if (planet == null) { continue; } planet.Save = false; RangeChangedDelegate OnStorageRangeChanged = null; OnStorageRangeChanged = delegate(Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData) { planet.Save = true; planet.Storage.RangeChanged -= OnStorageRangeChanged; }; planet.Storage.RangeChanged += OnStorageRangeChanged; } ProfilerShort.End(); } } ProfilerShort.End(); }
public override void GenerateObjects(List <MyObjectSeed> objectsList) { ProfilerShort.Begin("GenerateObjects"); foreach (var objectSeed in objectsList) { if (objectSeed.Generated) { continue; } objectSeed.Generated = true; using (MyRandom.Instance.PushSeed(GetObjectIdSeed(objectSeed))) { switch (objectSeed.Type) { case MyObjectSeedType.Asteroid: ProfilerShort.Begin("Asteroid"); var bbox = objectSeed.BoundingVolume; MyGamePruningStructure.GetAllVoxelMapsInBox(ref bbox, m_tmpVoxelMapsList); String storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", objectSeed.CellId.X, objectSeed.CellId.Y, objectSeed.CellId.Z, objectSeed.Index, objectSeed.Seed); bool exists = false; foreach (var voxelMap in m_tmpVoxelMapsList) { if (voxelMap.StorageName == storageName) { exists = true; break; } } if (!exists) { var provider = MyCompositeShapeProvider.CreateAsteroidShape(objectSeed.Seed, objectSeed.Size, MySession.Static.Settings.VoxelGeneratorVersion); MyStorageBase storage = new MyOctreeStorage(provider, GetAsteroidVoxelSize(objectSeed.Size)); var voxelMap = MyWorldGenerator.AddVoxelMap(storageName, storage, objectSeed.BoundingVolume.Center - VRageMath.MathHelper.GetNearestBiggerPowerOfTwo(objectSeed.Size) / 2, GetAsteroidEntityId(objectSeed)); if (voxelMap != null) { voxelMap.Save = false; RangeChangedDelegate OnStorageRangeChanged = null; OnStorageRangeChanged = delegate(Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData) { voxelMap.Save = true; storage.RangeChanged -= OnStorageRangeChanged; }; storage.RangeChanged += OnStorageRangeChanged; } } m_tmpVoxelMapsList.Clear(); ProfilerShort.End(); break; case MyObjectSeedType.EncounterAlone: case MyObjectSeedType.EncounterSingle: case MyObjectSeedType.EncounterMulti: ProfilerShort.Begin("Encounter"); MyEncounterGenerator.PlaceEncounterToWorld(objectSeed.BoundingVolume, objectSeed.Seed, objectSeed.Type); ProfilerShort.End(); break; default: throw new InvalidBranchException(); break; } } } ProfilerShort.End(); }