Blender  V2.93
scene.h
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 #ifndef __SCENE_H__
18 #define __SCENE_H__
19 
20 #include "bvh/bvh_params.h"
21 
22 #include "render/film.h"
23 #include "render/image.h"
24 #include "render/shader.h"
25 
26 #include "device/device.h"
27 #include "device/device_memory.h"
28 
29 #include "util/util_param.h"
30 #include "util/util_string.h"
31 #include "util/util_system.h"
32 #include "util/util_texture.h"
33 #include "util/util_thread.h"
34 #include "util/util_types.h"
35 #include "util/util_vector.h"
36 
38 
39 class AlembicProcedural;
41 class Background;
42 class BVH;
43 class Camera;
44 class Device;
45 class DeviceInfo;
46 class Film;
47 class Integrator;
48 class Light;
49 class LightManager;
50 class LookupTables;
51 class Geometry;
52 class GeometryManager;
53 class Object;
54 class ObjectManager;
56 class ParticleSystem;
57 class Procedural;
58 class ProceduralManager;
59 class CurveSystemManager;
60 class Shader;
61 class ShaderManager;
62 class Progress;
63 class BakeManager;
64 class BakeData;
65 class RenderStats;
66 class SceneUpdateStats;
67 class Volume;
68 
69 /* Scene Device Data */
70 
71 class DeviceScene {
72  public:
73  /* BVH */
84 
85  /* mesh */
91 
94 
96 
97  /* objects */
103 
104  /* cameras */
106 
107  /* attributes */
113 
114  /* lights */
119 
120  /* particles */
122 
123  /* shaders */
126 
127  /* lookup tables */
129 
130  /* integrator */
132 
133  /* ies lights */
135 
137 
138  DeviceScene(Device *device);
139 };
140 
141 /* Scene Parameters */
142 
143 class SceneParams {
144  public:
145  /* Type of BVH, in terms whether it is supported dynamic updates of meshes
146  * or whether modifying geometry requires full BVH rebuild.
147  */
148  enum BVHType {
149  /* BVH supports dynamic updates of geometry.
150  *
151  * Faster for updating BVH tree when doing modifications in viewport,
152  * but slower for rendering.
153  */
155  /* BVH tree is calculated for specific scene, updates in geometry
156  * requires full tree rebuild.
157  *
158  * Slower to update BVH tree when modifying objects in viewport, also
159  * slower to build final BVH tree but gives best possible render speed.
160  */
162 
164  };
165 
167 
168  /* Requested BVH layout.
169  *
170  * If it's not supported by the device, the widest one from supported ones
171  * will be used, but BVH wider than this one will never be used.
172  */
174 
182 
184 
186  {
190  use_bvh_spatial_split = false;
192  num_bvh_time_steps = 0;
193  hair_subdivisions = 3;
195  texture_limit = 0;
196  background = true;
197  }
198 
200  {
201  return !(shadingsystem == params.shadingsystem && bvh_layout == params.bvh_layout &&
202  bvh_type == params.bvh_type &&
203  use_bvh_spatial_split == params.use_bvh_spatial_split &&
204  use_bvh_unaligned_nodes == params.use_bvh_unaligned_nodes &&
205  num_bvh_time_steps == params.num_bvh_time_steps &&
206  hair_subdivisions == params.hair_subdivisions && hair_shape == params.hair_shape &&
207  texture_limit == params.texture_limit);
208  }
209 
211  {
212  /* Matching the tesselation rate limit in Embree. */
213  return clamp(1 << hair_subdivisions, 1, 16);
214  }
215 };
216 
217 /* Scene */
218 
219 class Scene : public NodeOwner {
220  public:
221  /* Optional name. Is used for logging and reporting. */
222  string name;
223 
224  /* data */
232 
233  /* data lists */
241 
242  /* data managers */
251 
252  /* default shaders */
258 
259  /* device */
262 
263  /* parameters */
265 
266  /* mutex must be locked manually by callers */
268 
269  /* scene update statistics */
271 
273  ~Scene();
274 
275  void device_update(Device *device, Progress &progress);
276 
279 
282  float motion_shutter_time();
283 
284  bool need_update();
285  bool need_reset();
286 
287  void reset();
288  void device_free();
289 
290  void collect_statistics(RenderStats *stats);
291 
292  void enable_update_stats();
293 
294  bool update(Progress &progress, bool &kernel_switch_needed);
295 
296  /* This function is used to create a node of a specified type instead of
297  * calling 'new', and sets the scene as the owner of the node.
298  * The function has overloads that will also add the created node to the right
299  * node array (e.g. Scene::geometry for Geometry nodes) and tag the appropriate
300  * manager for an update.
301  */
302  template<typename T, typename... Args> T *create_node(Args &&... args)
303  {
304  T *node = new T(args...);
305  node->set_owner(this);
306  return node;
307  }
308 
309  /* This function is used to delete a node from the scene instead of calling 'delete'
310  * and manually removing the node from the data array. It also tags the
311  * appropriate manager for an update, if any, and checks that the scene is indeed
312  * the owner of the node. Calling this function on a node not owned by the scene
313  * will likely cause a crash which we want in order to detect such cases.
314  */
315  template<typename T> void delete_node(T *node)
316  {
317  assert(node->get_owner() == this);
319  }
320 
321  /* Same as above, but specify the actual owner.
322  */
323  template<typename T> void delete_node(T *node, const NodeOwner *owner)
324  {
325  assert(node->get_owner() == owner);
327  (void)owner;
328  }
329 
330  /* Remove all nodes in the set from the appropriate data arrays, and tag the
331  * specific managers for an update. This assumes that the scene owns the nodes.
332  */
333  template<typename T> void delete_nodes(const set<T *> &nodes)
334  {
335  delete_nodes(nodes, this);
336  }
337 
338  /* Same as above, but specify the actual owner of all the nodes in the set.
339  */
340  template<typename T> void delete_nodes(const set<T *> &nodes, const NodeOwner *owner);
341 
342  protected:
343  /* Check if some heavy data worth logging was updated.
344  * Mainly used to suppress extra annoying logging.
345  */
346  bool need_data_update();
347 
348  void free_memory(bool final);
349 
352 
353  bool load_kernels(Progress &progress, bool lock_scene = true);
354 
355  /* ** Split kernel routines ** */
356 
358 
359  /* Maximum number of closure during session lifetime. */
361 
362  /* Get maximum number of closures to be used in kernel. */
363  int get_max_closure_count();
364 
365  template<typename T> void delete_node_impl(T *node)
366  {
367  delete node;
368  }
369 };
370 
371 template<> Light *Scene::create_node<Light>();
372 
373 template<> Mesh *Scene::create_node<Mesh>();
374 
375 template<> Object *Scene::create_node<Object>();
376 
377 template<> Hair *Scene::create_node<Hair>();
378 
379 template<> Volume *Scene::create_node<Volume>();
380 
381 template<> ParticleSystem *Scene::create_node<ParticleSystem>();
382 
383 template<> Shader *Scene::create_node<Shader>();
384 
385 template<> AlembicProcedural *Scene::create_node<AlembicProcedural>();
386 
387 template<> void Scene::delete_node_impl(Light *node);
388 
389 template<> void Scene::delete_node_impl(Mesh *node);
390 
391 template<> void Scene::delete_node_impl(Volume *node);
392 
393 template<> void Scene::delete_node_impl(Hair *node);
394 
395 template<> void Scene::delete_node_impl(Geometry *node);
396 
397 template<> void Scene::delete_node_impl(Object *node);
398 
400 
401 template<> void Scene::delete_node_impl(Shader *node);
402 
403 template<> void Scene::delete_node_impl(Procedural *node);
404 
405 template<> void Scene::delete_node_impl(AlembicProcedural *node);
406 
407 template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner);
408 
409 template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner);
410 
411 template<> void Scene::delete_nodes(const set<Object *> &nodes, const NodeOwner *owner);
412 
413 template<> void Scene::delete_nodes(const set<ParticleSystem *> &nodes, const NodeOwner *owner);
414 
415 template<> void Scene::delete_nodes(const set<Shader *> &nodes, const NodeOwner *owner);
416 
417 template<> void Scene::delete_nodes(const set<Procedural *> &nodes, const NodeOwner *owner);
418 
420 
421 #endif /* __SCENE_H__ */
CCL_NAMESPACE_BEGIN typedef KernelBVHLayout BVHLayout
Definition: bvh_params.h:32
Definition: bvh/bvh.h:80
device_vector< DecomposedTransform > object_motion
Definition: scene.h:100
device_vector< float4 > tri_vnormal
Definition: scene.h:87
device_vector< float4 > prim_tri_verts
Definition: scene.h:78
device_vector< float2 > prim_time
Definition: scene.h:83
device_vector< uint > patches
Definition: scene.h:95
device_vector< uint > prim_visibility
Definition: scene.h:80
device_vector< uint4 > tri_vindex
Definition: scene.h:88
device_vector< KernelShader > shaders
Definition: scene.h:125
device_vector< uint > prim_tri_index
Definition: scene.h:77
device_vector< float2 > attributes_float2
Definition: scene.h:110
device_vector< Transform > object_motion_pass
Definition: scene.h:99
device_vector< uint4 > attributes_map
Definition: scene.h:108
device_vector< float > object_volume_step
Definition: scene.h:102
device_vector< float4 > curves
Definition: scene.h:92
device_vector< int > object_node
Definition: scene.h:76
device_vector< float2 > light_background_marginal_cdf
Definition: scene.h:117
DeviceScene(Device *device)
Definition: scene.cpp:48
device_vector< float > lookup_table
Definition: scene.h:128
device_vector< int > prim_object
Definition: scene.h:82
device_vector< float4 > curve_keys
Definition: scene.h:93
device_vector< float > ies_lights
Definition: scene.h:134
device_vector< float2 > light_background_conditional_cdf
Definition: scene.h:118
device_vector< KernelParticle > particles
Definition: scene.h:121
device_vector< KernelLightDistribution > light_distribution
Definition: scene.h:115
device_vector< uint > sample_pattern_lut
Definition: scene.h:131
device_vector< int4 > bvh_leaf_nodes
Definition: scene.h:75
device_vector< uint > tri_shader
Definition: scene.h:86
device_vector< uint > object_flag
Definition: scene.h:101
device_vector< DecomposedTransform > camera_motion
Definition: scene.h:105
device_vector< float > attributes_float
Definition: scene.h:109
device_vector< int4 > svm_nodes
Definition: scene.h:124
device_vector< float2 > tri_patch_uv
Definition: scene.h:90
device_vector< uint > tri_patch
Definition: scene.h:89
KernelData data
Definition: scene.h:136
device_vector< int > prim_type
Definition: scene.h:79
device_vector< float4 > attributes_float3
Definition: scene.h:111
device_vector< KernelLight > lights
Definition: scene.h:116
device_vector< int4 > bvh_nodes
Definition: scene.h:74
device_vector< KernelObject > objects
Definition: scene.h:98
device_vector< int > prim_index
Definition: scene.h:81
device_vector< uchar4 > attributes_uchar4
Definition: scene.h:112
Definition: device.h:293
Definition: film.h:59
BVHLayout bvh_layout
Definition: scene.h:173
bool background
Definition: scene.h:183
bool use_bvh_unaligned_nodes
Definition: scene.h:177
int texture_limit
Definition: scene.h:181
SceneParams()
Definition: scene.h:185
@ BVH_STATIC
Definition: scene.h:161
@ BVH_NUM_TYPES
Definition: scene.h:163
@ BVH_DYNAMIC
Definition: scene.h:154
bool use_bvh_spatial_split
Definition: scene.h:176
int curve_subdivisions()
Definition: scene.h:210
CurveShapeType hair_shape
Definition: scene.h:180
int num_bvh_time_steps
Definition: scene.h:178
bool modified(const SceneParams &params)
Definition: scene.h:199
int hair_subdivisions
Definition: scene.h:179
BVHType bvh_type
Definition: scene.h:175
ShadingSystem shadingsystem
Definition: scene.h:166
Definition: shader.h:80
OperationNode * node
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define CCL_NAMESPACE_END
AttributeStandard
Definition: kernel_types.h:744
CurveShapeType
Definition: kernel_types.h:713
@ CURVE_RIBBON
Definition: kernel_types.h:714
@ BVH_LAYOUT_BVH2
#define T
ShadingSystem
Definition: shader.h:48
@ SHADINGSYSTEM_SVM
Definition: shader.h:48
Definition: node.h:94
bool kernels_loaded
Definition: scene.h:350
BakeManager * bake_manager
Definition: scene.h:249
T * create_node(Args &&... args)
Definition: scene.h:302
Film * film
Definition: scene.h:229
string name
Definition: scene.h:222
BVH * bvh
Definition: scene.h:225
bool need_global_attribute(AttributeStandard std)
Definition: scene.cpp:376
ParticleSystemManager * particle_system_manager
Definition: scene.h:248
vector< Geometry * > geometry
Definition: scene.h:235
void need_global_attributes(AttributeRequestSet &attributes)
Definition: scene.cpp:388
Device * device
Definition: scene.h:260
vector< Shader * > shaders
Definition: scene.h:236
vector< Procedural * > procedurals
Definition: scene.h:240
int get_max_closure_count()
Definition: scene.cpp:573
~Scene()
Definition: scene.cpp:136
void device_free()
Definition: scene.cpp:435
bool load_kernels(Progress &progress, bool lock_scene=true)
Definition: scene.cpp:540
Shader * default_volume
Definition: scene.h:254
Camera * dicing_camera
Definition: scene.h:227
LookupTables * lookup_tables
Definition: scene.h:228
SceneParams params
Definition: scene.h:264
DeviceRequestedFeatures get_requested_device_features()
Definition: scene.cpp:453
vector< Pass > passes
Definition: scene.h:239
vector< Light * > lights
Definition: scene.h:237
Shader * default_surface
Definition: scene.h:253
void free_memory(bool final)
Definition: scene.cpp:141
Shader * default_empty
Definition: scene.h:257
vector< ParticleSystem * > particle_systems
Definition: scene.h:238
ImageManager * image_manager
Definition: scene.h:243
void enable_update_stats()
Definition: scene.cpp:446
Shader * default_background
Definition: scene.h:256
vector< Object * > objects
Definition: scene.h:234
MotionType need_motion()
Definition: scene.cpp:358
ObjectManager * object_manager
Definition: scene.h:247
void delete_node(T *node)
Definition: scene.h:315
Background * background
Definition: scene.h:230
MotionType
Definition: scene.h:280
@ MOTION_PASS
Definition: scene.h:280
@ MOTION_NONE
Definition: scene.h:280
@ MOTION_BLUR
Definition: scene.h:280
void delete_nodes(const set< T * > &nodes)
Definition: scene.h:333
Camera * camera
Definition: scene.h:226
ProceduralManager * procedural_manager
Definition: scene.h:250
ShaderManager * shader_manager
Definition: scene.h:245
DeviceRequestedFeatures loaded_kernel_features
Definition: scene.h:351
void delete_node_impl(T *node)
Definition: scene.h:365
int max_closure_global
Definition: scene.h:360
Integrator * integrator
Definition: scene.h:231
LightManager * light_manager
Definition: scene.h:244
thread_mutex mutex
Definition: scene.h:267
bool need_data_update()
Definition: scene.cpp:400
bool update(Progress &progress, bool &kernel_switch_needed)
Definition: scene.cpp:503
bool need_update()
Definition: scene.cpp:395
Shader * default_light
Definition: scene.h:255
void delete_node(T *node, const NodeOwner *owner)
Definition: scene.h:323
void reset()
Definition: scene.cpp:415
void collect_statistics(RenderStats *stats)
Definition: scene.cpp:440
bool need_reset()
Definition: scene.cpp:410
SceneUpdateStats * update_stats
Definition: scene.h:270
GeometryManager * geometry_manager
Definition: scene.h:246
DeviceScene dscene
Definition: scene.h:261
void delete_nodes(const set< T * > &nodes, const NodeOwner *owner)
float motion_shutter_time()
Definition: scene.cpp:368
Scene(const SceneParams &params, Device *device)
Definition: scene.cpp:92
void device_update(Device *device, Progress &progress)
Definition: scene.cpp:209
ccl_device_inline int clamp(int a, int mn, int mx)
Definition: util_math.h:283
CCL_NAMESPACE_BEGIN typedef std::mutex thread_mutex
Definition: util_thread.h:40