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> (); } }
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(); } }