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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-01-25 21:23:52 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-01-25 21:23:52 +0400
commitf99343d3b8676543e2bd6acd6ee2274c21b1b388 (patch)
treefd40cd33691a783f82cf877e774d1b3a64d91ed3 /intern/cycles/render/film.cpp
parent14f475fccad7158098ddecc285c617f990b2f8b5 (diff)
Cycles: Render Passes
Currently supported passes: * Combined, Z, Normal, Object Index, Material Index, Emission, Environment, Diffuse/Glossy/Transmission x Direct/Indirect/Color Not supported yet: * UV, Vector, Mist Only enabled for CPU devices at the moment, will do GPU tweaks tommorrow, also for environment importance sampling. Documentation: http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Passes
Diffstat (limited to 'intern/cycles/render/film.cpp')
-rw-r--r--intern/cycles/render/film.cpp179
1 files changed, 178 insertions, 1 deletions
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 0ae2866f182..bc51384b873 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -21,11 +21,111 @@
#include "film.h"
#include "scene.h"
+#include "util_foreach.h"
+
CCL_NAMESPACE_BEGIN
+/* Pass */
+
+void Pass::add(PassType type, vector<Pass>& passes)
+{
+ Pass pass;
+
+ pass.type = type;
+ pass.filter = true;
+ pass.exposure = false;
+
+ switch(type) {
+ case PASS_NONE:
+ pass.components = 0;
+ break;
+ case PASS_COMBINED:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_DEPTH:
+ pass.components = 1;
+ pass.filter = false;
+ break;
+ case PASS_NORMAL:
+ pass.components = 4;
+ break;
+ case PASS_UV:
+ pass.components = 4;
+ break;
+ case PASS_OBJECT_ID:
+ pass.components = 1;
+ pass.filter = false;
+ break;
+ case PASS_MATERIAL_ID:
+ pass.components = 1;
+ pass.filter = false;
+ break;
+ case PASS_DIFFUSE_COLOR:
+ pass.components = 4;
+ break;
+ case PASS_GLOSSY_COLOR:
+ pass.components = 4;
+ break;
+ case PASS_TRANSMISSION_COLOR:
+ pass.components = 4;
+ break;
+ case PASS_DIFFUSE_INDIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_GLOSSY_INDIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_TRANSMISSION_INDIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_DIFFUSE_DIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_GLOSSY_DIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_TRANSMISSION_DIRECT:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+
+ case PASS_EMISSION:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ case PASS_BACKGROUND:
+ pass.components = 4;
+ pass.exposure = true;
+ break;
+ }
+
+ passes.push_back(pass);
+}
+
+bool Pass::equals(const vector<Pass>& A, const vector<Pass>& B)
+{
+ if(A.size() != B.size())
+ return false;
+
+ for(int i = 0; i < A.size(); i++)
+ if(A[i].type != B[i].type)
+ return false;
+
+ return true;
+}
+
+/* Film */
+
Film::Film()
{
exposure = 0.8f;
+ Pass::add(PASS_COMBINED, passes);
need_update = true;
}
@@ -42,6 +142,82 @@ void Film::device_update(Device *device, DeviceScene *dscene)
/* update __data */
kfilm->exposure = exposure;
+ kfilm->pass_flag = 0;
+ kfilm->pass_stride = 0;
+ kfilm->use_light_pass = 0;
+
+ foreach(Pass& pass, passes) {
+ kfilm->pass_flag |= pass.type;
+
+ switch(pass.type) {
+ case PASS_COMBINED:
+ kfilm->pass_combined = kfilm->pass_stride;
+ break;
+ case PASS_DEPTH:
+ kfilm->pass_depth = kfilm->pass_stride;
+ break;
+ case PASS_NORMAL:
+ kfilm->pass_normal = kfilm->pass_stride;
+ break;
+ case PASS_UV:
+ kfilm->pass_uv = kfilm->pass_stride;
+ break;
+ case PASS_OBJECT_ID:
+ kfilm->pass_object_id = kfilm->pass_stride;
+ break;
+ case PASS_MATERIAL_ID:
+ kfilm->pass_material_id = kfilm->pass_stride;
+ break;
+ case PASS_DIFFUSE_COLOR:
+ kfilm->pass_diffuse_color = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_GLOSSY_COLOR:
+ kfilm->pass_glossy_color = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_TRANSMISSION_COLOR:
+ kfilm->pass_transmission_color = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_DIFFUSE_INDIRECT:
+ kfilm->pass_diffuse_indirect = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_GLOSSY_INDIRECT:
+ kfilm->pass_glossy_indirect = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_TRANSMISSION_INDIRECT:
+ kfilm->pass_transmission_indirect = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_DIFFUSE_DIRECT:
+ kfilm->pass_diffuse_direct = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_GLOSSY_DIRECT:
+ kfilm->pass_glossy_direct = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_TRANSMISSION_DIRECT:
+ kfilm->pass_transmission_direct = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+
+ case PASS_EMISSION:
+ kfilm->pass_emission = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
+ case PASS_BACKGROUND:
+ kfilm->pass_background = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ case PASS_NONE:
+ break;
+ }
+
+ kfilm->pass_stride += pass.components;
+ }
need_update = false;
}
@@ -52,7 +228,8 @@ void Film::device_free(Device *device, DeviceScene *dscene)
bool Film::modified(const Film& film)
{
- return !(exposure == film.exposure);
+ return !(exposure == film.exposure
+ && Pass::equals(passes, film.passes));
}
void Film::tag_update(Scene *scene)