Welcome to mirror list, hosted at ThFree Co, Russian Federation.

eevee_renderpasses.cc « eevee « engines « draw « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b5172162aef21840a6a168f6aa99ba1aa6c3a43e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright 2021 Blender Foundation.
 */

#include "BLI_hash_tables.hh"
#include "BLI_rect.h"
#include "BLI_vector.hh"

#include "RE_pipeline.h"

#include "eevee_instance.hh"
#include "eevee_renderpasses.hh"

namespace blender::eevee {

class Instance;

/* -------------------------------------------------------------------- */
/** \name RenderPasses
 * \{ */

void RenderPasses::init(const int extent[2], const rcti *output_rect)
{
  const Scene *scene = inst_.scene;

  eRenderPassBit enabled_passes;
  if (inst_.render_layer) {
    enabled_passes = to_render_passes_bits(inst_.render_layer->passflag);
    /* Cannot output motion vectors when using motion blur. */
    if (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED) {
      enabled_passes &= ~RENDERPASS_VECTOR;
    }
  }
  else if (inst_.v3d) {
    enabled_passes = to_render_passes_bits(inst_.v3d->shading.render_pass);
    /* We need the depth pass for compositing overlays or GPencil. */
    if (!DRW_state_is_scene_render()) {
      enabled_passes |= RENDERPASS_DEPTH;
    }
  }
  else {
    enabled_passes = RENDERPASS_COMBINED;
  }

  const bool use_log_encoding = scene->eevee.flag & SCE_EEVEE_FILM_LOG_ENCODING;

  rcti fallback_rect;
  if (BLI_rcti_is_empty(output_rect)) {
    BLI_rcti_init(&fallback_rect, 0, extent[0], 0, extent[1]);
    output_rect = &fallback_rect;
  }

  /* HACK to iterate over all passes. */
  enabled_passes_ = RENDERPASS_ALL;
  for (RenderPassItem rpi : *this) {
    bool enable = (enabled_passes & rpi.pass_bit) != 0;
    if (enable && rpi.film == nullptr) {
      rpi.film = new Film(inst_,
                          to_render_passes_data_type(rpi.pass_bit, use_log_encoding),
                          to_render_passes_name(rpi.pass_bit));
    }
    else if (!enable && rpi.film != nullptr) {
      /* Delete unused passes. */
      delete rpi.film;
      rpi.film = nullptr;
    }

    if (rpi.film) {
      rpi.film->init(extent, output_rect);
    }
  }

  enabled_passes_ = enabled_passes;
}

/** \} */

}  // namespace blender::eevee