2015-03-22 13:33:02 -06:00
|
|
|
import os
|
2015-06-19 08:31:02 -07:00
|
|
|
import numpy as np
|
2015-03-22 13:33:02 -06:00
|
|
|
|
2018-05-24 20:59:37 +02:00
|
|
|
env_MEDIA_DIR = None
|
|
|
|
MEDIA_DIR = "#ERROR#"
|
|
|
|
|
|
|
|
try:
|
|
|
|
env_MEDIA_DIR = os.getenv("MEDIA_DIR")
|
|
|
|
except NameError:
|
|
|
|
try:
|
|
|
|
env_MEDIA_DIR = os.environ['MEDIA_DIR']
|
|
|
|
except KeyError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
if not (env_MEDIA_DIR is None):
|
|
|
|
MEDIA_DIR = env_MEDIA_DIR
|
|
|
|
elif os.path.exists("media_dir.txt"):
|
|
|
|
with open("media_dir.txt", 'rU') as media_file:
|
2018-06-26 17:40:08 +02:00
|
|
|
MEDIA_DIR = media_file.readline().strip()
|
2018-05-24 20:59:37 +02:00
|
|
|
else:
|
|
|
|
MEDIA_DIR = os.path.join(
|
|
|
|
os.path.expanduser('~'),
|
|
|
|
"Dropbox (3Blue1Brown)/3Blue1Brown Team Folder"
|
|
|
|
)
|
|
|
|
|
|
|
|
if not os.path.exists(MEDIA_DIR):
|
|
|
|
raise Exception("""
|
|
|
|
Redefine MEDIA_DIR by changing the MEDIA_DIR
|
|
|
|
environment constant or by changing
|
|
|
|
media_dir.txt to point to a valid directory
|
|
|
|
where movies and images will be written
|
|
|
|
""")
|
|
|
|
|
|
|
|
with open("media_dir.txt", 'w') as media_file:
|
|
|
|
media_file.write(MEDIA_DIR)
|
2018-03-30 18:19:23 -07:00
|
|
|
#
|
|
|
|
|
|
|
|
|
2018-03-30 11:36:06 -07:00
|
|
|
DEFAULT_PIXEL_HEIGHT = 1080
|
2018-04-06 13:58:59 -07:00
|
|
|
DEFAULT_PIXEL_WIDTH = 1920
|
2016-11-16 17:10:48 -08:00
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
LOW_QUALITY_FRAME_DURATION = 1. / 15
|
|
|
|
MEDIUM_QUALITY_FRAME_DURATION = 1. / 30
|
|
|
|
PRODUCTION_QUALITY_FRAME_DURATION = 1. / 60
|
2015-10-29 13:45:28 -07:00
|
|
|
|
2018-05-21 12:11:46 -07:00
|
|
|
# There might be other configuration than pixel shape later...
|
2016-03-07 19:07:00 -08:00
|
|
|
PRODUCTION_QUALITY_CAMERA_CONFIG = {
|
2018-05-21 12:11:46 -07:00
|
|
|
"pixel_height": DEFAULT_PIXEL_HEIGHT,
|
|
|
|
"pixel_width": DEFAULT_PIXEL_WIDTH,
|
2015-05-07 21:28:02 -07:00
|
|
|
}
|
|
|
|
|
2016-03-07 19:07:00 -08:00
|
|
|
MEDIUM_QUALITY_CAMERA_CONFIG = {
|
2018-05-21 12:11:46 -07:00
|
|
|
"pixel_height": 720,
|
|
|
|
"pixel_width": 1280,
|
2015-10-20 21:55:46 -07:00
|
|
|
}
|
|
|
|
|
2016-03-07 19:07:00 -08:00
|
|
|
LOW_QUALITY_CAMERA_CONFIG = {
|
2018-05-21 12:11:46 -07:00
|
|
|
"pixel_height": 480,
|
|
|
|
"pixel_width": 854,
|
2015-05-07 21:28:02 -07:00
|
|
|
}
|
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
DEFAULT_POINT_DENSITY_2D = 25
|
2016-03-21 19:30:36 -07:00
|
|
|
DEFAULT_POINT_DENSITY_1D = 250
|
2015-05-07 21:28:02 -07:00
|
|
|
|
2016-07-12 15:16:20 -07:00
|
|
|
DEFAULT_POINT_THICKNESS = 4
|
2015-10-10 18:48:25 -07:00
|
|
|
|
2018-03-30 11:25:37 -07:00
|
|
|
FRAME_HEIGHT = 8.0
|
2018-03-30 11:36:06 -07:00
|
|
|
FRAME_WIDTH = FRAME_HEIGHT * DEFAULT_PIXEL_WIDTH / DEFAULT_PIXEL_HEIGHT
|
2018-04-06 13:58:59 -07:00
|
|
|
FRAME_Y_RADIUS = FRAME_HEIGHT / 2
|
|
|
|
FRAME_X_RADIUS = FRAME_WIDTH / 2
|
2015-06-19 08:31:02 -07:00
|
|
|
|
2016-08-17 16:14:15 -07:00
|
|
|
SMALL_BUFF = 0.1
|
2017-01-25 16:40:59 -08:00
|
|
|
MED_SMALL_BUFF = 0.25
|
|
|
|
MED_LARGE_BUFF = 0.5
|
2016-08-17 16:14:15 -07:00
|
|
|
LARGE_BUFF = 1
|
|
|
|
|
2017-01-25 16:40:59 -08:00
|
|
|
DEFAULT_MOBJECT_TO_EDGE_BUFFER = MED_LARGE_BUFF
|
|
|
|
DEFAULT_MOBJECT_TO_MOBJECT_BUFFER = MED_SMALL_BUFF
|
2015-09-28 16:25:18 -07:00
|
|
|
|
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
# All in seconds
|
2015-06-27 04:49:10 -07:00
|
|
|
DEFAULT_ANIMATION_RUN_TIME = 1.0
|
2015-10-20 21:55:46 -07:00
|
|
|
DEFAULT_POINTWISE_FUNCTION_RUN_TIME = 3.0
|
2018-01-17 21:32:50 -08:00
|
|
|
DEFAULT_WAIT_TIME = 1.0
|
2015-03-22 13:33:02 -06:00
|
|
|
|
2015-06-19 08:31:02 -07:00
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
ORIGIN = np.array((0., 0., 0.))
|
|
|
|
UP = np.array((0., 1., 0.))
|
|
|
|
DOWN = np.array((0., -1., 0.))
|
|
|
|
RIGHT = np.array((1., 0., 0.))
|
|
|
|
LEFT = np.array((-1., 0., 0.))
|
|
|
|
IN = np.array((0., 0., -1.))
|
|
|
|
OUT = np.array((0., 0., 1.))
|
|
|
|
X_AXIS = np.array((1., 0., 0.))
|
|
|
|
Y_AXIS = np.array((0., 1., 0.))
|
|
|
|
Z_AXIS = np.array((0., 0., 1.))
|
2015-03-26 22:49:22 -06:00
|
|
|
|
2018-04-09 16:17:02 -07:00
|
|
|
# Useful abbreviations for diagonals
|
|
|
|
UL = UP + LEFT
|
|
|
|
UR = UP + RIGHT
|
|
|
|
DL = DOWN + LEFT
|
|
|
|
DR = DOWN + RIGHT
|
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
TOP = FRAME_Y_RADIUS * UP
|
|
|
|
BOTTOM = FRAME_Y_RADIUS * DOWN
|
|
|
|
LEFT_SIDE = FRAME_X_RADIUS * LEFT
|
|
|
|
RIGHT_SIDE = FRAME_X_RADIUS * RIGHT
|
2015-10-09 19:53:38 -07:00
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
TAU = 2 * np.pi
|
|
|
|
DEGREES = TAU / 360
|
2018-01-16 09:43:05 -08:00
|
|
|
|
2018-01-12 13:38:25 -08:00
|
|
|
ANIMATIONS_DIR = os.path.join(MEDIA_DIR, "animations")
|
|
|
|
RASTER_IMAGE_DIR = os.path.join(MEDIA_DIR, "designs", "raster_images")
|
|
|
|
SVG_IMAGE_DIR = os.path.join(MEDIA_DIR, "designs", "svg_images")
|
2018-04-06 13:58:59 -07:00
|
|
|
# TODO, staged scenes should really go into a subdirectory of a given scenes directory
|
|
|
|
STAGED_SCENES_DIR = os.path.join(ANIMATIONS_DIR, "staged_scenes")
|
2017-09-18 17:15:49 -07:00
|
|
|
###
|
2018-04-06 13:58:59 -07:00
|
|
|
THIS_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
FILE_DIR = os.path.join(THIS_DIR, "files")
|
|
|
|
TEX_DIR = os.path.join(FILE_DIR, "Tex")
|
|
|
|
TEX_IMAGE_DIR = TEX_DIR # TODO, What is this doing?
|
|
|
|
# These two may be depricated now.
|
|
|
|
MOBJECT_DIR = os.path.join(FILE_DIR, "mobjects")
|
2015-08-17 11:12:56 -07:00
|
|
|
IMAGE_MOBJECT_DIR = os.path.join(MOBJECT_DIR, "image")
|
|
|
|
|
2018-01-12 13:38:25 -08:00
|
|
|
for folder in [FILE_DIR, RASTER_IMAGE_DIR, SVG_IMAGE_DIR, ANIMATIONS_DIR, TEX_DIR,
|
2015-12-23 12:31:22 -08:00
|
|
|
TEX_IMAGE_DIR, MOBJECT_DIR, IMAGE_MOBJECT_DIR,
|
|
|
|
STAGED_SCENES_DIR]:
|
2015-03-22 13:33:02 -06:00
|
|
|
if not os.path.exists(folder):
|
2018-01-03 22:29:43 +01:00
|
|
|
os.makedirs(folder)
|
2015-03-22 13:33:02 -06:00
|
|
|
|
2015-03-26 22:49:22 -06:00
|
|
|
TEX_TEXT_TO_REPLACE = "YourTextHere"
|
2018-04-06 13:58:59 -07:00
|
|
|
TEMPLATE_TEX_FILE = os.path.join(THIS_DIR, "template.tex")
|
2015-10-29 13:45:28 -07:00
|
|
|
TEMPLATE_TEXT_FILE = os.path.join(THIS_DIR, "text_template.tex")
|
2016-04-17 00:31:38 -07:00
|
|
|
|
2016-02-23 22:29:32 -08:00
|
|
|
FFMPEG_BIN = "ffmpeg"
|
|
|
|
|
2015-06-13 19:00:23 -07:00
|
|
|
|
2018-04-06 13:58:59 -07:00
|
|
|
# Colors
|
2015-10-20 21:55:46 -07:00
|
|
|
|
|
|
|
COLOR_MAP = {
|
2018-04-06 13:58:59 -07:00
|
|
|
"DARK_BLUE": "#236B8E",
|
|
|
|
"DARK_BROWN": "#8B4513",
|
|
|
|
"LIGHT_BROWN": "#CD853F",
|
|
|
|
"BLUE_E": "#1C758A",
|
|
|
|
"BLUE_D": "#29ABCA",
|
|
|
|
"BLUE_C": "#58C4DD",
|
|
|
|
"BLUE_B": "#9CDCEB",
|
|
|
|
"BLUE_A": "#C7E9F1",
|
|
|
|
"TEAL_E": "#49A88F",
|
|
|
|
"TEAL_D": "#55C1A7",
|
|
|
|
"TEAL_C": "#5CD0B3",
|
|
|
|
"TEAL_B": "#76DDC0",
|
|
|
|
"TEAL_A": "#ACEAD7",
|
|
|
|
"GREEN_E": "#699C52",
|
|
|
|
"GREEN_D": "#77B05D",
|
|
|
|
"GREEN_C": "#83C167",
|
|
|
|
"GREEN_B": "#A6CF8C",
|
|
|
|
"GREEN_A": "#C9E2AE",
|
|
|
|
"YELLOW_E": "#E8C11C",
|
|
|
|
"YELLOW_D": "#F4D345",
|
|
|
|
"YELLOW_C": "#FFFF00",
|
|
|
|
"YELLOW_B": "#FFEA94",
|
|
|
|
"YELLOW_A": "#FFF1B6",
|
|
|
|
"GOLD_E": "#C78D46",
|
|
|
|
"GOLD_D": "#E1A158",
|
|
|
|
"GOLD_C": "#F0AC5F",
|
|
|
|
"GOLD_B": "#F9B775",
|
|
|
|
"GOLD_A": "#F7C797",
|
|
|
|
"RED_E": "#CF5044",
|
|
|
|
"RED_D": "#E65A4C",
|
|
|
|
"RED_C": "#FC6255",
|
|
|
|
"RED_B": "#FF8080",
|
|
|
|
"RED_A": "#F7A1A3",
|
|
|
|
"MAROON_E": "#94424F",
|
|
|
|
"MAROON_D": "#A24D61",
|
|
|
|
"MAROON_C": "#C55F73",
|
|
|
|
"MAROON_B": "#EC92AB",
|
|
|
|
"MAROON_A": "#ECABC1",
|
|
|
|
"PURPLE_E": "#644172",
|
|
|
|
"PURPLE_D": "#715582",
|
|
|
|
"PURPLE_C": "#9A72AC",
|
|
|
|
"PURPLE_B": "#B189C6",
|
|
|
|
"PURPLE_A": "#CAA3E8",
|
|
|
|
"WHITE": "#FFFFFF",
|
|
|
|
"BLACK": "#000000",
|
|
|
|
"LIGHT_GRAY": "#BBBBBB",
|
|
|
|
"LIGHT_GREY": "#BBBBBB",
|
|
|
|
"GRAY": "#888888",
|
|
|
|
"GREY": "#888888",
|
|
|
|
"DARK_GREY": "#444444",
|
|
|
|
"DARK_GRAY": "#444444",
|
|
|
|
"GREY_BROWN": "#736357",
|
|
|
|
"PINK": "#D147BD",
|
2016-07-13 22:03:31 -07:00
|
|
|
"GREEN_SCREEN": "#00FF00",
|
2018-04-06 13:58:59 -07:00
|
|
|
"ORANGE": "#FF862F",
|
2015-10-20 21:55:46 -07:00
|
|
|
}
|
|
|
|
PALETTE = COLOR_MAP.values()
|
2016-07-27 13:10:45 -07:00
|
|
|
locals().update(COLOR_MAP)
|
2018-04-06 13:58:59 -07:00
|
|
|
for name in filter(lambda s: s.endswith("_C"), COLOR_MAP.keys()):
|
2016-07-27 13:10:45 -07:00
|
|
|
locals()[name.replace("_C", "")] = locals()[name]
|