public override void GenerateLoadedCellObjects() { List <MyObjectSeed> seeds = new List <MyObjectSeed>(); foreach (var cell in m_loadedCells.Values) { cell.GetAll(seeds, false); } List <MyVoxelBase> tmp_voxelMaps = new List <MyVoxelBase>(); foreach (var seed in seeds) { if (seed.Params.Generated) { continue; } if (seed.Params.Type != VRage.Game.MyObjectSeedType.Asteroid) { continue; } seed.Params.Generated = true; using (MyRandom.Instance.PushSeed(GetObjectIdSeed(seed))) { tmp_voxelMaps.Clear(); var bounds = seed.BoundingVolume; MyGamePruningStructure.GetAllVoxelMapsInBox(ref bounds, tmp_voxelMaps); string storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", seed.CellId.X, seed.CellId.Y, seed.CellId.Z, seed.Params.Index, seed.Params.Seed); bool exists = false; foreach (var tmp in tmp_voxelMaps) { if (tmp.StorageName == storageName) { if (!m_existingObjectSeeds.Contains(seed)) { m_existingObjectSeeds.Add(seed); } exists = true; if (tmp_voxelMaps.Contains(tmp)) { tmp.Save = true; } break; } } if (exists) { continue; } var storage = CreateAsteroidStorage(GetAsteroidVoxelSize(seed.Size), seed.Params.Seed, seed.Size, m_definition.UseGeneratorSeed ? seed.Params.GeneratorSeed : 0); Vector3D pos = seed.BoundingVolume.Center - MathHelper.GetNearestBiggerPowerOfTwo(seed.Size) / 2; MyVoxelMap voxelMap; voxelMap = MyWorldGenerator.AddVoxelMap(storageName, storage, pos, GetAsteroidEntityId(storageName)); if (voxelMap == null) { continue; } MyVoxelBase.StorageChanged del = null; del = delegate(MyVoxelBase voxel, Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData) { voxel.Save = true; m_tmpAsteroids.Remove(voxel); voxel.RangeChanged -= del; }; voxelMap.RangeChanged += del; voxelMap.IsSeedOpen = true; seed.UserData = voxelMap; m_tmpAsteroids.Add(voxelMap); } } }
public override void GenerateObjects(List <MyObjectSeed> objects, HashSet <MyObjectSeedParams> existingObjectSeeds) { List <MyVoxelBase> tmp_voxelMaps = new List <MyVoxelBase>(); foreach (var obj in objects) { if (obj.Params.Generated) { continue; } obj.Params.Generated = true; using (MyRandom.Instance.PushSeed(GetObjectIdSeed(obj))) { if (obj.Params.Type != MyObjectSeedType.Asteroid) { continue; } var bounds = obj.BoundingVolume; MyGamePruningStructure.GetAllVoxelMapsInBox(ref bounds, tmp_voxelMaps); string storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", obj.CellId.X, obj.CellId.Y, obj.CellId.Z, obj.Params.Index, obj.Params.Seed); bool exists = false; foreach (var voxelMap in tmp_voxelMaps) { if (voxelMap.StorageName == storageName) { if (!existingObjectSeeds.Contains(obj.Params)) { existingObjectSeeds.Add(obj.Params); } exists = true; break; } } if (!exists) { var storage = CreateAsteroidStorage(GetAsteroidVoxelSize(obj.Size), obj.Params.Seed, obj.Size, m_data.UseGeneratorSeed ? obj.Params.GeneratorSeed : 0, 3); Vector3D pos = obj.BoundingVolume.Center - MathHelper.GetNearestBiggerPowerOfTwo(obj.Size) / 2; MyVoxelMap voxelMap; voxelMap = MyWorldGenerator.AddVoxelMap(storageName, storage, pos, GetAsteroidEntityId(storageName)); if (voxelMap == null) { continue; } voxelMap.Save = true; m_NotSavedMaps.Add(voxelMap); MyVoxelBase.StorageChanged OnStorageRangeChanged = null; OnStorageRangeChanged = delegate(MyVoxelBase voxel, Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData) { voxelMap.Save = true; m_NotSavedMaps.Remove(voxelMap); voxelMap.RangeChanged -= OnStorageRangeChanged; }; voxelMap.RangeChanged += OnStorageRangeChanged; } tmp_voxelMaps.Clear(); } } }
public override void GenerateObjects(List <MyObjectSeed> objectsList, HashSet <MyObjectSeedParams> existingObjectsSeeds) { ProfilerShort.Begin("GenerateObjects"); foreach (var objectSeed in objectsList) { if (objectSeed.Params.Generated || existingObjectsSeeds.Contains(objectSeed.Params)) { continue; } objectSeed.Params.Generated = true; using (MyRandom.Instance.PushSeed(GetObjectIdSeed(objectSeed))) { switch (objectSeed.Params.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.Params.Index, objectSeed.Params.Seed); bool exists = false; foreach (var voxelMap in m_tmpVoxelMapsList) { if (voxelMap.StorageName == storageName) { existingObjectsSeeds.Add(objectSeed.Params); exists = true; break; } } if (!exists) { var provider = MyCompositeShapeProvider.CreateAsteroidShape(objectSeed.Params.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(storageName)); if (voxelMap != null) { voxelMap.Save = false; MyVoxelBase.StorageChanged OnStorageRangeChanged = null; OnStorageRangeChanged = delegate(MyVoxelBase voxel, Vector3I minVoxelChanged, Vector3I maxVoxelChanged, MyStorageDataTypeFlags changedData) { voxelMap.Save = true; voxelMap.RangeChanged -= OnStorageRangeChanged; }; voxelMap.RangeChanged += OnStorageRangeChanged; } } m_tmpVoxelMapsList.Clear(); ProfilerShort.End(); break; case MyObjectSeedType.EncounterAlone: case MyObjectSeedType.EncounterSingle: case MyObjectSeedType.EncounterMulti: ProfilerShort.Begin("Encounter"); bool doSpawn = true; foreach (var start in MySession.Static.Scenario.PossiblePlayerStarts) { Vector3D?startPos = start.GetStartingLocation(); if (!startPos.HasValue) { startPos = Vector3D.Zero; } if ((startPos.Value - objectSeed.BoundingVolume.Center).LengthSquared() < (15000 * 15000)) { doSpawn = false; } } if (doSpawn) { MyEncounterGenerator.PlaceEncounterToWorld(objectSeed.BoundingVolume, objectSeed.Params.Seed, objectSeed.Params.Type); } ProfilerShort.End(); break; default: throw new InvalidBranchException(); break; } } } ProfilerShort.End(); }