-
Notifications
You must be signed in to change notification settings - Fork 0
/
MaSaiKe.cpp
114 lines (69 loc) · 2.15 KB
/
MaSaiKe.cpp
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
static const char * const HELP = "MaSaiKe";
static const char * const CLASS = "MaSaiKe";
#include "DDImage\Iop.h"
#include "DDImage\Row.h"
#include "DDImage\Knobs.h"
#include "DDImage\Tile.h"
#include "DDImage\NukeWrapper.h"
using namespace DD::Image;
class MaSaiKe : public Iop
{
public:
int _size;
MaSaiKe(Node * node) :Iop(node) { _size = 5; }
~MaSaiKe() {}
void _validate(bool for_real);
void _request(int x, int y, int r, int t, ChannelMask channels, int count);
void engine(int y, int l, int r, ChannelMask channels, Row& row);
virtual void knobs(Knob_Callback);
const char* Class() const { return CLASS; }
const char* node_help() const { return HELP; }
static const Iop::Description d;
};
void MaSaiKe::_validate(bool for_real)
{
if (_size < 1) _size = 1;
copy_info();
info_.pad(_size);
}
void MaSaiKe::_request(int x, int y, int r, int t, ChannelMask channels, int count)
{
if (_size < 1) _size = 1;
input(0)->request(x - (_size + 1.0) * 2, y - (_size + 1.0) * 2, r + (_size + 1.0) * 2, t + (_size + 1.0) * 2, channels, count);
}
void MaSaiKe::engine(int y, int x, int r, ChannelMask channels, Row& row)
{
if (_size < 1) _size = 1;
Tile tile(input0(), x - _size * 2, y - _size * 2, r + _size * 2, y + _size * 2, channels);
if (aborted()) {
std::cerr << "Aborted!"<<std::endl;
return;
}
foreach(z, channels) {
float* out = row.writable(z);
for (int i = x; i < r; i++)
{
int x_index = i / _size;
int y_index = y / _size;
float value = 0.0;
for (int x_offset = 0 ; x_index * _size+x_offset < (x_index+1)*_size ; x_offset++ )
{
for (int y_offset = 0; y_index*_size + y_offset < (y_index+1)*_size; y_offset++ )
{
value += tile[z][tile.clampy(y_index*_size + y_offset)][tile.clampx(x_index*_size + x_offset)];
}
}
out[i] = value/(_size*_size);
}
}
}
void MaSaiKe::knobs(Knob_Callback f)
{
Int_knob(f, &_size, "size");
Tooltip(f, "size");
}
static Iop* build(Node* node)
{
return new MaSaiKe(node);
}
const Iop::Description MaSaiKe::d(CLASS, "MaSaiKe", build);