From 1da0685076bbddaaa9eb20366f07b5d552f03eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Tue, 18 Aug 2020 12:15:46 +0200 Subject: Cycles: add a Pass Node The Pass struct is now a Node and the passes are moved from the Film class to the Scene class. The Pass Node only has `type` and `name` as sockets as those seem to be the only properties settable by exporters (other properties are implicit and depend on the pass type). This is part of T79131. Reviewed By: brecht Differential Revision: https://developer.blender.org/D8591 --- intern/cycles/render/film.cpp | 79 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 11 deletions(-) (limited to 'intern/cycles/render/film.cpp') diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp index d7cbf4a3581..7072fff4892 100644 --- a/intern/cycles/render/film.cpp +++ b/intern/cycles/render/film.cpp @@ -38,6 +38,60 @@ static bool compare_pass_order(const Pass &a, const Pass &b) return (a.components > b.components); } +NODE_DEFINE(Pass) +{ + NodeType *type = NodeType::add("pass", create); + + static NodeEnum pass_type_enum; + pass_type_enum.insert("combined", PASS_COMBINED); + pass_type_enum.insert("depth", PASS_DEPTH); + pass_type_enum.insert("normal", PASS_NORMAL); + pass_type_enum.insert("uv", PASS_UV); + pass_type_enum.insert("object_id", PASS_OBJECT_ID); + pass_type_enum.insert("material_id", PASS_MATERIAL_ID); + pass_type_enum.insert("motion", PASS_MOTION); + pass_type_enum.insert("motion_weight", PASS_MOTION_WEIGHT); +#ifdef __KERNEL_DEBUG__ + pass_type_enum.insert("traversed_nodes", PASS_BVH_TRAVERSED_NODES); + pass_type_enum.insert("traverse_instances", PASS_BVH_TRAVERSED_INSTANCES); + pass_type_enum.insert("bvh_intersections", PASS_BVH_INTERSECTIONS); + pass_type_enum.insert("ray_bounces", PASS_RAY_BOUNCES); +#endif + pass_type_enum.insert("render_time", PASS_RENDER_TIME); + pass_type_enum.insert("cryptomatte", PASS_CRYPTOMATTE); + pass_type_enum.insert("aov_color", PASS_AOV_COLOR); + pass_type_enum.insert("aov_value", PASS_AOV_VALUE); + pass_type_enum.insert("adaptive_aux_buffer", PASS_ADAPTIVE_AUX_BUFFER); + pass_type_enum.insert("sample_count", PASS_SAMPLE_COUNT); + pass_type_enum.insert("mist", PASS_MIST); + pass_type_enum.insert("emission", PASS_EMISSION); + pass_type_enum.insert("background", PASS_BACKGROUND); + pass_type_enum.insert("ambient_occlusion", PASS_AO); + pass_type_enum.insert("shadow", PASS_SHADOW); + pass_type_enum.insert("diffuse_direct", PASS_DIFFUSE_DIRECT); + pass_type_enum.insert("diffuse_indirect", PASS_DIFFUSE_INDIRECT); + pass_type_enum.insert("diffuse_color", PASS_DIFFUSE_COLOR); + pass_type_enum.insert("glossy_direct", PASS_GLOSSY_DIRECT); + pass_type_enum.insert("glossy_indirect", PASS_GLOSSY_INDIRECT); + pass_type_enum.insert("glossy_color", PASS_GLOSSY_COLOR); + pass_type_enum.insert("transmission_direct", PASS_TRANSMISSION_DIRECT); + pass_type_enum.insert("transmission_indirect", PASS_TRANSMISSION_INDIRECT); + pass_type_enum.insert("transmission_color", PASS_TRANSMISSION_COLOR); + pass_type_enum.insert("volume_direct", PASS_VOLUME_DIRECT); + pass_type_enum.insert("volume_indirect", PASS_VOLUME_INDIRECT); + pass_type_enum.insert("bake_primitive", PASS_BAKE_PRIMITIVE); + pass_type_enum.insert("bake_differential", PASS_BAKE_DIFFERENTIAL); + + SOCKET_ENUM(type, "Type", pass_type_enum, PASS_COMBINED); + SOCKET_STRING(name, "Name", ustring()); + + return type; +} + +Pass::Pass() : Node(node_type) +{ +} + void Pass::add(PassType type, vector &passes, const char *name) { for (size_t i = 0; i < passes.size(); i++) { @@ -330,8 +384,6 @@ NODE_DEFINE(Film) Film::Film() : Node(node_type) { - Pass::add(PASS_COMBINED, passes); - use_light_visibility = false; filter_table_offset = TABLE_OFFSET_INVALID; cryptomatte_passes = CRYPT_NONE; @@ -344,6 +396,11 @@ Film::~Film() { } +void Film::add_default(Scene *scene) +{ + Pass::add(PASS_COMBINED, scene->passes); +} + void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene) { if (!need_update) @@ -371,8 +428,8 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene) bool have_cryptomatte = false; - for (size_t i = 0; i < passes.size(); i++) { - Pass &pass = passes[i]; + for (size_t i = 0; i < scene->passes.size(); i++) { + Pass &pass = scene->passes[i]; if (pass.type == PASS_NONE) { continue; @@ -601,26 +658,26 @@ void Film::device_free(Device * /*device*/, DeviceScene * /*dscene*/, Scene *sce bool Film::modified(const Film &film) { - return !Node::equals(film) || !Pass::equals(passes, film.passes); + return !Node::equals(film); } void Film::tag_passes_update(Scene *scene, const vector &passes_, bool update_passes) { - if (Pass::contains(passes, PASS_UV) != Pass::contains(passes_, PASS_UV)) { + if (Pass::contains(scene->passes, PASS_UV) != Pass::contains(passes_, PASS_UV)) { scene->geometry_manager->tag_update(scene); foreach (Shader *shader, scene->shaders) shader->need_update_geometry = true; } - else if (Pass::contains(passes, PASS_MOTION) != Pass::contains(passes_, PASS_MOTION)) { + else if (Pass::contains(scene->passes, PASS_MOTION) != Pass::contains(passes_, PASS_MOTION)) { scene->geometry_manager->tag_update(scene); } - else if (Pass::contains(passes, PASS_AO) != Pass::contains(passes_, PASS_AO)) { + else if (Pass::contains(scene->passes, PASS_AO) != Pass::contains(passes_, PASS_AO)) { scene->integrator->tag_update(scene); } if (update_passes) { - passes = passes_; + scene->passes = passes_; } } @@ -629,10 +686,10 @@ void Film::tag_update(Scene * /*scene*/) need_update = true; } -int Film::get_aov_offset(string name, bool &is_color) +int Film::get_aov_offset(Scene *scene, string name, bool &is_color) { int num_color = 0, num_value = 0; - foreach (const Pass &pass, passes) { + foreach (const Pass &pass, scene->passes) { if (pass.type == PASS_AOV_COLOR) { num_color++; } -- cgit v1.2.3