summaryrefslogtreecommitdiff
path: root/lib/core/c++/particle/blur.hpp
blob: a304e8d5c36b91b6cea8f1bc20ae0f32a911a790 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma once

namespace kel {
namespace lbm {
template<typename T, uint64_t D>
void blur_mask(saw::data<sch::Array<T,D>>& p_mask){

	saw::data<T> mid{2.0/3.0};
	saw::data<T> edge{1.0/6.0};

	// saw::data<sch::FixedArray<sch::UInt64>,2u> blur_weights{{2.0/3.0},{1.0/6.0}};

	auto meta = p_mask.dims();
	saw::data<sch::Array<T,D>> blurred_mask{meta};

	for(saw::data<sch::UInt64> i{0u}; i < saw::data<sch::UInt64>{D}; ++i){
		iterator<D>::apply([&](const auto& index){
			blurred_mask.at(index) = p_mask.at(index) * mid;

			if(index.at({i}).get() > 0u){
				auto l_ind = index;
				l_ind.at({i}) = ind.at({i}) - 1u;
				blurred_mask.at(index) = blurred_mask.at(index) + p_mask.at(l_ind) * edge;
			}
			if((index.at({i}).get() + 1u) < meta.at({i})){
				auto r_ind = index;
				r_ind.at({i}) = ind.at({i}) + 1u;
				blurred_mask.at(index) = blurred_mask.at(index) + p_mask.at(r_ind) * edge;
			}
		},{},meta);

		p_mask = blurred_mask;
	}

}
}
}