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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_renderpasses.cc')
-rw-r--r--source/blender/draw/engines/eevee/eevee_renderpasses.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.cc b/source/blender/draw/engines/eevee/eevee_renderpasses.cc
new file mode 100644
index 00000000000..46cc2f67537
--- /dev/null
+++ b/source/blender/draw/engines/eevee/eevee_renderpasses.cc
@@ -0,0 +1,92 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * 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