mirror of
https://github.com/ManimCommunity/manim.git
synced 2026-06-22 10:01:47 +00:00
nothing rendering again
Co-authored-by: Jason Villanueva <a@jsonvillanueva.com>
This commit is contained in:
parent
d418acc865
commit
1a821d7013
5 changed files with 75 additions and 52 deletions
|
|
@ -1,13 +1,16 @@
|
|||
import time
|
||||
|
||||
from PIL import Image
|
||||
from pyglet.gl import Config
|
||||
from pyglet.window import Window
|
||||
|
||||
import manim.utils.color.manim_colors as col
|
||||
from manim._config import tempconfig
|
||||
from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame
|
||||
from manim.constants import OUT
|
||||
from manim.constants import OUT, RIGHT
|
||||
from manim.mobject.geometry.arc import Circle
|
||||
from manim.mobject.geometry.polygram import Square
|
||||
from manim.mobject.logo import ManimBanner
|
||||
from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject
|
||||
from manim.renderer.opengl_renderer import OpenGLRenderer
|
||||
|
||||
|
|
@ -16,7 +19,11 @@ if __name__ == "__main__":
|
|||
win = Window(width=1920, height=1080)
|
||||
renderer = OpenGLRenderer(1920, 1080)
|
||||
# vm = OpenGLVMobject([col.RED, col.GREEN])
|
||||
vm = Circle(radius=1,stroke_color=col.YELLOW,fill_opacity=1, fill_color=col.RED)
|
||||
vm = Circle(
|
||||
radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED
|
||||
).shift(RIGHT)
|
||||
vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1)
|
||||
# vm3 = ManimBanner()
|
||||
# vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]])
|
||||
# print(vm.color)
|
||||
# print(vm.fill_color)
|
||||
|
|
@ -25,8 +32,11 @@ if __name__ == "__main__":
|
|||
camera = OpenGLCameraFrame()
|
||||
renderer.set_camera(camera)
|
||||
|
||||
image = renderer.render(camera, [vm, vm2])
|
||||
# print(image.shape)
|
||||
# Image.fromarray(image,"RGBA").show()
|
||||
for _ in range(4):
|
||||
renderer.render_vmobject(vm)
|
||||
image = renderer.render(camera, [vm, vm2])
|
||||
win.dispatch_events()
|
||||
win.flip()
|
||||
time.sleep(1)
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ class OpenGLMobject:
|
|||
about_point=None,
|
||||
about_edge=ORIGIN,
|
||||
works_on_bounding_box=False,
|
||||
):
|
||||
) -> Self:
|
||||
if about_point is None and about_edge is not None:
|
||||
about_point = self.get_bounding_box_point(about_edge)
|
||||
|
||||
|
|
|
|||
|
|
@ -58,8 +58,9 @@ DEFAULT_FILL_COLOR = GREY_C
|
|||
def triggers_refreshed_triangulation(func: Callable):
|
||||
@wraps(func)
|
||||
def wrapper(self, *args, **kwargs):
|
||||
func(self, *args, **kwargs)
|
||||
res = func(self, *args, **kwargs)
|
||||
self.refresh_triangulation()
|
||||
return res
|
||||
|
||||
return wrapper
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ from typing import TYPE_CHECKING
|
|||
|
||||
import moderngl as gl
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
from typing_extensions import override
|
||||
|
||||
import manim.constants as const
|
||||
|
|
@ -190,7 +189,9 @@ class OpenGLRenderer(Renderer):
|
|||
background_color: c.ManimColor = color.BLACK,
|
||||
background_opacity: float = 1.0,
|
||||
background_image: str | None = None,
|
||||
substitute_output_fbo: gl.Framebuffer | None = None,
|
||||
) -> None:
|
||||
super().__init__()
|
||||
logger.debug("Initializing OpenGLRenderer")
|
||||
self.pixel_width = pixel_width
|
||||
self.pixel_height = pixel_height
|
||||
|
|
@ -204,18 +205,19 @@ class OpenGLRenderer(Renderer):
|
|||
logger.debug("Initializing OpenGL context and framebuffers")
|
||||
self.ctx = gl.create_context()
|
||||
self.target_fbo = self.ctx.simple_framebuffer(
|
||||
(self.pixel_width, self.pixel_height), samples=self.samples
|
||||
(self.pixel_width, self.pixel_height),
|
||||
samples=self.samples,
|
||||
dtype="f4",
|
||||
components=4,
|
||||
)
|
||||
|
||||
fbo = self.ctx.detect_framebuffer()
|
||||
if not fbo:
|
||||
self.output_fbo = self.ctx.framebuffer(
|
||||
color_attachments=[
|
||||
self.ctx.renderbuffer((self.pixel_width, self.pixel_height))
|
||||
]
|
||||
)
|
||||
else:
|
||||
self.output_fbo = fbo
|
||||
self.output_fbo = self.ctx.framebuffer(
|
||||
color_attachments=[
|
||||
self.ctx.renderbuffer(
|
||||
(self.pixel_width, self.pixel_height), dtype="f4", components=4
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
# Preparing vmobject shader
|
||||
logger.debug("Initializing Shader Programs")
|
||||
|
|
@ -226,6 +228,10 @@ class OpenGLRenderer(Renderer):
|
|||
self.ctx, "quadratic_bezier_stroke"
|
||||
)
|
||||
|
||||
def substitute_fbo(self):
|
||||
self.output_fbo.release()
|
||||
self.output_fbo = self.ctx.detect_framebuffer()
|
||||
|
||||
def set_camera(self, camera: OpenGLCameraFrame) -> ImageType:
|
||||
self.vmobject_fill_program["is_fixed_in_frame"] = 0.0
|
||||
self.vmobject_fill_program["frame_shape"] = camera.frame_shape
|
||||
|
|
@ -280,7 +286,18 @@ class OpenGLRenderer(Renderer):
|
|||
fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1))
|
||||
return fill_data
|
||||
|
||||
@override
|
||||
def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType:
|
||||
self.set_camera(camera=camera)
|
||||
self.target_fbo.use()
|
||||
self.target_fbo.clear(*self.background_color)
|
||||
|
||||
super().render(camera, renderables)
|
||||
|
||||
self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo)
|
||||
# from PIL import Image
|
||||
# Image.frombytes('RGB', self.output_fbo.size, self.output_fbo.read(), 'raw', 'RGB', 0, -1).show()
|
||||
return self.get_pixels()
|
||||
|
||||
def render_vmobject(self, mob: OpenGLVMobject) -> None:
|
||||
# Setting camera uniforms
|
||||
|
||||
|
|
@ -307,10 +324,6 @@ class OpenGLRenderer(Renderer):
|
|||
mob.renderer_data.bounding_box = compute_bounding_box(mob)
|
||||
print(mob.renderer_data)
|
||||
|
||||
# print(mob.renderer_data.mesh)
|
||||
# print(mob.renderer_data.orientation)
|
||||
# print(mob.points)
|
||||
|
||||
# if mob.colors_changed:
|
||||
# mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4))
|
||||
|
||||
|
|
@ -352,36 +365,28 @@ class OpenGLRenderer(Renderer):
|
|||
ibo.release()
|
||||
vao.release()
|
||||
|
||||
# print(self.get_fill_shader_data(mob))
|
||||
self.ctx.enable(gl.BLEND)
|
||||
self.ctx.blend_func = (
|
||||
gl.SRC_ALPHA,
|
||||
gl.ONE_MINUS_SRC_ALPHA,
|
||||
gl.ONE,
|
||||
gl.ONE,
|
||||
)
|
||||
# self.ctx.blend_func = (
|
||||
# gl.SRC_ALPHA,
|
||||
# gl.ONE_MINUS_SRC_ALPHA,
|
||||
# gl.ONE,
|
||||
# gl.ONE,
|
||||
# )
|
||||
# self.ctx.enable(gl.DEPTH_TEST)
|
||||
|
||||
self.target_fbo.use()
|
||||
self.target_fbo.clear(*self.background_color)
|
||||
# TODO: Handle Submobjects
|
||||
render_shader(
|
||||
self.vmobject_fill_program, mob, self.get_fill_shader_data(mob), True
|
||||
)
|
||||
render_shader(
|
||||
self.vmobject_stroke_program, mob, self.get_stroke_shader_data(mob), False
|
||||
)
|
||||
# print(self.target_fbo.read())
|
||||
self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo)
|
||||
# Image.frombytes('RGBA', self.output_fbo.size, self.output_fbo.read(components=4), 'raw', 'RGBA', 0, -1).show()
|
||||
|
||||
# set shader
|
||||
# use vbo
|
||||
# render fill
|
||||
|
||||
# set shader
|
||||
# use vbo
|
||||
# render stroke
|
||||
# self.fbo ...
|
||||
def get_pixels(self) -> ImageType:
|
||||
raw = self.output_fbo.read(components=4, dtype="f4") # RGBA, floats
|
||||
buf = np.frombuffer(raw, dtype="f4").reshape(
|
||||
(self.pixel_height, self.pixel_width, 4)
|
||||
)
|
||||
return buf
|
||||
|
||||
|
||||
# def init_frame(self, **config) -> None:
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import numpy as np
|
|||
from typing_extensions import TypeAlias
|
||||
|
||||
from manim import config
|
||||
from manim._config import logger
|
||||
from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject
|
||||
from manim.mobject.types.image_mobject import ImageMobject
|
||||
from manim.mobject.types.vectorized_mobject import VMobject
|
||||
|
|
@ -18,20 +19,23 @@ class RendererData:
|
|||
|
||||
class Renderer(ABC):
|
||||
def __init__(self):
|
||||
self.fbo = np.zeros((config.height, config.width))
|
||||
self.capabilities = {
|
||||
VMobject: self.render_vmobject,
|
||||
ImageMobject: self.render_image,
|
||||
}
|
||||
self.capabilities = [
|
||||
(OpenGLVMobject, self.render_vmobject),
|
||||
(ImageMobject, self.render_image),
|
||||
]
|
||||
|
||||
def render(self, camera, renderables: [VMobject]) -> ImageType: # Image
|
||||
def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Image
|
||||
for mob in renderables:
|
||||
if type(mob) in self.capabilities:
|
||||
self.capabilities[type(mob)](mob)
|
||||
for type, render_func in self.capabilities:
|
||||
if isinstance(mob, type):
|
||||
render_func(mob)
|
||||
break
|
||||
else:
|
||||
print("WARNING: NOT SUPPORTED")
|
||||
logger.warn(
|
||||
f"The type{type(mob)} is not supported in Renderer: {self.__class__}"
|
||||
)
|
||||
|
||||
return self.fbo.get_pixels()
|
||||
return self.get_pixels()
|
||||
|
||||
@abstractclassmethod
|
||||
def render_vmobject(self, mob: OpenGLVMobject) -> None:
|
||||
|
|
@ -43,6 +47,9 @@ class Renderer(ABC):
|
|||
def render_image(self, mob) -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
def get_pixels(self) -> ImageType:
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
# NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver
|
||||
# NOTE: Cairo_camera overlay_PIL_image for MultiRenderer
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue