Blender  V3.3
scene/background.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #include "scene/background.h"
5 #include "device/device.h"
6 #include "scene/integrator.h"
7 #include "scene/scene.h"
8 #include "scene/shader.h"
9 #include "scene/shader_graph.h"
10 #include "scene/shader_nodes.h"
11 #include "scene/stats.h"
12 
13 #include "util/foreach.h"
14 #include "util/math.h"
15 #include "util/time.h"
16 #include "util/types.h"
17 
19 
21 {
22  NodeType *type = NodeType::add("background", create);
23 
24  SOCKET_BOOLEAN(use_shader, "Use Shader", true);
25  SOCKET_UINT(visibility, "Visibility", PATH_RAY_ALL_VISIBILITY);
26 
27  SOCKET_BOOLEAN(transparent, "Transparent", false);
28  SOCKET_BOOLEAN(transparent_glass, "Transparent Glass", false);
29  SOCKET_FLOAT(transparent_roughness_threshold, "Transparent Roughness Threshold", 0.0f);
30 
31  SOCKET_FLOAT(volume_step_size, "Volume Step Size", 0.1f);
32 
33  SOCKET_NODE(shader, "Shader", Shader::get_node_type());
34 
35  SOCKET_STRING(lightgroup, "Light Group", ustring());
36 
37  return type;
38 }
39 
40 Background::Background() : Node(get_node_type())
41 {
42  shader = NULL;
43 }
44 
46 {
48 }
49 
51 {
52  if (!is_modified())
53  return;
54 
55  scoped_callback_timer timer([scene](double time) {
56  if (scene->update_stats) {
57  scene->update_stats->background.times.add_entry({"device_update", time});
58  }
59  });
60 
61  device_free(device, dscene);
62 
63  Shader *bg_shader = get_shader(scene);
64 
65  /* set shader index and transparent option */
66  KernelBackground *kbackground = &dscene->data.background;
67 
68  kbackground->transparent = transparent;
69  kbackground->surface_shader = scene->shader_manager->get_shader_id(bg_shader);
70 
71  if (transparent && transparent_glass) {
72  /* Square twice, once for principled BSDF convention, and once for
73  * faster comparison in kernel with anisotropic roughness. */
74  kbackground->transparent_roughness_squared_threshold = sqr(
75  sqr(transparent_roughness_threshold));
76  }
77  else {
78  kbackground->transparent_roughness_squared_threshold = -1.0f;
79  }
80 
81  if (bg_shader->has_volume)
82  kbackground->volume_shader = kbackground->surface_shader;
83  else
84  kbackground->volume_shader = SHADER_NONE;
85 
86  kbackground->volume_step_size = volume_step_size * scene->integrator->get_volume_step_rate();
87 
88  /* No background node, make world shader invisible to all rays, to skip evaluation in kernel. */
89  if (bg_shader->graph->nodes.size() <= 1) {
90  kbackground->surface_shader |= SHADER_EXCLUDE_ANY;
91  }
92  /* Background present, check visibilities */
93  else {
94  if (!(visibility & PATH_RAY_DIFFUSE))
95  kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE;
96  if (!(visibility & PATH_RAY_GLOSSY))
97  kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY;
98  if (!(visibility & PATH_RAY_TRANSMIT))
99  kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT;
100  if (!(visibility & PATH_RAY_VOLUME_SCATTER))
101  kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER;
102  if (!(visibility & PATH_RAY_CAMERA))
103  kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA;
104  }
105 
106  /* Light group. */
107  auto it = scene->lightgroups.find(lightgroup);
108  if (it != scene->lightgroups.end()) {
109  kbackground->lightgroup = it->second;
110  }
111  else {
112  kbackground->lightgroup = LIGHTGROUP_NONE;
113  }
114 
115  clear_modified();
116 }
117 
118 void Background::device_free(Device * /*device*/, DeviceScene * /*dscene*/)
119 {
120 }
121 
123 {
124  Shader *bg_shader = get_shader(scene);
125  if (bg_shader && bg_shader->is_modified()) {
126  /* Tag as modified to update the KernelBackground visibility information.
127  * We only tag the use_shader socket as modified as it is related to the shader
128  * and to avoid doing unnecessary updates anywhere else. */
129  tag_use_shader_modified();
130  }
131 }
132 
134 {
135  return (use_shader) ? ((shader) ? shader : scene->default_background) : scene->default_empty;
136 }
137 
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
NODE_DECLARE Background()
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
void device_free(Device *device, DeviceScene *dscene)
Shader * get_shader(const Scene *scene)
void tag_update(Scene *scene)
list< ShaderNode * > nodes
Definition: shader_graph.h:299
int get_shader_id(Shader *shader, bool smooth=false)
bool has_volume
Definition: scene/shader.h:107
NODE_DECLARE ShaderGraph * graph
Definition: scene/shader.h:71
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
double time
Scene scene
#define SHADER_NONE
Definition: kernel/types.h:39
@ PATH_RAY_TRANSMIT
Definition: kernel/types.h:196
@ PATH_RAY_VOLUME_SCATTER
Definition: kernel/types.h:201
@ PATH_RAY_GLOSSY
Definition: kernel/types.h:198
@ PATH_RAY_ALL_VISIBILITY
Definition: kernel/types.h:217
@ PATH_RAY_DIFFUSE
Definition: kernel/types.h:197
@ PATH_RAY_CAMERA
Definition: kernel/types.h:194
@ SHADER_EXCLUDE_CAMERA
Definition: kernel/types.h:442
@ SHADER_EXCLUDE_DIFFUSE
Definition: kernel/types.h:439
@ SHADER_EXCLUDE_ANY
Definition: kernel/types.h:445
@ SHADER_EXCLUDE_SCATTER
Definition: kernel/types.h:443
@ SHADER_EXCLUDE_GLOSSY
Definition: kernel/types.h:440
@ SHADER_EXCLUDE_TRANSMIT
Definition: kernel/types.h:441
#define LIGHTGROUP_NONE
Definition: kernel/types.h:45
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value)
Allocate a new IDProperty of type IDP_INT, set its name and value.
#define SOCKET_FLOAT(name, ui_name, default_value,...)
Definition: node_type.h:191
#define SOCKET_NODE(name, ui_name, node_type,...)
Definition: node_type.h:220
#define SOCKET_UINT(name, ui_name, default_value,...)
Definition: node_type.h:189
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
Definition: node_type.h:185
#define SOCKET_STRING(name, ui_name, default_value,...)
Definition: node_type.h:203
CCL_NAMESPACE_BEGIN NODE_DEFINE(Background)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
void dereference_all_used_nodes()
Definition: graph/node.cpp:779
bool is_modified() const
Definition: graph/node.cpp:804
Shader * default_empty
Definition: scene.h:236
Shader * default_background
Definition: scene.h:235
ShaderManager * shader_manager
Definition: scene.h:224
Integrator * integrator
Definition: scene.h:210
map< ustring, int > lightgroups
Definition: scene.h:201
SceneUpdateStats * update_stats
Definition: scene.h:249
ccl_device_inline float sqr(float a)
Definition: util/math.h:746