Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <array>
- #include "GL/glew.h"
- #include "GL/3dgl.h"
- #include "GL/glut.h"
- #include "GL/freeglut_ext.h"
- #pragma comment (lib, "glew32.lib")
- using namespace std;
- using namespace _3dgl;
- // 3D Models
- C3dglModel earth;
- C3dglModel minimap;
- C3dglModel st_stephens_tower;
- C3dglModel eiffel_tower;
- C3dglModel colosseum;
- C3dglModel sagrada_familia;
- C3dglModel pyramids_of_giza;
- C3dglModel red_square;
- C3dglModel great_wall_of_china;
- C3dglModel empire_state_building;
- // Skybox
- C3dglSkyBox skybox;
- // Textures
- GLuint none_texture;
- GLuint shadowmap_texture;
- GLuint pp_texture[4];
- GLuint earth_texture;
- GLuint earth_texture_night;
- GLuint earth_texture_norm;
- GLuint earthwater_texture_norm;
- GLuint uppercloud_texture;
- GLuint middlecloud_texture;
- GLuint st_stephens_tower_texture;
- GLuint colosseum_texture;
- GLuint sagrada_familia_texture;
- GLuint pyramids_of_giza_texture;
- GLuint red_square_texture;
- GLuint great_wall_of_china_texture;
- GLuint empire_state_building_texture;
- GLuint snow_texture;
- // GLSL Objects (Shader Program)
- C3dglProgram EarthShader;
- C3dglProgram AtmosphereShader;
- C3dglProgram ModelShader;
- C3dglProgram ParticleShader;
- C3dglProgram BlurShader;
- C3dglProgram BloomShader;
- // FBOs
- GLuint shadowFBO;
- // camera position (for first person type camera navigation)
- float matrixView[16]; // The View Matrix
- float angleTilt = 0; // Tilt Angle
- float deltaX = 0, deltaY = 0, deltaZ = 0; // Camera movement values
- float inverseModelViewMatrix[16];
- // camera world-position
- float cameraVector[3];
- GLfloat cameraMatrix[16];
- // global matrix
- float matrix[16];
- // screen size
- GLuint ScreenWidth = 800;
- GLuint ScreenHeight = 600;
- // absolute screen height for text rendering
- int abs_screenHeight;
- // particle system variables / buffers
- float particleAlpha;
- const float PERIOD = 0.000175f;
- const float LIFETIME = 50.0;
- const int NPARTICLES = (int)(LIFETIME / PERIOD);
- GLuint idBufferVelocity;
- GLuint idBufferStartTime;
- bool isNorth;
- bool isSouth;
- // post processing
- GLuint ppFBO[4];
- GLuint depth_rb[4];
- // screen quad buffer
- GLuint finalRenderBuffer;
- // control variables
- // input
- float time;
- bool middlecloudlayer;
- bool uppercloudlayer;
- bool atmospherelayer;
- // sun
- float sunDir[2];
- int sunOrigin;
- int sunRadius;
- float sunTime;
- // camera
- int viewIndex;
- bool lock[2] = {};
- int charIndex;
- char *charState[] =
- {
- "Outer Earth View", // 0
- "Inner Earth View", // 1
- "Europe", // 2
- "Africa", // 3
- "Asia", // 4
- "Oceania", // 5
- "North America", // 6
- "South America", // 7
- "Antarctica", // 8
- "Press Spacebar to unlock movement", // 9
- "Use WSAD keys to navigate", // 10
- "Click and drag to look around", // 11
- "1: Toggle lower cloud layer", // 12
- "2: Toggle upper cloud layer", // 13
- "3: Toggle atmopshere", // 14
- "4: Toggle view", // 15
- // Europe info
- "Area: 10,180,000 km2", // 16
- "Population: 741,447,158", // 17
- "Nominal GDP: $19 trillion", // 18
- "Countries: 50", // 19
- "Largest cities:", // 20
- "Istanbul, Turkey", // 21
- "Moscow, Russia", // 22
- "Paris, France", // 23
- "London, UK", // 24
- "Madrid, Spain", // 25
- // Africa info
- "Area: 30,370,000 km2", // 26
- "Population: 1,225,080,510", // 27
- "Nominal GDP: $2.1 trillion", // 28
- "Countries: 54", // 29
- "Largest cities:", // 30
- "Lagos, Nigeria", // 31
- "Cairo, Egypt", // 32
- "Kinshasa, Democratic Republic of the Congo", // 33
- "Johannesburg, South Africa", // 34
- "Khartoum, Sudan", // 35
- // Asia info
- "Area: 44,579,000 km2", // 36
- "Population: 4,462,676,731", // 37
- "Nominal GDP: $27.2 trillion", // 38
- "Countries: 55", // 39
- "Largest cities:", // 40
- "Guangzhou-Foshan, China", // 41
- "Tokyo, Japan", // 42
- "Shanghai, China", // 43
- "Jakarta, Indonesia", // 44
- "Delhi, India", // 45
- // Australia/Oceania info
- "Area: 8,525,989 km2", // 46
- "Population: 40,117,432", // 47
- "Nominal GDP: $1.468 trillion", // 48
- "Countries: 16", // 49
- "Largest cities:", // 50
- "Sydney, Australia", // 51
- "Melbourne, Australia", // 52
- "Brisbane, Australia", // 53
- "Perth, Australia", // 54
- "Auckland, New Zealand", // 55
- // North America info
- "Area: 24,709,000 km2", // 56
- "Population: 579,024,000", // 57
- "Nominal GDP: $21.2 trillion", // 58
- "Countries: 23 sovereign states", // 59
- "Largest cities:", // 60
- "New York City, USA", // 61
- "Mexico City, Mexico", // 62
- "Los Angeles, USA", // 63
- "Chicago, USA", // 64
- "Boston, USA", // 65
- // South America info
- "Area: 17,840,000 km2", // 66
- "Population: 420,458,044", // 67
- "Nominal GDP: $3.9 trillion", // 68
- "Countries: 12", // 69
- "Largest cities:", // 70
- "Sao Paulo, Brazil", // 71
- "Lima, Peru", // 72
- "Bogota, Colombia", // 73
- "Rio de Janeiro, Brazil", // 74
- "Santiago, Chile", // 75
- // South America info
- "Area: 14,000,000 km2", // 76
- "Population: 1,106", // 77
- "Nominal GDP: N/A", // 78
- "Countries: 0", // 79
- "Largest claims of land:", // 80
- "5,896,500 km2, Australian", // 81
- "2,700,000 km2, Norwegian", // 82
- "1,709,400 km2, British", // 83
- "1,461,597 km2, Argentine", // 84
- "1,250,257 km2, Chilean", // 85
- };
- // font
- const int font = (int)GLUT_BITMAP_HELVETICA_18;
- const int font2 = (int)GLUT_BITMAP_HELVETICA_10;
- // prototype
- void reshape(int w, int h);
- bool init()
- {
- // rendering states
- glEnable(GL_DEPTH_TEST); // depth test is necessary for most 3D scenes
- glEnable(GL_NORMALIZE); // normalization is needed by AssImp library models
- glShadeModel(GL_SMOOTH); // smooth shading mode is the default one; try GL_FLAT here!
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // this is the default one; try GL_LINE!
- // enable alpha channels
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // particle system setup
- glEnable(GL_POINT_SPRITE);
- glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
- glPointSize(1);
- // initialise Shaders
- C3dglShader VertexShader;
- C3dglShader FragmentShader;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/particles.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/particles.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!ParticleShader.Create()) return false;
- if (!ParticleShader.Attach(VertexShader)) return false;
- if (!ParticleShader.Attach(FragmentShader)) return false;
- if (!ParticleShader.Link()) return false;
- if (!ParticleShader.Use(true)) return false;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/blur.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/blur.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!BlurShader.Create()) return false;
- if (!BlurShader.Attach(VertexShader)) return false;
- if (!BlurShader.Attach(FragmentShader)) return false;
- if (!BlurShader.Link()) return false;
- if (!BlurShader.Use(true)) return false;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/bloom.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/bloom.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!BloomShader.Create()) return false;
- if (!BloomShader.Attach(VertexShader)) return false;
- if (!BloomShader.Attach(FragmentShader)) return false;
- if (!BloomShader.Link()) return false;
- if (!BloomShader.Use(true)) return false;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/atmosphere.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/atmosphere.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!AtmosphereShader.Create()) return false;
- if (!AtmosphereShader.Attach(VertexShader)) return false;
- if (!AtmosphereShader.Attach(FragmentShader)) return false;
- if (!AtmosphereShader.Link()) return false;
- if (!AtmosphereShader.Use(true)) return false;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/earth.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/earth.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!EarthShader.Create()) return false;
- if (!EarthShader.Attach(VertexShader)) return false;
- if (!EarthShader.Attach(FragmentShader)) return false;
- if (!EarthShader.Link()) return false;
- if (!EarthShader.Use(true)) return false;
- if (!VertexShader.Create(GL_VERTEX_SHADER)) return false;
- if (!VertexShader.LoadFromFile("shaders/model.vert")) return false;
- if (!VertexShader.Compile()) return false;
- if (!FragmentShader.Create(GL_FRAGMENT_SHADER)) return false;
- if (!FragmentShader.LoadFromFile("shaders/model.frag")) return false;
- if (!FragmentShader.Compile()) return false;
- if (!ModelShader.Create()) return false;
- if (!ModelShader.Attach(VertexShader)) return false;
- if (!ModelShader.Attach(FragmentShader)) return false;
- if (!ModelShader.Link()) return false;
- if (!ModelShader.Use(true)) return false;
- // glut additional setup
- glutSetVertexAttribCoord3(EarthShader.GetAttribLocation("aVertex"));
- glutSetVertexAttribNormal(EarthShader.GetAttribLocation("aNormal"));
- // load models
- if (!skybox.load("models\\stars.png", "models\\stars.png", "models\\stars.png",
- "models\\stars.png", "models\\stars.png", "models\\stars.png")) return false;
- if (!earth.load("models\\hugeball_reduced.obj")) return false;
- if (!st_stephens_tower.load("models\\st_stephens_tower.obj")) return false;
- if (!eiffel_tower.load("models\\eiffel_tower.obj")) return false;
- if (!colosseum.load("models\\colosseum.obj")) return false;
- if (!sagrada_familia.load("models\\sagrada_familia.obj")) return false;
- if (!pyramids_of_giza.load("models\\pyramids_of_giza.obj")) return false;
- if (!red_square.load("models\\red_square.obj")) return false;
- if (!great_wall_of_china.load("models\\great_wall_of_china.obj")) return false;
- if (!empire_state_building.load("models\\empire_state_building.obj")) return false;
- // loading and binding textures
- C3dglBitmap bm, bm2, bm3, bm4, bm5, bm6, bm7, bm8, bm9, bm10, bm11, bm12, bm13, bm14;
- bm.Load("models\\2_no_clouds_8k.jpg", GL_RGBA);
- if (!bm.GetBits()) return false;
- bm2.Load("models\\2_no_clouds_8k_n.jpg", GL_RGBA);
- if (!bm2.GetBits()) return false;
- bm3.Load("models\\clouds0.tga", GL_RGBA);
- if (!bm3.GetBits()) return false;
- bm4.Load("models\\clouds2.tga", GL_RGBA);
- if (!bm4.GetBits()) return false;
- bm5.Load("models\\water_n.jpg", GL_RGBA);
- if (!bm5.GetBits()) return false;
- bm6.Load("models\\st_stephens_tower_texture.jpg", GL_RGBA);
- if (!bm6.GetBits()) return false;
- bm7.Load("models\\colosseum_texture.jpg", GL_RGBA);
- if (!bm7.GetBits()) return false;
- bm8.Load("models\\sagrada_familia_texture.jpg", GL_RGBA);
- if (!bm8.GetBits()) return false;
- bm9.Load("models\\pyramids_of_giza_texture.jpg", GL_RGBA);
- if (!bm9.GetBits()) return false;
- bm10.Load("models\\red_square_texture.jpg", GL_RGBA);
- if (!bm10.GetBits()) return false;
- bm11.Load("models\\5_night_8k.jpg", GL_RGBA);
- if (!bm11.GetBits()) return false;
- bm12.Load("models\\great_wall_of_china_texture.jpg", GL_RGBA);
- if (!bm12.GetBits()) return false;
- bm13.Load("models\\empire_state_building_texture.jpg", GL_RGBA);
- if (!bm13.GetBits()) return false;
- bm14.Load("models\\snow.png", GL_RGBA);
- if (!bm14.GetBits()) return false;
- // send particles shader uniforms
- std::vector<float> bufferVelocity;
- std::vector<float> bufferStartTime;
- float time = 0;
- float M_PI = 3.14;
- for (int i = 0; i < NPARTICLES; i++)
- {
- float theta = (float)M_PI / 6.f * (float)rand() / (float)RAND_MAX;
- float phi = (float)M_PI * 2.f * (float)rand() / (float)RAND_MAX;
- float x = sin(theta) * cos(phi);
- float y = cos(theta);
- float z = sin(theta) * sin(phi);
- float v = 2 + 0.5f * (float)rand() / (float)RAND_MAX;
- bufferVelocity.push_back(x * v);
- bufferVelocity.push_back(y * v);
- bufferVelocity.push_back(z * v);
- bufferStartTime.push_back(time);
- time += PERIOD;
- }
- glGenBuffers(1, &idBufferVelocity);
- glBindBuffer(GL_ARRAY_BUFFER, idBufferVelocity);
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * bufferVelocity.size(), &bufferVelocity[0], GL_STATIC_DRAW);
- glGenBuffers(1, &idBufferStartTime); glBindBuffer(GL_ARRAY_BUFFER, idBufferStartTime);
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * bufferStartTime.size(), &bufferStartTime[0], GL_STATIC_DRAW);
- //ParticleShader.SendUniform("gravity", 0.0f, -0.5f, 0.0f);
- ParticleShader.SendUniform("particleLifetime", LIFETIME);
- // channel 0
- // earth texture
- glActiveTexture(GL_TEXTURE0);
- glGenTextures(1, &earth_texture);
- glBindTexture(GL_TEXTURE_2D, earth_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm.GetWidth(), bm.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm.GetBits());
- // uppercloud texture
- glGenTextures(1, &uppercloud_texture);
- glBindTexture(GL_TEXTURE_2D, uppercloud_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm3.GetWidth(), bm3.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm3.GetBits());
- // middlecloud texture
- glGenTextures(1, &middlecloud_texture);
- glBindTexture(GL_TEXTURE_2D, middlecloud_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm4.GetWidth(), bm4.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm4.GetBits());
- // st stephens tower texture
- glGenTextures(1, &st_stephens_tower_texture);
- glBindTexture(GL_TEXTURE_2D, st_stephens_tower_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm6.GetWidth(), bm6.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm6.GetBits());
- // colosseum texture
- glGenTextures(1, &colosseum_texture);
- glBindTexture(GL_TEXTURE_2D, colosseum_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm7.GetWidth(), bm7.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm7.GetBits());
- // sagrada familia texture
- glGenTextures(1, &sagrada_familia_texture);
- glBindTexture(GL_TEXTURE_2D, sagrada_familia_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm8.GetWidth(), bm8.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm8.GetBits());
- // pyramids of giza texture
- glGenTextures(1, &pyramids_of_giza_texture);
- glBindTexture(GL_TEXTURE_2D, pyramids_of_giza_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm9.GetWidth(), bm9.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm9.GetBits());
- // red square texture
- glGenTextures(1, &red_square_texture);
- glBindTexture(GL_TEXTURE_2D, red_square_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm10.GetWidth(), bm10.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm10.GetBits());
- // great wall of china texture
- glGenTextures(1, &great_wall_of_china_texture);
- glBindTexture(GL_TEXTURE_2D, great_wall_of_china_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm12.GetWidth(), bm12.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm12.GetBits());
- // empire state building texture
- glGenTextures(1, &empire_state_building_texture);
- glBindTexture(GL_TEXTURE_2D, empire_state_building_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm13.GetWidth(), bm13.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm13.GetBits());
- // snow texture
- glGenTextures(1, &snow_texture);
- glBindTexture(GL_TEXTURE_2D, snow_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm14.GetWidth(), bm14.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm14.GetBits());
- //// earth texture flipped
- //glGenTextures(1, &earth_texture_flipped);
- //glBindTexture(GL_TEXTURE_2D, earth_texture_flipped);
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm11.GetWidth(), bm11.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm11.GetBits());
- // null texture
- glGenTextures(1, &none_texture);
- glBindTexture(GL_TEXTURE_2D, none_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- BYTE bytes[] = { 255, 255, 255 };
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_BGR, GL_UNSIGNED_BYTE, &bytes);
- // bloom post-processing textures
- for (int i = 0; i < 4; i++)
- {
- glGenTextures(1, &pp_texture[i]);
- glBindTexture(GL_TEXTURE_2D, pp_texture[i]);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ScreenWidth * 4, ScreenHeight * 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- // FBO attachment
- glGenFramebuffers(1, &ppFBO[i]);
- glBindFramebuffer(GL_FRAMEBUFFER, ppFBO[i]);
- glGenRenderbuffers(1, &depth_rb[i]);
- glBindRenderbuffer(GL_RENDERBUFFER, depth_rb[i]);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, ScreenWidth * 4, ScreenHeight * 4);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb[i]);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pp_texture[i], 0);
- glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
- }
- // as part of post processing, use a quad for final rendering
- float ppScreenQuad[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
- glGenBuffers(1, &finalRenderBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, finalRenderBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(ppScreenQuad), ppScreenQuad, GL_STATIC_DRAW);
- // shadowmap texture
- glGenTextures(1, &shadowmap_texture);
- glBindTexture(GL_TEXTURE_2D, shadowmap_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, ScreenWidth * 2, ScreenHeight * 2, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
- glBindTexture(GL_TEXTURE_2D, 0);
- // FBO attachment
- glGenFramebuffers(1, &shadowFBO);
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, shadowFBO);
- glDrawBuffer(GL_NONE);
- glReadBuffer(GL_NONE);
- glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadowmap_texture, 0);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- // channel 1
- // earth texture normals
- glActiveTexture(GL_TEXTURE1);
- glGenTextures(1, &earth_texture_norm);
- glBindTexture(GL_TEXTURE_2D, earth_texture_norm);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm2.GetWidth(), bm2.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm2.GetBits());
- // channel 2
- // earth water texture normals
- glActiveTexture(GL_TEXTURE2);
- glGenTextures(1, &earthwater_texture_norm);
- glBindTexture(GL_TEXTURE_2D, earthwater_texture_norm);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm5.GetWidth(), bm5.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm5.GetBits());
- // channel 3
- // earth texture night
- glActiveTexture(GL_TEXTURE3);
- glGenTextures(1, &earth_texture_night);
- glBindTexture(GL_TEXTURE_2D, earth_texture_night);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm11.GetWidth(), bm11.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bm11.GetBits());
- EarthShader.SendUniform("texture0", 0);
- EarthShader.SendUniform("textureNormal", 1);
- EarthShader.SendUniform("textureWaterNormal", 2);
- EarthShader.SendUniform("texture3", 3);
- EarthShader.SendUniform("NormalMap", 0); // boolean toggle for normal map
- AtmosphereShader.SendUniform("texture0", 0);
- ModelShader.SendUniform("texture0", 0);
- ModelShader.SendUniform("textureNormal", 1);
- ModelShader.SendUniform("NormalMap", 0); // boolean toggle for normal map
- BlurShader.SendUniform("texture0", 0);
- BloomShader.SendUniform("texture0", 4);
- BloomShader.SendUniform("texture1", 5);
- BloomShader.SendUniform("exposure", 1);
- // setup ambient light
- EarthShader.SendUniform("lightAmbient.on", 1);
- EarthShader.SendUniform("lightAmbient.color", 1.0f, 1.0f, 1.0f);
- AtmosphereShader.SendUniform("lightAmbient.on", 1);
- AtmosphereShader.SendUniform("lightAmbient.color", 1.0f, 1.0f, 1.0f);
- ModelShader.SendUniform("lightAmbient.on", 1);
- ModelShader.SendUniform("lightAmbient.color", 1.0f, 1.0f, 1.0f);
- // setup directional light
- //EarthShader.SendUniform("lightDir.on", 1);
- //EarthShader.SendUniform("lightDir.direction", -1.0f, 0.0f, 0.0f);
- //EarthShader.SendUniform("lightDir.diffuse", 1.2f, 1.2f, 1.2f);
- //EarthShader.SendUniform("lightDir.specular", 8.0, 8.0, 8.0);
- //AtmosphereShader.SendUniform("lightDir.on", 1);
- //AtmosphereShader.SendUniform("lightDir.direction", -1.0f, 0.0f, 0.0f);
- //AtmosphereShader.SendUniform("lightDir.diffuse", 1.2f, 1.2f, 1.2f);
- //ModelShader.SendUniform("lightDir.on", 1);
- //ModelShader.SendUniform("lightDir.direction", -1.0f, 0.0f, 0.0f);
- //ModelShader.SendUniform("lightDir.diffuse", 1.2f, 1.2f, 1.2f);
- // point light
- EarthShader.SendUniform("lightPoint.on", 1);
- EarthShader.SendUniform("lightPoint.position", -2000.0f, 0.0f, 0.0f);
- EarthShader.SendUniform("lightPoint.diffuse", 1.6f, 1.6f, 1.6f);
- EarthShader.SendUniform("lightPoint.specular", 8.0, 8.0, 8.0);
- EarthShader.SendUniform("shininess", 30.0);
- AtmosphereShader.SendUniform("lightPoint.on", 1);
- AtmosphereShader.SendUniform("lightPoint.position", -2000.0f, 0.0f, 0.0f);
- AtmosphereShader.SendUniform("lightPoint.diffuse", 1.2f, 1.2f, 1.2f);
- ModelShader.SendUniform("lightPoint.on", 1);
- ModelShader.SendUniform("lightPoint.position", -2000.0f, 0.0f, 0.0f);
- ModelShader.SendUniform("lightPoint.diffuse", 1.2f, 1.2f, 1.2f);
- //AtmosphereShader.SendUniform("lightPoint.specular", 8.0, 8.0, 8.0);
- // init variables
- particleAlpha = 1.0;
- sunDir[0] = -2000.0;
- sunDir[1] = 0.0f;
- sunOrigin = 0;
- sunRadius = 2000;
- middlecloudlayer = true;
- uppercloudlayer = true;
- atmospherelayer = true;
- lock[0] = true;
- lock[1] = true;
- charIndex = 0;
- viewIndex = 0;
- bool ppb_horizontal = true;
- bool ppb_first_iteration = true;
- // fog
- //Program.SendUniform("fogColor", 0.10f, 0.10f, 0.10f);
- //Program.SendUniform("fogThickness", 0.07); // higher value for more thickness
- // set-up view matrix
- glMatrixMode(GL_MODELVIEW);
- angleTilt = 15;
- glLoadIdentity();
- glRotatef(angleTilt, 1, 0, 0);
- gluLookAt(-1008.5f, 279.973f, 63.586f,
- 0.0f, 279.973f, 63.586f,
- 0.0, 1.0, 0.0);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrixView);
- return true;
- }
- void done()
- {
- }
- // misc functions
- void getCamPos()
- {
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- //cameraVector[0] = -(cameraMatrix[0] * cameraMatrix[12] + cameraMatrix[1] * cameraMatrix[13] + cameraMatrix[2] * cameraMatrix[14]); // x
- //cameraVector[1] = -(cameraMatrix[4] * cameraMatrix[12] + cameraMatrix[5] * cameraMatrix[13] + cameraMatrix[6] * cameraMatrix[14]); // y
- //cameraVector[2] = -(cameraMatrix[8] * cameraMatrix[12] + cameraMatrix[9] * cameraMatrix[13] + cameraMatrix[10] * cameraMatrix[14]); // z
- gluInvertMatrix(matrix, inverseModelViewMatrix);
- cameraVector[0] = inverseModelViewMatrix[12];
- cameraVector[1] = inverseModelViewMatrix[13];
- cameraVector[2] = inverseModelViewMatrix[14];
- }
- void getCamPosDisplay()
- {
- cout << "x, y, z \n";
- cout << cameraVector[0]; cout << "f, ";
- cout << cameraVector[1]; cout << "f, ";
- cout << cameraVector[2]; cout << "f, ";
- cout << "\n";
- }
- void set2DMode()
- {
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1200, 1200, -1200, 1200, 0.5, 2300);
- }
- void set3DMode(float w, float h)
- {
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(120, (float)w / (float)h, 0.5, 1200);
- }
- //void theSwitcheroo(bool boolarray[], int index)
- //{
- // for (int i = 0; i < sizeof(boolarray); i++) boolarray[i] = false;
- // boolarray[index] = true;
- //}
- // text rendering
- //void setOrthographicProjection()
- //{
- // GLint viewport[4];
- // glGetIntegerv(GL_VIEWPORT, viewport);
- // int w = viewport[2];
- // int h = viewport[3];
- //
- // glMatrixMode(GL_PROJECTION);
- // glPushMatrix();
- // glLoadIdentity();
- // gluOrtho2D(0, w, 0, h);
- // glScalef(1, -1, 1);
- // glTranslatef(0, -h, 0);
- // glMatrixMode(GL_MODELVIEW);
- //}
- //void resetPerspectiveProjection()
- //{
- // glMatrixMode(GL_PROJECTION);
- // glPopMatrix();
- // glMatrixMode(GL_MODELVIEW);
- //}
- void prepareBitmapString(float x, float y, void *font)
- {
- glWindowPos2i(x, glutGet(GLUT_WINDOW_HEIGHT) - y);
- for (char *p = charState[charIndex]; *p != '\0'; p++) {
- glutBitmapCharacter(font, *p);
- }
- }
- void renderBitmapString(float r, float g, float b, float x, float y, void *font)
- {
- glColor3d(r, g, b);
- //setOrthographicProjection();
- //glPushMatrix();
- //glLoadIdentity();
- prepareBitmapString(x, y, font);
- //glPopMatrix();
- //resetPerspectiveProjection();
- }
- // earth shading
- void renderEarth()
- {
- EarthShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, earth_texture);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, earth_texture_norm);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D, earthwater_texture_norm);
- glActiveTexture(GL_TEXTURE3);
- glBindTexture(GL_TEXTURE_2D, earth_texture_night);
- EarthShader.SendUniform("NormalMap", 1);
- EarthShader.SendUniform("materialDiffuse", 1.0f, 1.0f, 1.0f);
- EarthShader.SendUniform("materialAmbient", 0.1f, 0.1f, 0.1f);
- EarthShader.SendUniform("materialSpecular", 1.0f, 1.0f, 1.0f);
- glPushMatrix();
- glRotatef((sunTime * 100), 0.0f, 1.0f, 0.0f); // rotate the earth anti-clockwise to the skybox (skybox also rotates the earth model (?))
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- EarthShader.SendUniform("matrixModelView", matrix);
- earth.render();
- glPopMatrix();
- EarthShader.SendUniform("NormalMap", 0);
- }
- // atmosphere shading
- void renderUpperCloudLayer()
- {
- AtmosphereShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, uppercloud_texture);
- AtmosphereShader.SendUniform("materialDiffuse", 0.7f, 0.7f, 0.7f);
- AtmosphereShader.SendUniform("materialAmbient", 0.5f, 0.5f, 0.5f);
- AtmosphereShader.SendUniform("upper", 1);
- glPushMatrix();
- glScalef(1.11f, 1.11f, 1.11f);
- glRotatef(sunTime * 100, 0.0f, 1.0f, 0.0f);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- AtmosphereShader.SendUniform("matrixModelView", matrix);
- earth.render();
- glPopMatrix();
- AtmosphereShader.SendUniform("upper", 0);
- }
- void renderMiddleCloudLayer()
- {
- AtmosphereShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, middlecloud_texture);
- AtmosphereShader.SendUniform("materialDiffuse", 0.7f, 0.7f, 0.7f);
- AtmosphereShader.SendUniform("materialAmbient", 0.5f, 0.5f, 0.5f);
- AtmosphereShader.SendUniform("middle", 1);
- glPushMatrix();
- glScalef(1.105f, 1.105f, 1.105f);
- glRotatef(sunTime * 100, 0.0f, 1.0f, 0.0f);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- AtmosphereShader.SendUniform("matrixModelView", matrix);
- earth.render();
- glPopMatrix();
- AtmosphereShader.SendUniform("middle", 0);
- }
- void renderAtmosphereLayer()
- {
- AtmosphereShader.Use();
- AtmosphereShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- AtmosphereShader.SendUniform("materialAmbient", 0.102f * 2.0, 0.175f * 2.0, 0.255f * 2.0);
- glPushMatrix();
- glScalef(1.115f, 1.115f, 1.115f);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- AtmosphereShader.SendUniform("matrixModelView", matrix);
- earth.render();
- glPopMatrix();
- }
- // model shading
- void renderSkybox()
- {
- ModelShader.Use();
- ModelShader.SendUniform("materialDiffuse", 0.0f, 0.0f, 0.0f);
- ModelShader.SendUniform("materialAmbient", 5.0f, 5.0f, 5.0f);
- glPushMatrix();
- glRotatef(-(sunTime * 100), 0.0f, 1.0f, 0.0f);
- skybox.render();
- glPopMatrix();
- }
- void renderStStephensTower()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, st_stephens_tower_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.5f, 0.5f, 0.5f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- st_stephens_tower.render();
- glPopMatrix();
- }
- void renderEiffelTower()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, none_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- eiffel_tower.render();
- glPopMatrix();
- }
- void renderColosseum()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, colosseum_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- colosseum.render();
- glPopMatrix();
- }
- void renderSagradaFamilia()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, sagrada_familia_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- sagrada_familia.render();
- glPopMatrix();
- }
- void renderPyramidsOfGiza()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, pyramids_of_giza_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- pyramids_of_giza.render();
- glPopMatrix();
- }
- void renderRedSquare()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, red_square_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- red_square.render();
- glPopMatrix();
- }
- void renderGreatWallOfChina()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, great_wall_of_china_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- great_wall_of_china.render();
- glPopMatrix();
- }
- void renderEmpireStateBuilding()
- {
- ModelShader.Use();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, empire_state_building_texture);
- ModelShader.SendUniform("materialDiffuse", 0.5f, 0.5f, 0.5f);
- ModelShader.SendUniform("materialAmbient", 0.255f, 0.204f, 0.153f);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- empire_state_building.render();
- glPopMatrix();
- }
- void renderCube()
- {
- ModelShader.Use();
- ModelShader.SendUniform("materialDiffuse", 10.0f, 10.0f, 10.0f);
- ModelShader.SendUniform("materialAmbient", 100.5f, 100.5f, 100.5f);
- glPushMatrix();
- glTranslatef(sunOrigin + cos(sunTime) * 600, 0.0f, sunOrigin + sin(sunTime) * 600);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ModelShader.SendUniform("matrixModelView", matrix);
- glutSolidCube(50);
- glPopMatrix();
- }
- // particle shading
- void renderParticleSystem()
- {
- ParticleShader.Use();
- glDepthMask(GL_FALSE);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, snow_texture);
- ParticleShader.SendUniform("time", glutGet(GLUT_ELAPSED_TIME) / 1000.f - 2);
- if (isNorth == true) ParticleShader.SendUniform("initialPos", cameraVector[0], cameraVector[1] + 10, cameraVector[2]);
- if (isSouth == true) ParticleShader.SendUniform("initialPos", cameraVector[0], cameraVector[1] - 10, cameraVector[2]);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- ParticleShader.SendUniform("matrixModelView", matrix);
- glEnableVertexAttribArray(0);
- glEnableVertexAttribArray(1);
- glBindBuffer(GL_ARRAY_BUFFER, idBufferVelocity);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, idBufferStartTime);
- glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, 0);
- glDrawArrays(GL_POINTS, 0, NPARTICLES);
- glDisableVertexAttribArray(0);
- glDisableVertexAttribArray(1);
- glDepthMask(GL_TRUE);
- }
- // misc (non-shading)
- // text rendering
- void renderText()
- {
- // unfortunately the text must be rendered after the first switch statement and object rendering as it must clear the matrix stack
- // so this switch must be placed here
- switch (viewIndex)
- {
- case 0:
- charIndex = 0; renderBitmapString(1.0f, 1.0f, 1.0f, 25, 40, (void*)font);
- if (lock[0])
- {
- charIndex = 9; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 65.0f, (void*)font);
- charIndex = 10; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 90.0f, (void*)font);
- charIndex = 11; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 115.0f, (void*)font);
- }
- break;
- case 1:
- charIndex = 1; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- if (lock[1])
- {
- charIndex = 9; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 65.0f, (void*)font);
- charIndex = 10; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 90.0f, (void*)font);
- charIndex = 11; renderBitmapString(1.0f, 0.0f, 0.0f, 25.0f, 115.0f, (void*)font);
- }
- break;
- case 2:
- charIndex = 2; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 16; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 17; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 18; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 19; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 20; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 21; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 22; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 23; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 24; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 25; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 3:
- charIndex = 3; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 26; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 27; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 28; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 29; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 30; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 31; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 32; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 33; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 34; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 35; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 4:
- charIndex = 4; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 36; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 37; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 38; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 39; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 40; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 41; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 42; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 43; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 44; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 45; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 5:
- charIndex = 5; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 46; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 47; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 48; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 49; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 50; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 51; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 52; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 53; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 54; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 55; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 6:
- charIndex = 6; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 56; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 57; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 58; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 59; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 60; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 61; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 62; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 63; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 64; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 65; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 7:
- charIndex = 7; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 66; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 67; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 68; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 69; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 70; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 71; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 72; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 73; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 74; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 75; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- case 8:
- charIndex = 8; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 40.0f, (void*)font);
- charIndex = 76; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 77; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 78; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 79; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- charIndex = 80; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 195.0f, (void*)font2);
- charIndex = 81; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 207.0f, (void*)font2);
- charIndex = 82; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 219.0f, (void*)font2);
- charIndex = 83; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 231.0f, (void*)font2);
- charIndex = 84; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 243.0f, (void*)font2);
- charIndex = 85; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 255.0f, (void*)font2);
- break;
- }
- if (viewIndex == 2 || viewIndex == 3 || viewIndex == 4 || viewIndex == 5 || viewIndex == 6 || viewIndex == 7 || viewIndex == 8 || !lock[1] && viewIndex == 1 || !lock[0] && viewIndex == 0)
- {
- charIndex = 12; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 70.0f, (void*)font2);
- charIndex = 13; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 82.0f, (void*)font2);
- charIndex = 14; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 94.0f, (void*)font2);
- charIndex = 15; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 106.0f, (void*)font2);
- }
- else
- {
- charIndex = 12; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 135.0f, (void*)font2);
- charIndex = 13; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 147.0f, (void*)font2);
- charIndex = 14; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 159.0f, (void*)font2);
- charIndex = 15; renderBitmapString(1.0f, 1.0f, 1.0f, 25.0f, 171.0f, (void*)font2);
- }
- if (viewIndex > 8) viewIndex = 0;
- }
- // set camera view
- void setCameraView(float x, float y, float z, float centerx, float centery, float centerz, float upx, float upy, float upz, int angleTilt)
- {
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glRotatef(angleTilt, 1, 0, 0);
- gluLookAt(x, y, z, centerx, centery, centerz, upx, upy, upz);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrixView);
- }
- // render post-processing screen quad
- void renderScreenQuad(int a)
- {
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0, 1, 0, 1, -1, 1);
- glGetFloatv(GL_PROJECTION_MATRIX, matrix);
- if (a == 1) BlurShader.SendUniform("matrixProjection", matrix);
- else BloomShader.SendUniform("matrixProjection", matrix);
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- if (a == 1) BlurShader.SendUniform("matrixModelView", matrix);
- else BloomShader.SendUniform("matrixModelView", matrix);
- if (a == 1)
- {
- GLuint attribVertex = BlurShader.GetAttribLocation("aVertex");
- GLuint attribTextCoord = BlurShader.GetAttribLocation("aTexCoord");
- glEnableVertexAttribArray(attribVertex);
- glEnableVertexAttribArray(attribTextCoord);
- glBindBuffer(GL_ARRAY_BUFFER, finalRenderBuffer);
- glVertexAttribPointer(attribVertex, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);
- glVertexAttribPointer(attribTextCoord, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
- glDrawArrays(GL_QUADS, 0, 4);
- glDisableVertexAttribArray(attribVertex);
- glDisableVertexAttribArray(attribTextCoord);
- }
- else
- {
- GLuint attribVertex = BloomShader.GetAttribLocation("aVertex");
- GLuint attribTextCoord = BloomShader.GetAttribLocation("aTexCoord");
- glEnableVertexAttribArray(attribVertex);
- glEnableVertexAttribArray(attribTextCoord);
- glBindBuffer(GL_ARRAY_BUFFER, finalRenderBuffer);
- glVertexAttribPointer(attribVertex, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);
- glVertexAttribPointer(attribTextCoord, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
- glDrawArrays(GL_QUADS, 0, 4);
- glDisableVertexAttribArray(attribVertex);
- glDisableVertexAttribArray(attribTextCoord);
- }
- }
- void prepareShadowMatrix()
- {
- // matrix to transfrom coordinates x,y,z
- // x = x* 0.5 + 0.5
- // y = y* 0.5 + 0.5
- // z = z* 0.5 + 0.5
- // Moving from unit cube [-1,1] to [0,1]
- const float bias[16] = {
- 0.5, 0.0, 0.0, 0.0,
- 0.0, 0.5, 0.0, 0.0,
- 0.0, 0.0, 0.5, 0.0,
- 0.5, 0.5, 0.5, 1.0 };
- // grab modelview and transformation matrices
- static float modelView[16];
- static float projection[16];
- glGetFloatv(GL_MODELVIEW_MATRIX, modelView);
- glGetFloatv(GL_PROJECTION_MATRIX, projection);
- // concatenating all matrices into one
- glPushMatrix();
- glLoadIdentity();
- glLoadMatrixf(bias);
- glMultMatrixf(projection);
- glMultMatrixf(modelView);
- // store and send as uniform variable
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- EarthShader.SendUniform("matrixShadow", matrix);
- ModelShader.SendUniform("matrixShadow", matrix);
- glPopMatrix();
- }
- void createShadowMap(float x, float y, float z,
- float centerx, float centery, float centerz,
- float upx, float upy, float upz, GLuint FBOid)
- {
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- // enable alpha test to discard transparency
- glAlphaFunc(GL_GREATER, 0.9);
- glEnable(GL_ALPHA_TEST);
- // Store the current viewport in a safe place
- GLint viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- int w = viewport[2];
- int h = viewport[3];
- // setup the viewport
- glViewport(0, 0, w * 2, h * 2);
- // change to orthographic camera (directional light)
- set2DMode();
- // send projection matrix
- glGetFloatv(GL_PROJECTION_MATRIX, matrix);
- AtmosphereShader.SendUniform("matrixProjection", matrix);
- EarthShader.SendUniform("matrixProjection", matrix);
- ModelShader.SendUniform("matrixProjection", matrix);
- // prepare the camera
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(x, y, z, centerx, centery, centerz, upx, upy, upz);
- // then send view matrix
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- AtmosphereShader.SendUniform("matrixView", matrix);
- EarthShader.SendUniform("matrixView", matrix);
- ModelShader.SendUniform("matrixView", matrix);
- // bind FBO
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, shadowFBO);
- // -- off screen rendering
- // clear previous frame depth values
- glClear(GL_DEPTH_BUFFER_BIT);
- // only enable alpha channel
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
- // call prepare shadow matrix function
- prepareShadowMatrix();
- // render objects that cast a shadow
- renderEarth();
- renderStStephensTower();
- renderEiffelTower();
- renderColosseum();
- renderSagradaFamilia();
- renderPyramidsOfGiza();
- renderRedSquare();
- renderGreatWallOfChina();
- renderEmpireStateBuilding();
- if (uppercloudlayer) renderUpperCloudLayer();
- if (middlecloudlayer) renderMiddleCloudLayer();
- // revert (back to currently bound FBO)
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOid);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- glDisable(GL_CULL_FACE);
- glDisable(GL_ALPHA_TEST);
- reshape(w, h);
- }
- void render()
- {
- // get window height for text rendering
- abs_screenHeight = glutGet(GLUT_WINDOW_HEIGHT);
- // view position
- //getCamPos();
- //getCamPosDisplay();
- // time (returns in milliseconds)
- time = glutGet(GLUT_ELAPSED_TIME);
- EarthShader.SendUniform("time", time);
- AtmosphereShader.SendUniform("time", time);
- // sun motion
- // x = Xorigin + cos(angle)*radius;
- // y = Yorigin + sin(angle)*radius;
- sunTime = time / 10000;
- sunDir[0] = sunOrigin + cos(sunTime) * sunRadius;
- sunDir[1] = sunOrigin + sin(sunTime) * sunRadius;
- // send uniforms
- EarthShader.SendUniform("lightPoint.position", sunDir[0], 0.0f, sunDir[1]);
- AtmosphereShader.SendUniform("lightPoint.position", sunDir[0], 0.0f, sunDir[1]);
- ModelShader.SendUniform("lightPoint.position", sunDir[0], 0.0f, sunDir[1]);
- // ---- first and second render passes: render everything to be post processed or have their brightness extracted
- for (int i = 0; i < 2; i++)
- {
- glBindFramebufferEXT(GL_FRAMEBUFFER, ppFBO[i]);
- // create shadow map
- createShadowMap(sunDir[0], 0.0f, sunDir[1], 0.0f, 0.0f, 0.0f, 0.0, 1.0, 0.0, ppFBO[i]);
- // clear screen and buffers
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // view settings for locations
- switch (viewIndex)
- {
- case 0:
- if (lock[0]) setCameraView(-1008.5f, 279.973f, 63.586f, 0.0f, 279.973f, 63.586f, 0.0, 1.0, 0.0, 15);
- break;
- case 1:
- if (lock[1]) setCameraView(0.0f, 545.0f, 0.0f, 10.0f, 545.0f, 0.0f, 0.0, 1.0, 0.0, 15);
- break;
- case 2: setCameraView(-480.885f, 499.004f, 179.741f, -307.241f, 378.114f, 107.816f, 0.0, 1.0, 0.0, 0);
- break;
- case 3: setCameraView(-816.507f, 161.529f, 389.861f, -442.657f, 60.8567f, 217.035f, 0.0, 1.0, 0.0, 0);
- break;
- case 4: setCameraView(64.7304f, 466.521f, 792.111f, 64.7301f, 266.844f, 416.57f, 0.0, 1.0, 0.0, 0);
- break;
- case 5: setCameraView(637.171f, -288.431f, 416.492f, 384.7f, -197.045f, 247.794f, 0.0, 1.0, 0.0, 0);
- break;
- case 6: setCameraView(126.285f, 464.575f, -692.372f, 72.6584f, 305.521f, -388.231f, 0.0, 1.0, 0.0, 0);
- break;
- case 7: setCameraView(-443.415f, -257.073f, -739.343f, -249.001f, -160.872f, -396.794f, 0.0, 1.0, 0.0, 0);
- break;
- case 8: setCameraView(0.7432f, -917.147f, 0.0556f, 0.0f, 0.0f, 0.0f, 0.0, 1.0, 0.0, 0);
- break;
- }
- // setup the View Matrix (camera)
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- if (viewIndex != 0) glRotatef(angleTilt, 1, 0, 0); // switch tilt off --------
- glTranslatef(deltaX, deltaY, deltaZ); // animate camera motion (controlled by WASD keys) |
- if (viewIndex == 1 && !lock[1]) glRotatef(-deltaX / 9.40, 0, 0, 1); // control Z rotation with W/S keys |--- turn these both off for 'noclip' movement (outterearth free movement)
- if (viewIndex == 1 && !lock[1]) glRotatef(deltaZ / 9.40, 1, 0, 0); // control X rotation with A/D keys |
- if (viewIndex != 0) glRotatef(-angleTilt, 1, 0, 0); // switch tilt on --------
- glMultMatrixf(matrixView);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrixView);
- if (viewIndex == 2 || viewIndex == 3 || viewIndex == 4 || viewIndex == 5 || viewIndex == 6 || viewIndex == 7 || viewIndex == 8) // set camera lock on any viewIndex that isn't inside the atmosphere
- {
- lock[0] = true;
- lock[1] = true;
- }
- // setup View Matrix
- glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
- EarthShader.SendUniform("matrixView", matrix);
- AtmosphereShader.SendUniform("matrixView", matrix);
- ModelShader.SendUniform("matrixView", matrix);
- // send shadowmap and shadow strength
- EarthShader.SendUniform("shadowMap", 7);
- ModelShader.SendUniform("shadowMap", 7);
- glActiveTexture(GL_TEXTURE7);
- glBindTexture(GL_TEXTURE_2D, shadowmap_texture);
- // render objects
- // reverse rendering order needed to see through transparency textures
- renderSkybox();
- // for inner earth view
- // extract only the brightness from the scene in second render pass
- if (i == 1)
- {
- EarthShader.SendUniform("brightnessTest", true);
- AtmosphereShader.SendUniform("brightnessTest", true);
- ModelShader.SendUniform("brightnessTest", true);
- // change the alpha of the atmosphere's bloom post-processing depending on the view
- if (viewIndex == 1) AtmosphereShader.SendUniform("bloomView", true);
- else AtmosphereShader.SendUniform("bloomView", false);
- }
- else
- {
- EarthShader.SendUniform("brightnessTest", false);
- AtmosphereShader.SendUniform("brightnessTest", false);
- ModelShader.SendUniform("brightnessTest", false);
- }
- if (viewIndex == 1)
- {
- renderEarth();
- if (atmospherelayer) renderAtmosphereLayer();
- if (uppercloudlayer) renderUpperCloudLayer();
- if (middlecloudlayer) renderMiddleCloudLayer();
- renderStStephensTower();
- renderEiffelTower();
- renderColosseum();
- renderSagradaFamilia();
- renderPyramidsOfGiza();
- renderRedSquare();
- renderGreatWallOfChina();
- renderEmpireStateBuilding();
- //renderCube();
- //renderEarthMap();
- }
- // for outter earth view
- else
- {
- renderEarth();
- renderStStephensTower();
- renderEiffelTower();
- renderColosseum();
- renderSagradaFamilia();
- renderPyramidsOfGiza();
- renderRedSquare();
- renderGreatWallOfChina();
- renderEmpireStateBuilding();
- if (middlecloudlayer) renderMiddleCloudLayer();
- if (uppercloudlayer) renderUpperCloudLayer();
- if (atmospherelayer) renderAtmosphereLayer();
- //renderCube();
- //renderEarthMap();
- }
- // particle system rendering / conditions
- // based upon camera position -- variables needed to calculate camera position must be placed after any clears to the matrix stack
- getCamPos();
- if (particleAlpha > 0) renderParticleSystem();
- if (particleAlpha < 0) particleAlpha = 0;
- if (particleAlpha > 1) particleAlpha = 1;
- if (isNorth == true) ParticleShader.SendUniform("gravity", 0.0f, -0.5f, 0.0f);
- else if (isSouth == true) ParticleShader.SendUniform("gravity", 0.0f, 0.5f, 0.0f);
- if (cameraVector[1] > 500.0f && cameraVector[1] < 550.0f || cameraVector[1] < 500.0f && cameraVector[1] > 400.0f) { isNorth = true; isSouth = false; }
- else if (cameraVector[1] < -500.0f && cameraVector[1] > -550.0f || cameraVector[1] > -500.0f && cameraVector[1] < -400.0f) { isSouth = true; isNorth = false; }
- if (cameraVector[1] > 500.0f && cameraVector[1] < 550.0f || cameraVector[1] < -500.0f && cameraVector[1] > -550.0f) particleAlpha += 0.005f;
- else if (cameraVector[1] < 500.0f && cameraVector[1] > 400.0f || cameraVector[1] > -500.0f && cameraVector[1] < -400.0f || cameraVector[1] > 550.0f || cameraVector[1] < -550.0f) particleAlpha -= 0.005f;
- else particleAlpha -= 0.005f;
- ParticleShader.SendUniform("particleAlpha", particleAlpha);
- }
- // ---- third and fourth render pass of pre-post-processing to blur the final output texture in verticle and horizontal
- // change the sample rate based on viewindex - if innerearth view, turn down bloom samples, if outterearth view switch them up for better effect
- if (viewIndex == 1) BlurShader.SendUniform("samples", 1);
- else BlurShader.SendUniform("samples", 5);
- glBindFramebufferEXT(GL_FRAMEBUFFER, ppFBO[2]);
- BlurShader.Use();
- BlurShader.SendUniform("horizontal", true);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, pp_texture[1]);
- renderScreenQuad(1);
- glBindFramebufferEXT(GL_FRAMEBUFFER, ppFBO[3]);
- BlurShader.Use();
- BlurShader.SendUniform("horizontal", false);
- glBindTexture(GL_TEXTURE_2D, pp_texture[2]);
- renderScreenQuad(1);
- // ---- fifth render pass: finally render the quad to screen with additive blending of textures bound to the ppFBO array [0] and [3]
- // ppFBO[0] = colour
- // ppFBO[1] = brightness
- // ppFBO[2] = horizontal blur
- // ppFBO[3] = horizontal + verticle blur
- glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
- BloomShader.Use();
- glActiveTexture(GL_TEXTURE4);
- glBindTexture(GL_TEXTURE_2D, pp_texture[3]);
- glActiveTexture(GL_TEXTURE5);
- glBindTexture(GL_TEXTURE_2D, pp_texture[0]);
- renderScreenQuad(0);
- // -- render text on top of any post processing effects
- renderText();
- //reshape(w, h);
- // essential for double-buffering technique
- glutSwapBuffers();
- // proceed the animation
- glutPostRedisplay();
- }
- void reshape(int w, int h)
- {
- // find screen aspect ratio
- float ratio = w * 1.0f / h;
- // setup the projection matrix
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glViewport(0, 0, w, h);
- gluPerspective(60.0f, ratio, 0.02f, 1000.0f);
- float matrixProjection[16];
- glGetFloatv(GL_PROJECTION_MATRIX, matrixProjection);
- EarthShader.SendUniform("matrixProjection", matrixProjection);
- AtmosphereShader.SendUniform("matrixProjection", matrixProjection);
- ModelShader.SendUniform("matrixProjection", matrixProjection);
- ParticleShader.SendUniform("matrixProjection", matrixProjection);
- BlurShader.SendUniform("matrixProjection", matrixProjection);
- BloomShader.SendUniform("matrixProjection", matrixProjection);
- ParticleShader.SendUniform("scaleFactor", (float)h / 720.f);
- // set model/view matrix for rendering
- glMatrixMode(GL_MODELVIEW);
- // adjust shadow map size based on window size * 2
- glBindTexture(GL_TEXTURE_2D, shadowmap_texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w * 2, h * 2, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
- // adjust post processing texture size based on window size
- for (int i = 0; i < 4; i++)
- {
- glBindTexture(GL_TEXTURE_2D, pp_texture[i]);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- }
- }
- // Handle WASDQE keys
- void onKeyDown(unsigned char key, int x, int y)
- {
- switch (tolower(key))
- {
- case 'w': deltaZ = max(deltaZ * 1.05f, 0.01f); break;
- case 's': deltaZ = min(deltaZ * 1.05f, -0.01f); break;
- case 'a': deltaX = max(deltaX * 1.05f, 0.01f); break;
- case 'd': deltaX = min(deltaX * 1.05f, -0.01f); break;
- case 'e': deltaY = max(deltaY * 1.05f, 0.01f); break;
- case 'q': deltaY = min(deltaY * 1.05f, -0.01f); break;
- case '1': middlecloudlayer = !middlecloudlayer; break;
- case '2': uppercloudlayer = !uppercloudlayer; break;
- case '3': atmospherelayer = !atmospherelayer; break;
- }
- // speed limit
- deltaX = max(-0.90f, min(0.90f, deltaX));
- deltaY = max(-0.90f, min(0.90f, deltaY));
- deltaZ = max(-0.90f, min(0.90f, deltaZ));
- }
- // Handle WASDQE keys (key up)
- void onKeyUp(unsigned char key, int x, int y)
- {
- switch (tolower(key))
- {
- case 'w': deltaZ = 0; getCamPos(); getCamPosDisplay(); break;
- case 's': deltaZ = 0; break;
- case 'a':
- case 'd': deltaX = 0; break;
- case 'q':
- case 'e': deltaY = 0; break;
- case ' ':
- if (viewIndex == 0) lock[0] = false;
- if (viewIndex == 1) lock[1] = false;
- break;
- case '4': viewIndex++; break;
- }
- }
- // Handle arrow keys and Alt+F4
- void onSpecDown(int key, int x, int y)
- {
- switch (key)
- {
- case GLUT_KEY_F4: if ((glutGetModifiers() & GLUT_ACTIVE_ALT) != 0) exit(0); break;
- case GLUT_KEY_UP: onKeyDown('w', x, y); break;
- case GLUT_KEY_DOWN: onKeyDown('s', x, y); break;
- case GLUT_KEY_LEFT: onKeyDown('a', x, y); break;
- case GLUT_KEY_RIGHT: onKeyDown('d', x, y); break;
- case GLUT_KEY_PAGE_UP: onKeyDown('q', x, y); break;
- case GLUT_KEY_PAGE_DOWN:onKeyDown('e', x, y); break;
- case GLUT_KEY_F11: glutFullScreenToggle();
- }
- }
- // Handle arrow keys (key up)
- void onSpecUp(int key, int x, int y)
- {
- switch (key)
- {
- case GLUT_KEY_UP: onKeyUp('w', x, y); break;
- case GLUT_KEY_DOWN: onKeyUp('s', x, y); break;
- case GLUT_KEY_LEFT: onKeyUp('a', x, y); break;
- case GLUT_KEY_RIGHT: onKeyUp('d', x, y); break;
- case GLUT_KEY_PAGE_UP: onKeyUp('q', x, y); break;
- case GLUT_KEY_PAGE_DOWN:onKeyUp('e', x, y); break;
- }
- }
- // Handle mouse click
- void onMouse(int button, int state, int x, int y)
- {
- int cx = glutGet(GLUT_WINDOW_WIDTH) / 2;
- int cy = glutGet(GLUT_WINDOW_HEIGHT) / 2;
- if (state == GLUT_DOWN)
- {
- //glutSetCursor(GLUT_CURSOR_CROSSHAIR);
- glutWarpPointer(cx, cy);
- }
- else
- glutSetCursor(GLUT_CURSOR_INHERIT);
- }
- // handle mouse move
- void onMotion(int x, int y)
- {
- int cx = glutGet(GLUT_WINDOW_WIDTH) / 2;
- int cy = glutGet(GLUT_WINDOW_HEIGHT) / 2;
- if (x == cx && y == cy)
- return; // caused by glutWarpPointer
- float amp = 0.25;
- float deltaTilt = amp * (y - cy);
- float deltaPan = amp * (x - cx);
- glutWarpPointer(cx, cy);
- // handle camera tilt (mouse move up & down)
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glRotatef(deltaTilt, 1, 0, 0);
- glMultMatrixf(matrixView);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrixView);
- angleTilt += deltaTilt;
- // handle camera pan (mouse move left & right)
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glRotatef(angleTilt, 1, 0, 0);
- glRotatef(deltaPan, 0, 1, 0);
- glRotatef(-angleTilt, 1, 0, 0);
- glMultMatrixf(matrixView);
- glGetFloatv(GL_MODELVIEW_MATRIX, matrixView);
- }
- int main(int argc, char **argv)
- {
- // init GLUT and create Window
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
- glutInitWindowPosition(100, 100);
- glutInitWindowSize(800, 600);
- glutCreateWindow("Earth-2018 (Hero Demo, Phoenix Mee (K1652267)");
- // init glew
- GLenum err = glewInit();
- if (GLEW_OK != err)
- {
- cerr << "GLEW Error: " << glewGetErrorString(err) << endl;
- return 0;
- }
- cout << "Using GLEW " << glewGetString(GLEW_VERSION) << endl;
- // register callbacks
- glutDisplayFunc(render);
- glutReshapeFunc(reshape);
- glutKeyboardFunc(onKeyDown);
- glutSpecialFunc(onSpecDown);
- glutKeyboardUpFunc(onKeyUp);
- glutSpecialUpFunc(onSpecUp);
- glutMouseFunc(onMouse);
- glutMotionFunc(onMotion);
- cout << "Vendor: " << glGetString(GL_VENDOR) << endl;
- cout << "Renderer: " << glGetString(GL_RENDERER) << endl;
- cout << "Version: " << glGetString(GL_VERSION) << endl;
- // init light and everything – not a GLUT or callback function!
- if (!init())
- {
- cerr << "Application failed to initialise" << endl;
- return 0;
- }
- // enter GLUT event processing cycle
- glutMainLoop();
- done();
- return 1;
- }
Add Comment
Please, Sign In to add comment