Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] 'OpenGLCamera' object has no attribute 'background_color' when rendering using manim.opengl #431

Closed
semikernel opened this issue May 17, 2024 · 3 comments · Fixed by #447
Labels
bug Something isn't working lib Related to the library (a.k.a. module) manimce Exclusive to Manim Community Edition
Milestone

Comments

@semikernel
Copy link

semikernel commented May 17, 2024

Description

Hi, there! I have found that the newest V5.1.7 manim-slides can't render manim.opengl scene. The mwe is shown here:

from manim import *
from manim.opengl import *
from manim_slides import Slide, ThreeDSlide
config.renderer = "opengl"

class Test(ThreeDSlide):
    def construct(self):
        cir = Circle()
        self.play(Create(cir))
        self.wait()

The terminal then outputs:

[05/17/24 19:26:03] INFO     Animation 0 : Partial movie file written in                             scene_file_writer.py:527
                             '/home/semikernel/Tiktok/Projects/OneMonthPlan/media/videos/gaza/1920p6                         
                             0/partial_movie_files/Test/2702378517_2531373006_223132457.mp4'                                 
[05/17/24 19:26:04] INFO     Animation 1 : Partial movie file written in                             scene_file_writer.py:527
                             '/home/semikernel/Tiktok/Projects/OneMonthPlan/media/videos/gaza/1920p6                         
                             0/partial_movie_files/Test/1069205256_3146877161_1023450693.mp4'                                
                    INFO     Combining to Movie file.                                                scene_file_writer.py:617
                    INFO                                                                             scene_file_writer.py:735
                             File ready at                                                                                   
                             '/home/semikernel/Tiktok/Projects/OneMonthPlan/media/videos/gaza/1920p6                         
                             0/Test.mp4'                                                                                     
                                                                                                                             
                    INFO     Rendered Test                                                                       scene.py:241
                             Played 2 animations                                                                             
[05/17/24 19:26:05] INFO     Generated 1 slides to                                                                base.py:503
                             '/home/semikernel/Tiktok/Projects/OneMonthPlan/slides/files/Test'                               
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/semikernel/.local/lib/python3.10/site-packages/manim/cli/render/commands.py:115 in render  │
│                                                                                                  │
│   112 │   │   │   try:                                                                           │
│   113 │   │   │   │   with tempconfig({}):                                                       │
│   114 │   │   │   │   │   scene = SceneClass()                                                   │
│ ❱ 115 │   │   │   │   │   scene.render()                                                         │
│   116 │   │   │   except Exception:                                                              │
│   117 │   │   │   │   error_console.print_exception()                                            │
│   118 │   │   │   │   sys.exit(1)                                                                │
│                                                                                                  │
│ /home/semikernel/.local/lib/python3.10/site-packages/manim_slides/slide/manim.py:97 in render    │
│                                                                                                  │
│    94 │   │                                                                                      │
│    95 │   │   config["max_files_cached"] = max_files_cached                                      │
│    96 │   │                                                                                      │
│ ❱  97 │   │   self._save_slides()                                                                │
│    98                                                                                            │
│    99                                                                                            │
│   100 class ThreeDSlide(Slide, ThreeDScene):  # type: ignore[misc]                               │
│                                                                                                  │
│ /home/semikernel/.local/lib/python3.10/site-packages/manim_slides/slide/base.py:512 in           │
│ _save_slides                                                                                     │
│                                                                                                  │
│   509 │   │   PresentationConfig(                                                                │
│   510 │   │   │   slides=slides,                                                                 │
│   511 │   │   │   resolution=self._resolution,                                                   │
│ ❱ 512 │   │   │   background_color=self._background_color,                                       │
│   513 │   │   ).to_file(slide_path)                                                              │
│   514 │   │                                                                                      │
│   515 │   │   logger.info(                                                                       │
│                                                                                                  │
│ /home/semikernel/.local/lib/python3.10/site-packages/manim_slides/slide/manim.py:26 in           │
│ _background_color                                                                                │
│                                                                                                  │
│    23 │                                                                                          │
│    24 │   @property                                                                              │
│    25 │   def _background_color(self) -> str:                                                    │
│ ❱  26 │   │   color = self.camera.background_color                                               │
│    27 │   │   if hex_color := getattr(color, "hex", None):                                       │
│    28 │   │   │   return hex_color  # type: ignore                                               │
│    29 │   │   else:  # manim>=0.18, see https://github.com/ManimCommunity/manim/pull/3020        │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'OpenGLCamera' object has no attribute 'background_color'

Version

manim-slides, version 5.1.7

Platform

ubuntu 22.04

Screenshots

No response

Additional information

Actually in previous manim-slides, everything works well. I am wondering where the error comes from. Thx a lot:)
No response

@semikernel semikernel added the bug Something isn't working label May 17, 2024
@jeertmans
Copy link
Owner

Hello, nice catch @semikernel!

I actually never use the OpenGL renderer, but I guess supporting it would be very easy.

Reading the OpenGLCamera class, it looks like I might need to try from config["background_color"] instead. Something similar might also be needed for the other attributes.

I don't have might time for this at the moment, but feel free to give it a try if you feel confident enough :-)

@jeertmans jeertmans added lib Related to the library (a.k.a. module) manimce Exclusive to Manim Community Edition labels May 17, 2024
@jeertmans jeertmans added this to the v6 milestone May 17, 2024
@semikernel
Copy link
Author

Hello, nice catch @semikernel!

I actually never use the OpenGL renderer, but I guess supporting it would be very easy.

Reading the OpenGLCamera class, it looks like I might need to try from config["background_color"] instead. Something similar might also be needed for the other attributes.

I don't have might time for this at the moment, but feel free to give it a try if you feel confident enough :-)

Hi,there! I figured it out by creating a ThreeDSlideGL class, it worked. I found it difficult to integrate it to manim-slides whole project. I need to change many all = [ ] stuffs. However, it worked well:)

from manim_slides import Slide, ThreeDSlide
from manim.renderer.opengl_renderer import OpenGLCamera

class ThreeDSlideGL(ThreeDSlide):
    @property
    def _background_color(self) -> str:
        try:
            # Attempt to get the background color for OpenGLCamera
            if isinstance(self.camera, OpenGLCamera):
                # Check for possible attributes
                if hasattr(self.camera, 'background_rgba'):
                    color = self.camera.background_rgba
                elif hasattr(self.camera, 'background_color'):
                    color = self.camera.background_color
                else:
                    # Fallback to default color if none is found
                    color = (0, 0, 0, 1)  # Default to black
                
                return "#" + "".join(f"{int(c*255):02x}" for c in color[:3])
            else:
                # Handle other camera types
                color = self.camera.background_color
                if hex_color := getattr(color, "hex", None):
                    return hex_color  # type: ignore
                else:
                    return "#000000"  # Default to black if attribute is not found
        except Exception as e:
            # Handle any unexpected errors
            return "#000000"  # Default to black

@jeertmans jeertmans changed the title 'OpenGLCamera' object has no attribute 'background_color' when rendering using manim.opengl [BUG] 'OpenGLCamera' object has no attribute 'background_color' when rendering using manim.opengl May 18, 2024
@jeertmans
Copy link
Owner

Hello, nice catch @semikernel!
I actually never use the OpenGL renderer, but I guess supporting it would be very easy.
Reading the OpenGLCamera class, it looks like I might need to try from config["background_color"] instead. Something similar might also be needed for the other attributes.
I don't have might time for this at the moment, but feel free to give it a try if you feel confident enough :-)

Hi,there! I figured it out by creating a ThreeDSlideGL class, it worked. I found it difficult to integrate it to manim-slides whole project. I need to change many all = [ ] stuffs. However, it worked well:)

from manim_slides import Slide, ThreeDSlide
from manim.renderer.opengl_renderer import OpenGLCamera

class ThreeDSlideGL(ThreeDSlide):
    @property
    def _background_color(self) -> str:
        try:
            # Attempt to get the background color for OpenGLCamera
            if isinstance(self.camera, OpenGLCamera):
                # Check for possible attributes
                if hasattr(self.camera, 'background_rgba'):
                    color = self.camera.background_rgba
                elif hasattr(self.camera, 'background_color'):
                    color = self.camera.background_color
                else:
                    # Fallback to default color if none is found
                    color = (0, 0, 0, 1)  # Default to black
                
                return "#" + "".join(f"{int(c*255):02x}" for c in color[:3])
            else:
                # Handle other camera types
                color = self.camera.background_color
                if hex_color := getattr(color, "hex", None):
                    return hex_color  # type: ignore
                else:
                    return "#000000"  # Default to black if attribute is not found
        except Exception as e:
            # Handle any unexpected errors
            return "#000000"  # Default to black

Thanks for sharing your solution, and sorry for the late reply!

The config["background_color"] didn't work? Because, for compatibility with future versions, I would like to prefer to have the simplest solution. And, if multiple cases have to be handled, then documenting why they might exist is very important IMO :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working lib Related to the library (a.k.a. module) manimce Exclusive to Manim Community Edition
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants