Fix T61376 Group Node Node Editor theme property is missing alpha channel
[blender.git] / intern / cycles / blender / addon / operators.py
1 #
2 # Copyright 2011-2019 Blender Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 #
16
17 # <pep8 compliant>
18
19 import bpy
20 from bpy.types import Operator
21 from bpy.props import StringProperty
22
23
24 class CYCLES_OT_use_shading_nodes(Operator):
25     """Enable nodes on a material, world or light"""
26     bl_idname = "cycles.use_shading_nodes"
27     bl_label = "Use Nodes"
28
29     @classmethod
30     def poll(cls, context):
31         return (getattr(context, "material", False) or getattr(context, "world", False) or
32                 getattr(context, "light", False))
33
34     def execute(self, context):
35         if context.material:
36             context.material.use_nodes = True
37         elif context.world:
38             context.world.use_nodes = True
39         elif context.light:
40             context.light.use_nodes = True
41
42         return {'FINISHED'}
43
44
45 class CYCLES_OT_denoise_animation(Operator):
46     """Denoise rendered animation sequence using current scene and view """ \
47     """layer settings. Requires denoising data passes and output to """ \
48     """OpenEXR multilayer files"""
49     bl_idname = "cycles.denoise_animation"
50     bl_label = "Denoise Animation"
51
52     input_filepath: StringProperty(
53         name='Input Filepath',
54         description='File path for frames to denoise. If not specified, uses the render file path from the scene',
55         default='',
56         subtype='FILE_PATH')
57
58     output_filepath: StringProperty(
59         name='Output Filepath',
60         description='If not specified, renders will be denoised in-place',
61         default='',
62         subtype='FILE_PATH')
63
64     def execute(self, context):
65         import os
66
67         preferences = context.preferences
68         scene = context.scene
69         view_layer = context.view_layer
70
71         in_filepath = self.input_filepath
72         out_filepath = self.output_filepath
73
74         if in_filepath == '':
75             in_filepath = scene.render.filepath
76         if out_filepath == '':
77             out_filepath = in_filepath
78
79         # Backup since we will overwrite the scene path temporarily
80         original_filepath = scene.render.filepath
81
82         # Expand filepaths for each frame so we match Blender render output exactly.
83         in_filepaths = []
84         out_filepaths = []
85
86         for frame in range(scene.frame_start, scene.frame_end + 1):
87             scene.render.filepath = in_filepath
88             filepath = scene.render.frame_path(frame=frame)
89             in_filepaths.append(filepath)
90
91             if not os.path.isfile(filepath):
92                 scene.render.filepath = original_filepath
93                 self.report({'ERROR'}, f"Frame '{filepath}' not found, animation must be complete.")
94                 return {'CANCELLED'}
95
96             scene.render.filepath = out_filepath
97             filepath = scene.render.frame_path(frame=frame)
98             out_filepaths.append(filepath)
99
100         scene.render.filepath = original_filepath
101
102         # Run denoiser
103         # TODO: support cancel and progress reports.
104         import _cycles
105         try:
106             _cycles.denoise(preferences.as_pointer(),
107                             scene.as_pointer(),
108                             view_layer.as_pointer(),
109                             input=in_filepaths,
110                             output=out_filepaths)
111         except Exception as e:
112             self.report({'ERROR'}, str(e))
113             return {'FINISHED'}
114
115         self.report({'INFO'}, "Denoising completed.")
116         return {'FINISHED'}
117
118
119 classes = (
120     CYCLES_OT_use_shading_nodes,
121     CYCLES_OT_denoise_animation
122 )
123
124 def register():
125     from bpy.utils import register_class
126     for cls in classes:
127         register_class(cls)
128
129
130 def unregister():
131     from bpy.utils import unregister_class
132     for cls in classes:
133         unregister_class(cls)