diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..bad3125 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,20 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +### Describe the bug + + +**Code**: + + +**Wrong display or Error traceback**: + + +### Additional context + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..5581a02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Ask A Question + url: https://github.com/3b1b/manim/discussions/categories/q-a + about: Please ask questions you encountered here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/error-when-using.md b/.github/ISSUE_TEMPLATE/error-when-using.md new file mode 100644 index 0000000..0686dfd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/error-when-using.md @@ -0,0 +1,23 @@ +--- +name: Error when using +about: The error you encountered while using manim +title: '' +labels: '' +assignees: '' + +--- + +### Describe the error + + +### Code and Error +**Code**: + + +**Error**: + + +### Environment +**OS System**: +**manim version**: master +**python version**: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..3ca8f47 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ + + +## Motivation + + +## Proposed changes + +- +- +- + +## Test + +**Code**: + +**Result**: \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..df25d09 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,46 @@ +name: docs + +on: + push: + branches: + - main + paths: + - 'docs/**' + workflow_dispatch: + +permissions: + contents: read + pages: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout Source + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Sphinx and Dependencies + run: | + python -m pip install --upgrade pip + pip install sphinx sphinx-copybutton furo Jinja2 + + - name: Build Documentation + working-directory: docs + run: | + make html + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.MANIMX }} + publish_dir: ./docs/build/html diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..1301e8c --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,37 @@ +name: Upload Python Package + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + python: ["py38", "py39", "py310", "py311", "py312"] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine build + + - name: Build wheels + run: python setup.py bdist_wheel --python-tag ${{ matrix.python }} + + - name: Upload wheels + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + twine upload dist/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82f9275 --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..b596941 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/manimx-main.iml b/.idea/manimx-main.iml new file mode 100644 index 0000000..8b8c395 --- /dev/null +++ b/.idea/manimx-main.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b195fad --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4888a36 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Manim-X + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..65835ab --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +graft manimx +recursive-exclude manimx *.pyc *.DS_Store \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..71f236f --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# ManimX + +[![pypi version](https://img.shields.io/pypi/v/manimx?logo=pypi)](https://pypi.org/project/manimx/) +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://choosealicense.com/licenses/mit/) +[![docs](https://github.com/Manim-X/manimx/actions/workflows/docs.yml/badge.svg?branch=main)](https://github.com/Manim-X/manimx/actions/workflows/docs.yml) +[![Manim Subreddit](https://img.shields.io/reddit/subreddit-subscribers/manimx.svg?color=ff4301&label=reddit&logo=reddit)](https://www.reddit.com/r/ManimX/) +[![ManimX Discord](https://img.shields.io/discord/581738731934056449.svg?label=discord&logo=discord)]([https://discord.com](https://discord.com/channels/1248543359472111684)) + +Manim is an engine for precise programmatic animations, designed for creating explanatory math videos. + +## Installation + +Manim runs on Python 3.8 or higher. + +System requirements are [FFmpeg](https://ffmpeg.org/), [OpenGL](https://www.opengl.org/) and [LaTeX](https://www.latex-project.org) (optional, if you want to use LaTeX). +For Linux, [Pango](https://pango.gnome.org) along with its development headers are required. See instruction [here](https://github.com/ManimCommunity/ManimPango#building). + + +### Directly + +```sh +# Install manimx +pip install manimx + +# Try it out +manimx +``` + +For more options, take a look at the [Using manim](#using-manim) sections further below. + +If you want to hack on manimx itself, clone this repository and in that directory execute: + +```sh +# Install manimx +pip install -e . + +# Try it out +manimx example_scenes.py OpeningManimExample +# or +manim-render example_scenes.py OpeningManimExample +``` + +### Directly (Windows) + +1. [Install FFmpeg](https://www.wikihow.com/Install-FFmpeg-on-Windows). +2. Install a LaTeX distribution. [MiKTeX](https://miktex.org/download) is recommended. +3. Install the remaining Python packages. + ```sh + git clone https://github.com/Manim-X/manimx.git + cd manimx + pip install -e . + manimx example_scenes.py OpeningManimExample + ``` + +### Mac OSX + +1. Install FFmpeg, LaTeX in terminal using homebrew. + ```sh + brew install ffmpeg mactex + ``` + +2. Install latest version of manimx using these command. + ```sh + git clone https://github.com/Manim-X/manimx.git + cd manimx + pip install -e . + manimx example_scenes.py OpeningManimExample + ``` + +## Anaconda Install + +1. Install LaTeX as above. +2. Create a conda environment using `conda create -n manimx python=3.11`. +3. Activate the environment using `conda activate manimx`. +4. Install manimx using `pip install -e .`. + + +## Using manim +Try running the following: +```sh +manimx example_scenes.py OpeningManimExample +``` +This should pop up a window playing a simple scene. + +Some useful flags include: +* `-w` to write the scene to a file +* `-o` to write the scene to a file and open the result +* `-s` to skip to the end and just show the final frame. + * `-so` will save the final frame to an image and show it +* `-n ` to skip ahead to the `n`'th animation of a scene. +* `-f` to make the playback window fullscreen + +Take a look at custom_config.yml for further configuration. To add your customization, you can either edit this file, or add another file by the same name "custom_config.yml" to whatever directory you are running manim from. There you can specify where videos should be output to, where manim should look for image files and sounds you want to read in, and other defaults regarding style and video quality. + +- [example scenes](https://manim-x.github.io/manimx/getting_started/example_scenes.html) + +### Documentation + +- [https://manim-x.github.io/manimx](https://manim-x.github.io/manimx) + +## License +This project falls under the MIT license. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/example.py b/docs/example.py new file mode 100644 index 0000000..32e5650 --- /dev/null +++ b/docs/example.py @@ -0,0 +1,37 @@ +from manimx import * + +class SquareToCircle(Scene): + def construct(self): + circle = Circle() + circle.set_fill(BLUE, opacity=0.5) + circle.set_stroke(BLUE_E, width=4) + square = Square() + + self.play(ShowCreation(square)) + self.wait() + self.play(ReplacementTransform(square, circle)) + self.wait() + # Try typing the following lines + # self.play(circle.animate.stretch(4, dim=0)) + # self.play(Rotate(circle, TAU / 4)) + # self.play(circle.animate.shift(2 * RIGHT), circle.animate.scale(0.25)) + # circle.insert_n_curves(10) + # self.play(circle.animate.apply_complex_function(lambda z: z**2)) + +class SquareToCircleEmbed(Scene): + def construct(self): + circle = Circle() + circle.set_fill(BLUE, opacity=0.5) + circle.set_stroke(BLUE_E, width=4) + + self.add(circle) + self.wait() + self.play(circle.animate.stretch(4, dim=0)) + self.wait(1.5) + self.play(Rotate(circle, TAU / 4)) + self.wait(1.5) + self.play(circle.animate.shift(2 * RIGHT), circle.animate.scale(0.25)) + self.wait(1.5) + circle.insert_n_curves(10) + self.play(circle.animate.apply_complex_function(lambda z: z**2)) + self.wait(2) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..d870410 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +Sphinx==3.0.3 +sphinx-copybutton +furo==2020.10.5b9 +Jinja2 \ No newline at end of file diff --git a/docs/source/_static/icon.png b/docs/source/_static/icon.png new file mode 100644 index 0000000..0c1a33f Binary files /dev/null and b/docs/source/_static/icon.png differ diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..e9d0844 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,43 @@ +import os +import sys +sys.path.insert(0, os.path.abspath(".")) +sys.path.insert(0, os.path.abspath('../../')) + + +project = 'manim' +copyright = '- This document has been placed in the public domain.' +author = 'TonyCrane' + +release = '' + +extensions = [ + 'sphinx.ext.todo', + 'sphinx.ext.githubpages', + 'sphinx.ext.mathjax', + 'sphinx.ext.intersphinx', + 'sphinx.ext.autodoc', + 'sphinx.ext.coverage', + 'sphinx.ext.napoleon', + 'sphinx_copybutton', + 'manim_example_ext' +] + +autoclass_content = 'both' +mathjax_path = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" + +templates_path = ['_templates'] +source_suffix = '.rst' +master_doc = 'index' +pygments_style = 'default' + +html_static_path = ["_static"] +html_css_files = [ + "https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manimgl_assets/custom.css", + "https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manimgl_assets/colors.css" +] +html_theme = 'furo' # pip install furo==2020.10.5b9 +html_favicon = '_static/icon.png' +html_logo = '../../logo/transparent_graph.png' +html_theme_options = { + "sidebar_hide_name": True, +} diff --git a/docs/source/development/about.rst b/docs/source/development/about.rst new file mode 100644 index 0000000..02bf7c3 --- /dev/null +++ b/docs/source/development/about.rst @@ -0,0 +1,31 @@ +About +===== + +About Manim +----------- + +Manim is an animation engine for explanatory math videos. +You can use it to make math videos (or other fields) like 3Blue1Brown. + +There are mainly two versions here: + +- `3b1b/manim `_ : Maintained by Grant Sanderson of 3Blue1Brown. + +Using OpenGL and its GLSL language to use GPU for rendering. It has higher efficiency, +faster rendering speed, and supports real-time rendering and interaction. + +- `ManimCommunity/manim `_ : Maintained by Manim Community Dev Team. + +Using multiple backend rendering. There is better documentation and +a more open contribution community. + +About this documentation +------------------------ + +This documentation is based on the version in `3b1b/manim `_. +Created by `TonyCrane `_ ("鹤翔万里" in Chinese) and in production. + +Among them, the ``manim_example_ext`` extension for Sphinx refers to +`the documentation of ManimCommunity `_. + +If you want to contribute to manim or this document, please see: :doc:`contributing` \ No newline at end of file diff --git a/docs/source/development/changelog.rst b/docs/source/development/changelog.rst new file mode 100644 index 0000000..b5fb4c4 --- /dev/null +++ b/docs/source/development/changelog.rst @@ -0,0 +1,412 @@ +Changelog +========= + +Unreleased +---------- + +Breaking Changes +^^^^^^^^^^^^^^^^ +- Added ``InteractiveScene`` (`#1794 `__) + +Fixed bugs +^^^^^^^^^^ +- Fixed ``ImageMobject`` by overriding ``set_color`` method (`#1791 `__) +- Fixed bug with trying to close window during embed (`#1796 `__) +- Fixed animating ``Mobject.restore`` bug (`#1796 `__) +- Fixed ``InteractiveScene.refresh_selection_highlight`` (`#1802 `__) +- Fixed ``VMobject.match_style`` (`#1821 `__) + +New Features +^^^^^^^^^^^^ +- Added specific euler angle getters (`#1794 `__) +- Added start angle option to ``Circle`` (`#1794 `__) +- Added ``Mobject.is_touching`` (`#1794 `__) +- Added ``Mobject.get_highlight`` (`#1794 `__) +- Allowed for saving and loading mobjects from file (`#1794 `__) +- Added ``Mobject.get_all_corners`` (`#1794 `__) +- Added ``Scene.id_to_mobject`` and ``Scene.ids_to_group`` (`#1794 `__) +- Added ``Scene.save_mobject`` and ``Scene.load_mobject`` to allow for saving and loading mobjects from file at the Scene level (`#1794 `__) +- Added ``InteractiveScene`` (`#1794 `__) +- Added ``VHighlight`` (`#1794 `__) +- Allowed for sweeping selection (`#1796 `__) +- Allowed stretched-resizing (`#1796 `__) +- Added cursor location label (`#1796 `__) +- Added ``Mobject.deserialize`` (`#1796 `__) +- Added undo and redo stacks for scene (`#1796 `__) +- Added ``Mobject.looks_identical`` (`#1802 `__) +- Added equality for ``ShaderWrapper`` (`#1802 `__) +- Added ``Mobject.get_ancestors`` (`#1802 `__) +- Added smarter default radius to ``Polygon.round_corners`` (`#1802 `__) +- Added checkpoints to ``Scene`` (`#1821 `__) +- Added ``crosshair`` to ``InteractiveScene`` (`#1821 `__) +- Added ``SceneState`` (`#1821 `__) +- Added ``time_span`` option to ``Animation`` (`#1821 `__) +- Added ``Mobject.arrange_to_fit_dim`` (`#1821 `__) +- Added ``DecimalNumber.get_tex`` (`#1821 `__) + +Refactor +^^^^^^^^ +- Updated parent updater status when adding updaters (`#1794 `__) +- Added case for zero vectors on ``angle_between_vectors`` (`#1794 `__) +- Refactored ``Mobject.clear_updaters`` (`#1794 `__) +- Changed the way changing-vs-static mobjects are tracked (more details see `#1794 `__) +- Refactored ``Mobject.is_point_touching`` (`#1794 `__) +- Refactored ``Mobject.make_movable`` and ``Mobject.set_animating_status`` to recurse over family (`#1794 `__) +- Refactored ``AnimationGroup`` (`#1794 `__) +- Refactored ``Scene.save_state`` and ``Scene.restore`` (`#1794 `__) +- Added ``MANIM_COLORS`` (`#1794 `__) +- Changed default transparent background codec to be prores (`#1794 `__) +- Simplified ``Mobject.copy`` (`#1794 `__) +- Refactored ``StringMobject`` and relevant classes (`#1795 `__) +- Updates to copying based on pickle serializing (`#1796 `) +- Removed ``refresh_shader_wrapper_id`` from ``Mobject.become`` (`#1796 `__) +- Refactored ``Scene.embed`` to play nicely with gui interactions (`#1796 `__) +- Made ``BlankScene`` inherit from ``InteractiveScene`` (`#1796 `__) +- Updated behavior of -e flag to take in (optional) strings as inputs (`#1796 `__) +- Refactor -e flag (`#1796 `__) +- Reverted to original copying scheme (`#1796 `__) +- Renamed ``Mobject.is_movable`` to ``Mobject.interaction_allowed`` (`#1796 `__) +- Refreshed static mobjects on undo's and redo's (`#1796 `__) +- Factored out event handling (`#1796 `__) +- Removed ``Mobject.interaction_allowed``, in favor of using ``_is_animating`` for multiple purposes (`#1796 `__) +- Moved Command + z and Command + shift + z behavior to Scene (`#1797 `__) +- Slight copy refactor (`#1797 `__) +- When scene saves state, have it only copy mobjects which have changed (`#1802 `__) +- Cleaned up ``Scene.remove`` function (`#1802 `__) +- Speed-ups to ``Mobject.copy`` (`#1802 `__) +- Slight speed-up to ``InteractiveScene.gather_selection`` (`#1802 `__) +- Only leave wait notes in presenter mode (`#1802 `__) +- Refactored ``remove_list_redundancies`` and ``list_update`` (`#1821 `__) +- Match updaters in ``Mobject.become`` (`#1821 `__) +- Don't show animation progress bar by default (`#1821 `__) +- Handle quitting during scene more gracefully (`#1821 `__) +- Made ``selection_highlight`` refresh with an updater (`#1821 `__) +- Refactored ``anims_from_play_args`` to ``prepare_animations`` which deprecating old style ``self.play(mob.method, ...)`` (`#1821 `__) +- Made presenter mode hold before first play call (`#1821 `__) +- Update frame on all play calls when skipping animations, so as to provide a rapid preview during scene loading (`#1821 `__) +- Renamed frame_rate to fps (`#1821 `__) +- Let default text alignment be decided in default_config (`#1821 `__) + +Dependencies +^^^^^^^^^^^^ +- Added dependency on ``pyperclip`` (`#1794 `__) + + +v1.6.1 +------ + +Fixed bugs +^^^^^^^^^^ +- Fixed the bug of ``MTex`` with multi-line tex string (`#1785 `__) +- Fixed ``interpolate`` (`#1788 `__) +- Fixed ``ImageMobject`` (`#1791 `__) + +Refactor +^^^^^^^^ +- Added ``\overset`` as a special string in ``Tex`` (`#1783 `__) +- Added ``outer_interpolate`` to perform interpolation using ``np.outer`` on arrays (`#1788 `__) + +v1.6.0 +------ + +Breaking changes +^^^^^^^^^^^^^^^^ +- **Python 3.6 is no longer supported** (`#1736 `__) + +Fixed bugs +^^^^^^^^^^ +- Fixed the width of riemann rectangles (`#1762 `__) +- Bug fixed in cases where empty array is passed to shader (`#1764 `__) +- Fixed ``AddTextWordByWord`` (`#1772 `__) +- Fixed ``ControlsExample`` (`#1781 `__) + + +New features +^^^^^^^^^^^^ +- Added more functions to ``Text`` (details: `#1751 `__) +- Allowed ``interpolate`` to work on an array of alpha values (`#1764 `__) +- Allowed ``Numberline.number_to_point`` and ``CoordinateSystem.coords_to_point`` to work on an array of inputs (`#1764 `__) +- Added a basic ``Prismify`` to turn a flat ``VMobject`` into something with depth (`#1764 `__) +- Added ``GlowDots``, analogous to ``GlowDot`` (`#1764 `__) +- Added ``TransformMatchingStrings`` which is compatible with ``Text`` and ``MTex`` (`#1772 `__) +- Added support for ``substring`` and ``case_sensitive`` parameters for ``LabelledString.get_parts_by_string`` (`#1780 `__) + + +Refactor +^^^^^^^^ +- Added type hints (`#1736 `__) +- Specifid UTF-8 encoding for tex files (`#1748 `__) +- Refactored ``Text`` with the latest manimpango (`#1751 `__) +- Reorganized getters for ``ParametricCurve`` (`#1757 `__) +- Refactored ``CameraFrame`` to use ``scipy.spatial.transform.Rotation`` (`#1764 `__) +- Refactored rotation methods to use ``scipy.spatial.transform.Rotation`` (`#1764 `__) +- Used ``stroke_color`` to init ``Arrow`` (`#1764 `__) +- Refactored ``Mobject.set_rgba_array_by_color`` (`#1764 `__) +- Made panning more sensitive to mouse movements (`#1764 `__) +- Added loading progress for large SVGs (`#1766 `__) +- Added getter/setter of ``field_of_view`` for ``CameraFrame`` (`#1770 `__) +- Renamed ``focal_distance`` to ``focal_dist_to_height`` and added getter/setter (`#1770 `__) +- Added getter and setter for ``VMobject.joint_type`` (`#1770 `__) +- Refactored ``VCube`` (`#1770 `__) +- Refactored ``Prism`` to receive ``width height depth`` instead of ``dimensions`` (`#1770 `__) +- Refactored ``Text``, ``MarkupText`` and ``MTex`` based on ``LabelledString`` (`#1772 `__) +- Refactored ``LabelledString`` and relevant classes (`#1779 `__) + + +v1.5.0 +------ + +Fixed bugs +^^^^^^^^^^ +- Bug fix for the case of calling ``Write`` on a null object (`#1740 `__) + + +New features +^^^^^^^^^^^^ +- Added ``TransformMatchingMTex`` (`#1725 `__) +- Added ``ImplicitFunction`` (`#1727 `__) +- Added ``Polyline`` (`#1731 `__) +- Allowed ``Mobject.set_points`` to take in an empty list, and added ``Mobject.add_point`` (`#1739 `__) +- Added ``Scene.refresh_locked_data`` (`#1739 `__) +- Added presenter mode to scenes with ``-p`` option (`#1739 `__ and `#1742 `__) +- Allowed for an embed by hitting ``ctrl+shift+e`` during interaction (`#1739 `__ and `#1746 `__) +- Added ``Mobject.set_min_width/height/depth`` (`#1739 `__) +- Allowed ``Mobject.match_coord/x/y/z`` to take in a point (`#1739 `__) +- Added ``text_config`` to ``DecimalNumber`` (`#1744 `__) + + +Refactor +^^^^^^^^ +- Refactored ``MTex`` (`#1725 `__) +- Refactored ``SVGMobject`` with svgelements (`#1731 `__) +- Made sure ``ParametricCurve`` has at least one point (`#1739 `__) +- Set default to no tips on ``Axes`` (`#1739 `__) +- Stopped displaying when writing tex string is happening (`#1739 `__) +- Reorganize inheriting order and refactor SVGMobject (`#1745 `__) + + +Dependencies +^^^^^^^^^^^^ +- Added dependency on ``isosurfaces`` (`#1727 `__) +- Removed dependency on ``argparse`` since it's a built-in module (`#1728 `__) +- Removed dependency on ``pyreadline`` (`#1728 `__) +- Removed dependency on ``cssselect2`` (`#1731 `__) +- Added dependency on ``svgelements`` (`#1731 `__) + + +v1.4.1 +------ + +Fixed bugs +^^^^^^^^^^ +- Temporarily fixed boolean operations' bug (`#1724 `__) +- Import ``Iterable`` from ``collections.abc`` instead of ``collections`` which is deprecated since python 3.9 (`d2e0811 `__) + +v1.4.0 +------ + +Fixed bugs +^^^^^^^^^^ +- Temporarily fixed ``Lightbulb`` (`f1996f8 `__) +- Fixed some bugs of ``SVGMobject`` (`#1712 `__) +- Fixed some bugs of SVG path string parser (`#1717 `__) +- Fixed some bugs of ``MTex`` (`#1720 `__) + +New features +^^^^^^^^^^^^ +- Added option to add ticks on x-axis in ``BarChart`` (`#1694 `__) +- Added ``lable_buff`` config parameter for ``Brace`` (`#1704 `__) +- Added support for ``rotate skewX skewY`` transform in SVG (`#1712 `__) +- Added style support to ``SVGMobject`` (`#1717 `__) +- Added parser to