
// g++ main.cpp -lGL -lglut -lGLU
#include <stdio.h>
#include <GL/glut.h>

#define NX 100
#define NY 100
int S[NX][NY];

void changeSize(int w, int h) 
{
	float ratio = 1.0 * w / h;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(0, 0, w, h);
	gluOrtho2D(0,1,0,1);
	glMatrixMode(GL_MODELVIEW);
}
void renderScene(void) 
{
   int i,j;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glColor3f(1,1,1);
	glPointSize(5.0);
   float dx = 1.0/NX;
   float dy = 1.0/NY;
    for(i=0; i<NX; i++)
	      for(j=0; j<NY; j++)
	   {
		  float x,y;
		  x = i/(float)NX;
		  y = j/(float)NY;
		  
		  
		  if(S[i][j]==0) 
			glColor4f(1,1,1,1);
		  else
			glColor4f(0,0,0,1);
		  
			glBegin(GL_QUADS);								
				glVertex2f(x, y);
		        glVertex2f(x+dx,y);
		        glVertex2f(x+dx,y+dy);
		        glVertex2f(x,y+dy);
			glEnd();
	   }
   
	glutSwapBuffers();
}
void idleFunction(void)
{
	glutPostRedisplay();
}

void init(void)
{
   int i,j;
   for(i=0; i<NX; i++)
	 for(j=0; j<NY; j++)
	   {
		  float r = rand()/(float)RAND_MAX;
		  if(r>0.5)
			  S[i][j] = 1;
		  else
			S[i][j] = 0;
	   }
   
}

void Keyboard(unsigned char key, int x, int y)
{
   
     switch (key)
	 {
		
	  case 27:             // ESCAPE key
			  exit (0);
			  break;
	  default:
		break;
	 }
   
   
}


int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(320,320);
	glutCreateWindow("GLUT, przyklad");
	// register callbacks
	glutDisplayFunc(renderScene);
	glutReshapeFunc(changeSize);
	glutIdleFunc(idleFunction);
	glutKeyboardFunc(Keyboard);   
    init();
   
	// enter GLUT event processing cycle
	// 
	// 
	// 
	glutMainLoop();
}
