Example #1
0
        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);
            }
        }
Example #2
0
 public LoadingConstruction InstanceAt(Vector3D worldPosition)
 {
     return(InstanceAt(StationNoise.GetOctreeNodeAt(worldPosition)));
 }