Repository: 3b1b/manim Branch: master Commit: 2e31f79a2359 Files: 160 Total size: 958.5 KB Directory structure: gitextract_x3i4m6_j/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── error-when-using.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ ├── docs.yml │ └── publish.yml ├── .gitignore ├── LICENSE.md ├── MANIFEST.in ├── README.md ├── docs/ │ ├── Makefile │ ├── example.py │ ├── make.bat │ ├── requirements.txt │ └── source/ │ ├── conf.py │ ├── development/ │ │ ├── about.rst │ │ ├── changelog.rst │ │ └── contributing.rst │ ├── documentation/ │ │ ├── animation/ │ │ │ └── index.rst │ │ ├── camera/ │ │ │ └── index.rst │ │ ├── constants.rst │ │ ├── custom_config.rst │ │ ├── mobject/ │ │ │ └── index.rst │ │ ├── scene/ │ │ │ └── index.rst │ │ ├── shaders/ │ │ │ └── index.rst │ │ └── utils/ │ │ └── index.rst │ ├── getting_started/ │ │ ├── configuration.rst │ │ ├── example_scenes.rst │ │ ├── installation.rst │ │ ├── quickstart.rst │ │ ├── structure.rst │ │ └── whatsnew.rst │ ├── index.rst │ └── manim_example_ext.py ├── example_scenes.py ├── logo/ │ └── logo.py ├── manimlib/ │ ├── __init__.py │ ├── __main__.py │ ├── animation/ │ │ ├── __init__.py │ │ ├── animation.py │ │ ├── composition.py │ │ ├── creation.py │ │ ├── fading.py │ │ ├── growing.py │ │ ├── indication.py │ │ ├── movement.py │ │ ├── numbers.py │ │ ├── rotation.py │ │ ├── specialized.py │ │ ├── transform.py │ │ ├── transform_matching_parts.py │ │ └── update.py │ ├── camera/ │ │ ├── __init__.py │ │ ├── camera.py │ │ └── camera_frame.py │ ├── config.py │ ├── constants.py │ ├── default_config.yml │ ├── event_handler/ │ │ ├── __init__.py │ │ ├── event_dispatcher.py │ │ ├── event_listner.py │ │ └── event_type.py │ ├── extract_scene.py │ ├── logger.py │ ├── mobject/ │ │ ├── __init__.py │ │ ├── boolean_ops.py │ │ ├── changing.py │ │ ├── coordinate_systems.py │ │ ├── frame.py │ │ ├── functions.py │ │ ├── geometry.py │ │ ├── interactive.py │ │ ├── matrix.py │ │ ├── mobject.py │ │ ├── mobject_update_utils.py │ │ ├── number_line.py │ │ ├── numbers.py │ │ ├── probability.py │ │ ├── shape_matchers.py │ │ ├── svg/ │ │ │ ├── __init__.py │ │ │ ├── brace.py │ │ │ ├── drawings.py │ │ │ ├── old_tex_mobject.py │ │ │ ├── special_tex.py │ │ │ ├── string_mobject.py │ │ │ ├── svg_mobject.py │ │ │ ├── tex_mobject.py │ │ │ └── text_mobject.py │ │ ├── three_dimensions.py │ │ ├── types/ │ │ │ ├── __init__.py │ │ │ ├── dot_cloud.py │ │ │ ├── image_mobject.py │ │ │ ├── point_cloud_mobject.py │ │ │ ├── surface.py │ │ │ └── vectorized_mobject.py │ │ ├── value_tracker.py │ │ └── vector_field.py │ ├── module_loader.py │ ├── scene/ │ │ ├── __init__.py │ │ ├── interactive_scene.py │ │ ├── scene.py │ │ ├── scene_embed.py │ │ └── scene_file_writer.py │ ├── shader_wrapper.py │ ├── shaders/ │ │ ├── image/ │ │ │ ├── frag.glsl │ │ │ └── vert.glsl │ │ ├── inserts/ │ │ │ ├── NOTE.md │ │ │ ├── complex_functions.glsl │ │ │ ├── emit_gl_Position.glsl │ │ │ ├── finalize_color.glsl │ │ │ ├── get_unit_normal.glsl │ │ │ └── get_xyz_to_uv.glsl │ │ ├── mandelbrot_fractal/ │ │ │ ├── frag.glsl │ │ │ └── vert.glsl │ │ ├── newton_fractal/ │ │ │ ├── frag.glsl │ │ │ └── vert.glsl │ │ ├── quadratic_bezier/ │ │ │ ├── depth/ │ │ │ │ ├── frag.glsl │ │ │ │ ├── geom.glsl │ │ │ │ └── vert.glsl │ │ │ ├── fill/ │ │ │ │ ├── frag.glsl │ │ │ │ ├── geom.glsl │ │ │ │ └── vert.glsl │ │ │ └── stroke/ │ │ │ ├── frag.glsl │ │ │ ├── geom.glsl │ │ │ └── vert.glsl │ │ ├── simple_vert.glsl │ │ ├── surface/ │ │ │ ├── frag.glsl │ │ │ └── vert.glsl │ │ ├── textured_surface/ │ │ │ ├── frag.glsl │ │ │ └── vert.glsl │ │ └── true_dot/ │ │ ├── frag.glsl │ │ ├── geom.glsl │ │ └── vert.glsl │ ├── tex_templates.yml │ ├── typing.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── bezier.py │ │ ├── cache.py │ │ ├── color.py │ │ ├── debug.py │ │ ├── dict_ops.py │ │ ├── directories.py │ │ ├── family_ops.py │ │ ├── file_ops.py │ │ ├── images.py │ │ ├── iterables.py │ │ ├── paths.py │ │ ├── rate_functions.py │ │ ├── shaders.py │ │ ├── simple_functions.py │ │ ├── sounds.py │ │ ├── space_ops.py │ │ ├── tex.py │ │ ├── tex_file_writing.py │ │ └── tex_to_symbol_count.py │ └── window.py ├── pyproject.toml ├── requirements.txt ├── setup.cfg └── setup.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- 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 ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ 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. ================================================ FILE: .github/ISSUE_TEMPLATE/error-when-using.md ================================================ --- 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**: ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Motivation ## Proposed changes - - - ## Test **Code**: **Result**: ================================================ FILE: .github/workflows/docs.yml ================================================ name: docs on: push: paths: - 'docs/**' pull_request: paths: - 'docs/**' jobs: docs: runs-on: ubuntu-latest name: build up document and deploy steps: - name: Checkout uses: actions/checkout@master - name: Install sphinx and manim env run: | pip3 install --upgrade pip sudo apt install python3-setuptools libpango1.0-dev pip3 install -r docs/requirements.txt pip3 install -r requirements.txt - name: Build document with Sphinx run: | cd docs export PATH="$PATH:/home/runner/.local/bin" export SPHINXBUILD="python3 -m sphinx" make html - name: Deploy to GitHub pages if: ${{ github.event_name == 'push' }} uses: JamesIves/github-pages-deploy-action@3.7.1 with: ACCESS_TOKEN: ${{ secrets.DOC_DEPLOY_TOKEN }} BRANCH: gh-pages FOLDER: docs/build/html ================================================ FILE: .github/workflows/publish.yml ================================================ name: Upload Python Package on: release: types: [created] jobs: deploy: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python: ["py37", "py38", "py39", "py310"] steps: - uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 with: python-version: '3.8' - 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/* ================================================ FILE: .gitignore ================================================ # Created by https://www.toptal.com/developers/gitignore/api/python # Edit at https://www.toptal.com/developers/gitignore?templates=python ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ manimlib.egg-info/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ 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/ pytestdebug.log # 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/ doc/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version pyrightconfig.json # 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 # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ pythonenv* # 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/ # profiling data .prof # End of https://www.toptal.com/developers/gitignore/api/python # Custom exclusions: .DS_Store # For manim /videos /custom_config.yml test.py CLAUDE.md ================================================ FILE: LICENSE.md ================================================ MIT License Copyright (c) 2020-2023 3Blue1Brown LLC 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. ================================================ FILE: MANIFEST.in ================================================ graft manimlib recursive-exclude manimlib *.pyc *.DS_Store ================================================ FILE: README.md ================================================

[![pypi version](https://img.shields.io/pypi/v/manimgl?logo=pypi)](https://pypi.org/project/manimgl/) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://choosealicense.com/licenses/mit/) [![Manim Subreddit](https://img.shields.io/reddit/subreddit-subscribers/manim.svg?color=ff4301&label=reddit&logo=reddit)](https://www.reddit.com/r/manim/) [![Manim Discord](https://img.shields.io/discord/581738731934056449.svg?label=discord&logo=discord)](https://discord.com/invite/bYCyhM9Kz2) [![docs](https://github.com/3b1b/manim/workflows/docs/badge.svg)](https://3b1b.github.io/manim/) Manim is an engine for precise programmatic animations, designed for creating explanatory math videos. Note, there are two versions of manim. This repository began as a personal project by the author of [3Blue1Brown](https://www.3blue1brown.com/) for the purpose of animating those videos, with video-specific code available [here](https://github.com/3b1b/videos). In 2020 a group of developers forked it into what is now the [community edition](https://github.com/ManimCommunity/manim/), with a goal of being more stable, better tested, quicker to respond to community contributions, and all around friendlier to get started with. See [this page](https://docs.manim.community/en/stable/faq/installation.html#different-versions) for more details. ## Installation > [!Warning] > **WARNING:** These instructions are for ManimGL _only_. Trying to use these instructions to install [Manim Community/manim](https://github.com/ManimCommunity/manim) or instructions there to install this version will cause problems. You should first decide which version you wish to install, then only follow the instructions for your desired version. > [!Note] > **Note**: To install manim directly through pip, please pay attention to the name of the installed package. This repository is ManimGL of 3b1b. The package name is `manimgl` instead of `manim` or `manimlib`. Please use `pip install manimgl` to install the version in this repository. Manim runs on Python 3.7 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.org) along with its development headers are required. See instruction [here](https://github.com/ManimCommunity/ManimPango#building). ### Directly ```sh # Install manimgl pip install manimgl # Try it out manimgl ``` For more options, take a look at the [Using manim](#using-manim) sections further below. If you want to hack on manimlib itself, clone this repository and in that directory execute: ```sh # Install manimgl pip install -e . # Try it out manimgl 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/3b1b/manim.git cd manim pip install -e . manimgl example_scenes.py OpeningManimExample ``` ### Mac OSX 1. Install FFmpeg, LaTeX in terminal using homebrew. ```sh brew install ffmpeg mactex ```
💡 An alternative to heavyweight MacTeX bundle. > To avoid installing the full MacTeX bundle, which is ~6GB, you can alternatively install the > lightweight [BasicTeX](https://formulae.brew.sh/cask/basictex) and then gradually add > only the LaTeX packages you actually need. A list of packages sufficient to run examples can > be found [here](https://github.com/3b1b/manim/issues/2133#issuecomment-2414547866). > For an overview of the MacTeX installer bundles, see https://www.tug.org/mactex/.
2. If you are using an ARM-based processor, install Cairo. ```sh arch -arm64 brew install pkg-config cairo ``` 3. Install latest version of manim using these command. ```sh git clone https://github.com/3b1b/manim.git cd manim pip install -e . manimgl example_scenes.py OpeningManimExample (make sure to add manimgl to path first.) ``` ## Anaconda Install 1. Install LaTeX as above. 2. Create a conda environment using `conda create -n manim python=3.9`. 3. Activate the environment using `conda activate manim`. 4. Install manimgl using `pip install -e .`. ## Using manim Try running the following: ```sh manimgl example_scenes.py OpeningManimExample ``` This should pop up a window playing a simple scene. Look through the [example scenes](https://3b1b.github.io/manim/getting_started/example_scenes.html) to see examples of the library's syntax, animation types and object types. In the [3b1b/videos](https://github.com/3b1b/videos) repo, you can see all the code for 3blue1brown videos, though code from older videos may not be compatible with the most recent version of manim. The readme of that repo also outlines some details for how to set up a more interactive workflow, as shown in [this manim demo video](https://www.youtube.com/watch?v=rbu7Zu5X1zI) for example. When running in the CLI, 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. For example [this is the one](https://github.com/3b1b/videos/blob/master/custom_config.yml) for 3blue1brown videos. 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. ### Documentation Documentation is in progress at [3b1b.github.io/manim](https://3b1b.github.io/manim/). And there is also a Chinese version maintained by [**@manim-kindergarten**](https://manim.org.cn): [docs.manim.org.cn](https://docs.manim.org.cn/) (in Chinese). [manim-kindergarten](https://github.com/manim-kindergarten/) wrote and collected some useful extra classes and some codes of videos in [manim_sandbox repo](https://github.com/manim-kindergarten/manim_sandbox). ## Contributing Is always welcome. As mentioned above, the [community edition](https://github.com/ManimCommunity/manim) has the most active ecosystem for contributions, with testing and continuous integration, but pull requests are welcome here too. Please explain the motivation for a given change and examples of its effect. ## License This project falls under the MIT license. ================================================ FILE: docs/Makefile ================================================ # 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) ================================================ FILE: docs/example.py ================================================ from manimlib 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) ================================================ FILE: docs/make.bat ================================================ @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 ================================================ FILE: docs/requirements.txt ================================================ Sphinx==3.0.3 sphinx-copybutton furo==2020.10.5b9 Jinja2 ================================================ FILE: docs/source/conf.py ================================================ 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, } ================================================ FILE: docs/source/development/about.rst ================================================ 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` ================================================ FILE: docs/source/development/changelog.rst ================================================ 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