static int win_width, win_height;
static float win_aspect;
+static int reshape_pending;
static struct erb_rend *erb;
static int drag_x, drag_y;
static int drag;
+static unsigned int fbtex;
int main(int argc, char **argv)
{
}
reshape_pending = 1;
+ glGenTextures(1, &fbtex);
+ glBindTexture(GL_TEXTURE_2D, fbtex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glEnable(GL_TEXTURE_2D);
+
glutMainLoop();
erb_destroy(erb);
return 0;
if(reshape_pending) {
reshape_pending = 0;
- erb_allocframe(erb, x, y);
+ erb_allocframe(erb, win_width, win_height);
erb_begin(erb);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, win_width, win_height, 0,
- GL_RGB, GL_FLOAT, erb_getframe(erb));
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, win_width, win_height, 0,
+ GL_RGBA, GL_FLOAT, erb_getframe(erb));
+ } else {
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, win_width, win_height,
+ GL_RGBA, GL_FLOAT, erb_getframe(erb));
}
/* TODO: continue with getting notified when a block is done rendering */
+
glClear(GL_COLOR_BUFFER_BIT);
+ glBegin(GL_QUADS);
+ glColor3f(1, 1, 1);
+ glTexCoord2f(0, 0);
+ glVertex2f(0, 0);
+ glTexCoord2f(1, 0);
+ glVertex2f(win_width, 0);
+ glTexCoord2f(1, 1);
+ glVertex2f(win_width, win_height);
+ glTexCoord2f(0, 1);
+ glVertex2f(0, win_height);
+ glEnd();
+
if(drag) {
+ glPushAttrib(GL_ENABLE_BIT);
+ glDisable(GL_TEXTURE_2D);
glEnable(GL_LOGIC_OP);
glLogicOp(GL_XOR);
glVertex2f(drag_x, mouse_y);
glEnd();
- glDisable(GL_LOGIC_OP);
+ glPopAttrib();
}
glutSwapBuffers();
if(key == 27) {
glutExit();
}
+ glutPostRedisplay();
}
static void mouse(int bn, int st, int x, int y)
rect[1] = y < drag_y ? y : drag_y;
rect[2] = abs(x - drag_x);
rect[3] = abs(y - drag_y);
+
+ erb_queue_block(erb, rect[0], rect[1], rect[2], rect[3]);
printf("rect: %d,%d %dx%d\n", rect[0], rect[1], rect[2], rect[3]);
}