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

// Ángulos de cámara
float camYaw = 0.0f;
float camPitch = 20.0f;
float camDist = 2.0f;   // ← distancia de la cámara

void updateCamera()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    float yawRad   = camYaw   * 3.14159f / 180.0f;
    float pitchRad = camPitch * 3.14159f / 180.0f;

    float camX = camDist * cos(pitchRad) * sin(yawRad);
    float camY = camDist * sin(pitchRad);
    float camZ = camDist * cos(pitchRad) * cos(yawRad);

    gluLookAt(camX, camY, camZ,
              0.0f, 0.0f, 0.0f,
              0.0f, 1.0f, 0.0f);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    updateCamera();

    glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 0.0f,  0.5f, 0.0f);
        glVertex3f(-0.5f, -0.5f, 0.0f);
        glVertex3f( 0.5f, -0.5f, 0.0f);
    glEnd();

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (float)w / h, 0.1, 100.0);

    glMatrixMode(GL_MODELVIEW);
}

// ← Flechas
void specialKeys(int key, int x, int y)
{
    const float rotSpeed = 5.0f;

    if (key == GLUT_KEY_LEFT)  camYaw -= rotSpeed;
    if (key == GLUT_KEY_RIGHT) camYaw += rotSpeed;
    if (key == GLUT_KEY_UP)    camPitch += rotSpeed;
    if (key == GLUT_KEY_DOWN)  camPitch -= rotSpeed;

    if (camPitch > 89.0f) camPitch = 89.0f;
    if (camPitch < -89.0f) camPitch = -89.0f;

    glutPostRedisplay();
}

// ← Teclas ASCII (+ y -)
void keyboard(unsigned char key, int x, int y)
{
    const float zoomSpeed = 0.1f;

    if (key == '+') camDist -= zoomSpeed;   // acercar
    if (key == '-') camDist += zoomSpeed;   // alejar

    if (camDist < 0.5f) camDist = 0.5f;     // evita cruzar el centro
    if (camDist > 20.0f) camDist = 20.0f;   // límite razonable

    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Camara con Flechas + Zoom (+ -)");

    glEnable(GL_DEPTH_TEST);
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutSpecialFunc(specialKeys);
    glutKeyboardFunc(keyboard);

    glutMainLoop();
    return 0;
}

