Blender  V2.93
render/background.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2013 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 #include "render/background.h"
18 #include "device/device.h"
19 #include "render/graph.h"
20 #include "render/integrator.h"
21 #include "render/nodes.h"
22 #include "render/scene.h"
23 #include "render/shader.h"
24 #include "render/stats.h"
25 
26 #include "util/util_foreach.h"
27 #include "util/util_math.h"
28 #include "util/util_time.h"
29 #include "util/util_types.h"
30 
32 
34 {
35  NodeType *type = NodeType::add("background", create);
36 
37  SOCKET_FLOAT(ao_factor, "AO Factor", 0.0f);
38  SOCKET_FLOAT(ao_distance, "AO Distance", FLT_MAX);
39 
40  SOCKET_BOOLEAN(use_shader, "Use Shader", true);
41  SOCKET_BOOLEAN(use_ao, "Use AO", false);
42  SOCKET_UINT(visibility, "Visibility", PATH_RAY_ALL_VISIBILITY);
43 
44  SOCKET_BOOLEAN(transparent, "Transparent", false);
45  SOCKET_BOOLEAN(transparent_glass, "Transparent Glass", false);
46  SOCKET_FLOAT(transparent_roughness_threshold, "Transparent Roughness Threshold", 0.0f);
47 
48  SOCKET_FLOAT(volume_step_size, "Volume Step Size", 0.1f);
49 
50  SOCKET_NODE(shader, "Shader", Shader::get_node_type());
51 
52  return type;
53 }
54 
55 Background::Background() : Node(get_node_type())
56 {
57  shader = NULL;
58 }
59 
61 {
62 }
63 
65 {
66  if (!is_modified())
67  return;
68 
69  scoped_callback_timer timer([scene](double time) {
70  if (scene->update_stats) {
71  scene->update_stats->background.times.add_entry({"device_update", time});
72  }
73  });
74 
75  device_free(device, dscene);
76 
77  Shader *bg_shader = get_shader(scene);
78 
79  /* set shader index and transparent option */
80  KernelBackground *kbackground = &dscene->data.background;
81 
82  kbackground->ao_factor = (use_ao) ? ao_factor : 0.0f;
83  kbackground->ao_bounces_factor = ao_factor;
84  kbackground->ao_distance = ao_distance;
85 
86  kbackground->transparent = transparent;
87  kbackground->surface_shader = scene->shader_manager->get_shader_id(bg_shader);
88 
89  if (transparent && transparent_glass) {
90  /* Square twice, once for principled BSDF convention, and once for
91  * faster comparison in kernel with anisotropic roughness. */
93  sqr(transparent_roughness_threshold));
94  }
95  else {
96  kbackground->transparent_roughness_squared_threshold = -1.0f;
97  }
98 
99  if (bg_shader->has_volume)
100  kbackground->volume_shader = kbackground->surface_shader;
101  else
102  kbackground->volume_shader = SHADER_NONE;
103 
104  kbackground->volume_step_size = volume_step_size * scene->integrator->get_volume_step_rate();
105 
106  /* No background node, make world shader invisible to all rays, to skip evaluation in kernel. */
107  if (bg_shader->graph->nodes.size() <= 1) {
108  kbackground->surface_shader |= SHADER_EXCLUDE_ANY;
109  }
110  /* Background present, check visibilities */
111  else {
112  if (!(visibility & PATH_RAY_DIFFUSE))
113  kbackground->surface_shader |= SHADER_EXCLUDE_DIFFUSE;
114  if (!(visibility & PATH_RAY_GLOSSY))
115  kbackground->surface_shader |= SHADER_EXCLUDE_GLOSSY;
116  if (!(visibility & PATH_RAY_TRANSMIT))
117  kbackground->surface_shader |= SHADER_EXCLUDE_TRANSMIT;
118  if (!(visibility & PATH_RAY_VOLUME_SCATTER))
119  kbackground->surface_shader |= SHADER_EXCLUDE_SCATTER;
120  if (!(visibility & PATH_RAY_CAMERA))
121  kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA;
122  }
123 
124  clear_modified();
125 }
126 
127 void Background::device_free(Device * /*device*/, DeviceScene * /*dscene*/)
128 {
129 }
130 
132 {
133  Shader *bg_shader = get_shader(scene);
134  if (bg_shader && bg_shader->is_modified()) {
135  /* Tag as modified to update the KernelBackground visibility information.
136  * We only tag the use_shader socket as modified as it is related to the shader
137  * and to avoid doing unnecessary updates anywhere else. */
138  tag_use_shader_modified();
139  }
140 
141  if (ao_factor_is_modified() || use_ao_is_modified()) {
143  }
144 }
145 
147 {
148  return (use_shader) ? ((shader) ? shader : scene->default_background) : scene->default_empty;
149 }
150 
_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)
Definition: device.h:293
void tag_update(Scene *scene, uint32_t flag)
Definition: integrator.cpp:292
@ BACKGROUND_AO_MODIFIED
Definition: integrator.h:94
list< ShaderNode * > nodes
Definition: graph.h:317
int get_shader_id(Shader *shader, bool smooth=false)
Definition: shader.cpp:449
Definition: shader.h:80
bool has_volume
Definition: shader.h:120
NODE_DECLARE ShaderGraph * graph
Definition: shader.h:85
double time
Scene scene
#define CCL_NAMESPACE_END
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
#define SHADER_NONE
Definition: kernel_types.h:58
@ PATH_RAY_TRANSMIT
Definition: kernel_types.h:268
@ PATH_RAY_VOLUME_SCATTER
Definition: kernel_types.h:290
@ PATH_RAY_GLOSSY
Definition: kernel_types.h:270
@ PATH_RAY_ALL_VISIBILITY
Definition: kernel_types.h:295
@ PATH_RAY_DIFFUSE
Definition: kernel_types.h:269
@ PATH_RAY_CAMERA
Definition: kernel_types.h:266
@ SHADER_EXCLUDE_CAMERA
Definition: kernel_types.h:588
@ SHADER_EXCLUDE_DIFFUSE
Definition: kernel_types.h:585
@ SHADER_EXCLUDE_ANY
Definition: kernel_types.h:590
@ SHADER_EXCLUDE_SCATTER
Definition: kernel_types.h:589
@ SHADER_EXCLUDE_GLOSSY
Definition: kernel_types.h:586
@ SHADER_EXCLUDE_TRANSMIT
Definition: kernel_types.h:587
#define SOCKET_FLOAT(name, ui_name, default_value,...)
Definition: node_type.h:204
#define SOCKET_NODE(name, ui_name, node_type,...)
Definition: node_type.h:233
#define SOCKET_UINT(name, ui_name, default_value,...)
Definition: node_type.h:202
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
Definition: node_type.h:198
CCL_NAMESPACE_BEGIN NODE_DEFINE(Background)
float transparent_roughness_squared_threshold
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
Definition: node.h:98
bool is_modified()
Definition: node.cpp:781
Shader * default_empty
Definition: scene.h:257
Shader * default_background
Definition: scene.h:256
ShaderManager * shader_manager
Definition: scene.h:245
Integrator * integrator
Definition: scene.h:231
SceneUpdateStats * update_stats
Definition: scene.h:270
ccl_device_inline float sqr(float a)
Definition: util_math.h:651