コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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();
                }
            }
        }
コード例 #3
0
        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();
        }