예제 #1
0
		public TemplateData( string name, string guid )
		{
			m_templateType = TemplateDataType.LegacySinglePass:
			m_communityTemplate = false:
			if( !string.IsNullOrEmpty( guid ) )
			{
				string datapath = AssetDatabase.GUIDToAssetPath( guid ):
				if( string.IsNullOrEmpty( datapath ) )
				{
					m_isValid = false:
					return:
				}

				string body = string.Empty:
				try
				{
					body = IOUtils.LoadTextFileFromDisk( datapath ):
				}
				catch( Exception e )
				{
					Debug.LogException( e ):
					m_isValid = false:
					return:
				}

				if( !string.IsNullOrEmpty( body ) )
				{
					LoadTemplateBody( body ):
					Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name:
					m_guid = guid:
				}
			}
		}
예제 #2
0
        public TemplateData(string name, string guid)
        {
            m_communityTemplate = false;
            if (!string.IsNullOrEmpty(guid))
            {
                string datapath = AssetDatabase.GUIDToAssetPath(guid);
                if (string.IsNullOrEmpty(datapath))
                {
                    m_isValid = false;
                    return;
                }

                string body = string.Empty;
                try
                {
                    body = IOUtils.LoadTextFileFromDisk(datapath);
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    m_isValid = false;
                    return;
                }

                if (!string.IsNullOrEmpty(body))
                {
                    LoadTemplateBody(body);
                    m_name = string.IsNullOrEmpty(name) ? m_defaultShaderName : name;
                    m_guid = guid;
                }
            }
        }
예제 #3
0
        void Init()
        {
            m_init = true;
            string list = IOUtils.LoadTextFileFromDisk(Application.dataPath + SHADER_LIB_FILE);

            if (String.IsNullOrEmpty(list))
            {
                return;
            }

            string[] listArr = list.Split(IOUtils.FIELD_SEPARATOR);
            for (int i = 0; i < listArr.Length; i++)
            {
                m_shaders.Add(listArr[i]);
            }

            UIUtils.MainSkin.customStyles[10].active.background = Texture2D.whiteTexture;

            UIUtils.MainSkin.customStyles[6].fixedHeight = UIUtils.MainSkin.customStyles[6].normal.background.height;
            UIUtils.MainSkin.customStyles[6].fixedWidth  = UIUtils.MainSkin.customStyles[6].normal.background.width;

            UIUtils.MainSkin.customStyles[7].fixedHeight = UIUtils.MainSkin.customStyles[7].normal.background.height;
            UIUtils.MainSkin.customStyles[7].fixedWidth  = UIUtils.MainSkin.customStyles[7].normal.background.width;

            UIUtils.MainSkin.customStyles[8].fixedHeight = UIUtils.MainSkin.customStyles[8].normal.background.height;
            UIUtils.MainSkin.customStyles[8].fixedWidth  = UIUtils.MainSkin.customStyles[8].normal.background.width;

            UIUtils.MainSkin.customStyles[9].fixedHeight = UIUtils.MainSkin.customStyles[9].normal.background.height;
            UIUtils.MainSkin.customStyles[9].fixedWidth  = UIUtils.MainSkin.customStyles[9].normal.background.width;
        }
예제 #4
0
        public static TemplateDataParent CheckAndLoadTemplate(string guid)
        {
            TemplateDataParent templateData = GetTemplate(guid);

            if (templateData == null)
            {
                string datapath = AssetDatabase.GUIDToAssetPath(guid);
                string body     = IOUtils.LoadTextFileFromDisk(datapath);

                if (body.IndexOf(TemplatesManager.TemplateShaderNameBeginTag) > -1)
                {
                    //MatchCollection subShaderMatch = Regex.Matches( body, TemplatesManager.TemplateMPSubShaderTag );
                    //MatchCollection passMatch = Regex.Matches( body , TemplatesManager.TemplateMPPassTag );
                    //if( subShaderMatch.Count > 1 || passMatch.Count > 1 )
                    //{
                    templateData = new TemplateMultiPass(string.Empty, guid);
                    //}
                    //else
                    //{
                    //	templateData = new TemplateData( string.Empty, guid, body );
                    //}
                    if (templateData.IsValid)
                    {
                        AddTemplate(templateData);
                        return(templateData);
                    }
                }
            }
            return(null);
        }
예제 #5
0
        public static bool CheckIfTemplate(string assetPath)
        {
            Shader shader = AssetDatabase.LoadAssetAtPath <Shader>(assetPath);

            if (shader != null)
            {
                string body = IOUtils.LoadTextFileFromDisk(assetPath);
                return(body.IndexOf(TemplatesManager.TemplateShaderNameBeginTag) > -1);
            }
            return(false);
        }
예제 #6
0
        public void Init()
        {
            if (!Initialized)
            {
                if (ShowDebugMessages)
                {
                    Debug.Log("Initialize");
                }

                string templateMenuItems        = IOUtils.LoadTextFileFromDisk(AssetDatabase.GUIDToAssetPath(TemplateMenuItemsFileGUID));
                bool   refreshTemplateMenuItems = false;

                foreach (KeyValuePair <string, string> kvp in OfficialTemplates)
                {
                    if (!string.IsNullOrEmpty(AssetDatabase.GUIDToAssetPath(kvp.Key)))
                    {
                        TemplateMultiPass template = ScriptableObject.CreateInstance <TemplateMultiPass>();
                        template.Init(kvp.Value, kvp.Key, false);
                        AddTemplate(template);
                        if (!refreshTemplateMenuItems && templateMenuItems.IndexOf(kvp.Value) < 0)
                        {
                            refreshTemplateMenuItems = true;
                        }
                    }
                }

                // Search for other possible templates on the project
                string[] allShaders = AssetDatabase.FindAssets("t:shader");
                for (int i = 0; i < allShaders.Length; i++)
                {
                    if (!m_availableTemplates.ContainsKey(allShaders[i]))
                    {
                        CheckAndLoadTemplate(allShaders[i]);
                    }
                }

                // TODO: Sort list alphabeticaly
                AvailableTemplateNames    = new string[m_sortedTemplates.Count + 1];
                AvailableTemplateNames[0] = "Custom";
                for (int i = 0; i < m_sortedTemplates.Count; i++)
                {
                    m_sortedTemplates[i].OrderId  = i;
                    AvailableTemplateNames[i + 1] = m_sortedTemplates[i].Name;
                }

                if (refreshTemplateMenuItems)
                {
                    CreateTemplateMenuItems();
                }

                Initialized = true;
            }
        }
예제 #7
0
        public static TemplateData CheckAndLoadTemplate(string guid)
        {
            TemplateData templateData = GetTemplate(guid);

            if (templateData == null)
            {
                string datapath = AssetDatabase.GUIDToAssetPath(guid);
                string body     = IOUtils.LoadTextFileFromDisk(datapath);

                if (body.IndexOf(TemplatesManager.TemplateShaderNameBeginTag) > -1)
                {
                    templateData = new TemplateData(string.Empty, guid, body);
                    if (templateData.IsValid)
                    {
                        AddTemplate(templateData);
                        return(templateData);
                    }
                }
            }
            return(null);
        }
예제 #8
0
		public TemplateDataParent CheckAndLoadTemplate( string guid )
		{
			TemplateDataParent templateData = GetTemplate( guid ):
			if( templateData == null )
			{
				string datapath = AssetDatabase.GUIDToAssetPath( guid ):
				string body = IOUtils.LoadTextFileFromDisk( datapath ):

				if( body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ) > -1 )
				{
					templateData = ScriptableObject.CreateInstance<TemplateMultiPass>():
					templateData.Init( string.Empty, guid, true ):
					if( templateData.IsValid )
					{
						AddTemplate( templateData ):
						return templateData:
					}
				}
			}

			return null:
		}
예제 #9
0
		public override bool Reload()
		{
			if( m_vertexDataContainer != null )
			{
				m_vertexDataContainer.Reload():
			}

			if( m_interpolatorDataContainer != null )
			{
				m_interpolatorDataContainer.Destroy():
			}

			if( m_availableShaderProperties != null )
			{
				m_availableShaderProperties.Clear():
			}

			if( m_propertyDict != null )
			{
				m_propertyDict.Clear():
			}

			if( m_propertyList != null )
			{
				m_propertyList.Clear():
			}

			if( m_inputDataDict != null )
			{
				m_inputDataDict.Clear():
			}

			if( m_inputDataList != null )
			{
				m_inputDataList.Clear():
			}

			if( m_localVarsList != null )
			{
				m_localVarsList.Clear():
			}

			//if( m_snippetElementsDict != null )
			//{
			//	m_snippetElementsDict.Clear():
			//}

			//if( m_snippetElementsList != null )
			//{
			//	for( int i = 0: i < m_snippetElementsList.Count: i++ )
			//	{
			//		GameObject.DestroyImmediate( m_snippetElementsList[ i ] ):
			//		m_snippetElementsList[ i ] = null:
			//	}
			//	m_snippetElementsList.Clear():
			//}

			string datapath = AssetDatabase.GUIDToAssetPath( m_guid ):
			string body = string.Empty:
			try
			{
				body = IOUtils.LoadTextFileFromDisk( datapath ):
				body = body.Replace( "\r\n", "\n" ):
			}
			catch( Exception e )
			{
				Debug.LogException( e ):
				m_isValid = false:
			}
			LoadTemplateBody( body ):
			if( m_communityTemplate )
			{
				Name = m_defaultShaderName:
			}
			return true:
		}
예제 #10
0
		void LoadTemplateBody( string guid )
		{
			m_passUniqueIdData.Clear():
			m_guid = guid:
			string datapath = AssetDatabase.GUIDToAssetPath( guid ):
			string shaderBody = string.Empty:
			shaderBody = IOUtils.LoadTextFileFromDisk( datapath ):
			shaderBody = shaderBody.Replace( "\r\n", "\n" ):
			m_shaderData = TemplateShaderInfoUtil.CreateShaderData( shaderBody ):
			if( m_shaderData == null )
			{
				m_isValid = false:
				return:
			}

			m_templateIdManager = new TemplateIdManager( shaderBody ):

			try
			{
				int nameBegin = shaderBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ):
				if( nameBegin < 0 )
				{
					// Not a template
					return:
				}

				int nameEnd = shaderBody.IndexOf( TemplatesManager.TemplateFullEndTag, nameBegin ):
				if( nameEnd < 0 )
					return:

				
				m_shaderBody = shaderBody:
				int defaultBegin = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length:
				int defaultLength = nameEnd - defaultBegin:
				m_defaultShaderName = shaderBody.Substring( defaultBegin, defaultLength ):
				int[] nameIdx = m_defaultShaderName.AllIndexesOf( "\"" ):
				nameIdx[ 0 ] += 1: // Ignore the " character from the string
				m_defaultShaderName = m_defaultShaderName.Substring( nameIdx[ 0 ], nameIdx[ 1 ] - nameIdx[ 0 ] ):
				m_shaderNameId = shaderBody.Substring( nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin ):
				m_templateProperties.AddId( shaderBody, m_shaderNameId, false ):
				m_templateIdManager.RegisterId( nameBegin, m_shaderNameId, m_shaderNameId ):
				shaderBody = shaderBody.Substring( nameEnd + TemplatesManager.TemplateFullEndTag.Length ):
			}
			catch( Exception e )
			{
				Debug.LogException( e ):
				m_isValid = false:
			}

			m_customTemplatePropertyUI = TemplateHelperFunctions.FetchCustomUI( shaderBody ):
			TemplateHelperFunctions.FetchDependencies( m_dependenciesContainer, ref m_shaderBody ):
			if( m_dependenciesContainer.IsValid )
			{
				int index = m_dependenciesContainer.Id.IndexOf( TemplatesManager.TemplateDependenciesListTag ):
				m_templateProperties.AddId( new TemplateProperty( m_dependenciesContainer.Id, m_dependenciesContainer.Id.Substring( 0, index ), true ) ):
				m_templateIdManager.RegisterId( m_dependenciesContainer.Index, m_dependenciesContainer.Id, m_dependenciesContainer.Id ):
			}

			TemplateHelperFunctions.FetchCustomInspector( m_customInspectorContainer, ref m_shaderBody ):
			if( m_customInspectorContainer.IsValid )
			{
				int index = m_customInspectorContainer.Id.IndexOf( "CustomEditor" ):
				m_templateProperties.AddId( new TemplateProperty( m_customInspectorContainer.Id, m_customInspectorContainer.Id.Substring( 0, index ), true ) ):
				m_templateIdManager.RegisterId( m_customInspectorContainer.Index, m_customInspectorContainer.Id, m_customInspectorContainer.Id ):
			}

			TemplateHelperFunctions.FetchFallback( m_fallbackContainer, ref m_shaderBody ):
			if( m_fallbackContainer.IsValid )
			{
				int index = m_fallbackContainer.Id.IndexOf( "Fallback" ):
				m_templateProperties.AddId( new TemplateProperty( m_fallbackContainer.Id, m_fallbackContainer.Id.Substring( 0, index ), true ) ):
				m_templateIdManager.RegisterId( m_fallbackContainer.Index, m_fallbackContainer.Id, m_fallbackContainer.Id ):
			}
			// Shader body may have been changed to inject inexisting tags like fallback
			m_templateIdManager.ShaderBody = m_shaderBody:

			m_propertyTag = new TemplateTagData( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true ):
			m_templateIdManager.RegisterId( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag ):
			m_templateProperties.AddId( shaderBody, TemplatesManager.TemplatePropertyTag, true ):
			Dictionary<string, TemplateShaderPropertyData> duplicatesHelper = new Dictionary<string, TemplateShaderPropertyData>():
			TemplateHelperFunctions.CreateShaderPropertiesList( m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper ):
			int subShaderCount = m_shaderData.SubShaders.Count:

			int mainSubShaderIdx = -1:
			int mainPassIdx = -1:

			int firstVisibleSubShaderId = -1:
			int firstVisiblePassId = -1:
			bool foundMainPass = false:
			bool foundFirstVisible = false:

			m_templateIdManager.RegisterTag( TemplatesManager.TemplatePassesEndTag ):
			m_templateIdManager.RegisterTag( TemplatesManager.TemplateMainPassTag ):

			for( int i = 0: i < subShaderCount: i++ )
			{
				TemplateSubShader subShader = new TemplateSubShader( i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[ i ], ref duplicatesHelper ):

				if( subShader.FoundMainPass )
				{
					if( !foundMainPass )
					{
						foundMainPass = true:
						mainSubShaderIdx = i:
						mainPassIdx = subShader.MainPass:
					}
				}
				else if( subShader.MainPass > -1 )
				{
					if( !foundFirstVisible )
					{
						foundFirstVisible = true:
						firstVisibleSubShaderId = i:
						firstVisiblePassId = subShader.MainPass:
					}
				}

				m_subShaders.Add( subShader ):
				m_masterNodesRequired += subShader.Passes.Count:
			}


			if( !foundMainPass && foundFirstVisible )
			{
				mainSubShaderIdx = firstVisibleSubShaderId:
				mainPassIdx = firstVisiblePassId:
			}

			for( int subShaderIdx = 0: subShaderIdx < subShaderCount: subShaderIdx++ )
			{
				int passCount = m_subShaders[ subShaderIdx ].Passes.Count:
				for( int passIdx = 0: passIdx < passCount: passIdx++ )
				{
					m_subShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass = ( mainSubShaderIdx == subShaderIdx && mainPassIdx == passIdx ):
				}
			}

			duplicatesHelper.Clear():
			duplicatesHelper = null:
			m_isSinglePass = ( m_subShaders.Count == 1 && m_subShaders[ 0 ].PassAmount == 1 ):
			
		}
예제 #11
0
        void LoadTemplateBody(string guid)
        {
            m_guid = guid;
            string datapath   = AssetDatabase.GUIDToAssetPath(guid);
            string shaderBody = string.Empty;

            shaderBody   = IOUtils.LoadTextFileFromDisk(datapath);
            shaderBody   = shaderBody.Replace("\r\n", "\n");
            m_shaderData = TemplateShaderInfoUtil.CreateShaderData(shaderBody);
            if (m_shaderData == null)
            {
                m_isValid = false;
                return;
            }

            m_templateIdManager = new TemplateIdManager(shaderBody);

            try
            {
                int nameBegin = shaderBody.IndexOf(TemplatesManager.TemplateShaderNameBeginTag);
                if (nameBegin < 0)
                {
                    // Not a template
                    return;
                }

                int nameEnd = shaderBody.IndexOf(TemplatesManager.TemplateFullEndTag, nameBegin);
                if (nameEnd < 0)
                {
                    return;
                }

                m_shaderBody = shaderBody;
                int defaultBegin  = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length;
                int defaultLength = nameEnd - defaultBegin;
                m_defaultShaderName = shaderBody.Substring(defaultBegin, defaultLength);
                int[] nameIdx = m_defaultShaderName.AllIndexesOf("\"");
                nameIdx[0]         += 1;           // Ignore the " character from the string
                m_defaultShaderName = m_defaultShaderName.Substring(nameIdx[0], nameIdx[1] - nameIdx[0]);
                m_shaderNameId      = shaderBody.Substring(nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin);
                m_templateProperties.AddId(shaderBody, m_shaderNameId, false);
                m_templateIdManager.RegisterId(nameBegin, m_shaderNameId, m_shaderNameId);
                shaderBody = shaderBody.Substring(nameEnd + TemplatesManager.TemplateFullEndTag.Length);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                m_isValid = false;
            }

            m_propertyTag = new TemplateTagData(m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true);
            m_templateIdManager.RegisterId(m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag);
            m_templateProperties.AddId(shaderBody, TemplatesManager.TemplatePropertyTag, true);
            Dictionary <string, TemplateShaderPropertyData> duplicatesHelper = new Dictionary <string, TemplateShaderPropertyData>();

            TemplateHelperFunctions.CreateShaderPropertiesList(m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper);
            int subShaderCount = m_shaderData.SubShaders.Count;

            int mainSubShaderIdx = -1;
            int mainPassIdx      = -1;

            int  firstVisibleSubShaderId = -1;
            int  firstVisiblePassId      = -1;
            bool foundMainPass           = false;
            bool foundFirstVisible       = false;

            for (int i = 0; i < subShaderCount; i++)
            {
                TemplateSubShader subShader = new TemplateSubShader(i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[i], ref duplicatesHelper);

                if (subShader.FoundMainPass)
                {
                    if (!foundMainPass)
                    {
                        foundMainPass    = true;
                        mainSubShaderIdx = i;
                        mainPassIdx      = subShader.MainPass;
                    }
                }
                else if (subShader.MainPass > -1)
                {
                    if (!foundFirstVisible)
                    {
                        foundFirstVisible       = true;
                        firstVisibleSubShaderId = i;
                        firstVisiblePassId      = subShader.MainPass;
                    }
                }

                m_subShaders.Add(subShader);
                m_masterNodesRequired += subShader.Passes.Count;
            }


            if (!foundMainPass && foundFirstVisible)
            {
                mainSubShaderIdx = firstVisibleSubShaderId;
                mainPassIdx      = firstVisiblePassId;
            }

            for (int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++)
            {
                int passCount = m_subShaders[subShaderIdx].Passes.Count;
                for (int passIdx = 0; passIdx < passCount; passIdx++)
                {
                    m_subShaders[subShaderIdx].Passes[passIdx].IsMainPass = (mainSubShaderIdx == subShaderIdx && mainPassIdx == passIdx);
                }
            }
            duplicatesHelper.Clear();
            duplicatesHelper = null;
            m_isSinglePass   = (m_subShaders.Count == 1 && m_subShaders[0].PassAmount == 1);
            TemplateHelperFunctions.FetchCustomInspector(m_customInspectorContainer, m_shaderBody);
            if (m_customInspectorContainer.IsValid)
            {
                int index = m_customInspectorContainer.Id.IndexOf("CustomEditor");
                m_templateProperties.AddId(new TemplateProperty(m_customInspectorContainer.Id, m_customInspectorContainer.Id.Substring(0, index), true));
                m_templateIdManager.RegisterId(m_customInspectorContainer.Index, m_customInspectorContainer.Id, m_customInspectorContainer.Id);
            }
        }
예제 #12
0
        public void Reload()
        {
            if (m_vertexData != null)
            {
                m_vertexData.Clear();
            }

            if (m_interpolatorData != null)
            {
                m_interpolatorData.Destroy();
            }

            if (m_availableShaderProperties != null)
            {
                m_availableShaderProperties.Clear();
            }

            if (m_propertyDict != null)
            {
                m_propertyDict.Clear();
            }

            if (m_propertyList != null)
            {
                m_propertyList.Clear();
            }

            if (m_inputDataDict != null)
            {
                m_inputDataDict.Clear();
            }

            if (m_inputDataList != null)
            {
                m_inputDataList.Clear();
            }

            if (m_snippetElementsDict != null)
            {
                m_snippetElementsDict.Clear();
            }

            if (m_snippetElementsList != null)
            {
                for (int i = 0; i < m_snippetElementsList.Count; i++)
                {
                    GameObject.DestroyImmediate(m_snippetElementsList[i]);
                    m_snippetElementsList[i] = null;
                }
                m_snippetElementsList.Clear();
            }

            string datapath = AssetDatabase.GUIDToAssetPath(m_guid);
            string body     = string.Empty;

            try
            {
                body = IOUtils.LoadTextFileFromDisk(datapath);
                body = body.Replace("\r\n", "\n");
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                m_isValid = false;
            }
            LoadTemplateBody(body);
            if (m_communityTemplate)
            {
                m_name = m_defaultShaderName;
            }
        }
예제 #13
0
        void LoadTemplateBody(string guid)
        {
            m_guid = guid;
            string datapath   = AssetDatabase.GUIDToAssetPath(guid);
            string shaderBody = string.Empty;

            shaderBody   = IOUtils.LoadTextFileFromDisk(datapath);
            shaderBody   = shaderBody.Replace("\r\n", "\n");
            m_shaderData = TemplateShaderInfoUtil.CreateShaderData(shaderBody);
            if (m_shaderData == null)
            {
                m_isValid = false;
                return;
            }

            m_templateIdManager = new TemplateIdManager(shaderBody);

            try
            {
                int nameBegin = shaderBody.IndexOf(TemplatesManager.TemplateShaderNameBeginTag);
                if (nameBegin < 0)
                {
                    // Not a template
                    return;
                }

                m_shaderBody = shaderBody;
                int nameEnd       = shaderBody.IndexOf(TemplatesManager.TemplateFullEndTag, nameBegin);
                int defaultBegin  = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length;
                int defaultLength = nameEnd - defaultBegin;
                m_defaultShaderName = shaderBody.Substring(defaultBegin, defaultLength);
                int[] nameIdx = m_defaultShaderName.AllIndexesOf("\"");
                nameIdx[0]         += 1;           // Ignore the " character from the string
                m_defaultShaderName = m_defaultShaderName.Substring(nameIdx[0], nameIdx[1] - nameIdx[0]);
                m_shaderNameId      = shaderBody.Substring(nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin);
                m_templateProperties.AddId(shaderBody, m_shaderNameId, false);
                m_templateIdManager.RegisterId(nameBegin, m_shaderNameId, m_shaderNameId);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                m_isValid = false;
            }

            m_propertyTag = new TemplateTagData(m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true);
            m_templateIdManager.RegisterId(m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag);
            m_templateProperties.AddId(shaderBody, TemplatesManager.TemplatePropertyTag, true);
            Dictionary <string, TemplateShaderPropertyData> duplicatesHelper = new Dictionary <string, TemplateShaderPropertyData>();

            TemplateHelperFunctions.CreateShaderPropertiesList(m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper);
            int subShaderCount = m_shaderData.SubShaders.Count;

            for (int i = 0; i < subShaderCount; i++)
            {
                TemplateSubShader subShader = new TemplateSubShader(i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[i], ref duplicatesHelper);
                m_subShaders.Add(subShader);
                m_masterNodesRequired += subShader.Passes.Count;
            }

            duplicatesHelper.Clear();
            duplicatesHelper = null;
            m_isSinglePass   = (m_subShaders.Count == 1 && m_subShaders[0].PassAmount == 1);
        }