Cogs.Core
Blur_Vanilla.cpp
1#include <algorithm>
2#include "Blur.h"
3#include "Context.h"
4
5using namespace Cogs::Core;
6
7namespace {
8
9 void boxFilterScanline(float* dst,
10 const float* src,
11 const uint32_t N,
12 const float radius)
13 {
14 auto s = 1.f / (2.f*radius + 1.f);
15 auto n = static_cast<uint32_t>(radius);
16 auto f = radius - n;
17
18 auto sum = src[0];
19 for (uint32_t k = 1; k <= n; k++) {
20 sum += src[k];
21 }
22 sum += f*src[n + 1];
23
24 for (uint32_t i = 0; i < N; i++) {
25 dst[i] = s*sum;
26 if (i + n + 1 < N) sum += (1.f - f)*src[i + n + 1];
27 if (i + n + 2 < N) sum += f*src[i + n + 2];
28 if (i - n < N) sum -= (1.f - f)*src[i - n];
29 if (i - n - 1 < N) sum -= f*src[i - n - 1];
30 }
31
32 }
33}
34
35void Blur::BoxFilterPassXTask::operator()()
36{
37 for (uint32_t k = a; k < b; k++) {
38 for (uint32_t j = 0; j < size.y; j++) {
39 for (uint32_t i = 0; i < size.x; i++) {
40 ptrA[i] = src[(k*size.y + j)*size.x + i];
41 }
42 for (uint32_t l = 0; l < iterations; l++) {
43 boxFilterScanline(ptrB, ptrA, size.x, radius);
44 std::swap(ptrA, ptrB);
45 }
46 for (uint32_t i = 0; i < size.x; i++) {
47 dst[(k*size.y + j)*size.x + i] = ptrA[i];
48 }
49 }
50 }
51}
52
53void Blur::BoxFilterPassYTask::operator()()
54{
55 for (uint32_t k = a; k < b; k++) {
56 for (uint32_t i = 0; i < size.x; i++) {
57 for (uint32_t j = 0; j < size.y; j++) {
58 ptrA[j] = src[(k*size.y + j)*size.x + i];
59 }
60 for (uint32_t l = 0; l < iterations; l++) {
61 boxFilterScanline(ptrB, ptrA, size.y, radius);
62 std::swap(ptrA, ptrB);
63 }
64 for (uint32_t j = 0; j < size.y; j++) {
65 dst[(k*size.y + j)*size.x + i] = ptrA[j];
66 }
67 }
68 }
69}
70
71void Blur::BoxFilterPassZTask::operator()()
72{
73 for (uint32_t j = a; j < b; j++) {
74 for (uint32_t i = 0; i < size.x; i++) {
75
76 for (uint32_t k = 0; k < size.z; k++) {
77 ptrA[k] = src[(k*size.y + j)*size.x + i];
78 }
79 for (uint32_t l = 0; l < iterations; l++) {
80 boxFilterScanline(ptrB, ptrA, size.z, radius);
81 std::swap(ptrA, ptrB);
82 }
83 for (uint32_t k = 0; k < size.z; k++) {
84 dst[(k*size.y + j)*size.x + i] = ptrA[k];
85 }
86 }
87 }
88}
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....