mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
Change seek_full_path_from_defaults to find_file, and make it a more general function which will find and download urls if needed. This means for images/textures/etc. one can point online
This commit is contained in:
parent
065df65cf1
commit
62bb40a7df
7 changed files with 54 additions and 29 deletions
|
@ -202,17 +202,17 @@ class SurfaceExample(Scene):
|
||||||
torus1 = Torus(r1=1, r2=1)
|
torus1 = Torus(r1=1, r2=1)
|
||||||
torus2 = Torus(r1=3, r2=1)
|
torus2 = Torus(r1=3, r2=1)
|
||||||
sphere = Sphere(radius=3, resolution=torus1.resolution)
|
sphere = Sphere(radius=3, resolution=torus1.resolution)
|
||||||
surfaces = [sphere, torus1, torus2]
|
# You can texture a surface with up to two images, which will
|
||||||
# If you want these to be textured with pictures of, say, earth,
|
# be interpreted as the side towards the light, and away from
|
||||||
# find images for the texture maps you want, perhaps
|
# the light. These can be either urls, or paths to a local file
|
||||||
# https://en.wikipedia.org/wiki/File:Blue_Marble_2002.png and
|
# in whatever you've set as the iamge directory in
|
||||||
# https://commons.wikimedia.org/wiki/File:The_earth_at_night.jpg
|
# the custom_defaults.yml file
|
||||||
# and make sure they are available in whatever folder manim
|
day_texture = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Blue_Marble_2002.png/1280px-Blue_Marble_2002.png"
|
||||||
# looks for images, then uncomment the lines below
|
night_texture = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/The_earth_at_night.jpg/1280px-The_earth_at_night.jpg"
|
||||||
# surfaces = [
|
surfaces = [
|
||||||
# TexturedSurface(surface, "EarthTextureMap", "NightEarthTextureMap")
|
TexturedSurface(surface, day_texture, night_texture)
|
||||||
# for surface in [sphere, torus1, torus2]
|
for surface in [sphere, torus1, torus2]
|
||||||
# ]
|
]
|
||||||
|
|
||||||
for mob in surfaces:
|
for mob in surfaces:
|
||||||
mob.mesh = SurfaceMesh(mob)
|
mob.mesh = SurfaceMesh(mob)
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import os
|
import os
|
||||||
import logging
|
|
||||||
import re
|
import re
|
||||||
import moderngl
|
import moderngl
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from manimlib.utils.directories import get_shader_dir
|
from manimlib.utils.directories import get_shader_dir
|
||||||
from manimlib.utils.file_ops import seek_full_path_from_defaults
|
from manimlib.utils.file_ops import find_file
|
||||||
|
|
||||||
# Mobjects that should be rendered with
|
# Mobjects that should be rendered with
|
||||||
# the same shader will be organized and
|
# the same shader will be organized and
|
||||||
|
@ -111,7 +110,7 @@ def get_shader_code_from_file(filename):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
filepath = seek_full_path_from_defaults(
|
filepath = find_file(
|
||||||
filename,
|
filename,
|
||||||
directories=[get_shader_dir(), "/"],
|
directories=[get_shader_dir(), "/"],
|
||||||
extensions=[],
|
extensions=[],
|
||||||
|
|
|
@ -25,12 +25,16 @@ def get_directories():
|
||||||
return PRE_COMPUTED_DIRS
|
return PRE_COMPUTED_DIRS
|
||||||
|
|
||||||
|
|
||||||
|
def get_temp_dir():
|
||||||
|
return get_directories()["temporary_storage"]
|
||||||
|
|
||||||
|
|
||||||
def get_tex_dir():
|
def get_tex_dir():
|
||||||
return guarantee_existence(os.path.join(get_directories()["temporary_storage"], "Tex"))
|
return guarantee_existence(os.path.join(get_temp_dir(), "Tex"))
|
||||||
|
|
||||||
|
|
||||||
def get_mobject_data_dir():
|
def get_mobject_data_dir():
|
||||||
return guarantee_existence(os.path.join(get_directories()["temporary_storage"], "mobject_data"))
|
return guarantee_existence(os.path.join(get_temp_dir(), "mobject_data"))
|
||||||
|
|
||||||
|
|
||||||
def get_output_dir():
|
def get_output_dir():
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
import os
|
import os
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
import validators
|
||||||
|
import urllib.request
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
|
||||||
def add_extension_if_not_present(file_name, extension):
|
def add_extension_if_not_present(file_name, extension):
|
||||||
# This could conceivably be smarter about handling existing differing extensions
|
# This could conceivably be smarter about handling existing differing extensions
|
||||||
|
@ -16,17 +20,34 @@ def guarantee_existence(path):
|
||||||
return os.path.abspath(path)
|
return os.path.abspath(path)
|
||||||
|
|
||||||
|
|
||||||
def seek_full_path_from_defaults(file_name, directories, extensions):
|
def find_file(file_name, directories=None, extensions=None):
|
||||||
possible_paths = [file_name]
|
# Check if this is a file online first, and if so, download
|
||||||
possible_paths += [
|
# it to a temporary directory
|
||||||
|
if validators.url(file_name):
|
||||||
|
stem, name = os.path.split(file_name)
|
||||||
|
folder = guarantee_existence(
|
||||||
|
os.path.join(tempfile.gettempdir(), "manim_downloads")
|
||||||
|
)
|
||||||
|
path = os.path.join(folder, name)
|
||||||
|
urllib.request.urlretrieve(file_name, path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
# Check if what was passed in is already a valid path to a file
|
||||||
|
if os.path.exists(file_name):
|
||||||
|
return file_name
|
||||||
|
|
||||||
|
# Otherwise look in local file system
|
||||||
|
directories = directories or [""]
|
||||||
|
extensions = extensions or [""]
|
||||||
|
possible_paths = (
|
||||||
os.path.join(directory, file_name + extension)
|
os.path.join(directory, file_name + extension)
|
||||||
for directory in directories
|
for directory in directories
|
||||||
for extension in ["", *extensions]
|
for extension in extensions
|
||||||
]
|
)
|
||||||
for path in possible_paths:
|
for path in possible_paths:
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
return path
|
return path
|
||||||
raise IOError("File {} not Found".format(file_name))
|
raise IOError(f"{file_name} not Found")
|
||||||
|
|
||||||
|
|
||||||
def get_sorted_integer_files(directory,
|
def get_sorted_integer_files(directory,
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
from manimlib.utils.file_ops import seek_full_path_from_defaults
|
from manimlib.utils.file_ops import find_file
|
||||||
from manimlib.utils.directories import get_raster_image_dir
|
from manimlib.utils.directories import get_raster_image_dir
|
||||||
from manimlib.utils.directories import get_vector_image_dir
|
from manimlib.utils.directories import get_vector_image_dir
|
||||||
|
|
||||||
|
|
||||||
def get_full_raster_image_path(image_file_name):
|
def get_full_raster_image_path(image_file_name):
|
||||||
return seek_full_path_from_defaults(
|
return find_file(
|
||||||
image_file_name,
|
image_file_name,
|
||||||
directories=[get_raster_image_dir()],
|
directories=[get_raster_image_dir()],
|
||||||
extensions=[".jpg", ".png", ".gif"]
|
extensions=[".jpg", ".png", ".gif"]
|
||||||
|
@ -16,7 +15,7 @@ def get_full_raster_image_path(image_file_name):
|
||||||
|
|
||||||
|
|
||||||
def get_full_vector_image_path(image_file_name):
|
def get_full_vector_image_path(image_file_name):
|
||||||
return seek_full_path_from_defaults(
|
return find_file(
|
||||||
image_file_name,
|
image_file_name,
|
||||||
directories=[get_vector_image_dir()],
|
directories=[get_vector_image_dir()],
|
||||||
extensions=[".svg", ".xdv"],
|
extensions=[".svg", ".xdv"],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import os
|
import os
|
||||||
from manimlib.utils.file_ops import seek_full_path_from_defaults
|
from manimlib.utils.file_ops import find_file
|
||||||
|
|
||||||
|
|
||||||
def play_chord(*nums):
|
def play_chord(*nums):
|
||||||
|
@ -32,7 +32,7 @@ def play_finish_sound():
|
||||||
|
|
||||||
|
|
||||||
def get_full_sound_file_path(sound_file_name):
|
def get_full_sound_file_path(sound_file_name):
|
||||||
return seek_full_path_from_defaults(
|
return find_file(
|
||||||
sound_file_name,
|
sound_file_name,
|
||||||
directories=[os.path.join("assets", "sounds")],
|
directories=[os.path.join("assets", "sounds")],
|
||||||
extensions=[".wav", ".mp3"]
|
extensions=[".wav", ".mp3"]
|
||||||
|
|
|
@ -15,3 +15,5 @@ PyOpenGL
|
||||||
pyyaml
|
pyyaml
|
||||||
screeninfo
|
screeninfo
|
||||||
pyreadline; sys_platform == 'win32'
|
pyreadline; sys_platform == 'win32'
|
||||||
|
tempfile
|
||||||
|
validators
|
Loading…
Add table
Reference in a new issue