Untitled
#include <GL/glut.h> #include <cmath> // For sin and cos functions // Global variable to track mode bool isDay = true; void drawText(float x, float y, const char* text) { glRasterPos2f(x, y); for (const char* c = text; *c != '\0'; c++) { glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *c); } } void drawCloud(float x, float y) { glColor3f(1.0, 1.0, 1.0); // White clouds glBegin(GL_POLYGON); for (int i = 0; i < 360; i += 10) { float theta = i * 3.14159 / 180; glVertex2f(x + 0.1f * cos(theta), y + 0.05f * sin(theta)); } glEnd(); glBegin(GL_POLYGON); for (int i = 0; i < 360; i += 10) { float theta = i * 3.14159 / 180; glVertex2f((x + 0.12f) + 0.1f * cos(theta), y + 0.07f * sin(theta)); } glEnd(); glBegin(GL_POLYGON); for (int i = 0; i < 360; i += 10) { float theta = i * 3.14159 / 180; glVertex2f((x - 0.12f) + 0.1f * cos(theta), y + 0.07f * sin(theta)); } glEnd(); } void drawBuilding(float x, float y, float width, float height, bool hasSolar, const char* label) { // Draw the building glColor3f(0.6, 0.2, 0.2); // Default building color glBegin(GL_QUADS); glVertex2f(x, y); glVertex2f(x + width, y); glVertex2f(x + width, y + height); glVertex2f(x, y + height); glEnd(); // Add windows if (!isDay && hasSolar) { glColor3f(1.0, 1.0, 0.0); // Yellow for lit windows at night with solar } else { glColor3f(0.2, 0.2, 0.2); // Dark for unlit windows } glBegin(GL_QUADS); glVertex2f(x + width * 0.1f, y + height * 0.5f); glVertex2f(x + width * 0.4f, y + height * 0.5f); glVertex2f(x + width * 0.4f, y + height * 0.7f); glVertex2f(x + width * 0.1f, y + height * 0.7f); glEnd(); // Add solar panels if applicable if (hasSolar) { // Panel 1 glColor3f(0.0, 0.0, 1.0); // Blue for solar panels glBegin(GL_QUADS); glVertex2f(x + width * 0.1f, y + height); glVertex2f(x + width * 0.4f, y + height); glVertex2f(x + width * 0.35f, y + height * 1.1f); glVertex2f(x + width * 0.15f, y + height * 1.1f); glEnd(); // Panel 2 glBegin(GL_QUADS); glVertex2f(x + width * 0.6f, y + height); glVertex2f(x + width * 0.9f, y + height); glVertex2f(x + width * 0.85f, y + height * 1.1f); glVertex2f(x + width * 0.65f, y + height * 1.1f); glEnd(); } // Add building label glColor3f(1.0, 1.0, 1.0); // White text drawText(x + width * 0.25f, y + height * 0.1f, label); } void drawSun(float x, float y) { glColor3f(1.0, 1.0, 0.0); // Yellow sun glBegin(GL_POLYGON); for (int i = 0; i < 360; i += 10) { float theta = i * 3.14159 / 180; glVertex2f(x + 0.1f * cos(theta), y + 0.1f * sin(theta)); } glEnd(); } void drawMoon(float x, float y) { glColor3f(1.0, 1.0, 1.0); // White moon glBegin(GL_POLYGON); for (int i = 0; i < 360; i += 10) { float theta = i * 3.14159 / 180; glVertex2f(x + 0.1f * cos(theta), y + 0.1f * sin(theta)); } glEnd(); } void drawButtons() { // Draw Day Mode Button glColor3f(0.2, 0.6, 0.2); // Green for Day Mode glBegin(GL_QUADS); glVertex2f(-0.9f, -0.9f); glVertex2f(-0.6f, -0.9f); glVertex2f(-0.6f, -0.8f); glVertex2f(-0.9f, -0.8f); glEnd(); // Day Mode Text glColor3f(1.0, 1.0, 1.0); // White text drawText(-0.85f, -0.85f, "Day"); // Draw Night Mode Button glColor3f(0.2, 0.2, 0.6); // Blue for Night Mode glBegin(GL_QUADS); glVertex2f(-0.5f, -0.9f); glVertex2f(-0.2f, -0.9f); glVertex2f(-0.2f, -0.8f); glVertex2f(-0.5f, -0.8f); glEnd(); // Night Mode Text glColor3f(1.0, 1.0, 1.0); // White text drawText(-0.45f, -0.85f, "Night"); } void display() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); // Draw background if (isDay) { glColor3f(0.53f, 0.81f, 0.92f); // Light blue for day } else { glColor3f(0.0f, 0.0f, 0.2f); // Dark blue for night } glBegin(GL_QUADS); glVertex2f(-1.0f, -1.0f); glVertex2f(1.0f, -1.0f); glVertex2f(1.0f, 1.0f); glVertex2f(-1.0f, 1.0f); glEnd(); // Draw sun or moon if (isDay) { drawSun(0.8f, 0.8f); } else { drawMoon(0.8f, 0.8f); } // Draw clouds if (isDay || !isDay) { // Clouds visible in both modes drawCloud(-0.5f, 0.7f); drawCloud(0.2f, 0.8f); drawCloud(0.7f, 0.6f); } // Draw road glColor3f(0.2f, 0.2f, 0.2f); // Gray road glBegin(GL_QUADS); glVertex2f(-1.0f, -0.5f); glVertex2f(1.0f, -0.5f); glVertex2f(1.0f, -0.7f); glVertex2f(-1.0f, -0.7f); glEnd(); // Draw buildings drawBuilding(-0.8f, -0.7f, 0.4f, 0.6f, true, "OFFICE"); drawBuilding(-0.2f, -0.7f, 0.4f, 0.6f, true, "Alpha Residency"); drawBuilding(0.4f, -0.7f, 0.4f, 0.6f, false, "HOME"); // Draw buttons drawButtons(); glFlush(); } void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { // Map mouse click to OpenGL coordinates float mx = (float)x / 400.0f - 1.0f; // Normalized X coordinate float my = 1.0f - (float)y / 300.0f; // Normalized Y coordinate // Check if Day Mode button was clicked if (mx >= -0.9f && mx <= -0.6f && my >= -0.9f && my <= -0.8f) { isDay = true; // Switch to day mode glutPostRedisplay(); } // Check if Night Mode button was clicked if (mx >= -0.5f && mx <= -0.2f && my >= -0.9f && my <= -0.8f) { isDay = false; // Switch to night mode glutPostRedisplay(); } } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800, 600); glutCreateWindow("Day and Night Mode Toggle"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glutDisplayFunc(display); glutMouseFunc(mouse); glutMainLoop(); return 0; }
Leave a Comment