00001 #include "InfoWidget.h"
00002
00005 InfoWidget::InfoWidget(OverlayWidget *parent) : QGLWidget(parent) {
00006 programObject = -1;
00007 }
00008
00009 void InfoWidget::setFrame(FCam::Frame::Ptr f) {
00010 frame = f;
00011 if (f) {
00012 update();
00013 }
00014 };
00015
00016 void InfoWidget::paintGL() {
00017 if (programObject < 0) {
00018
00019 GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
00020 const char vertSource[] =
00021 "attribute vec4 position, color;\n"
00022 "varying vec4 fragColor;\n"
00023 "void main() {\n"
00024 " gl_Position = position;\n"
00025 " fragColor = color;\n"
00026 "}\n";
00027 const char *sourcePtr = &(vertSource[0]);
00028 glShaderSource(vertShader, 1, &sourcePtr, NULL);
00029 glCompileShader(vertShader);
00030
00031 GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
00032 const char fragSource[] =
00033 "precision mediump float;\n"
00034 "varying vec4 fragColor;\n"
00035 "void main() {\n"
00036 " gl_FragColor = fragColor;\n"
00037 "}\n";
00038
00039 sourcePtr = &(fragSource[0]);
00040 glShaderSource(fragShader, 1, &sourcePtr, NULL);
00041 glCompileShader(fragShader);
00042
00043 GLint compileStatus = 0;
00044 glGetShaderiv(fragShader, GL_COMPILE_STATUS, &compileStatus);
00045 if (!compileStatus) {
00046 printf("Frag shader didn't compile\n");
00047 GLint infoLen;
00048 glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &infoLen);
00049 char *infoLog = new char[infoLen];
00050 glGetShaderInfoLog(fragShader, infoLen, NULL, infoLog);
00051 printf(infoLog);
00052 delete[] infoLog;
00053 }
00054 glGetShaderiv(vertShader, GL_COMPILE_STATUS, &compileStatus);
00055 if (!compileStatus) {
00056 printf("Vert shader didn't compile\n");
00057 GLint infoLen;
00058 glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &infoLen);
00059 char *infoLog = new char[infoLen];
00060 glGetShaderInfoLog(vertShader, infoLen, NULL, infoLog);
00061 printf(infoLog);
00062 delete[] infoLog;
00063 }
00064
00065 programObject = glCreateProgram();
00066 glAttachShader(programObject, vertShader);
00067 glAttachShader(programObject, fragShader);
00068
00069 glBindAttribLocation(programObject, 0, "position");
00070 glBindAttribLocation(programObject, 1, "color");
00071
00072 glLinkProgram(programObject);
00073 printf("Vertex and Fragment shaders compiled\n");
00074 }
00075
00076 qglClearColor(OverlayWidget::colorKey());
00077 glViewport(0, 0, width(), height());
00078 glClear(GL_COLOR_BUFFER_BIT);
00079
00080 if (!frame) return;
00081
00082 glUseProgram(programObject);
00083
00084 glLineWidth(2);
00085 glDisable(GL_DITHER);
00086
00087
00088 if (frame->sharpness.valid) {
00089 GLfloat vertices[4*2];
00090
00091 glVertexAttrib3f(1, 0, 1, 0);
00092 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
00093 glEnableVertexAttribArray(0);
00094 for (int sx = 0; sx < frame->sharpness.size.width; sx++) {
00095 for (int sy = 0; sy < frame->sharpness.size.height; sy++) {
00096 float x = 2*((sx + 0.5f) / frame->sharpness.size.width) -1;
00097 float y = 1-2*((sy + 0.5f) / frame->sharpness.size.height);
00098 int s = frame->sharpness(sx, sy);
00099 s >>= 15;
00100 s -= 2;
00101 if (s > 19) s = 19;
00102 if (s < 0) s = 0;
00103 float r = s/200.0f;
00104 vertices[0] = x-r; vertices[1] = y-r;
00105 vertices[2] = x+r; vertices[3] = y-r;
00106 vertices[4] = x+r; vertices[5] = y+r;
00107 vertices[6] = x-r; vertices[7] = y+r;
00108 glDrawArrays(GL_LINE_LOOP, 0, 4);
00109 }
00110 }
00111 }
00112
00113
00114
00115 }
00116
00117
00118