Blender  V3.3
blender/output_driver.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2021-2022 Blender Foundation */
3 
5 
7 
9 {
10 }
11 
13 {
14 }
15 
17 {
18  /* Get render result. */
19  BL::RenderResult b_rr = b_engine_.begin_result(tile.offset.x,
20  tile.offset.y,
21  tile.size.x,
22  tile.size.y,
23  tile.layer.c_str(),
24  tile.view.c_str());
25 
26  /* Can happen if the intersected rectangle gives 0 width or height. */
27  if (b_rr.ptr.data == NULL) {
28  return false;
29  }
30 
31  BL::RenderResult::layers_iterator b_single_rlay;
32  b_rr.layers.begin(b_single_rlay);
33 
34  /* layer will be missing if it was disabled in the UI */
35  if (b_single_rlay == b_rr.layers.end()) {
36  return false;
37  }
38 
39  BL::RenderLayer b_rlay = *b_single_rlay;
40 
41  /* Copy each pass.
42  * TODO:copy only the required ones for better performance? */
43  for (BL::RenderPass &b_pass : b_rlay.passes) {
44  tile.set_pass_pixels(b_pass.name(), b_pass.channels(), (float *)b_pass.rect());
45  }
46 
47  b_engine_.end_result(b_rr, false, false, false);
48 
49  return true;
50 }
51 
53 {
54  /* Use final write for preview renders, otherwise render result wouldn't be updated
55  * quickly on Blender side. For all other cases we use the display driver. */
56  if (b_engine_.is_preview()) {
58  return true;
59  }
60 
61  /* Don't highlight full-frame tile. */
62  if (!(tile.size == tile.full_size)) {
63  b_engine_.tile_highlight_clear_all();
64  b_engine_.tile_highlight_set(tile.offset.x, tile.offset.y, tile.size.x, tile.size.y, true);
65  }
66 
67  return false;
68 }
69 
71 {
72  b_engine_.tile_highlight_clear_all();
73 
74  /* Get render result. */
75  BL::RenderResult b_rr = b_engine_.begin_result(tile.offset.x,
76  tile.offset.y,
77  tile.size.x,
78  tile.size.y,
79  tile.layer.c_str(),
80  tile.view.c_str());
81 
82  /* Can happen if the intersected rectangle gives 0 width or height. */
83  if (b_rr.ptr.data == NULL) {
84  return;
85  }
86 
87  BL::RenderResult::layers_iterator b_single_rlay;
88  b_rr.layers.begin(b_single_rlay);
89 
90  /* Layer will be missing if it was disabled in the UI. */
91  if (b_single_rlay == b_rr.layers.end()) {
92  return;
93  }
94 
95  BL::RenderLayer b_rlay = *b_single_rlay;
96 
97  vector<float> pixels(static_cast<size_t>(tile.size.x) * tile.size.y * 4);
98 
99  /* Copy each pass. */
100  for (BL::RenderPass &b_pass : b_rlay.passes) {
101  if (!tile.get_pass_pixels(b_pass.name(), b_pass.channels(), &pixels[0])) {
102  memset(&pixels[0], 0, pixels.size() * sizeof(float));
103  }
104 
105  b_pass.rect(&pixels[0]);
106  }
107 
108  b_engine_.end_result(b_rr, false, false, true);
109 }
110 
struct RenderEngine RenderEngine
struct RenderLayer RenderLayer
struct RenderResult RenderResult
struct RenderPass RenderPass
virtual void write_render_tile(const Tile &tile) override
BL::RenderEngine b_engine_
virtual bool update_render_tile(const Tile &tile) override
BlenderOutputDriver(BL::RenderEngine &b_engine)
virtual bool read_render_tile(const Tile &tile) override
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
ccl_global const KernelWorkTile * tile