-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathblur.lua
73 lines (70 loc) · 1.83 KB
/
blur.lua
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
function init()
setName("Blur")
setDesc("Blurs texture")
setSize(100, 24+64+8+8+18+7+4)
addOutput(24+32)
addInput("Texture", 24+64+8+8)
addParameter("Intensity", "Blur intensity", 24+64+8+8+18, 10, 0, 100, true)
end
function apply()
tileSize = getTileSize()
intensity = getValue(1, 0, 0, 100.0)
radius = math.floor(tileSize*intensity)
kernel = { }
a = 1.0/(2.0*radius*radius)
b = 1.0/(math.sqrt(2.0*math.pi)*radius)
c = 1.0
r = -radius
total = 0
for i=0, radius*2 do
x = r*r
kernel[i] = b*math.exp(-x*b)
total = total+kernel[i]
r = r+1
end
for i=0, radius*2 do
kernel[i] = kernel[i]/total
if radius==0 then
kernel[i] = 1
end
end
blurr = { }
blurg = { }
blurb = { }
for i=0, tileSize*tileSize-1 do
x = i%tileSize
y = math.floor(i/tileSize)
sumr = 0;
sumg = 0;
sumb = 0;
for bx=0, radius*2 do
cr, cg, cb = getValue(0, x-radius+bx, y, 1.0)
sumr = sumr+cr*kernel[bx]
sumg = sumg+cg*kernel[bx]
sumb = sumb+cb*kernel[bx]
end
blurr[i] = sumr
blurg[i] = sumg
blurb[i] = sumb
end
for i=0, tileSize*tileSize-1 do
x = i%tileSize
y = math.floor(i/tileSize)
sumr = 0;
sumg = 0;
sumb = 0;
for by=0, radius*2 do
ny = y-radius+by
while ny<0 do ny=ny+tileSize end
while ny>=tileSize do ny=ny-tileSize end
index = ny*tileSize+x
cr = blurr[index]
cg = blurg[index]
cb = blurb[index]
sumr = sumr+cr*kernel[by]
sumg = sumg+cg*kernel[by]
sumb = sumb+cb*kernel[by]
end
setPixel(0, x, y, sumr, sumg, sumb)
end
end