Outliner: Don't show id operations (make single user) when not supported
[blender.git] / tests / python / eevee_render_tests.py
1 #!/usr/bin/env python3
2 # Apache License, Version 2.0
3
4 import argparse
5 import os
6 import shlex
7 import shutil
8 import subprocess
9 import sys
10
11 def setup():
12     import bpy
13
14     for scene in bpy.data.scenes:
15         scene.render.engine = 'BLENDER_EEVEE'
16
17     # Enable Eevee features
18     scene = bpy.context.scene
19     eevee = scene.eevee
20
21     eevee.use_soft_shadows = True
22
23     eevee.use_ssr = True
24     eevee.use_ssr_refraction = True
25
26     eevee.use_gtao = True
27     eevee.gtao_distance = 1
28
29     eevee.use_volumetric_shadows = True
30     eevee.volumetric_tile_size = '2'
31
32     for mat in bpy.data.materials:
33         # This needs to be enabled case by case,
34         # otherwise we loose SSR and GTAO everywhere.
35         # mat.use_screen_refraction = True
36         mat.use_sss_translucency = True
37
38     cubemap = None
39     grid = None
40     # Does not work in edit mode
41     try:
42         # Simple probe setup
43         bpy.ops.object.lightprobe_add(type='CUBEMAP', location=(0.5, 0, 1.5))
44         cubemap = bpy.context.selected_objects[0]
45         cubemap.scale = (2.5,2.5,1.0)
46         cubemap.data.falloff = 0
47         cubemap.data.clip_start = 2.4
48
49         bpy.ops.object.lightprobe_add(type='GRID', location=(0, 0, 0.25))
50         grid = bpy.context.selected_objects[0]
51         grid.scale = (1.735,1.735,1.735)
52         grid.data.grid_resolution_x = 3
53         grid.data.grid_resolution_y = 3
54         grid.data.grid_resolution_z = 2
55     except:
56         pass
57
58     try:
59         # Try to only include the plane in reflections
60         plane = bpy.data.objects['Plane']
61
62         collection = bpy.data.collections.new("Reflection")
63         collection.objects.link(plane)
64         # Add all lights to light the plane
65         if invert == False:
66             for light in bpy.data.objects:
67                 if light.type == 'LIGHT':
68                     collection.objects.link(light)
69
70         # Add collection to the scene
71         scene.collection.children.link(collection)
72
73         cubemap.data.visibility_collection = collection
74     except:
75         pass
76
77     eevee.gi_diffuse_bounces = 1
78     eevee.gi_cubemap_resolution = '128'
79     eevee.gi_visibility_resolution = '16'
80     eevee.gi_irradiance_smoothing = 0
81
82     bpy.ops.scene.light_cache_bake()
83
84
85 # When run from inside Blender, render and exit.
86 try:
87     import bpy
88     inside_blender = True
89 except ImportError:
90     inside_blender = False
91
92 if inside_blender:
93     try:
94         setup()
95     except Exception as e:
96         print(e)
97         sys.exit(1)
98
99
100 def get_arguments(filepath, output_filepath):
101     return [
102         "--background",
103         "-noaudio",
104         "--factory-startup",
105         "--enable-autoexec",
106         filepath,
107         "-E", "BLENDER_EEVEE",
108         "-P",
109         os.path.realpath(__file__),
110         "-o", output_filepath,
111         "-F", "PNG",
112         "-f", "1"]
113
114
115 def create_argparse():
116     parser = argparse.ArgumentParser()
117     parser.add_argument("-blender", nargs="+")
118     parser.add_argument("-testdir", nargs=1)
119     parser.add_argument("-outdir", nargs=1)
120     parser.add_argument("-idiff", nargs=1)
121     return parser
122
123
124 def main():
125     parser = create_argparse()
126     args = parser.parse_args()
127
128     blender = args.blender[0]
129     test_dir = args.testdir[0]
130     idiff = args.idiff[0]
131     output_dir = args.outdir[0]
132
133     from modules import render_report
134     report = render_report.Report("Eevee", output_dir, idiff)
135     report.set_pixelated(True)
136     report.set_reference_dir("eevee_renders")
137     report.set_compare_engines('eevee', 'cycles')
138     ok = report.run(test_dir, blender, get_arguments, batch=True)
139
140     sys.exit(not ok)
141
142
143 if not inside_blender and __name__ == "__main__":
144     main()