#include <GL/glut.h>
#include <vector>

// Ejemplo de matriz de colores RGB (puedes modificarla)
std::vector<std::vector<std::vector<int>>> Amat;
std::vector<std::vector<std::vector<int>>> Bmat;

void Matrizota(void)
{
	for (int i=0; i<1024; ++i) {
		std::vector<std::vector<int>> lin;
		for (int j=0; j<1024; ++j) {
			std::vector<int> pix;
			pix.push_back(i % 256);
			pix.push_back(j % 256);
			pix.push_back((i+j) % 256);
			lin.push_back(pix);
		}
		Amat.push_back(lin);
	}
}

// Función para inicializar OpenGL
void initOpenGL(int width, int height) {
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);	// Fondo blanco
    glViewport(0, 0, width, height);		// Tamaño de la ventana
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, 0, height, -1, 1);	// Coordenadas ortográficas 2D
    glMatrixMode(GL_MODELVIEW);
}

// Función que dibuja la imagen
void drawImage(int width, int height) {
    glClear(GL_COLOR_BUFFER_BIT);  // Limpiar la pantalla

    // Recorrer la matriz y dibujar los píxeles
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            int r = Amat[i][j][0];
            int g = Amat[i][j][1];
            int b = Amat[i][j][2];

            // Establecer el color del píxel
            glColor3f(r / 255.0f, g / 255.0f, b / 255.0f);

            // Dibujar un rectángulo de 1x1 para representar el píxel
            glBegin(GL_QUADS);
                glVertex2i(j, i);       // Esquina inferior izquierda
                glVertex2i(j + 1, i);   // Esquina inferior derecha
                glVertex2i(j + 1, i + 1); // Esquina superior derecha
                glVertex2i(j, i + 1);   // Esquina superior izquierda
            glEnd();
        }
    }

    glutSwapBuffers();  // Intercambiar los buffers para mostrar la imagen
}

void displayFunc() {
    int width = Amat[0].size();
    int height = Amat.size();
    drawImage(width, height);
}

// Función principal
int main(int argc, char** argv) {
	Matrizota();
    int width = Amat[0].size();  // Ancho de la imagen
    int height = Amat.size();    // Alto de la imagen

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  // Doble buffer y modo RGB
    glutInitWindowSize(width, height);  // Tamaño de la ventana
    glutCreateWindow("Imagen de Color desde Matriz");  // Crear la ventana

	// Iniciar OpenGL
    initOpenGL(width, height);

    // Función que se llama para dibujar la imagen
	glutDisplayFunc(displayFunc);
	// Bucle principal de OpenGL
    glutMainLoop();  
    return 0;
}

