Пример #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 spriteMesh = new SpriteMesh();
					spriteMesh.spriteRenderer = spriteRenderer;
					spriteMesh.CreateSpriteMesh();
					Texture2D spriteTexture = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);

					// Copy the sprite material
					Material spriteMaterial = new Material(spriteRenderer.sharedMaterial);
					spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
					spriteMaterial.mainTexture = spriteTexture;
					string sortLayerName = spriteRenderer.sortingLayerName;
					int sortOrder = spriteRenderer.sortingOrder;
					DestroyImmediate(spriteRenderer);
					Skin2D skin2D = o.AddComponent<Skin2D>();
					skin2D.sprite = thisSprite;
					skin = o.GetComponent<SkinnedMeshRenderer>();
					MeshFilter filter = o.GetComponent<MeshFilter>();
					skin.material = spriteMaterial;

					// Save out the material from the sprite so we have a default material
					if(!Directory.Exists("Assets/Materials")) {
						AssetDatabase.CreateFolder("Assets", "Materials");
						AssetDatabase.Refresh();
					}
					AssetDatabase.CreateAsset(spriteMaterial, "Assets/Materials/" + spriteMaterial.mainTexture.name + ".mat");
					Debug.Log("Created material " + spriteMaterial.mainTexture.name + " for " + skin.gameObject.name);
					skin2D.referenceMaterial = spriteMaterial;
					skin.sortingLayerName = sortLayerName;
					skin.sortingOrder = sortOrder;

					// Create the mesh from the selection
					filter.mesh = (Mesh)Selection.activeObject;
					if (filter.sharedMesh != null && skin.sharedMesh == null) {
						skin.sharedMesh = filter.sharedMesh;
					}
					// Recalculate the bone weights for the new mesh
					skin2D.RecalculateBoneWeights();
				}
				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> ();
			}
        }
Пример #2
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 spriteMesh = new SpriteMesh();
             spriteMesh.spriteRenderer = spriteRenderer;
             spriteMesh.CreateSpriteMesh();
             Texture2D spriteTexture  = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);
             Material  spriteMaterial = new Material(spriteRenderer.sharedMaterial);
             spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
             spriteMaterial.mainTexture = spriteTexture;
             string sortLayerName = spriteRenderer.sortingLayerName;
             int    sortOrder     = spriteRenderer.sortingOrder;
             DestroyImmediate(spriteRenderer);
             Skin2D skin2D = o.AddComponent <Skin2D>();
             skin2D.sprite = thisSprite;
             skin          = o.GetComponent <SkinnedMeshRenderer>();
             MeshFilter filter = o.GetComponent <MeshFilter>();
             skin.material         = spriteMaterial;
             skin.sortingLayerName = sortLayerName;
             skin.sortingOrder     = sortOrder;
             filter.mesh           = (Mesh)Selection.activeObject;
             if (filter.sharedMesh != null && skin.sharedMesh == null)
             {
                 skin.sharedMesh = filter.sharedMesh;
             }
             // Recalculate the bone weights for the new mesh
             skin2D.RecalculateBoneWeights();
         }
         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> ();
     }
 }
Пример #3
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 spriteMesh = new SpriteMesh();
					spriteMesh.spriteRenderer = spriteRenderer;
					spriteMesh.CreateSpriteMesh();
					Texture2D spriteTexture = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);
					Material spriteMaterial = new Material(spriteRenderer.sharedMaterial);
					spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
					spriteMaterial.mainTexture = spriteTexture;
					string sortLayerName = spriteRenderer.sortingLayerName;
					int sortOrder = spriteRenderer.sortingOrder;
					DestroyImmediate(spriteRenderer);
					Skin2D skin2D = o.AddComponent<Skin2D>();
					skin2D.sprite = thisSprite;
					skin = o.GetComponent<SkinnedMeshRenderer>();
					MeshFilter filter = o.GetComponent<MeshFilter>();
					skin.material = spriteMaterial;
					skin.sortingLayerName = sortLayerName;
					skin.sortingOrder = sortOrder;
					filter.mesh = (Mesh)Selection.activeObject;
					if (filter.sharedMesh != null && skin.sharedMesh == null) {
						skin.sharedMesh = filter.sharedMesh;
					}
					// Recalculate the bone weights for the new mesh
					skin2D.RecalculateBoneWeights();
				}
				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> ();
			}
        }
Пример #4
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 spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
                Texture2D spriteTexture  = UnityEditor.Sprites.DataUtility.GetSpriteTexture(spriteRenderer.sprite, false);
                Material  spriteMaterial = new Material(spriteRenderer.sharedMaterial);
                spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
                spriteMaterial.mainTexture = spriteTexture;
                string sortLayerName = spriteRenderer.sortingLayerName;
                int    sortOrder     = spriteRenderer.sortingOrder;
                DestroyImmediate(spriteRenderer);
                Skin2D skin2D = o.AddComponent <Skin2D>();
                skin2D.sprite = thisSprite;
                skin          = o.GetComponent <SkinnedMeshRenderer>();
                MeshFilter filter = o.GetComponent <MeshFilter>();
                skin.material         = spriteMaterial;
                skin.sortingLayerName = sortLayerName;
                skin.sortingOrder     = sortOrder;
                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)
                    {
                        bone.deform = true;
                        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> ();
        }
    }
Пример #5
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 spriteMesh = new SpriteMesh();
					spriteMesh.spriteRenderer = spriteRenderer;
					spriteMesh.CreateSpriteMesh();
					Texture2D spriteTexture = UnityEditor.Sprites.DataUtility.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();
						// 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> ();
			}
        }
Пример #6
0
    public void OnGUI()
    {
        GUILayout.Label("Sprite", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();
        spriteRenderer = (SpriteRenderer)EditorGUILayout.ObjectField(spriteRenderer, typeof(SpriteRenderer), true);
        if (Selection.activeGameObject != null) {
            GameObject o = Selection.activeGameObject;
            spriteRenderer = o.GetComponent<SpriteRenderer>();
        }
        if (EditorGUI.EndChangeCheck()) {
            polygon = new Vector2[0];
        }

        if (spriteRenderer != null) {
            EditorGUILayout.Separator();

            GUILayout.Label("Simplify", EditorStyles.boldLabel);

            simplify = EditorGUILayout.FloatField("Vertex Dist.", simplify);

            if (GUILayout.Button("Generate Polygon")) {
                Rect r = spriteRenderer.sprite.rect;
                Texture2D tex = spriteRenderer.sprite.texture;
                IBitmap bmp = ArrayBitmap.CreateFromTexture(tex, new Rect(r.x, r.y, r.width, r.height));
                polygon = BitmapHelper.CreateFromBitmap(bmp);
                polygon = SimplifyTools.DouglasPeuckerSimplify(new Vertices(polygon), simplify).ToArray();
                EditorUtility.SetDirty(this);
            }

            GUILayout.Label("Vertices: " + polygon.Length);

            EditorGUILayout.Separator();

            if (polygon.Length > 0 && GUILayout.Button("Create Mesh")) {
                CreateMesh();
                EditorUtility.SetDirty(this);
            }

            if (GUILayout.Button("Create Mesh from Sprite")) {
                SpriteMesh spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
                EditorUtility.SetDirty(this);
            }

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create Mesh from Polygon2D Collider")) {
                PolygonCollider2D polygonCollider = spriteRenderer.GetComponent<PolygonCollider2D>();
                if (polygonCollider == null) {
                    polygonCollider = spriteRenderer.gameObject.AddComponent<PolygonCollider2D>();
                }

                PolygonMesh polygonMesh = new PolygonMesh();
                polygonMesh.polygonCollider = polygonCollider;
                polygonMesh.spriteRenderer = spriteRenderer;
                polygonMesh.CreatePolygonMesh();
                EditorUtility.SetDirty(this);
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Create and Edit a Custom Polygon", EditorStyles.boldLabel);
            handleScale = EditorGUILayout.FloatField("Handle Size", handleScale);
            handleColor = EditorGUILayout.ColorField("Handle Color", handleColor);
            polyColor = EditorGUILayout.ColorField("Poly Color", polyColor);

            EditorGUILayout.Separator();

            GUILayout.Label("Ctrl + Click to Add Point, Shift + Click to Add Mid Point, Alt + Click to Remove Points", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create and Edit Polygon")) {
                CreatePolygon();
                EditorUtility.SetDirty(this);
            }

            EditorUtility.SetSelectedRenderState(spriteRenderer, EditorSelectedRenderState.Hidden);

            if (GUILayout.Button("Update Custom Mesh")) {
                if (spriteRenderer != null) UpdateMesh();
                EditorUtility.SetDirty(this);
            }

            if (GUILayout.Button("Save Custom Mesh")) {
                if (spriteRenderer != null) SaveMesh();
            }

            if (GUI.changed) {
                UpdateMesh();
                EditorUtility.SetDirty(this);
            }

            GUILayout.Label("Subdivide Mesh", EditorStyles.boldLabel);

            string[] subdivide = { "0", "1", "2", "3" };

            divisions = EditorGUILayout.Popup("Subdivisions", divisions, subdivide);

            if (GUILayout.Button("Subdivide Mesh")) {
                if (spriteRenderer != null && mesh != null) SubdivideMesh(divisions);
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Load Custom Mesh to Edit", EditorStyles.boldLabel);

            GUILayout.Label("Adding or Deleting points Re-Triangulates Mesh", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();
            customLoadMesh = (Mesh)EditorGUILayout.ObjectField(customLoadMesh, typeof(Mesh), true);

            if (GUILayout.Button("Load Custom Mesh")) {
                if (spriteRenderer != null && customLoadMesh != null) {
                    LoadMesh(customLoadMesh);
                }
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Combine Meshes", EditorStyles.boldLabel);

            GUILayout.Label("Avoid Combining Complex Meshes, results will vary", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();
            combineMesh = (Mesh)EditorGUILayout.ObjectField(combineMesh, typeof(Mesh), true);

            if (GUILayout.Button("Combine Meshes")) {
                if (spriteRenderer != null) CombineMesh();
            }
        }
    }
Пример #7
0
    public void OnGUI()
    {
        GUILayout.Label("Sprite", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();
        spriteRenderer = (SpriteRenderer)EditorGUILayout.ObjectField(spriteRenderer, typeof(SpriteRenderer), true);
        if (Selection.activeGameObject != null)
        {
            GameObject o = Selection.activeGameObject;
            spriteRenderer = o.GetComponent <SpriteRenderer>();
        }
        if (EditorGUI.EndChangeCheck())
        {
            polygon = new Vector2[0];
        }

        if (spriteRenderer != null)
        {
            EditorGUILayout.Separator();

            GUILayout.Label("Simplify", EditorStyles.boldLabel);

            simplify = EditorGUILayout.FloatField("Vertex Dist.", simplify);

            if (GUILayout.Button("Generate Polygon"))
            {
                Rect      r   = spriteRenderer.sprite.rect;
                Texture2D tex = spriteRenderer.sprite.texture;
                IBitmap   bmp = ArrayBitmap.CreateFromTexture(tex, new Rect(r.x, r.y, r.width, r.height));
                polygon = BitmapHelper.CreateFromBitmap(bmp);
                polygon = SimplifyTools.DouglasPeuckerSimplify(new Vertices(polygon), simplify).ToArray();
            }

            GUILayout.Label("Vertices: " + polygon.Length);

            EditorGUILayout.Separator();

            if (polygon.Length > 0 && GUILayout.Button("Create Mesh"))
            {
                CreateMesh();
            }

            if (GUILayout.Button("Create Mesh from Sprite"))
            {
                SpriteMesh spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
            }

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create Mesh from Polygon2D Collider"))
            {
                PolygonCollider2D polygonCollider = spriteRenderer.GetComponent <PolygonCollider2D>();
                if (polygonCollider == null)
                {
                    polygonCollider = spriteRenderer.gameObject.AddComponent <PolygonCollider2D>();
                }

                PolygonMesh polygonMesh = new PolygonMesh();
                polygonMesh.polygonCollider = polygonCollider;
                polygonMesh.spriteRenderer  = spriteRenderer;
                polygonMesh.CreatePolygonMesh();
            }
        }
    }
Пример #8
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 spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
                Texture2D spriteTexture = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);

                // Copy the sprite material
                Material spriteMaterial = new Material(spriteRenderer.sharedMaterial);
                spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
                spriteMaterial.mainTexture = spriteTexture;
                string sortLayerName = spriteRenderer.sortingLayerName;
                int    sortOrder     = spriteRenderer.sortingOrder;
                DestroyImmediate(spriteRenderer);
                Skin2D skin2D = o.AddComponent <Skin2D>();
                skin2D.sprite = thisSprite;
                skin          = o.GetComponent <SkinnedMeshRenderer>();
                MeshFilter filter = o.GetComponent <MeshFilter>();
                skin.material = spriteMaterial;

                // Save out the material from the sprite so we have a default material
                if (!Directory.Exists("Assets/Materials"))
                {
                    AssetDatabase.CreateFolder("Assets", "Materials");
                    AssetDatabase.Refresh();
                }
                AssetDatabase.CreateAsset(spriteMaterial, "Assets/Materials/" + spriteMaterial.mainTexture.name + ".mat");
                Debug.Log("Created material " + spriteMaterial.mainTexture.name + " for " + skin.gameObject.name);
                skin2D.referenceMaterial = spriteMaterial;
                skin.sortingLayerName    = sortLayerName;
                skin.sortingOrder        = sortOrder;

                // Create the mesh from the selection
                filter.mesh = (Mesh)Selection.activeObject;
                if (filter.sharedMesh != null && skin.sharedMesh == null)
                {
                    skin.sharedMesh = filter.sharedMesh;
                }
                // Recalculate the bone weights for the new mesh
                skin2D.RecalculateBoneWeights();
            }
            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> ();
        }
    }
Пример #9
0
    public void OnGUI() {
        GUILayout.Label("Sprite", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();
        spriteRenderer = (SpriteRenderer)EditorGUILayout.ObjectField(spriteRenderer, typeof(SpriteRenderer), true);
        if (Selection.activeGameObject != null) {
            GameObject o = Selection.activeGameObject;
            spriteRenderer = o.GetComponent<SpriteRenderer>();
        }
        if (EditorGUI.EndChangeCheck()) {
            polygon = new Vector2[0];
        }

        if (spriteRenderer != null) {
            EditorGUILayout.Separator();

            GUILayout.Label("Simplify", EditorStyles.boldLabel);

            simplify = EditorGUILayout.FloatField("Vertex Dist.", simplify);

            if (GUILayout.Button("Generate Polygon")) {
                Rect r = spriteRenderer.sprite.rect;
                Texture2D tex = spriteRenderer.sprite.texture;
                IBitmap bmp = ArrayBitmap.CreateFromTexture(tex, new Rect(r.x, r.y, r.width, r.height));
                polygon = BitmapHelper.CreateFromBitmap(bmp);
                polygon = SimplifyTools.DouglasPeuckerSimplify(new Vertices(polygon), simplify).ToArray();
            }

            GUILayout.Label("Vertices: " + polygon.Length);

            EditorGUILayout.Separator();

            if (polygon.Length > 0 && GUILayout.Button("Create Mesh")) {
                CreateMesh();
            }

            if (GUILayout.Button("Create Mesh from Sprite")) {
                SpriteMesh spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
            }

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create Mesh from Polygon2D Collider")) {
                PolygonCollider2D polygonCollider = spriteRenderer.GetComponent<PolygonCollider2D>();
                if (polygonCollider == null) {
                    polygonCollider = spriteRenderer.gameObject.AddComponent<PolygonCollider2D>();
                }

                PolygonMesh polygonMesh = new PolygonMesh();
                polygonMesh.polygonCollider = polygonCollider;
                polygonMesh.spriteRenderer = spriteRenderer;
                polygonMesh.CreatePolygonMesh();

            }
        }
    }
Пример #10
0
    public void OnGUI()
    {
        GUILayout.Label("Sprite", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();
        spriteRenderer = (SpriteRenderer)EditorGUILayout.ObjectField(spriteRenderer, typeof(SpriteRenderer), true);
        if (Selection.activeGameObject != null)
        {
            GameObject o = Selection.activeGameObject;
            spriteRenderer = o.GetComponent <SpriteRenderer>();
        }
        if (EditorGUI.EndChangeCheck())
        {
            polygon = new Vector2[0];
        }

        if (spriteRenderer != null)
        {
            EditorGUILayout.Separator();

            GUILayout.Label("Simplify", EditorStyles.boldLabel);

            simplify = EditorGUILayout.FloatField("Vertex Dist.", simplify);

            if (GUILayout.Button("Generate Polygon"))
            {
                Rect      r   = spriteRenderer.sprite.rect;
                Texture2D tex = spriteRenderer.sprite.texture;
                IBitmap   bmp = ArrayBitmap.CreateFromTexture(tex, new Rect(r.x, r.y, r.width, r.height));
                polygon = BitmapHelper.CreateFromBitmap(bmp);
                polygon = SimplifyTools.DouglasPeuckerSimplify(new Vertices(polygon), simplify).ToArray();
                EditorUtility.SetDirty(this);
            }

            GUILayout.Label("Vertices: " + polygon.Length);

            EditorGUILayout.Separator();

            if (polygon.Length > 0 && GUILayout.Button("Create Mesh"))
            {
                CreateMesh();
                EditorUtility.SetDirty(this);
            }

            if (GUILayout.Button("Create Mesh from Sprite"))
            {
                SpriteMesh spriteMesh = new SpriteMesh();
                spriteMesh.spriteRenderer = spriteRenderer;
                spriteMesh.CreateSpriteMesh();
                EditorUtility.SetDirty(this);
            }

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create Mesh from Polygon2D Collider"))
            {
                PolygonCollider2D polygonCollider = spriteRenderer.GetComponent <PolygonCollider2D>();
                if (polygonCollider == null)
                {
                    polygonCollider = spriteRenderer.gameObject.AddComponent <PolygonCollider2D>();
                }

                PolygonMesh polygonMesh = new PolygonMesh();
                polygonMesh.polygonCollider = polygonCollider;
                polygonMesh.spriteRenderer  = spriteRenderer;
                polygonMesh.CreatePolygonMesh();
                EditorUtility.SetDirty(this);
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Create and Edit a Custom Polygon", EditorStyles.boldLabel);
            handleScale = EditorGUILayout.FloatField("Handle Size", handleScale);
            handleColor = EditorGUILayout.ColorField("Handle Color", handleColor);
            polyColor   = EditorGUILayout.ColorField("Poly Color", polyColor);

            EditorGUILayout.Separator();

            GUILayout.Label("Ctrl + Click to Add Point, Shift + Click to Add Mid Point, Alt + Click to Remove Points", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();

            if (GUILayout.Button("Create and Edit Polygon"))
            {
                CreatePolygon();
                EditorUtility.SetDirty(this);
            }

            EditorUtility.SetSelectedWireframeHidden(spriteRenderer, true);

            if (GUILayout.Button("Update Custom Mesh"))
            {
                if (spriteRenderer != null)
                {
                    UpdateMesh();
                }
                EditorUtility.SetDirty(this);
            }

            if (GUILayout.Button("Save Custom Mesh"))
            {
                if (spriteRenderer != null)
                {
                    SaveMesh();
                }
            }

            if (GUI.changed)
            {
                UpdateMesh();
                EditorUtility.SetDirty(this);
            }

            GUILayout.Label("Subdivide Mesh", EditorStyles.boldLabel);

            string[] subdivide = { "0", "1", "2", "3" };

            divisions = EditorGUILayout.Popup("Subdivisions", divisions, subdivide);

            if (GUILayout.Button("Subdivide Mesh"))
            {
                if (spriteRenderer != null && mesh != null)
                {
                    SubdivideMesh(divisions);
                }
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Load Custom Mesh to Edit", EditorStyles.boldLabel);

            GUILayout.Label("Adding or Deleting points Re-Triangulates Mesh", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();
            customLoadMesh = (Mesh)EditorGUILayout.ObjectField(customLoadMesh, typeof(Mesh), true);

            if (GUILayout.Button("Load Custom Mesh"))
            {
                if (spriteRenderer != null && customLoadMesh != null)
                {
                    LoadMesh(customLoadMesh);
                }
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Combine Meshes", EditorStyles.boldLabel);

            GUILayout.Label("Avoid Combining Complex Meshes, results will vary", EditorStyles.whiteLabel);

            EditorGUILayout.Separator();
            combineMesh = (Mesh)EditorGUILayout.ObjectField(combineMesh, typeof(Mesh), true);

            if (GUILayout.Button("Combine Meshes"))
            {
                if (spriteRenderer != null)
                {
                    CombineMesh();
                }
            }
        }
    }