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_next/eevee_world.cc')
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_world.cc97
1 files changed, 97 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_world.cc b/source/blender/draw/engines/eevee_next/eevee_world.cc
new file mode 100644
index 00000000000..939f6087137
--- /dev/null
+++ b/source/blender/draw/engines/eevee_next/eevee_world.cc
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2021 Blender Foundation.
+ */
+
+/** \file
+ * \ingroup eevee
+ */
+
+#include "BKE_lib_id.h"
+#include "BKE_node.h"
+#include "BKE_world.h"
+#include "DEG_depsgraph_query.h"
+#include "NOD_shader.h"
+
+#include "eevee_instance.hh"
+
+namespace blender::eevee {
+
+/* -------------------------------------------------------------------- */
+/** \name Default Material
+ *
+ * \{ */
+
+DefaultWorldNodeTree::DefaultWorldNodeTree()
+{
+ bNodeTree *ntree = ntreeAddTree(nullptr, "World Nodetree", ntreeType_Shader->idname);
+ bNode *background = nodeAddStaticNode(nullptr, ntree, SH_NODE_BACKGROUND);
+ bNode *output = nodeAddStaticNode(nullptr, ntree, SH_NODE_OUTPUT_WORLD);
+ bNodeSocket *background_out = nodeFindSocket(background, SOCK_OUT, "Background");
+ bNodeSocket *output_in = nodeFindSocket(output, SOCK_IN, "Surface");
+ nodeAddLink(ntree, background, background_out, output, output_in);
+ nodeSetActive(ntree, output);
+
+ color_socket_ =
+ (bNodeSocketValueRGBA *)nodeFindSocket(background, SOCK_IN, "Color")->default_value;
+ ntree_ = ntree;
+}
+
+DefaultWorldNodeTree::~DefaultWorldNodeTree()
+{
+ ntreeFreeEmbeddedTree(ntree_);
+ MEM_SAFE_FREE(ntree_);
+}
+
+/* Configure a default nodetree with the given world. */
+bNodeTree *DefaultWorldNodeTree::nodetree_get(::World *wo)
+{
+ /* WARNING: This function is not threadsafe. Which is not a problem for the moment. */
+ copy_v3_fl3(color_socket_->value, wo->horr, wo->horg, wo->horb);
+ return ntree_;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name World
+ *
+ * \{ */
+
+void World::sync()
+{
+ // if (inst_.lookdev.sync_world()) {
+ // return;
+ // }
+
+ ::World *bl_world = inst_.scene->world;
+
+ if (bl_world == nullptr) {
+ // bl_world = BKE_world_default();
+ return;
+ }
+ else {
+ WorldHandle &wo_handle = inst_.sync.sync_world(bl_world);
+
+ if (wo_handle.recalc != 0) {
+ // inst_.lightprobes.set_world_dirty();
+ }
+ wo_handle.reset_recalc_flag();
+ }
+
+ /* TODO(fclem) This should be detected to scene level. */
+ ::World *orig_world = (::World *)DEG_get_original_id(&bl_world->id);
+ if (assign_if_different(prev_original_world, orig_world)) {
+ // inst_.sampling.reset();
+ }
+
+ bNodeTree *ntree = (bl_world->nodetree && bl_world->use_nodes) ?
+ bl_world->nodetree :
+ default_tree.nodetree_get(bl_world);
+
+ GPUMaterial *gpumat = inst_.shaders.world_shader_get(bl_world, ntree);
+ inst_.pipelines.world.sync(gpumat);
+}
+
+/** \} */
+
+} // namespace blender::eevee