Fix for memory leak caused by re-making mipmaps
[blender.git] / doc / python_api / examples / bpy.types.RenderEngine.py
1 """
2 Simple Render Engine
3 ++++++++++++++++++++
4 """
5
6 import bpy
7
8
9 class CustomRenderEngine(bpy.types.RenderEngine):
10     # These three members are used by blender to set up the
11     # RenderEngine; define its internal name, visible name and capabilities.
12     bl_idname = 'custom_renderer'
13     bl_label = 'Flat Color Renderer'
14     bl_use_preview = True
15
16     # This is the only method called by blender, in this example
17     # we use it to detect preview rendering and call the implementation
18     # in another method.
19     def render(self, scene):
20         scale = scene.render.resolution_percentage / 100.0
21         self.size_x = int(scene.render.resolution_x * scale)
22         self.size_y = int(scene.render.resolution_y * scale)
23
24         if scene.name == 'preview':
25             self.render_preview(scene)
26         else:
27             self.render_scene(scene)
28
29     # In this example, we fill the preview renders with a flat green color.
30     def render_preview(self, scene):
31         pixel_count = self.size_x * self.size_y
32
33         # The framebuffer is defined as a list of pixels, each pixel
34         # itself being a list of R,G,B,A values
35         green_rect = [[0.0, 1.0, 0.0, 1.0]] * pixel_count
36
37         # Here we write the pixel values to the RenderResult
38         result = self.begin_result(0, 0, self.size_x, self.size_y)
39         layer = result.layers[0]
40         layer.rect = green_rect
41         self.end_result(result)
42
43     # In this example, we fill the full renders with a flat blue color.
44     def render_scene(self, scene):
45         pixel_count = self.size_x * self.size_y
46
47         # The framebuffer is defined as a list of pixels, each pixel
48         # itself being a list of R,G,B,A values
49         blue_rect = [[0.0, 0.0, 1.0, 1.0]] * pixel_count
50
51         # Here we write the pixel values to the RenderResult
52         result = self.begin_result(0, 0, self.size_x, self.size_y)
53         layer = result.layers[0]
54         layer.rect = blue_rect
55         self.end_result(result)
56
57 # Register the RenderEngine
58 bpy.utils.register_class(CustomRenderEngine)
59
60 # RenderEngines also need to tell UI Panels that they are compatible
61 # Otherwise most of the UI will be empty when the engine is selected.
62 # In this example, we need to see the main render image button and
63 # the material preview panel.
64 import properties_render
65 properties_render.RENDER_PT_render.COMPAT_ENGINES.add('custom_renderer')
66 del properties_render
67
68 import properties_material
69 properties_material.MATERIAL_PT_preview.COMPAT_ENGINES.add('custom_renderer')
70 del properties_material