protected override void CloseObjectSeed(MyObjectSeed objectSeed) { switch (objectSeed.Params.Type) { case MyObjectSeedType.Asteroid: case MyObjectSeedType.AsteroidCluster: 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); foreach (var voxelBase in m_tmpVoxelMapsList) { if (voxelBase.StorageName == storageName) { if (!voxelBase.Save) { voxelBase.Close(); } break; } } m_tmpVoxelMapsList.Clear(); break; case MyObjectSeedType.EncounterAlone: case MyObjectSeedType.EncounterSingle: MyEncounterGenerator.RemoveEncounter(objectSeed.BoundingVolume, objectSeed.Params.Seed); break; default: throw new InvalidBranchException(); break; } }
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(); }
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(); }
private void ProcessDirtyCells() { foreach (var cell in m_dirtyCellsToAdd) { m_dirtyCells.Add(cell); } m_dirtyCellsToAdd.Clear(); if (m_dirtyCells.Count == 0) { return; } ProfilerShort.Begin("Find false possitive dirty cells"); foreach (var cell in m_dirtyCells) { foreach (var tracker in m_trackedEntities.Values) { if (tracker.BoundingVolume.Contains(cell.BoundingVolume) != ContainmentType.Disjoint) { m_dirtyCellsToRemove.Add(cell); break; } } } ProfilerShort.BeginNextBlock("Remove false possitive dirty cells"); foreach (var cell in m_dirtyCellsToRemove) { m_dirtyCells.Remove(cell); } m_dirtyCellsToRemove.Clear(); ProfilerShort.BeginNextBlock("Remove stuff"); foreach (var cell in m_dirtyCells) { cell.GetAll(m_tempObjectSeedList); foreach (var objectSeed in m_tempObjectSeedList) { switch (objectSeed.Type) { case MyObjectSeedType.Asteroid: case MyObjectSeedType.AsteroidCluster: var bbox = objectSeed.BoundingVolume; MyGamePruningStructure.GetAllVoxelMapsInBox(ref bbox, m_tmpVoxelMapsList); String storageName = string.Format("Asteroid_{0}_{1}_{2}_{3}_{4}", cell.CellId.X, cell.CellId.Y, cell.CellId.Z, objectSeed.Index, objectSeed.Seed); foreach (var voxelMap in m_tmpVoxelMapsList) { if (voxelMap.StorageName == storageName) { if (!voxelMap.Save) // for now { m_asteroidCount--; voxelMap.Close(); } break; } } m_asteroidSeedCount--; m_tmpVoxelMapsList.Clear(); break; case MyObjectSeedType.EncounterAlone: case MyObjectSeedType.EncounterSingle: case MyObjectSeedType.EncounterMulti: if (MyEncounterGenerator.RemoveEncounter(objectSeed.BoundingVolume, objectSeed.Seed)) { m_encounterCount--; } m_encounterSeedCount--; break; default: throw new InvalidBranchException(); break; } } } m_tempObjectSeedList.Clear(); ProfilerShort.BeginNextBlock("Remove dirty cells"); foreach (var cell in m_dirtyCells) { m_cells.Remove(cell.CellId); m_cellsTree.RemoveProxy(cell.proxyId); } m_dirtyCells.Clear(); ProfilerShort.End(); }