public override IEnumerable <ProceduralObject> Generate(BoundingSphereD include, BoundingSphereD?exclude) { var aabb = new BoundingBoxD(include.Center - include.Radius, include.Center + include.Radius); foreach (var cell in StationNoise.TryGetSpawnIn(aabb, (x) => include.Intersects(x) && (!exclude.HasValue || exclude.Value.Contains(x) != ContainmentType.Contains))) { LoadingConstruction instance; if (!m_instances.TryGetValue(cell.Item1, out instance)) { var numSeed = cell.Item1.GetHashCode(); Ob_ProceduralConstructionSeed dbSeed; Ob_ProceduralConstruction dbBlueprint; Ob_ProceduralFaction dbFaction; ProceduralConstructionSeed seed; if (m_database.TryGetBuildingBlueprint(numSeed, out dbSeed, out dbBlueprint) && dbSeed != null && m_database.TryGetFaction(dbSeed.FactionSeed, out dbFaction) && dbFaction != null) { seed = new ProceduralConstructionSeed(new ProceduralFactionSeed(dbFaction), cell.Item2.XYZ(), dbSeed); } else { seed = new ProceduralConstructionSeed(Factions.SeedAt(cell.Item2.XYZ()), cell.Item2, null, numSeed); } instance = m_instances[cell.Item1] = new LoadingConstruction(this, cell.Item1, seed); } else if (!instance.IsMarkedForRemoval) { continue; // Already loaded + not marked for removal -- already in the tree. } instance.EnsureGenerationStarted(); yield return(instance); } }
public LoadingConstruction InstanceAt(Vector3D worldPosition) { return(InstanceAt(StationNoise.GetOctreeNodeAt(worldPosition))); }