18 #ifndef PIC_UTIL_GL_STROKE_HPP 19 #define PIC_UTIL_GL_STROKE_HPP 21 #include "../../util/rasterizer.hpp" 22 #include "../../gl/image.hpp" 23 #include "../../util/gl/quad.hpp" 24 #include "../../util/gl/technique.hpp" 166 int halfBrushSize = this->
brushSize >> 1;
168 float halfBrushSizeXf = float(halfBrushSize) / float(
width);
169 float halfBrushSizeYf = float(halfBrushSize) / float(
height);
172 printf(
"%f %f\n", halfBrushSizeXf, halfBrushSizeYf);
175 this->
quad =
new QuadGL(
true, halfBrushSizeXf, halfBrushSizeYf);
185 for(
int i = 0; i < 3; i++) {
211 uniform vec2 shift_position;
212 out vec2 v_tex_coord;
215 v_tex_coord = a_tex_coord;
216 gl_Position = vec4(a_position + shift_position, 0.0, 1.0);
223 uniform sampler2D u_tex;
224 uniform vec4 current_color;
229 float shape = texture2D(u_tex, v_tex_coord).x;
230 f_color = vec4(current_color *
shape);
251 std::string fragment_source_annotation =
MAKE_STRING 253 uniform sampler2D u_tex;
259 float shape = texture2D(u_tex, v_tex_coord).x;
261 f_color = vec4(shapeVal, shapeVal, shapeVal,
shape);
295 std::vector<float> lengths;
297 for(
int i = 0; i < n; i += 2) {
300 tmpLen = sqrtf(x * x + y * y);
301 lengths.push_back(tmpLen);
306 std::vector<float> resampledPos;
310 float workLen = 0.0f;
311 int nSamples = int(len / (
rSize * 0.25f));
312 float deltaL = len / float(nSamples);
315 printf(
"Len: %f Samples: %d DeltaL: %f\n", len, nSamples, deltaL);
318 for(
int i = 1; i < nSamples; i++) {
322 float tmpWork = 0.0f;
324 for(j = 0; j < lengths.size(); j++) {
325 if(workLen >= tmpWork && workLen < (tmpWork + lengths[j])) {
330 tmpWork += lengths[j];
345 float shift = (deltaL - (tmpWork - workLen)) / lengths[j];
347 x = shift * (x1 - x0) + x0;
348 y = shift * (y1 - y0) + y0;
352 int indSG = tmpY *
width + tmpX;
353 bool tmpSampleGrid = sampleGrid[indSG];
357 if(tmpSampleGrid ==
false) {
358 resampledPos.push_back(x);
359 resampledPos.push_back(y);
360 sampleGrid[indSG] =
true;
374 if(sampleGrid != NULL) {
385 float xf = (x / float(
width) - 0.5f) * 2.0f;
386 float yf = (y / float(
height) - 0.5f) * 2.0f;
399 float xf = (x / float(
width) - 0.5f) * 2.0f;
400 float yf = (y / float(
height) - 0.5f) * 2.0f;
403 glBlendFunc(GL_ONE, GL_ONE);
405 glEnable(GL_TEXTURE_2D);
407 glActiveTexture(GL_TEXTURE0);
427 glDisable(GL_TEXTURE_2D);
433 glBlendFunc(GL_ONE, GL_ONE);
434 glEnable(GL_TEXTURE_2D);
436 glActiveTexture(GL_TEXTURE0);
446 for(
int i = 0; i < n; i += 2) {
456 glDisable(GL_TEXTURE_2D);
462 glBlendFunc(GL_ONE, GL_ONE);
472 glEnable(GL_TEXTURE_2D);
473 glActiveTexture(GL_TEXTURE0);
478 for(
int i = 0; i < n; i += 2) {
483 glBindTexture(GL_TEXTURE_2D, 0);
484 glDisable(GL_TEXTURE_2D);
StrokeGL(int width, int height, int brushSize, float *color)
StrokeGL.
Definition: stroke.hpp:151
void bindCol(float val)
bindCol
Definition: stroke.hpp:115
float rSize
Definition: stroke.hpp:38
void Straightner()
Straightner.
Definition: stroke.hpp:132
TechniqueGL brushProgram
Definition: stroke.hpp:47
void setOutputFragmentShaderIndex(const char *fragment_output_color_name, unsigned int index)
setOutputFragmentShaderIndex
Definition: technique.hpp:215
float size
Definition: stroke.hpp:38
void bindTexture()
bindTexture
QuadGL * quad
Definition: stroke.hpp:42
GLuint generateTextureGL(GLenum target, GLenum format_type, bool mipmap)
generateTextureGL
void setUniform1f(const char *name_uniform, float value0)
SetUniform1f.
Definition: technique.hpp:247
void unbind()
unbind
Definition: technique.hpp:197
float tmpColor[3]
Definition: stroke.hpp:40
void link()
link
Definition: technique.hpp:205
void setUniform2f(const char *name_uniform, float value0, float value1)
setUniform
Definition: technique.hpp:259
#define MAKE_STRING(input_string)
bool init(std::string version_number, std::string vertex_shader_source, std::string fragment_shader_source)
Definition: technique.hpp:67
TechniqueGL annotationProgram
Definition: stroke.hpp:46
The ImageGL class.
Definition: image.hpp:42
static bool * assign(bool *buffer, int n, bool value)
assign assigns value to buffer
Definition: filter_radial_basis_function.hpp:45
The TechniqueGL class.
Definition: technique.hpp:31
int brushSize
Definition: stroke.hpp:36
The QuadGL class.
Definition: quad.hpp:30
void unBindCol()
unBindCol
Definition: stroke.hpp:124
void RenderBrushGL(int x, int y)
RenderBrushGL.
Definition: stroke.hpp:397
float color[4]
Definition: stroke.hpp:39
void printLog(std::string name)
printLog
Definition: technique.hpp:176
void unBindTexture()
unBindTexture
int width
Definition: stroke.hpp:36
#define PIC_INLINE
Definition: base.hpp:33
~StrokeGL()
Definition: stroke.hpp:195
std::vector< float > positions
Definition: stroke.hpp:44
void RenderAnnotationGL()
RenderAnnotationGL.
Definition: stroke.hpp:459
void setAttributeIndex(const char *attribute_name, unsigned int index)
setAttributeIndex
Definition: technique.hpp:225
void Render()
Render draws a quad on screen.
Definition: quad.hpp:140
float annotation
Definition: stroke.hpp:50
void setUniform4f(const char *name_uniform, float value0, float value1, float value2, float value3)
setUniform4f
Definition: technique.hpp:289
void Insert2DPoint(int x, int y)
Insert2DPoint.
Definition: stroke.hpp:379
void Resample()
Resample.
Definition: stroke.hpp:282
GLuint getTexture() const
getTexture
Definition: image.hpp:369
Definition: bilateral_separation.hpp:25
#define CLAMP(x, a)
Definition: math.hpp:77
void initShaders()
initShaders
Definition: stroke.hpp:204
#define MAX(a, b)
Definition: math.hpp:73
The StrokeGL class.
Definition: stroke.hpp:33
int height
Definition: stroke.hpp:36
PIC_INLINE void evaluateSolid(Image *img)
evaluateSolid renders a centred circle.
Definition: rasterizer.hpp:238
ImageGL * shape
Definition: stroke.hpp:37
void RenderGL()
RenderGL.
Definition: stroke.hpp:430
void Reset()
Reset.
Definition: stroke.hpp:392
void setUniform1i(const char *name_uniform, int value0)
SetUniform.
Definition: technique.hpp:236
void bind()
bind
Definition: technique.hpp:189
unsigned int Size()
Size.
Definition: stroke.hpp:106