Blender  V3.3
layer_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. */
3 #include "testing/testing.h"
4 
5 #include "MEM_guardedalloc.h"
6 
7 #include "BKE_appdir.h"
8 #include "BKE_idtype.h"
9 #include "BKE_layer.h"
10 
11 #include "BLI_string.h"
12 
13 #include "RE_engine.h"
14 
15 #include "IMB_imbuf.h"
16 
17 #include "CLG_log.h"
18 
19 #include "RNA_access.h"
20 #include "RNA_prototypes.h"
21 
22 #include "GHOST_Path-api.h"
23 
24 namespace blender::bke::tests {
25 
26 TEST(view_layer, aov_unique_names)
27 {
28  /* Set Up */
29  CLG_init();
32  IMB_init();
34 
35  Scene scene = {{nullptr}};
37  ViewLayer *view_layer = static_cast<ViewLayer *>(scene.view_layers.first);
38 
40  RenderEngine *engine = RE_engine_create(engine_type);
41 
42  EXPECT_FALSE(BKE_view_layer_has_valid_aov(view_layer));
43  EXPECT_EQ(view_layer->active_aov, nullptr);
44 
45  /* Add an AOV */
46  ViewLayerAOV *aov1 = BKE_view_layer_add_aov(view_layer);
47  BKE_view_layer_verify_aov(engine, &scene, view_layer);
48  EXPECT_EQ(view_layer->active_aov, aov1);
49  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
50  EXPECT_FALSE((aov1->flag & AOV_CONFLICT) != 0);
51 
52  /* Add a second AOV */
53  ViewLayerAOV *aov2 = BKE_view_layer_add_aov(view_layer);
54  BKE_view_layer_verify_aov(engine, &scene, view_layer);
55  EXPECT_EQ(view_layer->active_aov, aov2);
56  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
57  EXPECT_FALSE((aov1->flag & AOV_CONFLICT) != 0);
58  EXPECT_FALSE((aov2->flag & AOV_CONFLICT) != 0);
59  EXPECT_TRUE(STREQ(aov1->name, "AOV"));
60  EXPECT_TRUE(STREQ(aov2->name, "AOV_001"));
61 
62  /* Revert previous resolution */
63  BLI_strncpy(aov2->name, "AOV", MAX_NAME);
64  BKE_view_layer_verify_aov(engine, &scene, view_layer);
65  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
66  EXPECT_FALSE((aov1->flag & AOV_CONFLICT) != 0);
67  EXPECT_FALSE((aov2->flag & AOV_CONFLICT) != 0);
68  EXPECT_TRUE(STREQ(aov1->name, "AOV"));
69  EXPECT_TRUE(STREQ(aov2->name, "AOV_001"));
70 
71  /* Resolve by removing AOV resolution */
72  BKE_view_layer_remove_aov(view_layer, aov2);
73  aov2 = nullptr;
74  BKE_view_layer_verify_aov(engine, &scene, view_layer);
75  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
76  EXPECT_FALSE((aov1->flag & AOV_CONFLICT) != 0);
77 
78  /* Tear down */
79  RE_engine_free(engine);
82  IMB_exit();
84  CLG_exit();
86 }
87 
89  RenderEngine *engine,
90  ViewLayer *view_layer,
91  ViewLayerAOV *aov,
92  const char *render_pass_name,
93  const char *rna_prop_name)
94 {
96  RNA_pointer_create(&scene->id, &RNA_ViewLayer, view_layer, &ptr);
97  RNA_boolean_set(&ptr, rna_prop_name, false);
98 
99  /* Rename to Conflicting name */
100  BLI_strncpy(aov->name, render_pass_name, MAX_NAME);
101  BKE_view_layer_verify_aov(engine, scene, view_layer);
102  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
103  EXPECT_FALSE((aov->flag & AOV_CONFLICT) != 0);
104  EXPECT_TRUE(STREQ(aov->name, render_pass_name));
105 
106  /* Activate render pass */
107  RNA_boolean_set(&ptr, rna_prop_name, true);
108  BKE_view_layer_verify_aov(engine, scene, view_layer);
109  EXPECT_FALSE(BKE_view_layer_has_valid_aov(view_layer));
110  EXPECT_TRUE((aov->flag & AOV_CONFLICT) != 0);
111  EXPECT_TRUE(STREQ(aov->name, render_pass_name));
112 
113  /* Deactivate render pass */
114  RNA_boolean_set(&ptr, rna_prop_name, false);
115  BKE_view_layer_verify_aov(engine, scene, view_layer);
116  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
117  EXPECT_FALSE((aov->flag & AOV_CONFLICT) != 0);
118  EXPECT_TRUE(STREQ(aov->name, render_pass_name));
119 }
120 
121 TEST(view_layer, aov_conflict)
122 {
123  /* Set Up */
124  CLG_init();
125  BKE_appdir_init();
126  IMB_init();
127  RE_engines_init();
128 
129  Scene scene = {{nullptr}};
131  ViewLayer *view_layer = static_cast<ViewLayer *>(scene.view_layers.first);
132 
134  RenderEngine *engine = RE_engine_create(engine_type);
135 
136  EXPECT_FALSE(BKE_view_layer_has_valid_aov(view_layer));
137  EXPECT_EQ(view_layer->active_aov, nullptr);
138 
139  /* Add an AOV */
140  ViewLayerAOV *aov = BKE_view_layer_add_aov(view_layer);
141  BKE_view_layer_verify_aov(engine, &scene, view_layer);
142  EXPECT_EQ(view_layer->active_aov, aov);
143  EXPECT_TRUE(BKE_view_layer_has_valid_aov(view_layer));
144  EXPECT_FALSE((aov->flag & AOV_CONFLICT) != 0);
145 
146  test_render_pass_conflict(&scene, engine, view_layer, aov, "Depth", "use_pass_z");
147  test_render_pass_conflict(&scene, engine, view_layer, aov, "Normal", "use_pass_normal");
148  test_render_pass_conflict(&scene, engine, view_layer, aov, "Mist", "use_pass_mist");
149  test_render_pass_conflict(&scene, engine, view_layer, aov, "Shadow", "use_pass_shadow");
150  test_render_pass_conflict(&scene, engine, view_layer, aov, "AO", "use_pass_ambient_occlusion");
151  test_render_pass_conflict(&scene, engine, view_layer, aov, "Emit", "use_pass_emit");
152  test_render_pass_conflict(&scene, engine, view_layer, aov, "Env", "use_pass_environment");
153  test_render_pass_conflict(&scene, engine, view_layer, aov, "DiffDir", "use_pass_diffuse_direct");
154  test_render_pass_conflict(&scene, engine, view_layer, aov, "DiffCol", "use_pass_diffuse_color");
155  test_render_pass_conflict(&scene, engine, view_layer, aov, "GlossDir", "use_pass_glossy_direct");
156  test_render_pass_conflict(&scene, engine, view_layer, aov, "GlossCol", "use_pass_glossy_color");
157 
158  /* Tear down */
159  RE_engine_free(engine);
160  RE_engines_exit();
162  IMB_exit();
163  BKE_appdir_exit();
164  CLG_exit();
166 }
167 
168 } // namespace blender::bke::tests
void BKE_appdir_init(void)
Definition: appdir.c:88
void BKE_appdir_exit(void)
Definition: appdir.c:96
IDTypeInfo IDType_ID_SCE
Definition: scene.cc:1693
void BKE_idtype_init(void)
Definition: idtype.c:106
bool BKE_view_layer_has_valid_aov(struct ViewLayer *view_layer)
Definition: layer.c:2493
void BKE_view_layer_verify_aov(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
Definition: layer.c:2476
struct ViewLayerAOV * BKE_view_layer_add_aov(struct ViewLayer *view_layer)
Definition: layer.c:2421
void BKE_view_layer_remove_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov)
Definition: layer.c:2433
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
#define STREQ(a, b)
void CLG_exit(void)
Definition: clog.c:703
void CLG_init(void)
Definition: clog.c:696
#define MAX_NAME
Definition: DNA_defs.h:48
@ AOV_CONFLICT
GHOST_TSuccess GHOST_DisposeSystemPaths(void)
void IMB_init(void)
Definition: module.c:16
void IMB_exit(void)
Definition: module.c:25
Read Guarded memory(de)allocation.
Scene scene
RenderEngine * RE_engine_create(RenderEngineType *type)
Definition: engine.c:136
RenderEngineType * RE_engines_find(const char *idname)
Definition: engine.c:98
void RE_engines_init(void)
Definition: engine.c:59
void RE_engines_exit(void)
Definition: engine.c:69
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:164
static void test_render_pass_conflict(Scene *scene, RenderEngine *engine, ViewLayer *view_layer, ViewLayerAOV *aov, const char *render_pass_name, const char *rna_prop_name)
Definition: layer_test.cc:88
TEST(action_groups, ReconstructGroupsWithReordering)
Definition: action_test.cc:17
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
Definition: rna_access.c:4874
IDTypeInitDataFunction init_data
Definition: BKE_idtype.h:151
IDTypeFreeDataFunction free_data
Definition: BKE_idtype.h:162
void * first
Definition: DNA_listBase.h:31
char engine[32]
struct RenderData r
ListBase view_layers
ViewLayerAOV * active_aov
PointerRNA * ptr
Definition: wm_files.c:3480