/// <summary> /// AddVegetationItem will add a new instance of a Vegetation Item to the persistent storage. Position, scale and rotation is in worldspace. The Optional clearCellCache will refresh the area where the item is added. /// </summary> /// <param name="vegetationItemID"></param> /// <param name="worldPosition"></param> /// <param name="scale"></param> /// <param name="rotation"></param> /// <param name="applyMeshRotation"></param> /// <param name="vegetationSourceID"></param> /// <param name="distanceFalloff"></param> /// <param name="clearCellCache"></param> public void AddVegetationItemInstance(string vegetationItemID, Vector3 worldPosition, Vector3 scale, Quaternion rotation, bool applyMeshRotation, byte vegetationSourceID, float distanceFalloff, bool clearCellCache = false) { if (!VegetationSystemPro || !PersistentVegetationStoragePackage) { return; } Rect positionRect = new Rect(new Vector2(worldPosition.x, worldPosition.z), Vector2.zero); VegetationItemInfoPro vegetationItemInfo = VegetationSystemPro.GetVegetationItemInfo(vegetationItemID); if (applyMeshRotation) { rotation *= Quaternion.Euler(vegetationItemInfo.RotationOffset); } List <VegetationCell> overlapCellList = new List <VegetationCell>(); VegetationSystemPro.VegetationCellQuadTree.Query(positionRect, overlapCellList); for (int i = 0; i <= overlapCellList.Count - 1; i++) { int cellIndex = overlapCellList[i].Index; if (clearCellCache) { VegetationItemIndexes indexes = VegetationSystemPro.GetVegetationItemIndexes(vegetationItemID); VegetationSystemPro.ClearCache(overlapCellList[i], indexes.VegetationPackageIndex, indexes.VegetationItemIndex); } PersistentVegetationStoragePackage.AddVegetationItemInstance(cellIndex, vegetationItemID, worldPosition - VegetationSystemPro.VegetationSystemPosition, scale, rotation, vegetationSourceID, distanceFalloff); } }
private static void AddVegetationMaskToVegetationSystem(VegetationSystemPro vegetationSystem, BaseMaskArea maskArea) { vegetationSystem.CompleteCellLoading(); VegetationItemIndexes vegetationItemIndexes = new VegetationItemIndexes(); if (maskArea.VegetationItemID != "") { vegetationItemIndexes = vegetationSystem.GetVegetationItemIndexes(maskArea.VegetationItemID); } else { vegetationItemIndexes.VegetationPackageIndex = -1; vegetationItemIndexes.VegetationItemIndex = -1; } Rect maskRect = RectExtension.CreateRectFromBounds(maskArea.MaskBounds); if (vegetationSystem.VegetationCellQuadTree == null || vegetationSystem.BillboardCellQuadTree == null) { return; } List <VegetationCell> selectedCellList = new List <VegetationCell>(); vegetationSystem.VegetationCellQuadTree.Query(maskRect, selectedCellList); if (vegetationItemIndexes.VegetationPackageIndex > -1) { for (int i = 0; i <= selectedCellList.Count - 1; i++) { selectedCellList[i] .AddVegetationMask( maskArea, vegetationItemIndexes.VegetationPackageIndex, vegetationItemIndexes.VegetationItemIndex); } List <BillboardCell> selectedBillboardCellList = new List <BillboardCell>(); vegetationSystem.BillboardCellQuadTree.Query(maskRect, selectedBillboardCellList); for (int i = 0; i <= selectedBillboardCellList.Count - 1; i++) { selectedBillboardCellList[i].ClearCache(vegetationItemIndexes.VegetationPackageIndex, vegetationItemIndexes.VegetationItemIndex); } } else { for (int i = 0; i <= selectedCellList.Count - 1; i++) { selectedCellList[i].AddVegetationMask(maskArea); } List <BillboardCell> selectedBillboardCellList = new List <BillboardCell>(); vegetationSystem.BillboardCellQuadTree.Query(maskRect, selectedBillboardCellList); for (int i = 0; i <= selectedBillboardCellList.Count - 1; i++) { selectedBillboardCellList[i].ClearCache(); } } }
public VegetationItemSelector(VisibleVegetationCellSelector visibleVegetationCellSelector, VegetationSystemPro vegetationSystemPro, VegetationItemInfoPro vegetationItemInfoPro, bool useSpawnChance, float spawnChance, int spawnSeed) { _useSpawnChance = useSpawnChance; _spawnChance = spawnChance; _spawnSeed = spawnSeed; _visibleVegetationCellSelector = visibleVegetationCellSelector; _vegetationSystemPro = vegetationSystemPro; VegetationItemID = vegetationItemInfoPro.VegetationItemID; _vegetationItemIndexes = _vegetationSystemPro.GetVegetationItemIndexes(VegetationItemID); _visibleVegetationCellSelector.OnVegetationCellVisibleDelegate += OnVegetationCellVisible; _visibleVegetationCellSelector.OnVegetationCellInvisibleDelegate += OnVegetationCellInvisible; _vegetationSystemPro.OnVegetationCellLoaded += OnVegetationCellLoaded; InstanceList = new NativeList <ItemSelectorInstanceInfo>(512, Allocator.Persistent); _removeVegetationCellIndexList = new NativeList <int>(64, Allocator.Persistent); _visibilityChangedIndexList = new NativeList <int>(512, Allocator.Persistent); }