Untitled
unknown
plain_text
a year ago
6.2 kB
6
Indexable
#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;
}
Editor is loading...
Leave a Comment