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
================================================
[](https://pypi.org/project/manimgl/)
[](http://choosealicense.com/licenses/mit/)
[](https://www.reddit.com/r/manim/)
[](https://discord.com/invite/bYCyhM9Kz2)
[](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