mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
![]() |
from __future__ import annotations
|
||
|
|
||
|
import os
|
||
|
import re
|
||
|
from functools import lru_cache
|
||
|
|
||
|
from manimlib.utils.directories import get_shader_dir
|
||
|
from manimlib.utils.file_ops import find_file
|
||
|
|
||
|
from typing import TYPE_CHECKING
|
||
|
|
||
|
if TYPE_CHECKING:
|
||
|
from typing import Sequence
|
||
|
|
||
|
|
||
|
@lru_cache(maxsize=12)
|
||
|
def get_shader_code_from_file(filename: str) -> str | None:
|
||
|
if not filename:
|
||
|
return None
|
||
|
|
||
|
try:
|
||
|
filepath = find_file(
|
||
|
filename,
|
||
|
directories=[get_shader_dir(), "/"],
|
||
|
extensions=[],
|
||
|
)
|
||
|
except IOError:
|
||
|
return None
|
||
|
|
||
|
with open(filepath, "r") as f:
|
||
|
result = f.read()
|
||
|
|
||
|
# To share functionality between shaders, some functions are read in
|
||
|
# from other files an inserted into the relevant strings before
|
||
|
# passing to ctx.program for compiling
|
||
|
# Replace "#INSERT " lines with relevant code
|
||
|
insertions = re.findall(r"^#INSERT .*\.glsl$", result, flags=re.MULTILINE)
|
||
|
for line in insertions:
|
||
|
inserted_code = get_shader_code_from_file(
|
||
|
os.path.join("inserts", line.replace("#INSERT ", ""))
|
||
|
)
|
||
|
result = result.replace(line, inserted_code)
|
||
|
return result
|
||
|
|
||
|
|
||
|
def get_colormap_code(rgb_list: Sequence[float]) -> str:
|
||
|
data = ",".join(
|
||
|
"vec3({}, {}, {})".format(*rgb)
|
||
|
for rgb in rgb_list
|
||
|
)
|
||
|
return f"vec3[{len(rgb_list)}]({data})"
|