Skip to content

Commit 57f228b

Browse files
authored
Js tweening (#952)
* Add .animate attribute to mobjects * Return function from _AnimationBuilder.__getattr__ * black * Pass background color to JS renderer * Handle default case * Pass background color to JS renderer * Remove line that came back in the merge * Handle FrameServer case * Use community colors by default * Allow for chaining _AnimationBuilder * Trying to do tweening * Add _AnimationBuilder.build() * Apply docs patch * Pass tweening data * Pass ID for ImageMobject * Fix Wait bug, add FadeIn tween data * Remove unused proto fields * Remove unused proto field * Optimize RPCs * Handle frame skipping better * Refactoring * Ignore PreviewMode.ALL * Remove preview mode * Don't send tween data for wait * Opacity fixes * Add comments * Simplify protos * Add tween data for wait * Add todo * Serialize when updating * Prepare to send tweened and non-tweened mobject IDs * Pass updater information to javascript * Add log * Rename js_* -> webgl_*, remove WebGLScene * rename js->webgl in workflow file * Update doctest * Update .gitattributes * Remove try/except for webgl imports * Step through animations using updaters with fixed frame rate * Add --webgl_updater_fps flag * Configuration test * configuration test * JS->WebGL * Add install message
1 parent 1d3e36a commit 57f228b

File tree

21 files changed

+820
-431
lines changed

21 files changed

+820
-431
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
manim/grpc/gen/* linguist-generated=true
1+
manim/grpc/gen/** linguist-generated=true

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ jobs:
112112
113113
- name: Install manim
114114
run: |
115-
poetry install -E js_renderer
115+
poetry install -E webgl_renderer
116116
117117
- name: Run tests
118118
run: poetry run pytest

docs/source/tutorials/configuration.rst

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -351,14 +351,14 @@ A list of all config options
351351
'custom_folders', 'disable_caching', 'dry_run', 'ffmpeg_loglevel', 'flush_cache',
352352
'frame_height', 'frame_rate', 'frame_size', 'frame_width', 'frame_x_radius',
353353
'frame_y_radius', 'from_animation_number', 'images_dir', 'input_file',
354-
'js_renderer_path', 'leave_progress_bars', 'left_side', 'log_dir', 'log_to_file',
354+
'leave_progress_bars', 'left_side', 'log_dir', 'log_to_file',
355355
'max_files_cached', 'media_dir', 'movie_file_extension', 'output_file',
356356
'partial_movie_dir', 'pixel_height', 'pixel_width', 'plugins', 'png_mode',
357357
'preview', 'progress_bar', 'quality', 'right_side', 'save_as_gif', 'save_last_frame',
358358
'save_pngs', 'scene_names', 'show_in_file_browser', 'sound', 'tex_dir',
359359
'tex_template', 'tex_template_file', 'text_dir', 'top', 'transparent',
360-
'upto_animation_number', 'use_js_renderer', 'verbosity', 'video_dir',
361-
'write_all', 'write_to_movie']
360+
'upto_animation_number', 'use_webgl_renderer', 'verbosity', 'video_dir',
361+
'webgl_renderer_path', 'webgl_updater_fps', 'write_all', 'write_to_movie']
362362

363363

364364
A list of all CLI flags
@@ -429,9 +429,11 @@ A list of all CLI flags
429429
-n FROM_ANIMATION_NUMBER, --from_animation_number FROM_ANIMATION_NUMBER
430430
Start rendering at the specified animation index, instead of the first animation. If you pass in two comma separated values, e.g. '3,6', it will end
431431
the rendering at the second value
432-
--use_js_renderer Render animations using the javascript frontend
433-
--js_renderer_path JS_RENDERER_PATH
434-
Path to the javascript frontend
432+
--use_webgl_renderer Render animations using the WebGL frontend
433+
--webgl_renderer_path WEBGL_RENDERER_PATH
434+
Path to the WebGL frontend
435+
--webgl_updater_fps WEBGL_UPDATER_FPS
436+
Frame rate to use when generating keyframe data for animations that use updaters while using the WebGL frontend
435437
--config_file CONFIG_FILE
436438
Specify the configuration file
437439
--custom_folders Use the folders defined in the [custom_folders] section of the config file to define the output folder structure

manim/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,6 @@
5959
from .scene.moving_camera_scene import *
6060
from .scene.reconfigurable_scene import *
6161

62-
try:
63-
from .scene.js_scene import *
64-
except ModuleNotFoundError:
65-
pass # optional deps
6662
from .scene.scene import *
6763
from .scene.sample_space_scene import *
6864
from .scene.three_d_scene import *

manim/__main__.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
from manim.utils.file_ops import open_file as open_media_file
1313
from manim._config.main_utils import parse_args
1414

15-
try:
16-
from manim.grpc.impl import frame_server_impl
17-
except ImportError:
18-
frame_server_impl = None
19-
2015

2116
def open_file_if_needed(file_writer):
2217
if config["verbosity"] != "DEBUG":
@@ -77,16 +72,20 @@ def main():
7772
else:
7873
config.digest_args(args)
7974
input_file = config.get_dir("input_file")
80-
if config["use_js_renderer"]:
75+
if config["use_webgl_renderer"]:
8176
try:
82-
if frame_server_impl is None:
83-
raise ImportError("Dependencies for JS renderer is not installed.")
77+
from manim.grpc.impl import frame_server_impl
78+
8479
server = frame_server_impl.get(input_file)
8580
server.start()
8681
server.wait_for_termination()
87-
except Exception:
82+
except ModuleNotFoundError as e:
8883
print("\n\n")
89-
traceback.print_exc()
84+
print(
85+
"Dependencies for the WebGL render are missing. Run "
86+
"pip install manim[webgl_renderer] to install them."
87+
)
88+
print(e)
9089
print("\n\n")
9190
else:
9291
for SceneClass in scene_classes_from_file(input_file):

manim/_config/default.cfg

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,14 @@ tex_dir = {media_dir}/Tex
8484
text_dir = {media_dir}/texts
8585
partial_movie_dir = {video_dir}/partial_movie_files/{scene_name}
8686

87-
# --use_js_renderer
88-
use_js_renderer = False
87+
# --use_webgl_renderer
88+
use_webgl_renderer = False
8989

90-
# --js_renderer_path
91-
js_renderer_path =
90+
# --webgl_renderer_path
91+
webgl_renderer_path =
92+
93+
# --webgl_updater_fps
94+
webgl_updater_fps = 15
9295

9396
# If the -t (--transparent) flag is used, these will be replaced with the
9497
# values specified in the [TRANSPARENT] section later in this file.

manim/_config/main_utils.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,15 +412,21 @@ def _parse_args_no_subcmd(args: list) -> argparse.Namespace:
412412
)
413413

414414
parser.add_argument(
415-
"--use_js_renderer",
416-
help="Render animations using the javascript frontend",
415+
"--use_webgl_renderer",
416+
help="Render animations using the WebGL frontend",
417417
action="store_const",
418418
const=True,
419419
)
420420

421421
parser.add_argument(
422-
"--js_renderer_path",
423-
help="Path to the javascript frontend",
422+
"--webgl_renderer_path",
423+
help="Path to the WebGL frontend",
424+
)
425+
426+
parser.add_argument(
427+
"--webgl_updater_fps",
428+
type=int,
429+
help="Frame rate to use when generating keyframe data for animations that use updaters while using the WebGL frontend",
424430
)
425431

426432
# Specify the manim.cfg file

manim/_config/utils.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ class MyScene(Scene):
262262
"from_animation_number",
263263
"images_dir",
264264
"input_file",
265-
"js_renderer_path",
265+
"webgl_renderer_path",
266266
"leave_progress_bars",
267267
"log_dir",
268268
"log_to_file",
@@ -286,7 +286,8 @@ class MyScene(Scene):
286286
"tex_template_file",
287287
"text_dir",
288288
"upto_animation_number",
289-
"use_js_renderer",
289+
"use_webgl_renderer",
290+
"webgl_updater_fps",
290291
"verbosity",
291292
"video_dir",
292293
"write_all",
@@ -508,7 +509,7 @@ def digest_parser(self, parser: configparser.ConfigParser) -> "ManimConfig":
508509
"disable_caching",
509510
"flush_cache",
510511
"custom_folders",
511-
"use_js_renderer",
512+
"use_webgl_renderer",
512513
]:
513514
setattr(self, key, parser["CLI"].getboolean(key, fallback=False))
514515

@@ -521,6 +522,7 @@ def digest_parser(self, parser: configparser.ConfigParser) -> "ManimConfig":
521522
# the next two must be set BEFORE digesting frame_width and frame_height
522523
"pixel_height",
523524
"pixel_width",
525+
"webgl_updater_fps",
524526
]:
525527
setattr(self, key, parser["CLI"].getint(key))
526528

@@ -540,7 +542,7 @@ def digest_parser(self, parser: configparser.ConfigParser) -> "ManimConfig":
540542
"png_mode",
541543
"movie_file_extension",
542544
"background_color",
543-
"js_renderer_path",
545+
"webgl_renderer_path",
544546
]:
545547
setattr(self, key, parser["CLI"].get(key, fallback="", raw=True))
546548

@@ -623,7 +625,8 @@ def digest_args(self, args: argparse.Namespace) -> "ManimConfig":
623625
"scene_names",
624626
"verbosity",
625627
"background_color",
626-
"use_js_renderer",
628+
"use_webgl_renderer",
629+
"webgl_updater_fps",
627630
]:
628631
if hasattr(args, key):
629632
attr = getattr(args, key)
@@ -1029,20 +1032,26 @@ def dry_run(self, val: bool) -> None:
10291032
)
10301033

10311034
@property
1032-
def use_js_renderer(self):
1033-
"""Whether to use JS renderer or not (default)."""
1034-
return self._d["use_js_renderer"]
1035+
def use_webgl_renderer(self):
1036+
"""Whether to use WebGL renderer or not (default)."""
1037+
return self._d["use_webgl_renderer"]
10351038

1036-
@use_js_renderer.setter
1037-
def use_js_renderer(self, val: bool) -> None:
1038-
self._d["use_js_renderer"] = val
1039+
@use_webgl_renderer.setter
1040+
def use_webgl_renderer(self, val: bool) -> None:
1041+
self._d["use_webgl_renderer"] = val
10391042
if val:
10401043
self["disable_caching"] = True
10411044

1042-
js_renderer_path = property(
1043-
lambda self: self._d["js_renderer_path"],
1044-
lambda self, val: self._d.__setitem__("js_renderer_path", val),
1045-
doc="Path to JS renderer.",
1045+
webgl_renderer_path = property(
1046+
lambda self: self._d["webgl_renderer_path"],
1047+
lambda self, val: self._d.__setitem__("webgl_renderer_path", val),
1048+
doc="Path to WebGL renderer.",
1049+
)
1050+
1051+
webgl_updater_fps = property(
1052+
lambda self: self._d["webgl_updater_fps"],
1053+
lambda self, val: self._d.__setitem__("webgl_updater_fps", val),
1054+
doc="Frame rate to use when generating keyframe data for animations that use updaters while using the WebGL frontend.",
10461055
)
10471056

10481057
media_dir = property(

manim/animation/transform.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ def check_validity_of_input(self, mobject: Mobject) -> None:
189189

190190

191191
class _MethodAnimation(MoveToTarget):
192-
def __init__(self, mobject):
192+
def __init__(self, mobject, methods):
193+
self.methods = methods
193194
super().__init__(mobject)
194195

195196

manim/camera/js_camera.py renamed to manim/camera/webgl_camera.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import copy
33

44

5-
class JsCamera(Camera):
5+
class WebGLCamera(Camera):
66
def __init__(self, **kwargs):
77
super().__init__(self, **kwargs)
88
self.serialized_frame = []

0 commit comments

Comments
 (0)