public override void OnModuleActivate()
        {
            InitStyles();

            Undo.undoRedoPerformed           += UndoRedoPerformed;
            spriteEditor.enableMouseMoveEvent = true;

            IGUIWrapper guiWrapper = new GUIWrapper();

            m_SpriteMeshCache      = ScriptableObject.CreateInstance <SpriteMeshCache>();
            m_Triangulator         = new Triangulator();
            m_WeightGenerator      = new BoundedBiharmonicWeightsGenerator();
            m_OutlineGenerator     = new OutlineGenerator();
            m_UndoObject           = new UndoObject(m_SpriteMeshCache);
            m_SpriteMeshController = new SpriteMeshController();
            m_SpriteMeshView       = new SpriteMeshView(guiWrapper);
            m_BindPoseController   = new BindPoseController();
            m_BindPoseView         = new BindPoseView(guiWrapper);
            m_RectSelectionTool    = new RectSelectionTool(m_SpriteMeshCache);
            m_UnselectTool         = new UnselectTool(m_SpriteMeshCache);
            m_WeightEditor         = new WeightEditor();
            m_BrushWeightTool      = new BrushWeightTool();
            m_SliderWeightTool     = new SliderWeightTool();
            m_WeightInspector      = new WeightInspector(m_SpriteMeshCache);
            m_BoneInspector        = new BoneInspector(m_SpriteMeshCache);
            m_MeshPreview          = new MeshPreview();

            var dataProvider       = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            var boneProvider       = spriteEditor.GetDataProvider <ISpriteBoneDataProvider>();
            var spriteMeshProvider = spriteEditor.GetDataProvider <ISpriteMeshDataProvider>();
            var spriteRects        = dataProvider.GetSpriteRects();
            var textureProvider    = spriteEditor.GetDataProvider <ITextureDataProvider>();

            m_MeshPreview.textureDataProvider = textureProvider;

            for (var i = 0; i < spriteRects.Length; i++)
            {
                var spriteRect     = spriteRects[i];
                var spriteMeshData = new SpriteMeshData();
                spriteMeshData.spriteID = spriteRect.spriteID;
                spriteMeshData.frame    = spriteRect.rect;
                spriteMeshData.pivot    = spriteRect.rect.position + Vector2.Scale(spriteRect.rect.size, spriteRect.pivot);
                spriteMeshData.bones    = MeshModuleUtility.CreateSpriteBoneData(boneProvider.GetBones(spriteRect.spriteID), spriteMeshData.CalculateRootMatrix());

                var metaVertices = spriteMeshProvider.GetVertices(spriteRect.spriteID);
                foreach (var mv in metaVertices)
                {
                    var v = new Vertex2D(mv.position + spriteRect.rect.position, mv.boneWeight);
                    spriteMeshData.vertices.Add(v);
                }

                spriteMeshData.indices = new List <int>(spriteMeshProvider.GetIndices(spriteRect.spriteID));

                Vector2Int[] edges = spriteMeshProvider.GetEdges(spriteRect.spriteID);

                foreach (var e in edges)
                {
                    spriteMeshData.edges.Add(new Edge(e.x, e.y));
                }

                m_SpriteMeshCache.AddSpriteMeshData(spriteMeshData);
            }

            m_WeightEditorWindow = new ModuleWindow(Contents.weightEditor.text, new Rect(0f, 0f, 300f, 195f));
            m_WeightEditorWindow.windowGUICallback = WeightEditorInspector;

            m_InspectorWindow = new ModuleWindow(Contents.inspector.text, new Rect(0f, 0f, 300f, 95f));

            m_GenerateGeometryMenuContents.settings           = m_GenerateGeometrySettings;
            m_GenerateGeometryMenuContents.onGenerateGeometry = OnGenerateGeometry;

            m_BindPoseController.onSkinPreviewChanged += () =>
            {
                m_MeshPreview.SetSkinningDirty();
            };

            m_MeshPreview.SetMeshDirty();

            m_CachedSpriteMeshData = selectedSpriteMeshData;
        }