using System.IO; using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Experimental.Rendering.HDPipeline; namespace UnityEditor.Experimental.Rendering.HDPipeline { using UnityObject = UnityEngine.Object; static class HDAssetFactory { static string s_RenderPipelineResourcesPath { get { return HDEditorUtils.GetHDRenderPipelinePath() + "RenderPipelineResources/HDRenderPipelineResources.asset"; } } static string s_DefaultMaterialPath { get { return HDEditorUtils.GetHDRenderPipelinePath() + "RenderPipelineResources/DefaultHDMaterial.mat"; } } static string s_DefaultShaderPath { get { return HDEditorUtils.GetHDRenderPipelinePath() + "Material/Lit/Lit.shader"; } } class DoCreateNewAssetHDRenderPipeline : ProjectWindowCallback.EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { var newAsset = CreateInstance(); newAsset.name = Path.GetFileName(pathName); // Load default renderPipelineResources / Material / Shader newAsset.renderPipelineResources = AssetDatabase.LoadAssetAtPath(s_RenderPipelineResourcesPath); newAsset.defaultDiffuseMaterial = AssetDatabase.LoadAssetAtPath(s_DefaultMaterialPath); newAsset.defaultShader = AssetDatabase.LoadAssetAtPath(s_DefaultShaderPath); AssetDatabase.CreateAsset(newAsset, pathName); ProjectWindowUtil.ShowCreatedAsset(newAsset); } } [MenuItem("Assets/Create/Render Pipeline/High Definition/Render Pipeline", priority = CoreUtils.assetCreateMenuPriority1)] static void CreateHDRenderPipeline() { var icon = EditorGUIUtility.FindTexture("ScriptableObject Icon"); ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), "New HDRenderPipelineAsset.asset", icon, null); } // Note: move this to a static using once we can target C#6+ static T Load(string path) where T : UnityObject { return AssetDatabase.LoadAssetAtPath(path); } class DoCreateNewAssetHDRenderPipelineResources : ProjectWindowCallback.EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { var newAsset = CreateInstance(); newAsset.name = Path.GetFileName(pathName); // Load default renderPipelineResources / Material / Shader string HDRenderPipelinePath = HDEditorUtils.GetHDRenderPipelinePath(); string PostProcessingPath = HDEditorUtils.GetPostProcessingPath(); string CorePath = HDEditorUtils.GetCorePath(); newAsset.debugDisplayLatlongShader = Load(HDRenderPipelinePath + "Debug/DebugDisplayLatlong.Shader"); newAsset.debugViewMaterialGBufferShader = Load(HDRenderPipelinePath + "Debug/DebugViewMaterialGBuffer.Shader"); newAsset.debugViewTilesShader = Load(HDRenderPipelinePath + "Debug/DebugViewTiles.Shader"); newAsset.debugFullScreenShader = Load(HDRenderPipelinePath + "Debug/DebugFullScreen.Shader"); newAsset.deferredShader = Load(HDRenderPipelinePath + "Lighting/Deferred.Shader"); newAsset.subsurfaceScatteringCS = Load(HDRenderPipelinePath + "Material/Lit/Resources/SubsurfaceScattering.compute"); newAsset.gaussianPyramidCS = Load(PostProcessingPath + "Shaders/Builtins/GaussianDownsample.compute"); newAsset.depthPyramidCS = Load(HDRenderPipelinePath + "RenderPipelineResources/DepthDownsample.compute"); newAsset.copyChannelCS = Load(CorePath + "Resources/GPUCopy.compute"); newAsset.applyDistortionCS = Load(HDRenderPipelinePath + "RenderPipelineResources/ApplyDistorsion.compute"); newAsset.clearDispatchIndirectShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/cleardispatchindirect.compute"); newAsset.buildDispatchIndirectShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/builddispatchindirect.compute"); newAsset.buildScreenAABBShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/scrbound.compute"); newAsset.buildPerTileLightListShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/lightlistbuild.compute"); newAsset.buildPerBigTileLightListShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/lightlistbuild-bigtile.compute"); newAsset.buildPerVoxelLightListShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/lightlistbuild-clustered.compute"); newAsset.buildMaterialFlagsShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/materialflags.compute"); newAsset.deferredComputeShader = Load(HDRenderPipelinePath + "Lighting/LightLoop/Deferred.compute"); newAsset.deferredDirectionalShadowComputeShader = Load(HDRenderPipelinePath + "Lighting/DeferredDirectionalShadow.compute"); // SceneSettings // These shaders don't need to be reference by RenderPipelineResource as they are not use at runtime (only to draw in editor) // instance.drawSssProfile = UnityEditor.AssetDatabase.LoadAssetAtPath(HDRenderPipelinePath + "SceneSettings/DrawSssProfile.shader"); // instance.drawTransmittanceGraphShader = UnityEditor.AssetDatabase.LoadAssetAtPath(HDRenderPipelinePath + "SceneSettings/DrawTransmittanceGraph.shader"); newAsset.cameraMotionVectors = Load(HDRenderPipelinePath + "RenderPipelineResources/CameraMotionVectors.shader"); // Sky newAsset.blitCubemap = Load(HDRenderPipelinePath + "Sky/BlitCubemap.shader"); newAsset.buildProbabilityTables = Load(HDRenderPipelinePath + "Material/GGXConvolution/BuildProbabilityTables.compute"); newAsset.computeGgxIblSampleData = Load(HDRenderPipelinePath + "Material/GGXConvolution/ComputeGgxIblSampleData.compute"); newAsset.GGXConvolve = Load(HDRenderPipelinePath + "Material/GGXConvolution/GGXConvolve.shader"); newAsset.opaqueAtmosphericScattering = Load(HDRenderPipelinePath + "Sky/OpaqueAtmosphericScattering.shader"); newAsset.encodeBC6HCS = Load(CorePath + "Resources/EncodeBC6H.compute"); // Skybox/Cubemap is a builtin shader, must use Sahder.Find to access it. It is fine because we are in the editor newAsset.skyboxCubemap = Shader.Find("Skybox/Cubemap"); AssetDatabase.CreateAsset(newAsset, pathName); ProjectWindowUtil.ShowCreatedAsset(newAsset); } } [MenuItem("Assets/Create/Render Pipeline/High Definition/Render Pipeline Resources", priority = CoreUtils.assetCreateMenuPriority1)] static void CreateRenderPipelineResources() { var icon = EditorGUIUtility.FindTexture("ScriptableObject Icon"); ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), "New HDRenderPipelineResources.asset", icon, null); } } }