public void OnWizardCreate()
 {
     if (dragonBoneRoot)
     {
         foreach (Renderer render in dragonBoneRoot.GetComponentsInChildren <Renderer>(true))
         {
             render.sortingLayerName = sortingLayerName;
             render.sortingOrder     = sortingOrder;
             SpriteFrame sf = render.GetComponent <SpriteFrame>();
             if (sf)
             {
                 sf.sortingLayerName = sortingLayerName;
                 sf.soringOrder      = sortingOrder;
                 EditorUtility.SetDirty(sf);
             }
             else
             {
                 SpriteMesh sm = render.GetComponent <SpriteMesh>();
                 if (sm)
                 {
                     sm.sortingLayerName = sortingLayerName;
                     sm.soringOrder      = sortingOrder;
                     EditorUtility.SetDirty(sm);
                 }
             }
         }
     }
 }
        /// <summary>
        /// Changes the sprite mesh.
        /// </summary>
        /// <param name="sm">Will replace SpriteMesh</param>
        /// <param name="texture">new Texture.</param>
        /// <param name="mat">Mat.</param>
        public void ChangeSpriteMesh(SpriteMesh sm, Texture texture, Material mat = null)
        {
            if (!sm || !texture)
            {
                return;
            }

            if (mat)
            {
                sm.atlasMat = mat;
            }

            sm.atlasMat.mainTexture = texture;
            sm.frame.material       = sm.atlasMat;
            sm.frame.texture        = texture;
            sm.frame.isRotated      = false;

            sm.frame.rect.x             = 0;
            sm.frame.rect.y             = 0;
            sm.frame.rect.width         = texture.width;
            sm.frame.rect.height        = texture.height;
            sm.frame.frameSize          = new Rect(0, 0, texture.width, texture.height);
            sm.frame.atlasTextureSize.x = texture.width;
            sm.frame.atlasTextureSize.y = texture.height;

            sm.UpdateUV();
        }
        /// <summary>
        /// Changes the sprite mesh.
        /// </summary>
        /// <param name="spriteMeshName">Will replace SpriteMesh'name.</param>
        /// <param name="texture">new Texture.</param>
        /// <param name="mat">Mat.</param>
        public void ChangeSpriteMesh(string spriteMeshName, Texture texture, Material mat = null)
        {
            Renderer attachment = GetAttachmentByName(spriteMeshName);

            if (!attachment)
            {
                return;
            }
            SpriteMesh sm = attachment.GetComponent <SpriteMesh>();

            ChangeSpriteMesh(sm, texture, mat);
        }
Esempio n. 4
0
 void UpdateCurrentDisplay()
 {
     if (__displayIndex > -1 && transform.childCount > 0)
     {
         m_SpriteFrame    = null;
         m_SpriteMesh     = null;
         m_SpriteRenderer = null;
         Transform child = transform.GetChild(__displayIndex);
         m_SpriteFrame    = child.GetComponent <SpriteFrame>();
         m_SpriteMesh     = child.GetComponent <SpriteMesh>();
         m_SpriteRenderer = child.GetComponent <SpriteRenderer>();
     }
 }
        /// <summary>
        /// Changes the sprite mesh.
        /// </summary>
        /// <param name="spriteMeshName">Sprite mesh name.</param>
        /// <param name="newTextureFrameName">New texture frame name.</param>
        public void ChangeSpriteMesh(string spriteMeshName, string newTextureFrameName)
        {
            Renderer attachment = GetAttachmentByName(spriteMeshName);

            if (!attachment)
            {
                return;
            }

            SpriteMesh   sm    = attachment.GetComponent <SpriteMesh>();
            TextureFrame frame = GetTextureFrameByName(newTextureFrameName);

            if (sm != null && frame != null)
            {
                sm.atlasMat = frame.material;
                attachment.sharedMaterial = frame.material;
                sm.frame = frame;
                sm.UpdateUV();
            }
        }
Esempio n. 6
0
		/// <summary>
		/// update
		/// </summary>
		public void UpdateArmature(){
			int len = updateFrames.Length;
			for(int i=0;i<len;++i){
				SpriteFrame frame = updateFrames[i];
				if(frame&&frame.isActiveAndEnabled) frame.UpdateFrame();
			}

			len = updateMeshs.Length;
			for(int i=0;i<len;++i){
				SpriteMesh mesh = updateMeshs[i];
				if(mesh&&mesh.isActiveAndEnabled) mesh.UpdateMesh();
			}

			len = slots.Length;
			for(int i=0;i<len;++i){
				Slot slot = slots[i];
				if(slot && slot.isActiveAndEnabled){
					slot.UpdateSlot();
				}
			}
		}
Esempio n. 7
0
        /// <summary>
        /// update
        /// </summary>
        public void UpdateArmature()
        {
            int len = updateFrames.Length;

            for (int i = 0; i < len; ++i)
            {
                SpriteFrame frame = updateFrames[i];
                if (frame && frame.isActiveAndEnabled)
                {
                    frame.UpdateFrame();
                }
            }

            len = updateMeshs.Length;
            for (int i = 0; i < len; ++i)
            {
                SpriteMesh mesh = updateMeshs[i];
                if (mesh && mesh.isActiveAndEnabled)
                {
                    mesh.UpdateMesh();
                }
            }
        }
Esempio n. 8
0
        static void ShowSpriteMesh(TextureFrame frame, Material mat, DragonBoneData.SkinSlotDisplayData displayData, Transform slot, ArmatureEditor armatureEditor, DragonBoneData.SlotData slotData)
        {
            armatureEditor.spriteMeshUsedMatKV[mat] = true;
            GameObject go = new GameObject(displayData.textureName);
            SpriteMesh sm = go.AddComponent <SpriteMesh>();

            sm.atlasMat  = mat;
            sm.vertices  = displayData.vertices;
            sm.frame     = frame;
            sm.uvs       = displayData.uvs;
            sm.triangles = displayData.triangles;
            sm.colors    = new Color[sm.vertices.Length];
            for (int i = 0; i < sm.colors.Length; ++i)
            {
                sm.colors[i] = Color.white;
            }
            if (displayData.weights != null && displayData.weights.Length > 0)
            {
                sm.CreateMesh(true);
                if (armatureEditor.ffdKV.ContainsKey(displayData.textureName))
                {
                    //Vertex controller
                    sm.vertControlTrans = new Transform[sm.vertices.Length];
                    for (int i = 0; i < sm.vertices.Length; ++i)
                    {
                        GameObject gov = new GameObject(go.name + "_v" + i);
                        gov.transform.parent        = go.transform;
                        gov.transform.localPosition = sm.vertices[i];
                        gov.transform.localScale    = Vector3.zero;
                        sm.vertControlTrans[i]      = gov.transform;
                    }
                }
            }
            else
            {
                sm.CreateMesh(false);
                if (displayData.bonePose == null)
                {
                    //Vertex controller
                    sm.vertControlTrans = new Transform[sm.vertices.Length];
                    for (int i = 0; i < sm.vertices.Length; ++i)
                    {
                        GameObject gov = new GameObject(go.name + "_v" + i);
                        gov.transform.parent        = go.transform;
                        gov.transform.localPosition = sm.vertices[i];
                        gov.transform.localScale    = Vector3.zero;
                        sm.vertControlTrans[i]      = gov.transform;
                    }
                }
            }
            sm.transform.parent = slot;

            if (displayData.bonePose != null)
            {
                SkinnedMeshRenderer skinnedMesh = sm.GetComponent <SkinnedMeshRenderer>();
                if (skinnedMesh)
                {
                    skinnedMesh.quality = SkinQuality.Bone4;
                    if (displayData.weights != null && displayData.weights.Length > 0)
                    {
                        Transform[] bones = new Transform[displayData.bonePose.Length / 7];
                        for (int i = 0; i < displayData.bonePose.Length; i += 7)
                        {
                            int index     = i / 7;
                            int boneIndex = (int)displayData.bonePose[i];
                            bones[index] = armatureEditor.bones[boneIndex];
                        }

                        List <BoneWeight> boneWeights = new List <BoneWeight>();
                        for (int i = 0; i < displayData.weights.Length; ++i)
                        {
                            int boneCount = (int)displayData.weights[i];                            //骨骼数量

                            List <KeyValuePair <int, float> > boneWeightList = new List <KeyValuePair <int, float> >();
                            for (int j = 0; j < boneCount * 2; j += 2)
                            {
                                int   boneIdx = (int)displayData.weights[i + j + 1];
                                float weight  = displayData.weights[i + j + 2];
                                boneWeightList.Add(new KeyValuePair <int, float>(boneIdx, weight));
                            }
                            //sort boneWeightList,desc
                            boneWeightList.Sort(delegate(KeyValuePair <int, float> x, KeyValuePair <int, float> y) {
                                if (x.Value == y.Value)
                                {
                                    return(0);
                                }
                                return(x.Value < y.Value? 1: -1);
                            });
                            BoneWeight bw = new BoneWeight();
                            for (int j = 0; j < boneWeightList.Count; ++j)
                            {
                                if (j == 0)
                                {
                                    bw.boneIndex0 = GlobalBoneIndexToLocalBoneIndex(armatureEditor, boneWeightList[j].Key, bones);
                                    bw.weight0    = boneWeightList[j].Value;
                                }
                                else if (j == 1)
                                {
                                    bw.boneIndex1 = GlobalBoneIndexToLocalBoneIndex(armatureEditor, boneWeightList[j].Key, bones);
                                    bw.weight1    = boneWeightList[j].Value;
                                }
                                else if (j == 2)
                                {
                                    bw.boneIndex2 = GlobalBoneIndexToLocalBoneIndex(armatureEditor, boneWeightList[j].Key, bones);
                                    bw.weight2    = boneWeightList[j].Value;
                                }
                                else if (j == 3)
                                {
                                    bw.boneIndex3 = GlobalBoneIndexToLocalBoneIndex(armatureEditor, boneWeightList[j].Key, bones);
                                    bw.weight3    = boneWeightList[j].Value;
                                }
                            }
                            boneWeights.Add(bw);
                            i += boneCount * 2;
                        }
                        Matrix4x4[] matrixArray = new Matrix4x4[bones.Length];
                        for (int i = 0; i < matrixArray.Length; ++i)
                        {
                            Transform  bone       = bones[i];
                            Vector3    bonePos    = bone.localPosition;
                            Quaternion boneRotate = bone.localRotation;

                            Matrix2D m2d = armatureEditor.bonePoseKV[displayData.textureName + bone.name];
                            bone.position = new Vector3(m2d.tx * 0.01f, -m2d.ty * 0.01f, bone.position.z);
                            bone.rotation = Quaternion.Euler(0f, 0f, -m2d.GetAngle());

                            matrixArray[i]  = bone.worldToLocalMatrix * armatureEditor.armature.localToWorldMatrix;
                            matrixArray[i] *= Matrix4x4.TRS(slot.localPosition, slot.localRotation, slot.localScale);

                            bone.localPosition = bonePos;
                            bone.localRotation = boneRotate;
                        }
                        skinnedMesh.bones = bones;
                        skinnedMesh.sharedMesh.boneWeights = boneWeights.ToArray();
                        skinnedMesh.sharedMesh.bindposes   = matrixArray;
                        skinnedMesh.rootBone = slot;
                        sm.bindposes         = matrixArray;
                        SpriteMesh.BoneWeightClass[] bwcs = new SpriteMesh.BoneWeightClass[boneWeights.Count];
                        for (int i = 0; i < boneWeights.Count; ++i)
                        {
                            SpriteMesh.BoneWeightClass bwc = new SpriteMesh.BoneWeightClass();
                            BoneWeight bw = boneWeights[i];
                            bwc.boneIndex0 = bw.boneIndex0;
                            bwc.boneIndex1 = bw.boneIndex1;
                            bwc.boneIndex2 = bw.boneIndex2;
                            bwc.boneIndex3 = bw.boneIndex3;
                            bwc.weight0    = bw.weight0;
                            bwc.weight1    = bw.weight1;
                            bwc.weight2    = bw.weight2;
                            bwc.weight3    = bw.weight3;
                            bwcs[i]        = bwc;
                        }
                        sm.weights = bwcs;
                    }
                }
            }
            DragonBoneData.TransformData tranform = displayData.transform;
            Vector3 localPos = Vector3.zero;

            if (!float.IsNaN(tranform.x))
            {
                localPos.x = tranform.x;
            }
            if (!float.IsNaN(tranform.y))
            {
                localPos.y = tranform.y;
            }
            sm.transform.localPosition = localPos;

            Vector3 localSc = Vector3.one;

            if (!float.IsNaN(tranform.scx))
            {
                localSc.x = tranform.scx;
            }
            if (!float.IsNaN(tranform.scy))
            {
                localSc.y = tranform.scy;
            }
            sm.transform.localScale = localSc;

            sm.color = slot.GetComponent <Slot>().color;
            sm.transform.localRotation = Quaternion.Euler(0, 0, tranform.rotate);
        }
Esempio n. 9
0
        //init
        public void InitShow()
        {
            ShowArmature.AddBones(this);
            ShowArmature.AddSlot(this);
            ShowArmature.ShowBones(this);
            ShowArmature.ShowSlots(this);
            ShowArmature.ShowSkins(this);
            ShowArmature.SetIKs(this);
            AnimFile.CreateAnimFile(this);

            DragonBoneArmature dba = _armature.GetComponent <DragonBoneArmature>();

            //update slot display
            for (int s = 0; s < slots.Count; ++s)
            {
                slots[s].displayIndex = slots[s].displayIndex;
            }

            Renderer[] renders = _armature.GetComponentsInChildren <Renderer>(true);
            foreach (Renderer r in renders)
            {
                if (r.GetComponent <SpriteFrame>())
                {
                    //optimize memory
                    SpriteFrame  sf = r.GetComponent <SpriteFrame>();
                    TextureFrame tf = sf.frame;
                    sf.frames = new TextureFrame[] { tf };
                }
            }
            dba.attachments = renders;
            dba.slots       = slots.ToArray();
            dba.bones       = bones.ToArray();
            dba.zSpace      = zoffset;
            dba.ResetSlotZOrder();

            string path = AssetDatabase.GetAssetPath(animTextAsset);

            path = path.Substring(0, path.LastIndexOf('/')) + "/" + _armature.name;


            //create pose data
            PoseData poseData = ScriptableObject.CreateInstance <PoseData>();

            poseData.slotDatas = new PoseData.SlotData[slots.Count];
            for (int i = 0; i < slots.Count; ++i)
            {
                poseData.slotDatas[i]              = new PoseData.SlotData();
                poseData.slotDatas[i].color        = slots[i].color;
                poseData.slotDatas[i].displayIndex = slots[i].displayIndex;
                poseData.slotDatas[i].zorder       = slots[i].z;
            }
            poseData.boneDatas = new PoseData.TransformData[bones.Count];
            for (int i = 0; i < bones.Count; ++i)
            {
                poseData.boneDatas[i]          = new PoseData.TransformData();
                poseData.boneDatas[i].x        = bones[i].localPosition.x;
                poseData.boneDatas[i].y        = bones[i].localPosition.y;
                poseData.boneDatas[i].sx       = bones[i].localScale.x;
                poseData.boneDatas[i].sy       = bones[i].localScale.y;
                poseData.boneDatas[i].rotation = bones[i].localEulerAngles.z;
            }
            poseData.displayDatas = new PoseData.DisplayData[dba.attachments.Length];
            for (int i = 0; i < dba.attachments.Length; ++i)
            {
                poseData.displayDatas[i] = new PoseData.DisplayData();
                Renderer render = dba.attachments[i];

                SpriteFrame sf = render.GetComponent <SpriteFrame>();
                if (sf)
                {
                    poseData.displayDatas[i].type  = PoseData.AttachmentType.IMG;
                    poseData.displayDatas[i].color = sf.color;
                }
                else
                {
                    SpriteMesh sm = render.GetComponent <SpriteMesh>();
                    if (sm)
                    {
                        poseData.displayDatas[i].type   = PoseData.AttachmentType.MESH;
                        poseData.displayDatas[i].color  = sm.color;
                        poseData.displayDatas[i].vertex = sm.vertices;
                    }
                    else
                    {
                        SpriteRenderer sr = render.GetComponent <SpriteRenderer>();
                        if (sr)
                        {
                            poseData.displayDatas[i].type  = PoseData.AttachmentType.IMG;
                            poseData.displayDatas[i].color = sr.color;
                        }
                        else
                        {
                            poseData.displayDatas[i].type = PoseData.AttachmentType.BOX;
                        }
                    }
                }
                poseData.displayDatas[i].transform          = new PoseData.TransformData();
                poseData.displayDatas[i].transform.x        = render.transform.localPosition.x;
                poseData.displayDatas[i].transform.y        = render.transform.localPosition.y;
                poseData.displayDatas[i].transform.sx       = render.transform.localScale.x;
                poseData.displayDatas[i].transform.sy       = render.transform.localScale.y;
                poseData.displayDatas[i].transform.rotation = render.transform.localEulerAngles.z;
            }
            AssetDatabase.CreateAsset(poseData, path + "_Pose.asset");
            dba.poseData = poseData;


            string     prefabPath = path + ".prefab";
            GameObject prefab     = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath);

            if (!prefab)
            {
                PrefabUtility.CreatePrefab(prefabPath, _armature.gameObject, ReplacePrefabOptions.ConnectToPrefab);
            }
            else
            {
                PrefabUtility.ReplacePrefab(_armature.gameObject, prefab, ReplacePrefabOptions.ConnectToPrefab);
            }
        }
Esempio n. 10
0
        public override void OnInspectorGUI()
        {
            DragonBoneArmature armature = target as DragonBoneArmature;

            if (armature == null)
            {
                return;
            }

            selectedOption = EditorGUILayout.Popup("Sorting Layer", selectedOption, sortingLayerNames);
            if (sortingLayerNames[selectedOption] != armature.sortingLayerName)
            {
                Undo.RecordObject(armature, "Sorting Layer");
                armature.sortingLayerName = sortingLayerNames[selectedOption];
                EditorUtility.SetDirty(armature);
            }
            int newSortingLayerOrder = EditorGUILayout.IntField("Order in Layer", armature.sortingOrder);

            if (newSortingLayerOrder != armature.sortingOrder)
            {
                Undo.RecordObject(armature, "Edit Sorting Order");
                armature.sortingOrder = newSortingLayerOrder;
                EditorUtility.SetDirty(armature);
            }
            if (GUILayout.Button("Update All Sorting Order", GUILayout.Height(20)))
            {
                foreach (Renderer render in armature.GetComponentsInChildren <Renderer>(true))
                {
                    render.sortingLayerName = armature.sortingLayerName;
                    render.sortingOrder     = armature.sortingOrder;
                    EditorUtility.SetDirty(render);

                    SpriteFrame sf = render.GetComponent <SpriteFrame>();
                    if (sf)
                    {
                        sf.sortingLayerName = armature.sortingLayerName;
                        sf.sortingOrder     = armature.sortingOrder;
                    }
                    else
                    {
                        SpriteMesh sm = render.GetComponent <SpriteMesh>();
                        if (sm)
                        {
                            sm.sortingLayerName = armature.sortingLayerName;
                            sm.sortingOrder     = armature.sortingOrder;
                        }
                    }
                }
                EditorUtility.SetDirty(armature);
                if (!string.IsNullOrEmpty(armature.gameObject.scene.name))
                {
                    UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
                }
            }

            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_FlipX"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_FlipY"), true);
            if (!Application.isPlaying)
            {
                EditorGUILayout.PropertyField(serializedObject.FindProperty("zSpace"), true);
            }
            EditorGUILayout.PropertyField(serializedObject.FindProperty("poseData"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("slots"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("bones"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("attachments"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("materials"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("textureFrames"), true);
            serializedObject.ApplyModifiedProperties();

            if (!Application.isPlaying)
            {
                if (armature.flipX != flipX)
                {
                    armature.flipX = armature.flipX;
                    flipX          = armature.flipX;
                    if (!string.IsNullOrEmpty(armature.gameObject.scene.name))
                    {
                        UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
                    }
                }
                if (armature.flipY != flipY)
                {
                    armature.flipY = armature.flipY;
                    flipY          = armature.flipY;
                    if (!string.IsNullOrEmpty(armature.gameObject.scene.name))
                    {
                        UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
                    }
                }
                if (armature.zSpace != zspace)
                {
                    zspace = armature.zSpace;
                    armature.ResetSlotZOrder();
                    if (!string.IsNullOrEmpty(armature.gameObject.scene.name))
                    {
                        UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
                    }
                }
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Sets to pose.
        /// </summary>
        public void SetToPose()
        {
            if (poseData)
            {
                for (int i = 0; i < poseData.boneDatas.Length && i < bones.Length; ++i)
                {
                    Transform bone = bones[i];
                    if (bone)
                    {
                        PoseData.TransformData transData = poseData.boneDatas[i];
                        bone.localPosition    = new Vector3(transData.x, transData.y, bone.localPosition.z);
                        bone.localScale       = new Vector3(transData.sx, transData.sy, bone.localScale.z);
                        bone.localEulerAngles = new Vector3(bone.localEulerAngles.x, bone.localEulerAngles.y, transData.rotation);
                    }
                }
                for (int i = 0; i < poseData.slotDatas.Length && i < slots.Length; ++i)
                {
                    Slot slot = slots[i];
                    if (slot)
                    {
                        slot.color        = poseData.slotDatas[i].color;
                        slot.displayIndex = poseData.slotDatas[i].displayIndex;
                        slot.z            = poseData.slotDatas[i].zorder;
                    }
                }
                for (int i = 0; i < poseData.displayDatas.Length && i < attachments.Length; ++i)
                {
                    Renderer r = attachments[i];
                    if (r)
                    {
                        Transform trans = r.transform;
                        PoseData.TransformData transData = poseData.displayDatas[i].transform;
                        trans.localPosition    = new Vector3(transData.x, transData.y, trans.localPosition.z);
                        trans.localScale       = new Vector3(transData.sx, transData.sy, trans.localScale.z);
                        trans.localEulerAngles = new Vector3(trans.localEulerAngles.x, trans.localEulerAngles.y, transData.rotation);

                        PoseData.DisplayData displayData = poseData.displayDatas[i];
                        switch (displayData.type)
                        {
                        case PoseData.AttachmentType.IMG:
                            SpriteFrame sf = r.GetComponent <SpriteFrame>();
                            if (sf)
                            {
                                sf.color = displayData.color;
                            }
                            else
                            {
                                SpriteRenderer sr = r.GetComponent <SpriteRenderer>();
                                if (sr)
                                {
                                    sr.color = displayData.color;
                                }
                            }
                            break;

                        case PoseData.AttachmentType.MESH:
                            SpriteMesh sm = r.GetComponent <SpriteMesh>();
                            sm.vertices = displayData.vertex;
                            for (int j = 0; j < sm.vertControlTrans.Length && j < sm.vertices.Length; ++j)
                            {
                                Transform vctr = sm.vertControlTrans[j];
                                if (vctr)
                                {
                                    vctr.localPosition = sm.vertices[j];
                                }
                            }
                            break;
                        }
                    }
                }
            }
            ResetSlotZOrder();
        }