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