-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathClone.cpp
More file actions
executable file
·126 lines (100 loc) · 3.3 KB
/
Clone.cpp
File metadata and controls
executable file
·126 lines (100 loc) · 3.3 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
//
// Clone.cpp
// FaceSubstitutionCamera
//
// Created by James Lilard on 2014/10/20.
//
//
#include "Clone.h"
void Clone::setup(int width, int height) {
ofFbo::Settings settings;
settings.width = width;
settings.height = height;
buffer.allocate(settings);
srcBlur.allocate(settings);
dstBlur.allocate(settings);
maskBlurShader.load("shader/maskBlurShader");
cloneShader.load("shader/cloneShader");
strength = 0;
}
void Clone::maskedBlur(ofTexture& tex, ofTexture& mask, ofFbo& result) {
int k = strength;
buffer.begin();
maskBlurShader.begin();
maskBlurShader.setUniformTexture("tex0", tex, 1);
maskBlurShader.setUniformTexture("mask", mask, 2);
maskBlurShader.setUniform2f("direction", 1./(tex.getWidth()*2), 0.);
maskBlurShader.setUniform1i("k", k);
tex.draw(0, 0);
maskBlurShader.end();
buffer.end();
result.begin();
maskBlurShader.begin();
maskBlurShader.setUniformTexture("tex0", buffer, 1);
maskBlurShader.setUniformTexture("mask", mask, 2);
maskBlurShader.setUniform2f("direction", 0., 1./(buffer.getHeight()));
maskBlurShader.setUniform1i("k", k);
buffer.draw(0, 0);
maskBlurShader.end();
buffer.draw(0, 0);
result.end();
}
void Clone::setStrength(int strength) {
this->strength = strength;
}
void Clone::update(ofTexture& src, ofTexture& dst, ofTexture& mask) {
maskedBlur(src, mask, srcBlur);
maskedBlur(dst, mask, dstBlur);
buffer.begin();
ofPushStyle();
ofEnableAlphaBlending();
dst.draw(0, 0);
cloneShader.begin();
cloneShader.setUniformTexture("src", src, 1);
cloneShader.setUniformTexture("srcBlur", srcBlur, 2);
cloneShader.setUniformTexture("dstBlur", dstBlur, 3);
dst.draw(0, 0);
cloneShader.end();
ofDisableAlphaBlending();
ofPopStyle();
buffer.end();
}
void Clone::draw(float x, float y) {
buffer.draw(x, y);
}
void Clone::debugShader(ofTexture &tex, ofTexture &mask){
debugFbo.allocate(buffer.getWidth(), buffer.getHeight());
debugResultFbo.allocate(buffer.getWidth(), buffer.getHeight());
ofShader debugShader;
debugShader.load("shader/maskBlurShader");
setStrength(16);
debugFbo.begin();
// debugShader.begin();
//
// //maskBlurShader.setUniformTexture("tex", tex, 1);
// debugShader.setUniformTexture("tex0", tex, 1);
// debugShader.setUniformTexture("mask", mask, 2);
// debugShader.setUniform2f("direction", 0, 1);
// debugShader.setUniform1i("k", strength);
// mask.draw(0, 0);
//
// debugShader.end();
maskBlurShader.begin();
maskBlurShader.setUniformTexture("tex0", tex, 1);
maskBlurShader.setUniformTexture("mask", mask, 2);
//maskBlurShader.setUniform2f("direction", 0., 1./tex.getHeight());
maskBlurShader.setUniform2f("direction", 1./tex.getWidth(), 0.);
maskBlurShader.setUniform1i("k", strength);
tex.draw(0, 0);
maskBlurShader.end();
debugFbo.end();
// debugResultFbo.begin();
//
// maskBlurShader.setUniformTexture("tex0", debugFbo, 1);
// maskBlurShader.setUniformTexture("mask", mask, 2);
// maskBlurShader.setUniform2f("direction", 0., 1./tex.getHeight());
// maskBlurShader.setUniform1i("k", strength);
// debugFbo.draw(0, 0);
//
// debugResultFbo.end();
}