Cycles: Added Cryptomatte output.
[blender.git] / intern / cycles / device / device_cpu.cpp
index 7eb73dea3ef610300d447a4078a6a5ca1ef0333c..eb816e1fdd0805158722e1c7c5246c562c37136d 100644 (file)
@@ -41,6 +41,7 @@
 #include "kernel/osl/osl_globals.h"
 
 #include "render/buffers.h"
+#include "render/coverage.h"
 
 #include "util/util_debug.h"
 #include "util/util_foreach.h"
@@ -677,8 +678,15 @@ public:
 
        void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg)
        {
+               const bool use_coverage = kernel_data.film.cryptomatte_passes & CRYPT_ACCURATE;
+
                scoped_timer timer(&tile.buffers->render_time);
 
+               Coverage coverage(kg, tile);
+               if(use_coverage) {
+                       coverage.init_path_trace();
+               }
+
                float *render_buffer = (float*)tile.buffer;
                int start_sample = tile.start_sample;
                int end_sample = tile.start_sample + tile.num_samples;
@@ -691,6 +699,9 @@ public:
 
                        for(int y = tile.y; y < tile.y + tile.h; y++) {
                                for(int x = tile.x; x < tile.x + tile.w; x++) {
+                                       if(use_coverage) {
+                                               coverage.init_pixel(x, y);
+                                       }
                                        path_trace_kernel()(kg, render_buffer,
                                                            sample, x, y, tile.offset, tile.stride);
                                }
@@ -700,6 +711,9 @@ public:
 
                        task.update_progress(&tile, tile.w*tile.h);
                }
+               if(use_coverage) {
+                       coverage.finalize();
+               }
        }
 
        void denoise(DenoisingTask& denoising, RenderTile &tile)
@@ -760,7 +774,6 @@ public:
                        }
                        else if(tile.task == RenderTile::DENOISE) {
                                denoise(denoising, tile);
-
                                task.update_progress(&tile, tile.w*tile.h);
                        }