Exemplo n.º 1
0
        void UpdateEditMode()
        {
            EditorGUILayout.BeginVertical(EditorStyles.inspectorDefaultMargins);

            EditorGUILayout.PropertyField(barycentricWeight);
            EditorGUILayout.PropertyField(normalAlignmentWeight);
            EditorGUILayout.PropertyField(elevationWeight);

            EditorGUI.BeginChangeCheck();
            paintMode    = GUILayout.Toggle(paintMode, new GUIContent("Paint skin", Resources.Load <Texture2D>("PaintButton")), "LargeButton");
            Tools.hidden = paintMode || subject == SubjectBeingEdited.Master;
            if (EditorGUI.EndChangeCheck())
            {
                SceneView.RepaintAll();
            }

            // Buttons:
            GUILayout.BeginHorizontal();

            if (GUILayout.Button("Bind") && masterObject != null && slaveObject != null)
            {
                EditorUtility.SetDirty(target);
                CoroutineJob job = new CoroutineJob();
                routine = job.Start(skinMap.Bind());
                EditorCoroutine.ShowCoroutineProgressBar("Generating skinmap...", ref routine);
                EditorGUIUtility.ExitGUI();
            }

            if (GUILayout.Button("Done"))
            {
                EditorApplication.delayCall += ExitSkinEditMode;
            }

            GUILayout.EndHorizontal();

            EditorGUILayout.EndVertical();

            // skin channel selector:
            if (paintMode)
            {
                EditorGUILayout.Space();
                GUILayout.Box(GUIContent.none, ObiEditorUtils.GetSeparatorLineStyle());

                EditorGUILayout.BeginVertical(EditorStyles.inspectorDefaultMargins);

                // Brush parameters:
                paintBrush.radius      = EditorGUILayout.Slider("Brush size", paintBrush.radius, 0.0001f, 0.5f);
                paintBrush.innerRadius = 1;
                paintBrush.opacity     = 1;

                EditorGUI.BeginChangeCheck();
                if (paintBrush.brushMode.needsInputValue)
                {
                    currentProperty.PropertyField();
                }
                if (EditorGUI.EndChangeCheck())
                {
                    SceneView.RepaintAll();
                }

                GUILayout.BeginHorizontal();

                if (GUILayout.Button(new GUIContent("Fill"), EditorStyles.miniButtonLeft))
                {
                    if (subject == SubjectBeingEdited.Master)
                    {
                        skinMap.FillChannel(skinMap.m_MasterChannels, currentProperty.GetDefault());
                    }
                    else
                    {
                        skinMap.FillChannel(skinMap.m_SlaveChannels, currentProperty.GetDefault());
                    }
                    SceneView.RepaintAll();
                }

                if (GUILayout.Button(new GUIContent("Clear"), EditorStyles.miniButtonMid))
                {
                    if (subject == SubjectBeingEdited.Master)
                    {
                        skinMap.ClearChannel(skinMap.m_MasterChannels, currentProperty.GetDefault());
                    }
                    else
                    {
                        skinMap.ClearChannel(skinMap.m_SlaveChannels, currentProperty.GetDefault());
                    }
                    SceneView.RepaintAll();
                }

                if (GUILayout.Button(new GUIContent("Copy"), EditorStyles.miniButtonMid))
                {
                    targetSkinChannel = currentProperty.GetDefault();
                }

                if (GUILayout.Button(new GUIContent("Paste"), EditorStyles.miniButtonRight))
                {
                    if (subject == SubjectBeingEdited.Master)
                    {
                        skinMap.CopyChannel(skinMap.m_MasterChannels, targetSkinChannel, currentProperty.GetDefault());
                    }
                    else
                    {
                        skinMap.CopyChannel(skinMap.m_SlaveChannels, targetSkinChannel, currentProperty.GetDefault());
                    }
                    SceneView.RepaintAll();
                }

                GUILayout.EndHorizontal();

                EditorGUILayout.EndVertical();
            }

            EditorGUILayout.Space();
            GUILayout.Box(GUIContent.none, ObiEditorUtils.GetSeparatorLineStyle());

            EditorGUILayout.BeginVertical(EditorStyles.inspectorDefaultMargins);

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Slave transform", EditorStyles.boldLabel);
            if (GUILayout.Button("Reset", EditorStyles.miniButton))
            {
                skinMap.m_SlaveTransform.Reset();
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_SlaveTransform"));

            EditorGUILayout.EndVertical();
        }
        void UpdateEditMode()
        {
            paintMode = GUILayout.Toggle(paintMode, new GUIContent("Paint skin master/slave", Resources.Load <Texture2D>("PaintButton")), "LargeButton");

            // skin channel selector:
            if (paintMode)
            {
                GUILayout.BeginHorizontal();

                if (GUILayout.Toggle(brushType == PaintBrushType.Add, new GUIContent("Add", Resources.Load <Texture2D>("AddIcon")), GUI.skin.FindStyle("ButtonLeft")))
                {
                    brushType = PaintBrushType.Add;
                }

                if (GUILayout.Toggle(brushType == PaintBrushType.Remove, new GUIContent("Remove", Resources.Load <Texture2D>("RemoveIcon")), GUI.skin.FindStyle("ButtonMid")))
                {
                    brushType = PaintBrushType.Remove;
                }

                if (GUILayout.Button(new GUIContent("Fill", Resources.Load <Texture2D>("FillButton")), GUI.skin.FindStyle("ButtonMid")))
                {
                    if (sourceObject != null && Selection.activeGameObject == sourceObject)
                    {
                        for (int i = 0; i < skinMap.masterFlags.Length; ++i)
                        {
                            skinMap.masterFlags[i] |= (uint)(1 << selectedSkinChannel);
                        }
                    }
                    if (targetObject != null && Selection.activeGameObject == targetObject)
                    {
                        for (int i = 0; i < skinMap.slaveFlags.Length; ++i)
                        {
                            skinMap.slaveFlags[i] |= (uint)(1 << selectedSkinChannel);
                        }
                    }
                }

                if (GUILayout.Button(new GUIContent("Clear", Resources.Load <Texture2D>("ClearButton2")), GUI.skin.FindStyle("ButtonRight")))
                {
                    if (sourceObject != null && Selection.activeGameObject == sourceObject)
                    {
                        for (int i = 0; i < skinMap.masterFlags.Length; ++i)
                        {
                            skinMap.masterFlags[i] &= ~(uint)(1 << selectedSkinChannel);
                        }
                    }
                    if (targetObject != null && Selection.activeGameObject == targetObject)
                    {
                        for (int i = 0; i < skinMap.slaveFlags.Length; ++i)
                        {
                            skinMap.slaveFlags[i] &= ~(uint)(1 << selectedSkinChannel);
                        }
                    }
                }

                GUILayout.EndHorizontal();

                brushRadius         = EditorGUILayout.Slider("Brush radius", brushRadius, 5, 200);
                selectedSkinChannel = EditorGUILayout.Popup("Skin channel:", selectedSkinChannel, availableChannels);

                GUILayout.BeginHorizontal();
                if (GUILayout.Button("Copy channel to:"))
                {
                    CopySkinChannels(selectedSkinChannel, targetSkinChannel);
                }
                targetSkinChannel = EditorGUILayout.Popup(targetSkinChannel, availableChannels);
                GUILayout.EndHorizontal();
            }

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Bind"))
            {
                if (sourceObject != null && targetObject != null)
                {
                    skinMap.Bind(sourceObject.transform, targetObject.transform);
                }
                EditorUtility.SetDirty(target);
            }

            if (GUILayout.Button("Done"))
            {
                EditorApplication.delayCall += ExitSkinEditMode;
            }
            GUILayout.EndHorizontal();

            DrawTransformInspector("Source transform", sourceObject);
            DrawTransformInspector("Target transform", targetObject);

            // Change materials when painting weights:
            if (Event.current.type == EventType.Repaint)
            {
                UpdateSourceObject();
                UpdateTargetObject();
            }
        }