示例#1
0
 public void ReInitializeManagers()
 {
     for (int i = 0; i < terrainCounter; i++)
     {
         GPUInstancerDetailManager detailManager = terrainArray[i].GetComponent <GPUInstancerDetailManager>();
         GPUInstancerAPI.InitializeGPUInstancer(detailManager);
     }
 }
        protected override void OnEnable()
        {
            base.OnEnable();

            wikiHash = "#The_Detail_Manager";

            prop_runInThreads = serializedObject.FindProperty("runInThreads");

            _detailManager = (target as GPUInstancerDetailManager);
            if (!Application.isPlaying && _detailManager.gpuiSimulator == null)
            {
                _detailManager.gpuiSimulator = new GPUInstancerEditorSimulator(_detailManager);
            }
        }
示例#3
0
        private void UpdateManagers()
        {
            for (int i = 0; i < terrainCounter; i++)
            {
                GPUInstancerDetailManager detailManager = terrainArray[i].GetComponent <GPUInstancerDetailManager>();

                detailManager.terrainSettings.windVector = _windVector;

                for (int j = 0; j < detailManager.prototypeList.Count; j++)
                {
                    GPUInstancerDetailPrototype detailPrototype = (GPUInstancerDetailPrototype)detailManager.prototypeList[j];

                    // noise settings:
                    detailPrototype.detailHealthyColor = _healthyColor;
                    detailPrototype.detailDryColor     = _dryColor;
                    detailPrototype.noiseSpread        = _noiseSpread;
                    detailPrototype.ambientOcclusion   = _ambientOcclusion;
                    detailPrototype.gradientPower      = _gradientPower;

                    // wind settings:
                    detailPrototype.windIdleSway      = _windIdleSway;
                    detailPrototype.windWavesOn       = _windWavesOn;
                    detailPrototype.windWaveTint      = _windWaveTint;
                    detailPrototype.windWaveSize      = _windWaveSize;
                    detailPrototype.windWaveSway      = _windWaveSway;
                    detailPrototype.windWaveTintColor = _windWaveTintColor;

                    // mesh settings:
                    detailPrototype.isBillboard       = _useCrossQuads ? false : _isBillboard;
                    detailPrototype.useCrossQuads     = _useCrossQuads;
                    detailPrototype.quadCount         = _crossQuadCount;
                    detailPrototype.billboardDistance = _crossQuadBillboardDistance;
                    detailPrototype.detailScale       = _scale;

                    // GPU Instancer settings
                    detailPrototype.isShadowCasting  = _isShadowCasting;
                    detailPrototype.isFrustumCulling = _isFrustumCulling;
                    detailPrototype.frustumOffset    = _frustumOffset;
                    detailPrototype.maxDistance      = _maxDistance;
                }

                GPUInstancerAPI.UpdateDetailInstances(detailManager, true);
            }
        }
示例#4
0
        private void AddInstancer(Terrain terrain)
        {
            GPUInstancerDetailManager detailManager = terrain.gameObject.AddComponent <GPUInstancerDetailManager>();

            GPUInstancerAPI.SetupManagerWithTerrain(detailManager, terrain);

            detailManager.terrainSettings.windVector = _windVector;

            // Can change prototype properties here
            if (detailManager.prototypeList.Count > 0)
            {
                GPUInstancerDetailPrototype detailPrototype = (GPUInstancerDetailPrototype)detailManager.prototypeList[0];

                detailPrototype.detailHealthyColor = _healthyColor;
                detailPrototype.detailDryColor     = _dryColor;
                detailPrototype.noiseSpread        = _noiseSpread;
                detailPrototype.ambientOcclusion   = _ambientOcclusion;
                detailPrototype.gradientPower      = _gradientPower;

                detailPrototype.windIdleSway      = _windIdleSway;
                detailPrototype.windWavesOn       = _windWavesOn;
                detailPrototype.windWaveTint      = _windWaveTint;
                detailPrototype.windWaveSize      = _windWaveSize;
                detailPrototype.windWaveSway      = _windWaveSway;
                detailPrototype.windWaveTintColor = _windWaveTintColor;

                detailPrototype.isBillboard       = _isBillboard;
                detailPrototype.useCrossQuads     = _useCrossQuads;
                detailPrototype.quadCount         = _crossQuadCount;
                detailPrototype.billboardDistance = _crossQuadBillboardDistance;
                detailPrototype.detailScale       = _scale;

                detailPrototype.isShadowCasting  = _isShadowCasting;
                detailPrototype.isFrustumCulling = _isFrustumCulling;
                detailPrototype.frustumOffset    = _frustumOffset;
                detailPrototype.maxDistance      = _maxDistance;
            }

            GPUInstancerAPI.InitializeGPUInstancer(detailManager);
        }
示例#5
0
 /// <summary>
 /// Can be used to set the Detail Map Data to the Detail Manager before initialization.
 /// </summary>
 /// <param name="manager"></param>
 /// <param name="detailMapData"></param>
 public static void SetDetailMapData(GPUInstancerDetailManager manager, List <int[, ]> detailMapData)
 {
     manager.SetDetailMapData(detailMapData);
 }
示例#6
0
 /// <summary>
 /// Returns a 2D array of detail object density for the given layer.
 /// </summary>
 /// <param name="manager"></param>
 /// <param name="layerIndex"></param>
 /// <returns></returns>
 public static int[,] GetDetailLayer(GPUInstancerDetailManager manager, int layerIndex)
 {
     return(manager.GetDetailLayer(layerIndex));
 }
示例#7
0
 /// <summary>
 /// Returns a list of 2D array of detail object density for the all the prototypes of the manager.
 /// </summary>
 /// <param name="manager"></param>
 /// <returns></returns>
 public static List <int[, ]> GetDetailMapData(GPUInstancerDetailManager manager)
 {
     return(manager.GetDetailMapData());
 }
示例#8
0
 /// <summary>
 ///     <para>Updates and synchronizes the GPU Instancer detail prototypes with the modifications made in the manager at runtime.</para>
 ///     <para>Use this if you want to make changes to the detail prototypes at runtime. Prototypes in the manager must be modified before using this.</para>
 ///     <para>For example usages, see: <see cref="DetailDemoSceneController"/> and <seealso cref="TerrainGenerator"/></para>
 /// </summary>
 /// <param name="manager">The manager that defines the prototypes you want to GPU instance.</param>
 /// <param name="updateMeshes">Whether GPU Instancer should also update meshes. Send this value as "true" if you change properties
 /// related to cross quadding, noise spread and/or detail scales</param>
 public static void UpdateDetailInstances(GPUInstancerDetailManager manager, bool updateMeshes = false)
 {
     GPUInstancerUtility.UpdateDetailInstanceRuntimeDataList(manager.runtimeDataList, manager.terrainSettings, updateMeshes, manager.detailLayer);
 }
示例#9
0
        private void MapMagicTerrainAddDetailManager(Terrain terrain)
        {
            if (terrain.GetComponent <GPUInstancerDetailManager>() == null && detailPrototypes != null && detailPrototypes.Count > 0)
            {
                GPUInstancerDetailManager newDetailManager = terrain.gameObject.AddComponent <GPUInstancerDetailManager>();
                newDetailManager.isFrustumCulling   = isFrustumCulling;
                newDetailManager.isOcclusionCulling = isOcclusionCulling;
                newDetailManager.minCullingDistance = minCullingDistance;
                newDetailManager.detailLayer        = detailLayer;
                newDetailManager.runInThreads       = detailRunInThreads;
                newDetailManager.autoSelectCamera   = autoSelectCamera;
                newDetailManager.cameraData.SetCamera(cameraData.mainCamera);
                newDetailManager.cameraData.renderOnlySelectedCamera = cameraData.renderOnlySelectedCamera;
                newDetailManager.cameraData.hiZOcclusionGenerator    = null;
                newDetailManager.InitializeCameraData();
                // for mapmagic detail optimization
                if (terrain.terrainData.detailPrototypes.Length != detailPrototypes.Count)
                {
                    int terrainDetailIndex = 0;
                    List <GPUInstancerPrototype> newPrototypeList = new List <GPUInstancerPrototype>();
                    for (int i = 0; i < detailPrototypes.Count; i++)
                    {
                        if (terrainDetailIndex >= terrain.terrainData.detailPrototypes.Length)
                        {
                            break;
                        }

                        GPUInstancerDetailPrototype dp = (GPUInstancerDetailPrototype)detailPrototypes[i];
                        if (!terrain.terrainData.detailPrototypes[terrainDetailIndex].usePrototypeMesh && dp.prototypeTexture == terrain.terrainData.detailPrototypes[terrainDetailIndex].prototypeTexture)
                        {
                            newPrototypeList.Add(dp);
                            terrainDetailIndex++;
                        }
                        else if (terrain.terrainData.detailPrototypes[terrainDetailIndex].usePrototypeMesh && dp.prefabObject == terrain.terrainData.detailPrototypes[terrainDetailIndex].prototype)
                        {
                            newPrototypeList.Add(dp);
                            terrainDetailIndex++;
                        }
                    }
                    newDetailManager.prototypeList = newPrototypeList;
                }
                else
                {
                    newDetailManager.prototypeList = detailPrototypes;
                }
                newDetailManager.SetupManagerWithTerrain(terrain);

                newDetailManager.terrainSettings.maxDetailDistance      = terrainSettings.maxDetailDistance;
                newDetailManager.terrainSettings.detailDensity          = terrainSettings.detailDensity;
                newDetailManager.terrainSettings.healthyDryNoiseTexture = terrainSettings.healthyDryNoiseTexture;
                newDetailManager.terrainSettings.windWaveNormalTexture  = terrainSettings.windWaveNormalTexture;
                newDetailManager.terrainSettings.windVector             = terrainSettings.windVector;
                newDetailManager.terrainSettings.autoSPCellSize         = terrainSettings.autoSPCellSize;
                newDetailManager.terrainSettings.preferedSPCellSize     = terrainSettings.preferedSPCellSize;

                if (terrain.gameObject.activeSelf)
                {
                    newDetailManager.InitializeRuntimeDataAndBuffers();
                }
            }
        }