Skip to content

Commit

Permalink
Add set_program_uniform function
Browse files Browse the repository at this point in the history
  • Loading branch information
3b1b committed Feb 3, 2023
1 parent 772ea79 commit ac3db9b
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 9 deletions.
10 changes: 2 additions & 8 deletions manimlib/shader_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from manimlib.utils.shaders import get_texture_id
from manimlib.utils.shaders import get_fill_canvas
from manimlib.utils.shaders import release_texture
from manimlib.utils.shaders import set_program_uniform

from typing import TYPE_CHECKING

Expand Down Expand Up @@ -224,14 +225,7 @@ def update_program_uniforms(self, camera_uniforms: UniformDict):
if self.program is None:
return
for name, value in (*self.mobject_uniforms.items(), *camera_uniforms.items()):
if name not in self.program:
continue
if isinstance(value, np.ndarray) and value.ndim > 0:
value = tuple(value)
if name in camera_uniforms and self.program_uniform_mirror.get(name, None) == value:
continue
self.program[name].value = value
self.program_uniform_mirror[name] = value
set_program_uniform(self.program, name, value)

def get_vertex_buffer_object(self, refresh: bool = True):
if refresh:
Expand Down
31 changes: 30 additions & 1 deletion manimlib/utils/shaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,20 @@

from manimlib.config import parse_cli
from manimlib.config import get_configuration
from manimlib.utils.customization import get_customization
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, Optional, Tuple
from manimlib.typing import UniformDict
from moderngl.vertex_array import VertexArray
from moderngl.framebuffer import Framebuffer


ID_TO_TEXTURE: dict[int, moderngl.Texture] = dict()
PROGRAM_UNIFORM_MIRRORS: dict[int, dict[str, float | tuple]] = dict()


@lru_cache()
Expand Down Expand Up @@ -63,6 +64,34 @@ def get_shader_program(
)


def set_program_uniform(
program: moderngl.Program,
name: str,
value: float | tuple | np.ndarray
) -> bool:
"""
Sets a program uniform, and also keeps track of a dictionary
of previously set uniforms for that program so that it
doesn't needlessly reset it, requiring an exchange with gpu
memory, if it sees the same value again.
Returns True if changed the program, False if it left it as is.
"""
if name not in program:
return False
pid = id(program)
if pid not in PROGRAM_UNIFORM_MIRRORS:
PROGRAM_UNIFORM_MIRRORS[pid] = dict()
uniform_mirror = PROGRAM_UNIFORM_MIRRORS[pid]
if isinstance(value, np.ndarray) and value.ndim > 0:
value = tuple(value)
if uniform_mirror.get(name, None) == value:
return False
uniform_mirror[name] = value
program[name].value = value
return True


@lru_cache()
def get_shader_code_from_file(filename: str) -> str | None:
if not filename:
Expand Down

0 comments on commit ac3db9b

Please sign in to comment.