nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "opengl.h" nuclear@0: nuclear@0: static bool init(); nuclear@0: static void cleanup(); nuclear@0: static void resize_rtarget(int xsz, int ysz); nuclear@0: static void update_rect(int x, int y, int xsz, int ysz, float *pixels); nuclear@0: static void display(); nuclear@0: static void reshape(int x, int y); nuclear@0: static void keyb(unsigned char key, int x, int y); nuclear@0: static void mouse(int bn, int st, int x, int y); nuclear@0: static int next_pow2(int x); nuclear@0: nuclear@0: static int width, height, rtex_width, rtex_height; nuclear@0: static unsigned int rtex; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: glutInitWindowSize(1024, 600); nuclear@0: glutInit(&argc, argv); nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); nuclear@0: glutCreateWindow("erebus OpenGL frontend"); nuclear@0: nuclear@0: glutDisplayFunc(display); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keyb); nuclear@0: glutMouseFunc(mouse); nuclear@0: nuclear@0: if(!init()) { nuclear@0: return 1; nuclear@0: } nuclear@0: atexit(cleanup); nuclear@0: nuclear@0: glutMainLoop(); nuclear@0: } nuclear@0: nuclear@0: static bool init() nuclear@0: { nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: static void cleanup() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: static void resize_rtarget(int xsz, int ysz) nuclear@0: { nuclear@0: static unsigned char *defpix; nuclear@0: nuclear@0: width = xsz; nuclear@0: height = ysz; nuclear@0: nuclear@0: if(xsz <= rtex_width && ysz <= rtex_height) { nuclear@0: return; nuclear@0: } nuclear@0: rtex_width = next_pow2(xsz); nuclear@0: rtex_height = next_pow2(ysz); nuclear@0: nuclear@0: printf("resizing framebuffer texture: %dx%d\n", rtex_width, rtex_height); nuclear@0: nuclear@0: if(!rtex) { nuclear@0: glGenTextures(1, &rtex); nuclear@0: } nuclear@0: nuclear@0: delete [] defpix; nuclear@0: defpix = new unsigned char[rtex_width * rtex_height * 4]; nuclear@0: unsigned char *ptr = defpix; nuclear@0: for(int i=0; i> 4) & 1) == ((j >> 4) & 1); nuclear@0: nuclear@0: int val = chess ? 64 : 48; nuclear@0: nuclear@0: *ptr++ = val; nuclear@0: *ptr++ = val; nuclear@0: *ptr++ = val; nuclear@0: *ptr++ = 255; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: glBindTexture(GL_TEXTURE_2D, rtex); nuclear@0: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); nuclear@0: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); nuclear@0: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, rtex_width, rtex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, defpix); nuclear@0: } nuclear@0: nuclear@0: static void update_rect(int x, int y, int xsz, int ysz, float *pixels) nuclear@0: { nuclear@0: glBindTexture(GL_TEXTURE_2D, rtex); nuclear@0: glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, xsz, ysz, GL_RGBA, GL_FLOAT, pixels); nuclear@0: } nuclear@0: nuclear@0: static void display() nuclear@0: { nuclear@0: glBindTexture(GL_TEXTURE_2D, rtex); nuclear@0: glEnable(GL_TEXTURE_2D); nuclear@0: nuclear@0: float maxu = (float)width / (float)rtex_width; nuclear@0: float maxv = (float)height / (float)rtex_height; nuclear@0: nuclear@0: glBegin(GL_QUADS); nuclear@0: glTexCoord2f(0, maxv); glVertex2f(-1, -1); nuclear@0: glTexCoord2f(maxu, maxv); glVertex2f(1, -1); nuclear@0: glTexCoord2f(maxu, 0); glVertex2f(1, 1); nuclear@0: glTexCoord2f(0, 0); glVertex2f(-1, 1); nuclear@0: glEnd(); nuclear@0: nuclear@0: glDisable(GL_TEXTURE_2D); nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: static void reshape(int x, int y) nuclear@0: { nuclear@0: glViewport(0, 0, x, y); nuclear@0: resize_rtarget(x, y); nuclear@0: } nuclear@0: nuclear@0: static void keyb(unsigned char key, int x, int y) nuclear@0: { nuclear@0: switch(key) { nuclear@0: case 27: nuclear@0: exit(0); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static void mouse(int bn, int st, int x, int y) nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: static int next_pow2(int x) nuclear@0: { nuclear@0: int res = 2; nuclear@0: while(res < x) { nuclear@0: res <<= 1; nuclear@0: } nuclear@0: return res; nuclear@0: }