Exemple #1
0
    public static void Create()
    {
        if (Selection.activeGameObject != null)
        {
            GameObject          o              = Selection.activeGameObject;
            SkinnedMeshRenderer skin           = o.GetComponent <SkinnedMeshRenderer>();
            SpriteRenderer      spriteRenderer = o.GetComponent <SpriteRenderer>();
            if (skin == null && spriteRenderer != null)
            {
                Sprite thisSprite = spriteRenderer.sprite;
                SpriteMesh.CreateSpriteMeshAsset(spriteRenderer.transform, thisSprite);
                Texture2D spriteTexture  = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);
                Material  spriteMaterial = new Material(spriteRenderer.sharedMaterial);
                spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
                spriteMaterial.mainTexture = spriteTexture;
                DestroyImmediate(spriteRenderer);
                Skin2D skin2D = o.AddComponent <Skin2D>();
                skin2D.sprite = thisSprite;
                skin          = o.GetComponent <SkinnedMeshRenderer>();
                MeshFilter filter = o.GetComponent <MeshFilter>();
                skin.material = spriteMaterial;
                filter.mesh   = (Mesh)Selection.activeObject;
                if (filter.sharedMesh != null && skin.sharedMesh == null)
                {
                    skin.sharedMesh = filter.sharedMesh;
                }
                Skeleton skeleton = o.transform.root.GetComponent <Skeleton>();
                if (skeleton != null)
                {
                    // Generate the mesh and calculate the weights if the root transform has a skeleton
                    skeleton.CalculateWeights(true);
                    // Debug.Log("Calculated weights for " + o.name);

                    // Try to initialize the parent bone to this skin
                    Bone bone = o.transform.parent.GetComponent <Bone>();
                    if (bone != null)
                    {
                        Mesh m = skin.sharedMesh.Clone();
                        List <BoneWeight> weights = m.boneWeights.ToList();

                        for (int i = 0; i < m.vertices.Length; i++)
                        {
                            BoneWeight bw = weights[i];
                            bw         = bw.SetWeight(bone.index, 1);
                            weights[i] = bw.Clone();
                        }

                        skin.sharedMesh.boneWeights = weights.ToArray();
                        EditorUtility.SetDirty(skin.gameObject);
                        if (PrefabUtility.GetPrefabType(skin.gameObject) != PrefabType.None)
                        {
                            AssetDatabase.SaveAssets();
                        }
                    }
                }
            }
            else
            {
                o = new GameObject("Skin2D");
                Undo.RegisterCreatedObjectUndo(o, "Create Skin2D");
                o.AddComponent <Skin2D> ();
            }
        }
        else
        {
            GameObject o = new GameObject("Skin2D");
            Undo.RegisterCreatedObjectUndo(o, "Create Skin2D");
            o.AddComponent <Skin2D> ();
        }
    }
Exemple #2
0
        public void OnSceneGUI(SceneView sceneView)
        {
            if (skin != null && isPainting)
            {
                HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

                if (mesh == null || recalculateMesh)
                {
                    mesh = new Mesh();
                    skin.BakeMesh(mesh);

                    mesh.normals     = skin.sharedMesh.normals;
                    mesh.bindposes   = skin.sharedMesh.bindposes;
                    mesh.bounds      = skin.sharedMesh.bounds;
                    mesh.uv          = skin.sharedMesh.uv;
                    mesh.uv2         = skin.sharedMesh.uv2;
                    mesh.boneWeights = skin.sharedMesh.boneWeights;
                    mesh.tangents    = skin.sharedMesh.tangents;

                    mesh.GetVertices(vertices);

                    for (int i = 0; i < mesh.vertexCount; i++)
                    {
                        vertices[i] = new Vector3(
                            vertices[i].x * skin.transform.lossyScale.x,
                            vertices[i].y * skin.transform.lossyScale.y,
                            vertices[i].z * skin.transform.lossyScale.z);
                    }

                    mesh.SetVertices(vertices);

                    recalculateMesh = false;
                }
                else
                {
                    mesh.boneWeights = skin.sharedMesh.boneWeights;
                }

                CalculateVertexColors(skin.bones, bones[boneIndex]);

                List <BoneWeight> weights = mesh.boneWeights.ToList();

                Event current = Event.current;

                Graphics.DrawMeshNow(mesh, skin.transform.localToWorldMatrix);

                for (int b = 0; b < bones.Length; b++)
                {
                    if (bones[b] == bones[boneIndex])
                    {
                        Handles.color = Color.yellow;
                    }
                    else
                    {
                        Handles.color = Color.gray;
                    }

                    Handles.DrawLine(bones[b].transform.position, bones[b].Head);
                }

                Handles.color = Color.red;

                mpos = HandleUtility.GUIPointToWorldRay(current.mousePosition).origin;

                mpos = new Vector3(mpos.x, mpos.y);

                Handles.DrawWireDisc(mpos, Vector3.forward, brushSize);

                if (isPainting)
                {
                    if (current.type == EventType.ScrollWheel && current.modifiers == EventModifiers.Control)
                    {
                        brushSize = Mathf.Clamp(brushSize + (float)System.Math.Round(current.delta.y / 30, 2), 0, float.MaxValue);

                        Repaint();

                        current.Use();
                    }
                    else if (current.type == EventType.MouseDown && current.button == 0)
                    {
                        isDrawing  = true;
                        wasDrawing = false;
                    }
                    else if (current.type == EventType.MouseUp && current.button == 0)
                    {
                        if (isDrawing)
                        {
                            wasDrawing      = true;
                            recalculateMesh = true;
                        }

                        isDrawing = false;
                    }
                    else if (current.type == EventType.MouseDrag && isDrawing && current.button == 0)
                    {
                        w = weight * ((mode == PaintingMode.Subtract) ? -1 : 1);

                        for (int i = 0; i < mesh.vertices.Length; i++)
                        {
                            v = mesh.vertices[i];

                            d = (v - skin.gameObject.transform.InverseTransformPoint(mpos)).magnitude;

                            if (d <= brushSize)
                            {
                                bw         = weights[i];
                                vw         = bw.GetWeight(boneIndex);
                                vw         = Mathf.Clamp(vw + (1 - d / brushSize) * w, 0, 1);
                                bw         = bw.SetWeight(boneIndex, vw);
                                weights[i] = bw.Clone();
                            }
                        }

                        skin.sharedMesh.boneWeights = weights.ToArray();
                    }
                }

                sceneView.Repaint();
            }
        }
    public void OnSceneGUI(SceneView sceneView)
    {
        if (skin != null && isPainting)
        {
            HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

            Mesh m = skin.sharedMesh.Clone();
            m.colors = CalculateVertexColors(skin.bones, m, skin.bones[bone].GetComponent <Bone>());

            List <BoneWeight> weights = m.boneWeights.ToList();

            Event current = Event.current;

            Graphics.DrawMeshNow(m, skin.transform.position, skin.transform.rotation);

            Bone bn = skin.bones[bone].GetComponent <Bone>();

            foreach (Bone b in skin.GetComponentsInChildren <Bone>())
            {
                if (bn == b)
                {
                    Handles.color = Color.yellow;
                }
                else
                {
                    Handles.color = Color.gray;
                }
                Handles.DrawLine(b.transform.position, b.Head);
            }

            Handles.color = Color.red;
            Vector3 mpos = HandleUtility.GUIPointToWorldRay(current.mousePosition).origin;
            mpos = new Vector3(mpos.x, mpos.y);
            Handles.DrawWireDisc(mpos, Vector3.forward, brushSize);

            if (isPainting)
            {
                if (current.type == EventType.scrollWheel && current.modifiers == EventModifiers.Control)
                {
                    brushSize = Mathf.Clamp(brushSize + (float)System.Math.Round(current.delta.y / 30, 2), 0, float.MaxValue);
                    Repaint();
                    current.Use();
                }
                else if (current.type == EventType.mouseDown && current.button == 0)
                {
                    isDrawing = true;
                }
                else if (current.type == EventType.mouseUp && current.button == 0)
                {
                    isDrawing = false;
                }
                else if (current.type == EventType.mouseDrag && isDrawing && current.button == 0)
                {
                    float w = weight * ((mode == PaintingMode.Subtract) ? -1 : 1);

                    for (int i = 0; i < m.vertices.Length; i++)
                    {
                        Vector3 v = m.vertices[i];
                        float   d = (v - skin.gameObject.transform.InverseTransformPoint(mpos)).magnitude;

                        if (d <= brushSize)
                        {
                            BoneWeight bw = weights[i];
                            float      vw = bw.GetWeight(bn.index);
                            vw         = Mathf.Clamp(vw + (1 - d / brushSize) * w, 0, 1);
                            bw         = bw.SetWeight(bn.index, vw);
                            weights[i] = bw.Clone();
                        }
                    }

                    skin.sharedMesh.boneWeights = weights.ToArray();
                    EditorUtility.SetDirty(skin.gameObject);
                    if (PrefabUtility.GetPrefabType(skin.gameObject) != PrefabType.None)
                    {
                        AssetDatabase.SaveAssets();
                    }
                }
            }

            sceneView.Repaint();
        }
    }