Exemple #1
0
        public JobHandle SampleConcaveLocation(VegetationInstanceData instanceData, float minHeightDifference,
                                               float distance, bool inverse, bool average, Rect spawnRect,
                                               JobHandle dependsOn)
        {
            if (!_initDone)
            {
                return(dependsOn);
            }

            if (spawnRect.Overlaps(_terrainRect))
            {
                UnityTerrainSampleConcaveJob unityTerrainSampleConcaveLocationJob = new UnityTerrainSampleConcaveJob
                {
                    InputHeights        = Heights,
                    Excluded            = instanceData.Excluded.ToDeferredJobArray(),
                    Position            = instanceData.Position.ToDeferredJobArray(),
                    HeightMapScale      = _heightmapScale,
                    HeightmapHeight     = _heightmapHeight,
                    HeightmapWidth      = _heightmapWidth,
                    TerrainPosition     = TerrainPosition,
                    Size                = _size,
                    Distance            = distance,
                    MinHeightDifference = minHeightDifference,
                    Inverse             = inverse,
                    Average             = average
                };

                JobHandle handle = unityTerrainSampleConcaveLocationJob.Schedule(instanceData.Excluded, 64, dependsOn);
                return(handle);
            }

            return(dependsOn);
        }
Exemple #2
0
        public override JobHandle SampleIncludeVegetationMask(VegetationInstanceData instanceData,
                                                              VegetationTypeIndex vegetationTypeIndex,
                                                              JobHandle dependsOn)
        {
            VegetationTypeSettings vegetationTypeSettings = GetVegetationTypeSettings(vegetationTypeIndex);

            if (vegetationTypeSettings != null)
            {
                IncludeVegetationMaskLineJob includeVegetationMaskLineJob =
                    new IncludeVegetationMaskLineJob
                {
                    Excluded = instanceData.Excluded.ToDeferredJobArray(),
                    Position = instanceData.Position.ToDeferredJobArray(),
                    VegetationMaskDensity = instanceData.VegetationMaskDensity.ToDeferredJobArray(),
                    VegetationMaskScale   = instanceData.VegetationMaskScale.ToDeferredJobArray(),
                    Denisty       = vegetationTypeSettings.Density,
                    Scale         = vegetationTypeSettings.Size,
                    LineSegment2D = _line2D,
                    Width         = _width
                };
                dependsOn = includeVegetationMaskLineJob.Schedule(instanceData.Excluded, 32, dependsOn);
            }

            return(dependsOn);
        }
Exemple #3
0
        public override JobHandle SampleIncludeVegetationMask(VegetationInstanceData instanceData,
                                                              VegetationTypeIndex vegetationTypeIndex,
                                                              JobHandle dependsOn)
        {
            VegetationTypeSettings vegetationTypeSettings = GetVegetationTypeSettings(vegetationTypeIndex);

            if (vegetationTypeSettings != null)
            {
                IncludeVegetatiomMaskBeaconJob includeVegetatiomMaskBeaconJob =
                    new IncludeVegetatiomMaskBeaconJob
                {
                    Excluded = instanceData.Excluded.ToDeferredJobArray(),
                    Position = instanceData.Position.ToDeferredJobArray(),
                    VegetationMaskDensity = instanceData.VegetationMaskDensity.ToDeferredJobArray(),
                    VegetationMaskScale   = instanceData.VegetationMaskScale.ToDeferredJobArray(),
                    Denisty           = vegetationTypeSettings.Density,
                    Scale             = vegetationTypeSettings.Size,
                    FalloutCurveArray = FalloutCurveArray,
                    MaskPosition      = Position,
                    Radius            = Radius
                };
                dependsOn = includeVegetatiomMaskBeaconJob.Schedule(instanceData.Excluded, 32, dependsOn);
            }

            return(dependsOn);
        }
 void ReturnVegetationCellTemporaryMemory(VegetationCell vegetationCell)
 {
     for (int i = 0; i <= vegetationCell.VegetationInstanceDataList.Count - 1; i++)
     {
         VegetationInstanceData vegetationInstanceData = vegetationCell.VegetationInstanceDataList[i];
         VegetationCellSpawner.VegetationInstanceDataPool.ReturnObject(vegetationInstanceData);
     }
     vegetationCell.VegetationInstanceDataList.Clear();
 }
Exemple #5
0
 public JobHandle SampleConcaveLocation(VegetationInstanceData instanceData, float minHeightDifference, float distance, bool inverse, bool average, Rect spawnRect,
                                        JobHandle dependsOn)
 {
     if (!_initDone)
     {
         return(dependsOn);
     }
     //TODO implement concave sampling for mesh terrain
     return(dependsOn);
 }
Exemple #6
0
        public JobHandle SampleExcludeMask(VegetationInstanceData instanceData, Rect spawnRect,
                                           TextureMaskRule textureMaskRule, JobHandle dependsOn)
        {
            for (int i = 0; i <= TextureMaskList.Count - 1; i++)
            {
                dependsOn = TextureMaskList[i]
                            .SampleExcludeMask(instanceData, spawnRect, TextureMaskType, textureMaskRule, dependsOn);
            }

            return(dependsOn);
        }
        public JobHandle ProcessSplatmapRules(List <TerrainTextureRule> terrainTextureRuleList,
                                              VegetationInstanceData instanceData, bool include, Rect cellRect, JobHandle dependsOn)
        {
            if (cellRect.Overlaps(_terrainRect))
            {
                if (!IsSplatmapArraysValid())
                {
                    return(dependsOn);
                }

                int width  = _terrain.terrainData.alphamapWidth;
                int height = _terrain.terrainData.alphamapHeight;

                Vector2 splatCellSize = new Vector2(_terrain.terrainData.size.x / (width - 1),
                                                    _terrain.terrainData.size.z / (height - 1));
                for (int i = 0; i <= terrainTextureRuleList.Count - 1; i++)
                {
                    int splatmapIndex = terrainTextureRuleList[i].TextureIndex / 4;
                    int localIndex    = terrainTextureRuleList[i].TextureIndex - (4 * splatmapIndex);

                    if (splatmapIndex < _splatMapArrayList.Count)
                    {
                        SplatMapRuleJob splatMapRuleJob = new SplatMapRuleJob
                        {
                            Excluded           = instanceData.Excluded.ToDeferredJobArray(),
                            TerrainTextureData = instanceData.TerrainTextureData.ToDeferredJobArray(),
                            Position           = instanceData.Position.ToDeferredJobArray(),
                            SplatMapArray      = _splatMapArrayList[splatmapIndex],
                            MinValue           = terrainTextureRuleList[i].MinimumValue,
                            MaxValue           = terrainTextureRuleList[i].MaximumValue,
                            SplatmapIndex      = localIndex,
                            Width           = width,
                            Height          = height,
                            TerrainPosition = TerrainPosition,
                            SplatCellSize   = splatCellSize
                        };
                        dependsOn = splatMapRuleJob.Schedule(instanceData.Excluded, 32, dependsOn);
                    }
                }

                SplatMapRuleCompleteJob splatMapRuleCompleteJob =
                    new SplatMapRuleCompleteJob
                {
                    Excluded           = instanceData.Excluded.ToDeferredJobArray(),
                    TerrainTextureData = instanceData.TerrainTextureData.ToDeferredJobArray(),
                    Include            = include
                };
                return(splatMapRuleCompleteJob.Schedule(instanceData.Excluded, 32, dependsOn));
            }
            return(dependsOn);
        }
Exemple #8
0
        public JobHandle SampleIncludeMask(VegetationInstanceData instanceData, Rect spawnRect,
                                           TextureMaskType textureMaskType, TextureMaskRule textureMaskRule, JobHandle dependsOn)
        {
            if (!spawnRect.Overlaps(TextureRect))
            {
                return(dependsOn);
            }
            if (MaskTexture == null)
            {
                return(dependsOn);
            }

            switch (textureMaskType)
            {
            case TextureMaskType.RGBAChannel:
                if (!_rgbaNativeArray.IsCreated)
                {
                    _rgbaNativeArray = MaskTexture.GetRawTextureData <RGBABytes>();
                }

                bool inverse         = textureMaskRule.GetBooleanPropertyValue("Inverse");
                int  selectedChannel = textureMaskRule.GetIntPropertyValue("ChannelSelector");

                if (MaskTexture.format == TextureFormat.RGBA32)
                {
                    selectedChannel--;
                    if (selectedChannel == -1)
                    {
                        selectedChannel = 3;
                    }
                }

                SampleRgbaChannelIncludeMaskJob sampleRgbaChannelIncludeMaskJob =
                    new SampleRgbaChannelIncludeMaskJob();
                sampleRgbaChannelIncludeMaskJob.Width  = MaskTexture.width;
                sampleRgbaChannelIncludeMaskJob.Height = MaskTexture.height;

                sampleRgbaChannelIncludeMaskJob.Excluded        = instanceData.Excluded.ToDeferredJobArray();
                sampleRgbaChannelIncludeMaskJob.Position        = instanceData.Position.ToDeferredJobArray();
                sampleRgbaChannelIncludeMaskJob.TextureMaskData = instanceData.TextureMaskData.ToDeferredJobArray();
                sampleRgbaChannelIncludeMaskJob.RgbaNativeArray = _rgbaNativeArray;
                sampleRgbaChannelIncludeMaskJob.SelectedChannel = selectedChannel;
                sampleRgbaChannelIncludeMaskJob.Inverse         = inverse;
                sampleRgbaChannelIncludeMaskJob.TextureRect     = TextureRect;
                sampleRgbaChannelIncludeMaskJob.MinValue        = textureMaskRule.MinDensity;
                sampleRgbaChannelIncludeMaskJob.MaxValue        = textureMaskRule.MaxDensity;
                return(sampleRgbaChannelIncludeMaskJob.Schedule(instanceData.Excluded, 32, dependsOn));
            }

            return(dependsOn);
        }
 void ReturnVegetationCellTemporaryMemory()
 {
     for (int i = 0; i <= CompactMemoryCellList.Count - 1; i++)
     {
         VegetationCell vegetationCell = CompactMemoryCellList[i];
         for (int j = 0; j <= vegetationCell.VegetationInstanceDataList.Count - 1; j++)
         {
             VegetationInstanceData vegetationInstanceData = vegetationCell.VegetationInstanceDataList[j];
             VegetationCellSpawner.VegetationInstanceDataPool.ReturnObject(vegetationInstanceData);
         }
         vegetationCell.VegetationInstanceDataList.Clear();
     }
     CompactMemoryCellList.Clear();
 }
Exemple #10
0
        public JobHandle SampleTerrain(NativeList <VegetationSpawnLocationInstance> spawnLocationList,
                                       VegetationInstanceData instanceData, int sampleCount, Rect spawnRect, JobHandle dependsOn)
        {
            if (!_initDone)
            {
                return(dependsOn);
            }


            if (spawnRect.Overlaps(_terrainRect))
            {
                UnityTerrainSampleJob unityTerrainSampleJob = new UnityTerrainSampleJob
                {
                    InputHeights      = Heights,
                    SpawnLocationList = spawnLocationList.ToDeferredJobArray(),

                    Position              = instanceData.Position.ToDeferredJobArray(),
                    Rotation              = instanceData.Rotation.ToDeferredJobArray(),
                    Scales                = instanceData.Scale.ToDeferredJobArray(),
                    TerrainNormal         = instanceData.TerrainNormal.ToDeferredJobArray(),
                    BiomeDistance         = instanceData.BiomeDistance.ToDeferredJobArray(),
                    TerrainTextureData    = instanceData.TerrainTextureData.ToDeferredJobArray(),
                    RandomNumberIndex     = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                    DistanceFalloff       = instanceData.DistanceFalloff.ToDeferredJobArray(),
                    VegetationMaskDensity = instanceData.VegetationMaskDensity.ToDeferredJobArray(),
                    VegetationMaskScale   = instanceData.VegetationMaskScale.ToDeferredJobArray(),
                    TerrainSourceIDs      = instanceData.TerrainSourceID.ToDeferredJobArray(),
                    TextureMaskData       = instanceData.TextureMaskData.ToDeferredJobArray(),
                    Excluded              = instanceData.Excluded.ToDeferredJobArray(),
                    HeightmapSampled      = instanceData.HeightmapSampled.ToDeferredJobArray(),
                    HeightMapScale        = _heightmapScale,
                    HeightmapHeight       = _heightmapHeight,
                    HeightmapWidth        = _heightmapWidth,
                    TerrainPosition       = TerrainPosition,
                    Scale           = _scale,
                    Size            = _size,
                    TerrainSourceID = (byte)TerrainSourceID
                };
                JobHandle handle = unityTerrainSampleJob.Schedule(sampleCount, 64, dependsOn);
                return(handle);
            }
            return(dependsOn);
        }
Exemple #11
0
        public override JobHandle SampleMask(VegetationInstanceData instanceData, VegetationType vegetationType,
                                             JobHandle dependsOn)
        {
            if (VegetationType != vegetationType)
            {
                return(dependsOn);
            }

            SampleVegetatiomMaskCircleJob sampleVegetatiomMaskCircleJob =
                new SampleVegetatiomMaskCircleJob
            {
                MaskPosition = Position,
                Radius       = Radius,
                Position     = instanceData.Position.ToDeferredJobArray(),
                Excluded     = instanceData.Excluded.ToDeferredJobArray()
            };

            dependsOn = sampleVegetatiomMaskCircleJob.Schedule(instanceData.Excluded, 32, dependsOn);

            return(dependsOn);
        }
Exemple #12
0
        public override JobHandle SampleMask(VegetationInstanceData instanceData, VegetationType vegetationType,
                                             JobHandle dependsOn)
        {
            if (!ExcludeVegetationType(vegetationType))
            {
                return(dependsOn);
            }

            SampleVegetatiomMaskPolygonJob sampleVegetatiomMaskPolygonJob =
                new SampleVegetatiomMaskPolygonJob
            {
                Position           = instanceData.Position.ToDeferredJobArray(),
                Excluded           = instanceData.Excluded.ToDeferredJobArray(),
                PolygonArray       = PolygonArray,
                SegmentArray       = SegmentArray,
                AdditionalWidth    = GetAdditionalWidth(vegetationType),
                AdditionalWidthMax = GetAdditionalWidthMax(vegetationType),
                NoiseScale         = GetPerlinScale(vegetationType)
            };

            dependsOn = sampleVegetatiomMaskPolygonJob.Schedule(instanceData.Excluded, 32, dependsOn);
            return(dependsOn);
        }
        JobHandle ExecuteSpawnRules(VegetationCell vegetationCell, Rect vegetationCellRect, int vegetationPackageIndex, int vegetationItemIndex)
        {
            int firstUnityTerrainIndex = GetFirstUnityTerrainIndex();
            VegetationItemInfoPro   vegetationItemInfoPro   = VegetationPackageProList[vegetationPackageIndex].VegetationInfoList[vegetationItemIndex];
            VegetationPackagePro    vegetationPackagePro    = VegetationPackageProList[vegetationPackageIndex];
            VegetationItemModelInfo vegetationItemModelInfo =
                VegetationPackageProModelsList[vegetationPackageIndex].VegetationItemModelList[vegetationItemIndex];
            BiomeType currentBiome          = VegetationPackageProList[vegetationPackageIndex].BiomeType;
            int       currentBiomeSortOrder = VegetationPackageProList[vegetationPackageIndex].BiomeSortOrder;

            float globalDensity =
                VegetationSettings.GetVegetationItemDensity(vegetationItemInfoPro.VegetationType);

            if (vegetationCell.VegetationPackageInstancesList[vegetationPackageIndex].LoadStateList[vegetationItemIndex] == 1)
            {
                return(default(JobHandle));
            }
            vegetationCell.VegetationPackageInstancesList[vegetationPackageIndex].LoadStateList[vegetationItemIndex] = 1;

            bool doRuntimeSpawn = !(currentBiome != BiomeType.Default && !vegetationCell.HasBiome(currentBiome));

            NativeList <MatrixInstance> matrixList =
                vegetationCell.VegetationPackageInstancesList[vegetationPackageIndex].VegetationItemMatrixList[vegetationItemIndex];

            matrixList.Clear();

            if (!vegetationItemInfoPro.EnableRuntimeSpawn)
            {
                doRuntimeSpawn = false;
            }

            if (vegetationItemInfoPro.UseVegetationMask)
            {
                bool hasVegetationTypeIndex = false;
                if (vegetationCell.VegetationMaskList != null)
                {
                    for (int k = 0; k <= vegetationCell.VegetationMaskList.Count - 1; k++)
                    {
                        if (vegetationCell.VegetationMaskList[k]
                            .HasVegetationTypeIndex(vegetationItemInfoPro.VegetationTypeIndex))
                        {
                            hasVegetationTypeIndex = true;
                            break;
                        }
                    }
                }

                if (!hasVegetationTypeIndex)
                {
                    doRuntimeSpawn = false;
                }
            }

            JobHandle vegetationItemHandle = default(JobHandle);

            if (doRuntimeSpawn)
            {
                VegetationInstanceData instanceData = VegetationInstanceDataPool.GetObject();
                instanceData.Clear();
                vegetationCell.VegetationInstanceDataList.Add(instanceData);

                float sampleDistance = vegetationItemInfoPro.SampleDistance / globalDensity;
                float density        = 1;

                float calculatedSampleDistance = Mathf.Clamp(sampleDistance / density, 0.1f,
                                                             vegetationCell.VegetationCellBounds.size.x / 2f);
                int xSamples    = Mathf.CeilToInt(vegetationCell.VegetationCellBounds.size.x / calculatedSampleDistance);
                int zSamples    = Mathf.CeilToInt(vegetationCell.VegetationCellBounds.size.z / calculatedSampleDistance);
                int sampleCount = xSamples * zSamples;

                matrixList.Capacity = sampleCount;
                instanceData.SpawnLocations.ResizeUninitialized(sampleCount);

                if (firstUnityTerrainIndex > -1)
                {
                    instanceData.ResizeUninitialized(sampleCount);
                    InitInstanceData initInstanceData = new InitInstanceData
                    {
                        HeightmapSampled = instanceData.HeightmapSampled.ToDeferredJobArray(),
                        Excluded         = instanceData.Excluded.ToDeferredJobArray()
                    };
                    vegetationItemHandle = initInstanceData.Schedule(sampleCount, 256, vegetationItemHandle);
                }
                else
                {
                    instanceData.SetCapasity(sampleCount);
                }
                float defaultSpawnChance = 0;
                if (currentBiome == BiomeType.Default)
                {
                    defaultSpawnChance = 1;
                }

                CalculateCellSpawnLocationsWideJob calculateCellSpawnLocationsWideJob =
                    new CalculateCellSpawnLocationsWideJob
                {
                    SpawnLocations = instanceData.SpawnLocations.ToDeferredJobArray(),
                    CellSize       = vegetationCell.VegetationCellBounds.size,
                    CellCorner     =
                        vegetationCell.VegetationCellBounds.center -
                        vegetationCell.VegetationCellBounds.extents,
                    SampleDistance     = sampleDistance,
                    RandomizePosition  = vegetationItemInfoPro.RandomizePosition,
                    Density            = 1,
                    DefaultSpawnChance = defaultSpawnChance,
                    RandomNumbers      = RandomNumbers,
                    CellRect           = vegetationCellRect,
                    CellIndex          = vegetationCell.Index,
                    Seed = vegetationItemInfoPro.Seed + VegetationSettings.Seed,
                    UseSamplePointOffset     = vegetationItemInfoPro.UseSamplePointOffset,
                    SamplePointMinOffset     = vegetationItemInfoPro.SamplePointMinOffset,
                    SamplePointMaxOffset     = vegetationItemInfoPro.SamplePointMaxOffset,
                    XSamples                 = xSamples,
                    ZSamples                 = zSamples,
                    CalculatedSampleDistance = calculatedSampleDistance
                };

                vegetationItemHandle = calculateCellSpawnLocationsWideJob.Schedule(sampleCount, 64, vegetationItemHandle);

                if (vegetationCell.BiomeMaskList != null)
                {
                    for (int k = 0; k <= vegetationCell.BiomeMaskList.Count - 1; k++)
                    {
                        if (vegetationCell.BiomeMaskList[k].BiomeSortOrder < currentBiomeSortOrder)
                        {
                            continue;
                        }
                        vegetationItemHandle = vegetationCell.BiomeMaskList[k]
                                               .FilterSpawnLocations(instanceData.SpawnLocations, currentBiome, sampleCount, vegetationItemHandle);
                    }
                }

                if (vegetationItemInfoPro.UseNoiseCutoff)
                {
                    PerlinNoiseCutoffJob perlinNoiseCutoffJob =
                        new PerlinNoiseCutoffJob
                    {
                        InversePerlinMask = vegetationItemInfoPro.NoiseCutoffInverse,
                        PerlinCutoff      = vegetationItemInfoPro.NoiseCutoffValue,
                        PerlinScale       = vegetationItemInfoPro.NoiseCutoffScale,
                        Offset            = vegetationItemInfoPro.NoiseCutoffOffset,
                        SpawnLocationList = instanceData.SpawnLocations.ToDeferredJobArray()
                    };

                    vegetationItemHandle = perlinNoiseCutoffJob.Schedule(sampleCount, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseNoiseDensity)
                {
                    PerlinNoiseDensityJob perlinNoiseDensityJob =
                        new PerlinNoiseDensityJob
                    {
                        InversePerlinMask = vegetationItemInfoPro.NoiseDensityInverse,
                        PerlinScale       = vegetationItemInfoPro.NoiseDensityScale,
                        Offset            = vegetationItemInfoPro.NoiseDensityOffset,
                        SpawnLocationList = instanceData.SpawnLocations.ToDeferredJobArray()
                    };
                    vegetationItemHandle = perlinNoiseDensityJob.Schedule(sampleCount, 64, vegetationItemHandle);
                }

                FilterSpawnLocationsChanceJob filterSpawnLocationsChanceJob =
                    new FilterSpawnLocationsChanceJob
                {
                    SpawnLocationList = instanceData.SpawnLocations.ToDeferredJobArray(),
                    RandomNumbers     = RandomNumbers,
                    Density           = vegetationItemInfoPro.Density
                };

                vegetationItemHandle = filterSpawnLocationsChanceJob.Schedule(sampleCount, 64, vegetationItemHandle);

                for (int k = 0; k <= VegetationStudioTerrainList.Count - 1; k++)
                {
                    vegetationItemHandle = VegetationStudioTerrainList[k]
                                           .SampleTerrain(instanceData.SpawnLocations, instanceData, sampleCount, vegetationCellRect,
                                                          vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseTerrainSourceExcludeRule)
                {
                    TerrainSourceExcludeRuleJob terrainSourceExcludeRuleJob =
                        new TerrainSourceExcludeRuleJob
                    {
                        Excluded          = instanceData.Excluded.ToDeferredJobArray(),
                        TerrainSourceID   = instanceData.TerrainSourceID.ToDeferredJobArray(),
                        TerrainSourceRule = vegetationItemInfoPro.TerrainSourceExcludeRule
                    };
                    vegetationItemHandle = terrainSourceExcludeRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseTerrainSourceIncludeRule)
                {
                    TerrainSourceIncludeRuleJob terrainSourceIncludeRuleJob =
                        new TerrainSourceIncludeRuleJob
                    {
                        Excluded          = instanceData.Excluded.ToDeferredJobArray(),
                        TerrainSourceID   = instanceData.TerrainSourceID.ToDeferredJobArray(),
                        TerrainSourceRule = vegetationItemInfoPro.TerrainSourceIncludeRule
                    };
                    vegetationItemHandle = terrainSourceIncludeRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseSteepnessRule)
                {
                    InstanceSteepnessRuleJob instanceSteepnessRuleJob =
                        new InstanceSteepnessRuleJob
                    {
                        Excluded                = instanceData.Excluded.ToDeferredJobArray(),
                        TerrainNormal           = instanceData.TerrainNormal.ToDeferredJobArray(),
                        RandomNumberIndex       = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                        MinSteepness            = vegetationItemInfoPro.MinSteepness,
                        MaxSteepness            = vegetationItemInfoPro.MaxSteepness,
                        Advanced                = vegetationItemInfoPro.UseAdvancedSteepnessRule,
                        SteepnessRuleCurveArray = vegetationItemModelInfo.SteepnessRuleCurveArray,
                        RandomNumbers           = RandomNumbers
                    };
                    vegetationItemHandle = instanceSteepnessRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseHeightRule)
                {
                    InstanceHeightRuleJob instanceHeightRuleJob =
                        new InstanceHeightRuleJob
                    {
                        Excluded             = instanceData.Excluded.ToDeferredJobArray(),
                        Position             = instanceData.Position.ToDeferredJobArray(),
                        RandomNumberIndex    = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                        MinHeight            = vegetationItemInfoPro.MinHeight + WorldspaceSeaLevel,
                        MaxHeight            = vegetationItemInfoPro.MaxHeight + WorldspaceSeaLevel,
                        Advanced             = vegetationItemInfoPro.UseAdvancedHeightRule,
                        HeightRuleCurveArray = vegetationItemModelInfo.HeightRuleCurveArray,
                        RandomNumbers        = RandomNumbers,
                        MaxCurveHeight       = vegetationItemInfoPro.MaxCurveHeight
                    };
                    vegetationItemHandle = instanceHeightRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (!vegetationItemInfoPro.UseVegetationMask && vegetationCell.VegetationMaskList != null)
                {
                    for (int k = 0; k <= vegetationCell.VegetationMaskList.Count - 1; k++)
                    {
                        vegetationItemHandle = vegetationCell.VegetationMaskList[k].SampleMask(instanceData,
                                                                                               vegetationItemInfoPro.VegetationType, vegetationItemHandle);
                    }
                }
                else
                {
                    if (vegetationCell.VegetationMaskList != null)
                    {
                        for (int k = 0; k <= vegetationCell.VegetationMaskList.Count - 1; k++)
                        {
                            vegetationItemHandle = vegetationCell.VegetationMaskList[k].SampleIncludeVegetationMask(
                                instanceData,
                                vegetationItemInfoPro.VegetationTypeIndex, vegetationItemHandle);
                        }

                        if (vegetationCell.VegetationMaskList.Count > 0)
                        {
                            ProcessIncludeVegetationMaskJob processIncludeVegetationMaskJob =
                                new ProcessIncludeVegetationMaskJob
                            {
                                Excluded              = instanceData.Excluded.ToDeferredJobArray(),
                                Scale                 = instanceData.Scale.ToDeferredJobArray(),
                                RandomNumberIndex     = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                                VegetationMaskDensity = instanceData.VegetationMaskDensity.ToDeferredJobArray(),
                                VegetationMaskScale   = instanceData.VegetationMaskScale.ToDeferredJobArray(),
                                RandomNumbers         = RandomNumbers
                            };
                            vegetationItemHandle = processIncludeVegetationMaskJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                        }
                    }
                }

                if (vegetationItemInfoPro.UseConcaveLocationRule)
                {
                    for (int k = 0; k <= VegetationStudioTerrainList.Count - 1; k++)
                    {
                        vegetationItemHandle = VegetationStudioTerrainList[k].SampleConcaveLocation(instanceData,
                                                                                                    vegetationItemInfoPro.ConcaveLoactionMinHeightDifference,
                                                                                                    vegetationItemInfoPro.ConcaveLoactionDistance, vegetationItemInfoPro.ConcaveLocationInverse,
                                                                                                    vegetationItemInfoPro.ConcaveLoactionAverage, vegetationCellRect, vegetationItemHandle);
                    }
                }

                if (vegetationItemInfoPro.UseTextureMaskIncludeRules)
                {
                    for (int k = 0; k <= vegetationItemInfoPro.TextureMaskIncludeRuleList.Count - 1; k++)
                    {
                        TextureMaskGroup textureMaskGroup =
                            vegetationPackagePro.GetTextureMaskGroup(vegetationItemInfoPro
                                                                     .TextureMaskIncludeRuleList[k].TextureMaskGroupID);
                        if (textureMaskGroup != null)
                        {
                            vegetationItemHandle = textureMaskGroup.SampleIncludeMask(instanceData, vegetationCellRect,
                                                                                      vegetationItemInfoPro.TextureMaskIncludeRuleList[k], vegetationItemHandle);
                        }
                    }

                    FilterIncludeMaskJob filterIncludeMaskJob =
                        new FilterIncludeMaskJob
                    {
                        Excluded        = instanceData.Excluded.ToDeferredJobArray(),
                        TextureMaskData = instanceData.TextureMaskData.ToDeferredJobArray()
                    };
                    vegetationItemHandle = filterIncludeMaskJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseTextureMaskExcludeRules)
                {
                    for (int k = 0; k <= vegetationItemInfoPro.TextureMaskExcludeRuleList.Count - 1; k++)
                    {
                        TextureMaskGroup textureMaskGroup =
                            vegetationPackagePro.GetTextureMaskGroup(vegetationItemInfoPro
                                                                     .TextureMaskExcludeRuleList[k].TextureMaskGroupID);
                        if (textureMaskGroup != null)
                        {
                            vegetationItemHandle = textureMaskGroup.SampleExcludeMask(instanceData, vegetationCellRect,
                                                                                      vegetationItemInfoPro.TextureMaskExcludeRuleList[k], vegetationItemHandle);
                        }
                    }
                }

                OffsetAndRotateScaleVegetationInstanceMathJob offsetAndRotateScaleVegetationInstanceJob =
                    new OffsetAndRotateScaleVegetationInstanceMathJob
                {
                    RandomNumbers          = RandomNumbers,
                    Excluded               = instanceData.Excluded.ToDeferredJobArray(),
                    Scale                  = instanceData.Scale.ToDeferredJobArray(),
                    Position               = instanceData.Position.ToDeferredJobArray(),
                    Rotation               = instanceData.Rotation.ToDeferredJobArray(),
                    RandomNumberIndex      = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                    TerrainNormal          = instanceData.TerrainNormal.ToDeferredJobArray(),
                    VegetationRotationType = vegetationItemInfoPro.Rotation,
                    MinScale               = vegetationItemInfoPro.MinScale,
                    MaxScale               = vegetationItemInfoPro.MaxScale,
                    Offset                 = vegetationItemInfoPro.Offset,
                    RotationOffset         = vegetationItemInfoPro.RotationOffset,
                    ScaleMultiplier        = vegetationItemInfoPro.ScaleMultiplier
                };
                vegetationItemHandle = offsetAndRotateScaleVegetationInstanceJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);


                if (vegetationItemInfoPro.UseNoiseScaleRule)
                {
                    PerlinNoiseScaleJob perlinNoiseScaleJob =
                        new PerlinNoiseScaleJob
                    {
                        Excluded          = instanceData.Excluded.ToDeferredJobArray(),
                        Position          = instanceData.Position.ToDeferredJobArray(),
                        Scale             = instanceData.Scale.ToDeferredJobArray(),
                        PerlinScale       = vegetationItemInfoPro.NoiseScaleScale,
                        MinScale          = vegetationItemInfoPro.NoiseScaleMinScale,
                        MaxScale          = vegetationItemInfoPro.NoiseScaleMaxScale,
                        InversePerlinMask = vegetationItemInfoPro.NoiseScaleInverse,
                        Offset            = vegetationItemInfoPro.NoiseScaleOffset
                    };
                    vegetationItemHandle = perlinNoiseScaleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseBiomeEdgeScaleRule && currentBiome != BiomeType.Default)
                {
                    BiomeEdgeDistanceScaleRuleJob biomeEdgeDistanceScaleRuleJob =
                        new BiomeEdgeDistanceScaleRuleJob
                    {
                        Excluded      = instanceData.Excluded.ToDeferredJobArray(),
                        Scale         = instanceData.Scale.ToDeferredJobArray(),
                        BiomeDistance = instanceData.BiomeDistance.ToDeferredJobArray(),
                        MinScale      = vegetationItemInfoPro.BiomeEdgeScaleMinScale,
                        MaxScale      = vegetationItemInfoPro.BiomeEdgeScaleMaxScale,
                        MaxDistance   = vegetationItemInfoPro.BiomeEdgeScaleDistance,
                        InverseScale  = vegetationItemInfoPro.BiomeEdgeScaleInverse
                    };
                    vegetationItemHandle = biomeEdgeDistanceScaleRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseBiomeEdgeIncludeRule && currentBiome != BiomeType.Default)
                {
                    BiomeEdgeDistanceIncludeRuleJob biomeEdgeDistanceIncludeRuleJob =
                        new BiomeEdgeDistanceIncludeRuleJob
                    {
                        Excluded      = instanceData.Excluded.ToDeferredJobArray(),
                        BiomeDistance = instanceData.BiomeDistance.ToDeferredJobArray(),
                        MaxDistance   = vegetationItemInfoPro.BiomeEdgeIncludeDistance,
                        Inverse       = vegetationItemInfoPro.BiomeEdgeIncludeInverse
                    };
                    vegetationItemHandle = biomeEdgeDistanceIncludeRuleJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                if (vegetationItemInfoPro.UseTerrainTextureIncludeRules)
                {
                    for (int k = 0; k <= VegetationStudioTerrainList.Count - 1; k++)
                    {
                        vegetationItemHandle = VegetationStudioTerrainList[k]
                                               .ProcessSplatmapRules(vegetationItemInfoPro.TerrainTextureIncludeRuleList, instanceData,
                                                                     true,
                                                                     vegetationCellRect,
                                                                     vegetationItemHandle);
                    }
                }

                if (vegetationItemInfoPro.UseTerrainTextureExcludeRules)
                {
                    for (int k = 0; k <= VegetationStudioTerrainList.Count - 1; k++)
                    {
                        vegetationItemHandle = VegetationStudioTerrainList[k]
                                               .ProcessSplatmapRules(vegetationItemInfoPro.TerrainTextureExcludeRuleList, instanceData,
                                                                     false,
                                                                     vegetationCellRect,
                                                                     vegetationItemHandle);
                    }
                }

                if (vegetationItemInfoPro.UseDistanceFalloff)
                {
                    DistanceFalloffJob distanceFalloffJob =
                        new DistanceFalloffJob
                    {
                        Excluded                     = instanceData.Excluded.ToDeferredJobArray(),
                        RandomNumberIndex            = instanceData.RandomNumberIndex.ToDeferredJobArray(),
                        DistanceFalloff              = instanceData.DistanceFalloff.ToDeferredJobArray(),
                        RandomNumbers                = RandomNumbers,
                        DistanceFalloffStartDistance = vegetationItemInfoPro.DistanceFalloffStartDistance
                    };
                    vegetationItemHandle = distanceFalloffJob.Schedule(instanceData.Excluded, 64, vegetationItemHandle);
                }

                NewCreateInstanceMatrixJob createInstanceMatrixJob =
                    new NewCreateInstanceMatrixJob
                {
                    Excluded        = instanceData.Excluded,
                    Position        = instanceData.Position,
                    Scale           = instanceData.Scale,
                    Rotation        = instanceData.Rotation,
                    DistanceFalloff = instanceData.DistanceFalloff,
                    VegetationInstanceMatrixList = matrixList
                };

                vegetationItemHandle = createInstanceMatrixJob.Schedule(vegetationItemHandle);
            }

            if (!doRuntimeSpawn)
            {
                if (PersistentVegetationStorage && !PersistentVegetationStorage.DisablePersistentStorage)
                {
                    PersistentVegetationCell persistentVegetationCell = PersistentVegetationStorage.GetPersistentVegetationCell(vegetationCell.Index);
                    PersistentVegetationInfo persistentVegetationInfo = persistentVegetationCell?.GetPersistentVegetationInfo(vegetationItemInfoPro.VegetationItemID);
                    if (persistentVegetationInfo != null && persistentVegetationInfo.VegetationItemList.Count > 0)
                    {
                        persistentVegetationInfo.CopyToNativeArray();
                        matrixList.ResizeUninitialized(persistentVegetationInfo.NativeVegetationItemArray.Length);

                        LoadPersistentStorageToMatrixWideJob loadPersistentStorageToMatrixJob =
                            new LoadPersistentStorageToMatrixWideJob
                        {
                            InstanceList = persistentVegetationInfo.NativeVegetationItemArray,
                            VegetationInstanceMatrixList = matrixList.ToDeferredJobArray(),
                            VegetationSystemPosition     = VegetationSystemPro.VegetationSystemPosition
                        };
                        vegetationItemHandle = loadPersistentStorageToMatrixJob.Schedule(matrixList, 64, vegetationItemHandle);
                    }
                }
            }
            else
            {
                if (PersistentVegetationStorage && !PersistentVegetationStorage.DisablePersistentStorage)
                {
                    PersistentVegetationCell persistentVegetationCell = PersistentVegetationStorage.GetPersistentVegetationCell(vegetationCell.Index);
                    PersistentVegetationInfo persistentVegetationInfo = persistentVegetationCell?.GetPersistentVegetationInfo(vegetationItemInfoPro.VegetationItemID);
                    if (persistentVegetationInfo != null && persistentVegetationInfo.VegetationItemList.Count > 0)
                    {
                        persistentVegetationInfo.CopyToNativeArray();
                        LoadPersistentStorageToMatrixJob loadPersistentStorageToMatrixJob =
                            new LoadPersistentStorageToMatrixJob
                        {
                            InstanceList = persistentVegetationInfo.NativeVegetationItemArray,
                            VegetationInstanceMatrixList = matrixList,
                            VegetationSystemPosition     = VegetationSystemPro.VegetationSystemPosition
                        };

                        vegetationItemHandle = loadPersistentStorageToMatrixJob.Schedule(vegetationItemHandle);
                    }
                }
            }

            Profiler.BeginSample("Schedule batched jobs");
            JobHandle.ScheduleBatchedJobs();
            Profiler.EndSample();

            return(vegetationItemHandle);
        }
Exemple #14
0
        //public virtual bool Contains(Vector3 point, VegetationType vegetationType, bool useAdditionalDistance, bool useExcludeFilter)
        //{
        //    return false;
        //}


        public virtual JobHandle SampleMask(VegetationInstanceData instanceData,
                                            VegetationType vegetationType,
                                            JobHandle dependsOn)
        {
            return(dependsOn);
        }
Exemple #15
0
 public virtual JobHandle SampleIncludeVegetationMask(VegetationInstanceData instanceData,
                                                      VegetationTypeIndex vegetationTypeIndex,
                                                      JobHandle dependsOn)
 {
     return(dependsOn);
 }
Exemple #16
0
        public JobHandle SampleTerrain(NativeList <VegetationSpawnLocationInstance> spawnLocationList, VegetationInstanceData instanceData, int sampleCount, Rect spawnRect,
                                       JobHandle dependsOn)
        {
            if (!_initDone)
            {
                return(dependsOn);
            }
            if (!_nativeNodes.IsCreated)
            {
                CreateNativeArrays();
            }

            Rect terrainRect = RectExtension.CreateRectFromBounds(TerrainBounds);

            if (!spawnRect.Overlaps(terrainRect))
            {
                return(dependsOn);
            }

            BVHRaycastContainer raycastContainer = new BVHRaycastContainer
            {
                Rays           = new NativeArray <BVHRay>(sampleCount, Allocator.TempJob),
                RaycastHits    = new NativeArray <HitInfo>(sampleCount, Allocator.TempJob),
                RaycastHitList = new NativeList <HitInfo>(sampleCount * 2, Allocator.TempJob),
                TempHi         = new NativeArray <HitInfo>(sampleCount, Allocator.TempJob)
            };

            RaycastContainerList.Add(raycastContainer);

            CreateBVHRaycastJob createBVHRaysJob =
                new CreateBVHRaycastJob
            {
                SpawnLocationList = spawnLocationList.ToDeferredJobArray(),
                Rays        = raycastContainer.Rays,
                TerrainRect = terrainRect
            };

            dependsOn = createBVHRaysJob.Schedule(dependsOn);


            if (MultiLevelRaycast)
            {
                SampleBVHTreeMultiLevelJob jobData = new SampleBVHTreeMultiLevelJob()
                {
                    Rays        = raycastContainer.Rays,
                    HitInfos    = raycastContainer.RaycastHitList,
                    NativeNodes = _nativeNodes,
                    NativePrims = _nativePrims,
                    TempHi      = raycastContainer.TempHi
                };

                dependsOn = jobData.Schedule(dependsOn);

                UpdateBVHInstanceListMultiLevelJob updateInstanceListJob = new UpdateBVHInstanceListMultiLevelJob
                {
                    Position              = instanceData.Position,
                    Rotation              = instanceData.Rotation,
                    Scale                 = instanceData.Scale,
                    TerrainNormal         = instanceData.TerrainNormal,
                    BiomeDistance         = instanceData.BiomeDistance,
                    TerrainTextureData    = instanceData.TerrainTextureData,
                    RandomNumberIndex     = instanceData.RandomNumberIndex,
                    DistanceFalloff       = instanceData.DistanceFalloff,
                    VegetationMaskDensity = instanceData.VegetationMaskDensity,
                    VegetationMaskScale   = instanceData.VegetationMaskScale,
                    TerrainSourceID       = instanceData.TerrainSourceID,
                    TextureMaskData       = instanceData.TextureMaskData,
                    Excluded              = instanceData.Excluded,
                    HeightmapSampled      = instanceData.HeightmapSampled,
                    RaycastHits           = raycastContainer.RaycastHitList.ToDeferredJobArray(),
                };
                dependsOn = updateInstanceListJob.Schedule(dependsOn);
            }
            else
            {
                SampleBVHTreeJob jobData = new SampleBVHTreeJob()
                {
                    Rays        = raycastContainer.Rays,
                    HitInfos    = raycastContainer.RaycastHits,
                    NativeNodes = _nativeNodes,
                    NativePrims = _nativePrims,
                    TempHi      = raycastContainer.TempHi
                };

                dependsOn = jobData.Schedule(sampleCount, 32, dependsOn);

                UpdateBVHInstanceListJob updateInstanceListJob = new UpdateBVHInstanceListJob
                {
                    Position              = instanceData.Position,
                    Rotation              = instanceData.Rotation,
                    Scale                 = instanceData.Scale,
                    TerrainNormal         = instanceData.TerrainNormal,
                    BiomeDistance         = instanceData.BiomeDistance,
                    TerrainTextureData    = instanceData.TerrainTextureData,
                    RandomNumberIndex     = instanceData.RandomNumberIndex,
                    DistanceFalloff       = instanceData.DistanceFalloff,
                    VegetationMaskDensity = instanceData.VegetationMaskDensity,
                    VegetationMaskScale   = instanceData.VegetationMaskScale,
                    TerrainSourceID       = instanceData.TerrainSourceID,
                    TextureMaskData       = instanceData.TextureMaskData,
                    Excluded              = instanceData.Excluded,
                    RaycastHits           = raycastContainer.RaycastHits,
                    HeightmapSampled      = instanceData.HeightmapSampled,
                    SpawnLocationList     = spawnLocationList.ToDeferredJobArray()
                };

                dependsOn = updateInstanceListJob.Schedule(dependsOn);
            }
            return(dependsOn);
        }
Exemple #17
0
        public JobHandle SampleTerrain(NativeList <VegetationSpawnLocationInstance> spawnLocationList,
                                       VegetationInstanceData instanceData, int sampleCount,
                                       Rect spawnRect, JobHandle dependsOn)
        {
            if (!_initDone)
            {
                return(dependsOn);
            }

            Vector3 floatingOriginOffset = VegetationStudioManager.GetFloatingOriginOffset();
            Rect    terrainRect          = RectExtension.CreateRectFromBounds(TerrainBounds);

            if (!spawnRect.Overlaps(terrainRect))
            {
                return(dependsOn);
            }

            MaxHits = 1;

            RaycastContainers raycastContainers = RaycastContainerPool.Get();

            raycastContainers.RaycastCommands = new NativeArray <RaycastCommand>(sampleCount, Allocator.TempJob);
            raycastContainers.RaycastHits     = new NativeArray <RaycastHit>(sampleCount * MaxHits, Allocator.TempJob);
            RaycastContainerList.Add(raycastContainers);

            CreateRaycastCommandsJob createRaycastCommandsJob =
                new CreateRaycastCommandsJob
            {
                SpawnLocationList    = spawnLocationList.ToDeferredJobArray(),
                LayerMask            = RaycastLayerMask,
                MaxHits              = MaxHits,
                RaycastCommands      = raycastContainers.RaycastCommands,
                FloatingOriginOffset = floatingOriginOffset
            };

            dependsOn = createRaycastCommandsJob.Schedule(dependsOn);
            dependsOn = RaycastCommand.ScheduleBatch(raycastContainers.RaycastCommands, raycastContainers.RaycastHits,
                                                     32, dependsOn);

            UpdateInstanceListJob updateInstanceListJob = new UpdateInstanceListJob
            {
                Position              = instanceData.Position,
                Rotation              = instanceData.Rotation,
                Scale                 = instanceData.Scale,
                TerrainNormal         = instanceData.TerrainNormal,
                BiomeDistance         = instanceData.BiomeDistance,
                TerrainTextureData    = instanceData.TerrainTextureData,
                RandomNumberIndex     = instanceData.RandomNumberIndex,
                DistanceFalloff       = instanceData.DistanceFalloff,
                VegetationMaskDensity = instanceData.VegetationMaskDensity,
                VegetationMaskScale   = instanceData.VegetationMaskScale,
                TerrainSourceIDs      = instanceData.TerrainSourceID,
                TextureMaskData       = instanceData.TextureMaskData,
                Excluded              = instanceData.Excluded,
                RaycastHits           = raycastContainers.RaycastHits,
                HeightmapSampled      = instanceData.HeightmapSampled,
                SpawnLocationList     = spawnLocationList.ToDeferredJobArray(),
                TerrainRect           = terrainRect,
                FloatingOriginOffset  = floatingOriginOffset,
                TerrainSourceID       = (byte)TerrainSourceID
            };

            dependsOn = updateInstanceListJob.Schedule(dependsOn);
            return(dependsOn);
        }
Exemple #18
0
 public JobHandle ProcessSplatmapRules(List <TerrainTextureRule> terrainTextureRuleList,
                                       VegetationInstanceData instanceData, bool include, Rect cellRect, JobHandle dependsOn)
 {
     return(dependsOn);
 }