void DrawButtons() { EditorGUILayout.Separator(); // Add keyword if (GUILayout.Button(string.Empty, UIUtils.PlusStyle, GUILayout.Width(Constants.PlusMinusButtonLayoutWidth))) { AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; m_additionalDirectives.Add(newItem); UpdateNativeIndex(); EditorGUI.FocusTextInControl(null); m_isDirty = true; } //Remove keyword if (GUILayout.Button(string.Empty, UIUtils.MinusStyle, GUILayout.Width(Constants.PlusMinusButtonLayoutWidth))) { if (m_additionalDirectives.Count > 0) { AdditionalDirectiveContainer itemToDelete = m_additionalDirectives[m_additionalDirectives.Count - 1]; m_additionalDirectives.RemoveAt(m_additionalDirectives.Count - 1); ScriptableObject.DestroyImmediate(itemToDelete); EditorGUI.FocusTextInControl(null); } m_isDirty = true; } }
// read comment on m_directivesSaveItems declaration public void UpdateDirectivesFromSaveItems() { if (m_directivesSaveItems.Count > 0) { for (int i = 0; i < m_additionalDirectives.Count; i++) { if (m_additionalDirectives[i] != null) { ScriptableObject.DestroyImmediate(m_additionalDirectives[i]); } } m_additionalDirectives.Clear(); for (int i = 0; i < m_directivesSaveItems.Count; i++) { AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; newItem.Init(m_directivesSaveItems[i]); m_additionalDirectives.Add(newItem); } UpdateNativeIndex(); //m_directivesSaveItems.Clear(); } }
public override void ReadFromString(ref uint index, ref string[] nodeParams) { try { int count = Convert.ToInt32(nodeParams[index++]); for (int i = 0; i < count; i++) { AdditionalLineType lineType = (AdditionalLineType)Enum.Parse(typeof(AdditionalLineType), nodeParams[index++]); string lineValue = nodeParams[index++]; AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; newItem.LineType = lineType; newItem.LineValue = lineValue.Replace(Constants.SemiColonSeparator, ';'); if (UIUtils.CurrentShaderVersion() > 15607) { newItem.GUIDToggle = Convert.ToBoolean(nodeParams[index++]); newItem.GUIDValue = nodeParams[index++]; if (newItem.GUIDToggle) { newItem.LibObject = AssetDatabase.LoadAssetAtPath <TextAsset>(AssetDatabase.GUIDToAssetPath(newItem.GUIDValue)); if (newItem.LibObject == null) { Debug.LogWarning("Include file not found with GUID " + newItem.GUIDValue); } } } m_additionalDirectives.Add(newItem); } } catch (Exception e) { Debug.LogException(e); } }
public AdditionalDirectiveContainerSaveItem(AdditionalDirectiveContainer container) { LineType = container.LineType; LineValue = container.LineValue; GUIDToggle = container.GUIDToggle; GUIDValue = container.GUIDValue; }
public void Init(string ownerId, AdditionalDirectiveContainer item) { LineType = item.LineType; LineValue = item.LineValue; GUIDToggle = item.GUIDToggle; GUIDValue = item.GUIDValue; Origin = item.Origin; LibObject = item.LibObject; OwnerId = ownerId; }
//public void RemoveShaderFunctionItem( AdditionalLineType type, string item ) //{ // m_shaderFunctionDirectives.RemoveAll( x => x.LineType == type && x.LineValue.Equals( item ) ); //} public void AddItems(AdditionalLineType type, List <string> items) { int count = items.Count; for (int i = 0; i < count; i++) { AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.LineType = type; newItem.LineValue = items[i]; newItem.hideFlags = HideFlags.HideAndDontSave; m_additionalDirectives.Add(newItem); } }
public void AddNativeContainer() { if (m_nativeDirectives.Count > 0) { if (m_additionalDirectives.FindIndex(x => x.Origin.Equals(AdditionalContainerOrigin.Native)) == -1) { AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.Origin = AdditionalContainerOrigin.Native; newItem.hideFlags = HideFlags.HideAndDontSave; m_additionalDirectives.Add(newItem); } } }
//public void AddShaderFunctionItem( AdditionalLineType type, string item ) //{ // UpdateShaderFunctionDictionary(); // string id = type + item; // if( !m_shaderFunctionDictionary.ContainsKey( id ) ) // { // AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance<AdditionalDirectiveContainer>(); // newItem.LineType = type; // newItem.LineValue = item; // newItem.hideFlags = HideFlags.HideAndDontSave; // m_shaderFunctionDirectives.Add( newItem ); // m_shaderFunctionDictionary.Add( id, newItem ); // } //} public void AddShaderFunctionItems(string ownerOutputId, List <AdditionalDirectiveContainer> functionList) { RemoveShaderFunctionItems(ownerOutputId); if (functionList.Count > 0) { for (int i = 0; i < functionList.Count; i++) { AdditionalDirectiveContainer item = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); item.Init(ownerOutputId, functionList[i]); m_shaderFunctionDirectives.Add(item); } } //if( functionList.Count > 0 ) //{ // m_shaderFunctionDirectives.AddRange( functionList ); //} }
public override void ReadFromString(ref uint index, ref string[] nodeParams) { try { int count = Convert.ToInt32(nodeParams[index++]); for (int i = 0; i < count; i++) { AdditionalLineType lineType = (AdditionalLineType)Enum.Parse(typeof(AdditionalLineType), nodeParams[index++]); string lineValue = nodeParams[index++]; AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; newItem.LineType = lineType; newItem.LineValue = lineValue; m_additionalDirectives.Add(newItem); } } catch (Exception e) { Debug.LogException(e); } }
public override void Draw(UndoParentNode currOwner, bool style = true) { m_currOwner = currOwner; if (m_reordableList == null) { m_reordableList = new ReorderableList(m_additionalDirectives, typeof(AdditionalDirectiveContainer), true, false, false, false) { headerHeight = 0, footerHeight = 0, showDefaultBackground = false, elementHeightCallback = (index) => { if (m_additionalDirectives[index].Origin == AdditionalContainerOrigin.Native && m_nativeDirectivesFoldout) { return((m_nativeDirectives.Count + 1) * (EditorGUIUtility.singleLineHeight) + 5); } return(EditorGUIUtility.singleLineHeight + 5); }, drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (m_additionalDirectives[index].Origin == AdditionalContainerOrigin.Native && m_nativeDirectivesFoldout) { rect.height = (m_nativeDirectives.Count + 1) * (EditorGUIUtility.singleLineHeight) + 5; } if (m_additionalDirectives[index] != null) { float labelWidthStyleAdjust = 0; if (style) { rect.xMin -= 10; labelWidthStyleAdjust = 15; } else { rect.xMin -= 1; } float popUpWidth = style ? 75 : 60f; float widthAdjust = m_additionalDirectives[index].LineType == AdditionalLineType.Include ? -14 : 0; Rect popupPos = new Rect(rect.x, rect.y, popUpWidth, EditorGUIUtility.singleLineHeight); Rect GUIDTogglePos = m_additionalDirectives[index].LineType == AdditionalLineType.Include ? new Rect(rect.x + rect.width - 3 * Constants.PlusMinusButtonLayoutWidth, rect.y, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth) : new Rect(); Rect buttonPlusPos = new Rect(rect.x + rect.width - 2 * Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth); Rect buttonMinusPos = new Rect(rect.x + rect.width - Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth); float labelWidthBuffer = EditorGUIUtility.labelWidth; Rect labelPos = new Rect(rect.x + popupPos.width - labelWidthStyleAdjust, rect.y, labelWidthStyleAdjust + rect.width - popupPos.width - buttonPlusPos.width - buttonMinusPos.width + widthAdjust, EditorGUIUtility.singleLineHeight); if (m_additionalDirectives[index].Origin == AdditionalContainerOrigin.Native) { m_nativeRect = rect; m_nativeRect.xMin += 2; m_nativeRect.xMax -= 2; m_nativeRect.yMax -= 2; #if UNITY_2019_3_OR_NEWER EditorGUI.LabelField(m_nativeRect, NativeFoldoutStr); #else NodeUtils.DrawNestedPropertyGroup(ref m_nativeDirectivesFoldout, rect, NativeFoldoutStr, DrawNativeItemsRect, 4); #endif return; } m_additionalDirectives[index].LineType = (AdditionalLineType)m_currOwner.EditorGUIEnumPopup(popupPos, m_additionalDirectives[index].LineType); if (m_additionalDirectives[index].LineType == AdditionalLineType.Include) { if (m_additionalDirectives[index].GUIDToggle) { //if( m_additionalDirectives[ index ].LibObject == null && !string.IsNullOrEmpty( m_additionalDirectives[ index ].GUIDValue ) ) //{ // m_additionalDirectives[ index ].LibObject = AssetDatabase.LoadAssetAtPath<TextAsset>( AssetDatabase.GUIDToAssetPath( m_additionalDirectives[ index ].GUIDValue ) ); //} EditorGUI.BeginChangeCheck(); TextAsset obj = m_currOwner.EditorGUIObjectField(labelPos, m_additionalDirectives[index].LibObject, typeof(TextAsset), false) as TextAsset; if (EditorGUI.EndChangeCheck()) { string pathName = AssetDatabase.GetAssetPath(obj); string extension = Path.GetExtension(pathName); extension = extension.ToLower(); if (extension.Equals(".cginc") || extension.Equals(".hlsl")) { m_additionalDirectives[index].LibObject = obj; m_additionalDirectives[index].GUIDValue = AssetDatabase.AssetPathToGUID(pathName); } } } else { m_additionalDirectives[index].LineValue = m_currOwner.EditorGUITextField(labelPos, string.Empty, m_additionalDirectives[index].LineValue); } if (GUI.Button(GUIDTogglePos, m_additionalDirectives[index].GUIDToggle ? UIUtils.FloatIntIconOFF : UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF)) { m_additionalDirectives[index].GUIDToggle = !m_additionalDirectives[index].GUIDToggle; } } else { m_additionalDirectives[index].LineValue = m_currOwner.EditorGUITextField(labelPos, string.Empty, m_additionalDirectives[index].LineValue); } if (GUI.Button(buttonPlusPos, string.Empty, UIUtils.PlusStyle)) { m_actionType = ReordableAction.Add; m_actionIndex = index; } if (GUI.Button(buttonMinusPos, string.Empty, UIUtils.MinusStyle)) { m_actionType = ReordableAction.Remove; m_actionIndex = index; } } }, onReorderCallback = ( ReorderableList list ) => { UpdateNativeIndex(); } }; } if (m_actionType != ReordableAction.None) { switch (m_actionType) { case ReordableAction.Add: { AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; m_additionalDirectives.Insert(m_actionIndex + 1, newItem); } break; case ReordableAction.Remove: AdditionalDirectiveContainer itemToDelete = m_additionalDirectives[m_actionIndex]; m_additionalDirectives.RemoveAt(m_actionIndex); ScriptableObject.DestroyImmediate(itemToDelete); break; } m_isDirty = true; m_actionType = ReordableAction.None; EditorGUI.FocusTextInControl(null); } bool foldoutValue = currOwner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives; if (style) { NodeUtils.DrawPropertyGroup(ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons); } else { NodeUtils.DrawNestedPropertyGroup(ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons); } currOwner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives = foldoutValue; }
public override void Draw(UndoParentNode owner, bool style = true) { if (m_reordableList == null) { m_reordableList = new ReorderableList(m_additionalDirectives, typeof(AdditionalDirectiveContainer), true, false, false, false) { headerHeight = 0, footerHeight = 0, showDefaultBackground = false, drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { if (m_additionalDirectives[index] != null) { if (style) { rect.xMin -= 10; } else { rect.xMin -= 1; } float popUpWidth = style?75:65f; Rect popupPos = new Rect(rect.x, rect.y, popUpWidth, EditorGUIUtility.singleLineHeight); Rect buttonPlusPos = new Rect(rect.x + rect.width - 2 * Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth); Rect buttonMinusPos = new Rect(rect.x + rect.width - Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth); Rect labelPos = new Rect(rect.x + popupPos.width, rect.y, rect.width - popupPos.width - buttonPlusPos.width - buttonMinusPos.width, rect.height); labelPos.height = EditorGUIUtility.singleLineHeight; m_additionalDirectives[index].LineType = (AdditionalLineType)owner.EditorGUIEnumPopup(popupPos, m_additionalDirectives[index].LineType); m_additionalDirectives[index].LineValue = owner.EditorGUITextField(labelPos, string.Empty, m_additionalDirectives[index].LineValue); if (GUI.Button(buttonPlusPos, string.Empty, UIUtils.PlusStyle)) { m_actionType = ReordableAction.Add; m_actionIndex = index; } if (GUI.Button(buttonMinusPos, string.Empty, UIUtils.MinusStyle)) { m_actionType = ReordableAction.Remove; m_actionIndex = index; } } } }; } if (m_actionType != ReordableAction.None) { switch (m_actionType) { case ReordableAction.Add: AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance <AdditionalDirectiveContainer>(); newItem.hideFlags = HideFlags.HideAndDontSave; m_additionalDirectives.Insert(m_actionIndex + 1, newItem); break; case ReordableAction.Remove: AdditionalDirectiveContainer itemToDelete = m_additionalDirectives[m_actionIndex]; m_additionalDirectives.RemoveAt(m_actionIndex); ScriptableObject.DestroyImmediate(itemToDelete); break; } m_isDirty = true; m_actionType = ReordableAction.None; EditorGUI.FocusTextInControl(null); } bool foldoutValue = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives; if (style) { NodeUtils.DrawPropertyGroup(ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons); } else { NodeUtils.DrawNestedPropertyGroup(ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons); } owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives = foldoutValue; }