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); } }
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); } }
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); }
/// <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); }
/// <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)); }
/// <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()); }
/// <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); }
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(); } } }