public static GPUInstancerBillboardAtlasBindings GetDefaultGPUInstancerBillboardAtlasBindings() { GPUInstancerBillboardAtlasBindings billboardAtlasBindings = Resources.Load <GPUInstancerBillboardAtlasBindings>(GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.BILLBOARD_ATLAS_BINDINGS_DEFAULT_NAME); if (billboardAtlasBindings == null) { billboardAtlasBindings = ScriptableObject.CreateInstance <GPUInstancerBillboardAtlasBindings>(); billboardAtlasBindings.ResetBillboardAtlases(); #if UNITY_EDITOR if (!Application.isPlaying) { if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH); } AssetDatabase.CreateAsset(billboardAtlasBindings, GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.BILLBOARD_ATLAS_BINDINGS_DEFAULT_NAME + ".asset"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif } return(billboardAtlasBindings); }
private void GenerateMapMagicTerrainSettings() { if (terrainSettings) { return; } terrainSettings = ScriptableObject.CreateInstance <GPUInstancerTerrainSettings>(); terrainSettings.name = "GPUI_MapMagic_" + mapMagicInstance.gens.name + "_" + mapMagicInstance.gens.GetInstanceID(); terrainSettings.maxDetailDistance = mapMagicInstance.detailDistance; terrainSettings.maxTreeDistance = mapMagicInstance.treeDistance; terrainSettings.detailDensity = mapMagicInstance.detailDensity; terrainSettings.healthyDryNoiseTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_HEALTHY_DRY_NOISE); terrainSettings.windWaveNormalTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_WIND_WAVE_NOISE); #if UNITY_EDITOR if (!Application.isPlaying) { string assetPath = GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH + terrainSettings.name + ".asset"; if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH); } AssetDatabase.CreateAsset(terrainSettings, assetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif }
public virtual void Awake() { #if UNITY_EDITOR if (!Application.isPlaying) { CheckPrototypeChanges(); } #endif if (activeManagerList == null) { activeManagerList = new List <GPUInstancerManager>(); } if (SystemInfo.supportsComputeShaders) { if (_visibilityComputeShader == null) { #if !UNITY_EDITOR && UNITY_ANDROID if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Vulkan) { _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH_VULKAN); GPUInstancerConstants.DETAIL_STORE_INSTANCE_DATA = true; GPUInstancerConstants.COMPUTE_MAX_LOD_BUFFER = 3; } else { _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH); } _bufferToTextureComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.BUFFER_TO_TEXTURE_COMPUTE_RESOURCE_PATH); _bufferToTextureComputeKernelID = _bufferToTextureComputeShader.FindKernel(GPUInstancerConstants.BUFFER_TO_TEXTURE_KERNEL); #else _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH); #endif _instanceVisibilityComputeKernelIDs = new int[GPUInstancerConstants.VISIBILITY_COMPUTE_KERNELS.Length]; for (int i = 0; i < _instanceVisibilityComputeKernelIDs.Length; i++) { _instanceVisibilityComputeKernelIDs[i] = _visibilityComputeShader.FindKernel(GPUInstancerConstants.VISIBILITY_COMPUTE_KERNELS[i]); } GPUInstancerConstants.TEXTURE_MAX_SIZE = SystemInfo.maxTextureSize; } GPUInstancerConstants.SetupComputeRuntimeModification(); GPUInstancerConstants.SetupComputeSetDataPartial(); } else if (Application.isPlaying) { Debug.LogError("Target Graphics API does not support Compute Shaders. Please refer to Minimum Requirements on GPUInstancer/ReadMe.txt for detailed information."); this.enabled = false; } showRenderedAmount = false; InitializeCameraData(); SetDefaultGPUInstancerShaderBindings(); SetDefaultGPUInstancerBillboardAtlasBindings(); }
private void Awake() { hiZTextureSize = Vector2.zero; GPUInstancerConstants.SetupComputeTextureUtils(); occlusionCullingType = GPUInstancerConstants.gpuiSettings.occlusionCullingType; #if !UNITY_2018_3_OR_NEWER occlusionCullingType = GPUIOcclusionCullingType.Default; #endif }
private GPUInstancerTerrainSettings GenerateTerrainSettings(Terrain terrain, GameObject gameObject) { #if UNITY_EDITOR if (!Application.isPlaying) { string[] guids = AssetDatabase.FindAssets("t:GPUInstancerTerrainSettings"); for (int i = 0; i < guids.Length; i++) { GPUInstancerTerrainSettings ts = AssetDatabase.LoadAssetAtPath <GPUInstancerTerrainSettings>(AssetDatabase.GUIDToAssetPath(guids[i])); if (ts != null && ts.terrainDataInstanceID == terrain.terrainData.GetInstanceID()) { prototypeList.Clear(); if (this is GPUInstancerDetailManager) { GPUInstancerUtility.SetPrototypeListFromAssets(ts, prototypeList, typeof(GPUInstancerDetailPrototype)); } return(ts); } } } #endif GPUInstancerTerrainSettings terrainSettings = ScriptableObject.CreateInstance <GPUInstancerTerrainSettings>(); terrainSettings.name = (string.IsNullOrEmpty(terrain.terrainData.name) ? terrain.gameObject.name : terrain.terrainData.name) + "_" + terrain.terrainData.GetInstanceID(); terrainSettings.terrainDataInstanceID = terrain.terrainData.GetInstanceID(); terrainSettings.maxDetailDistance = terrain.detailObjectDistance; terrainSettings.maxTreeDistance = terrain.treeDistance; terrainSettings.detailDensity = terrain.detailObjectDensity; terrainSettings.healthyDryNoiseTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_HEALTHY_DRY_NOISE); terrainSettings.windWaveNormalTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_WIND_WAVE_NOISE); #if UNITY_EDITOR if (!Application.isPlaying) { string assetPath = GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH + terrainSettings.name + ".asset"; if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH); } AssetDatabase.CreateAsset(terrainSettings, assetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif return(terrainSettings); }
public static ShaderVariantCollection GetDefaultShaderVariantCollection() { ShaderVariantCollection shaderVariantCollection = Resources.Load <ShaderVariantCollection>(GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.SHADER_VARIANT_COLLECTION_DEFAULT_NAME); if (shaderVariantCollection == null) { shaderVariantCollection = new ShaderVariantCollection(); #if UNITY_EDITOR if (!Application.isPlaying) { if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH); } AssetDatabase.CreateAsset(shaderVariantCollection, GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.SHADER_VARIANT_COLLECTION_DEFAULT_NAME + ".shadervariants"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif } return(shaderVariantCollection); }
public static GPUInstancerSettings GetDefaultGPUInstancerSettings() { GPUInstancerSettings gpuiSettings = Resources.Load <GPUInstancerSettings>(GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.GPUI_SETTINGS_DEFAULT_NAME); if (gpuiSettings == null) { gpuiSettings = ScriptableObject.CreateInstance <GPUInstancerSettings>(); #if UNITY_EDITOR if (!Application.isPlaying) { if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH); } AssetDatabase.CreateAsset(gpuiSettings, GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.RESOURCES_PATH + GPUInstancerConstants.SETTINGS_PATH + GPUInstancerConstants.GPUI_SETTINGS_DEFAULT_NAME + ".asset"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif } gpuiSettings.SetDefultBindings(); return(gpuiSettings); }
public virtual void Awake() { if (GPUInstancerConstants.gpuiSettings == null) { GPUInstancerConstants.gpuiSettings = GPUInstancerSettings.GetDefaultGPUInstancerSettings(); } GPUInstancerConstants.gpuiSettings.SetDefultBindings(); GPUInstancerUtility.SetPlatformDependentVariables(); #if UNITY_EDITOR if (!Application.isPlaying) { CheckPrototypeChanges(); } #endif if (Application.isPlaying && activeManagerList == null) { activeManagerList = new List <GPUInstancerManager>(); } if (SystemInfo.supportsComputeShaders) { if (_visibilityComputeShader == null) { switch (GPUInstancerUtility.matrixHandlingType) { case GPUIMatrixHandlingType.MatrixAppend: _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH_VULKAN); GPUInstancerConstants.DETAIL_STORE_INSTANCE_DATA = true; GPUInstancerConstants.COMPUTE_MAX_LOD_BUFFER = 3; break; case GPUIMatrixHandlingType.CopyToTexture: _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH); _bufferToTextureComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.BUFFER_TO_TEXTURE_COMPUTE_RESOURCE_PATH); _bufferToTextureComputeKernelID = _bufferToTextureComputeShader.FindKernel(GPUInstancerConstants.BUFFER_TO_TEXTURE_KERNEL); break; default: _visibilityComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.VISIBILITY_COMPUTE_RESOURCE_PATH); break; } _instanceVisibilityComputeKernelIDs = new int[GPUInstancerConstants.VISIBILITY_COMPUTE_KERNELS.Length]; for (int i = 0; i < _instanceVisibilityComputeKernelIDs.Length; i++) { _instanceVisibilityComputeKernelIDs[i] = _visibilityComputeShader.FindKernel(GPUInstancerConstants.VISIBILITY_COMPUTE_KERNELS[i]); } GPUInstancerConstants.TEXTURE_MAX_SIZE = SystemInfo.maxTextureSize; _cameraComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.CAMERA_COMPUTE_RESOURCE_PATH); #if UNITY_2017_2_OR_NEWER if (isOcclusionCulling && UnityEngine.XR.XRSettings.enabled && GPUInstancerConstants.gpuiSettings.testBothEyesForVROcclusion) #else if (isOcclusionCulling && UnityEngine.VR.VRSettings.enabled && GPUInstancerConstants.gpuiSettings.testBothEyesForVROcclusion) #endif { _cameraComputeShader = (ComputeShader)Resources.Load(GPUInstancerConstants.CAMERA_VR_COMPUTE_RESOURCE_PATH); } _cameraComputeKernelIDs = new int[GPUInstancerConstants.CAMERA_COMPUTE_KERNELS.Length]; for (int i = 0; i < _cameraComputeKernelIDs.Length; i++) { _cameraComputeKernelIDs[i] = _cameraComputeShader.FindKernel(GPUInstancerConstants.CAMERA_COMPUTE_KERNELS[i]); } } GPUInstancerConstants.SetupComputeRuntimeModification(); GPUInstancerConstants.SetupComputeSetDataPartial(); } else if (Application.isPlaying) { Debug.LogError("Target Graphics API does not support Compute Shaders. Please refer to Minimum Requirements on GPUInstancer/ReadMe.txt for detailed information."); this.enabled = false; } showRenderedAmount = false; InitializeCameraData(); #if UNITY_EDITOR && UNITY_2017_2_OR_NEWER EditorApplication.playModeStateChanged -= HandlePlayModeStateChanged; EditorApplication.playModeStateChanged += HandlePlayModeStateChanged; #endif }
private GPUInstancerTerrainSettings GenerateTerrainSettings(Terrain terrain, GameObject gameObject) { #if UNITY_EDITOR if (!Application.isPlaying) { string[] guids = AssetDatabase.FindAssets("t:GPUInstancerTerrainSettings"); string guid = GPUInstancerUtility.GetAssetGUID(terrain.terrainData); for (int i = 0; i < guids.Length; i++) { GPUInstancerTerrainSettings ts = AssetDatabase.LoadAssetAtPath <GPUInstancerTerrainSettings>(AssetDatabase.GUIDToAssetPath(guids[i])); if (ts != null && !string.IsNullOrEmpty(guid) && ts.terrainDataGUID == guid) { prototypeList.Clear(); if (this is GPUInstancerDetailManager) { List <GPUInstancerPrototype> detailPrototypeList = new List <GPUInstancerPrototype>(); GPUInstancerUtility.SetPrototypeListFromAssets(ts, detailPrototypeList, typeof(GPUInstancerDetailPrototype)); for (int p = 0; p < detailPrototypeList.Count; p++) { foreach (GPUInstancerDetailPrototype detailPrototype in detailPrototypeList) { if (detailPrototype.prototypeIndex == p) { prototypeList.Add(detailPrototype); break; } } } } if (this is GPUInstancerTreeManager) { List <GPUInstancerPrototype> treePrototypeList = new List <GPUInstancerPrototype>(); GPUInstancerUtility.SetPrototypeListFromAssets(ts, treePrototypeList, typeof(GPUInstancerTreePrototype)); for (int p = 0; p < treePrototypeList.Count; p++) { foreach (GPUInstancerTreePrototype treePrototype in treePrototypeList) { if (treePrototype.prototypeIndex == p) { prototypeList.Add(treePrototype); break; } } } } return(ts); } } } #endif GPUInstancerTerrainSettings terrainSettings = ScriptableObject.CreateInstance <GPUInstancerTerrainSettings>(); terrainSettings.name = (string.IsNullOrEmpty(terrain.terrainData.name) ? terrain.gameObject.name : terrain.terrainData.name) + "_" + terrain.terrainData.GetInstanceID(); terrainSettings.terrainDataGUID = GPUInstancerUtility.GetAssetGUID(terrain.terrainData); terrainSettings.maxDetailDistance = terrain.detailObjectDistance; terrainSettings.maxTreeDistance = terrain.treeDistance; terrainSettings.detailDensity = terrain.detailObjectDensity; terrainSettings.healthyDryNoiseTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_HEALTHY_DRY_NOISE); terrainSettings.windWaveNormalTexture = Resources.Load <Texture2D>(GPUInstancerConstants.NOISE_TEXTURES_PATH + GPUInstancerConstants.DEFAULT_WIND_WAVE_NOISE); #if UNITY_EDITOR if (!Application.isPlaying) { string assetPath = GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH + terrainSettings.name + ".asset"; // If there is already a file with the same name, change file name int counter = 2; while (System.IO.File.Exists(assetPath)) { assetPath = GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH + terrainSettings.name + "_" + counter + ".asset"; counter++; } if (!System.IO.Directory.Exists(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH)) { System.IO.Directory.CreateDirectory(GPUInstancerConstants.GetDefaultPath() + GPUInstancerConstants.PROTOTYPES_TERRAIN_PATH); } AssetDatabase.CreateAsset(terrainSettings, assetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } #endif return(terrainSettings); }