nothing rendering again

Co-authored-by: Jason Villanueva <a@jsonvillanueva.com>
This commit is contained in:
MrDiver 2023-09-11 01:17:49 +02:00
commit 1a821d7013
5 changed files with 75 additions and 52 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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:

View file

@ -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