diff --git a/grk-project.vcxproj b/grk-project.vcxproj index da1317a..898082b 100644 --- a/grk-project.vcxproj +++ b/grk-project.vcxproj @@ -17,6 +17,8 @@ + + diff --git a/grk-project.vcxproj.filters b/grk-project.vcxproj.filters index 46e4667..7589c2e 100644 --- a/grk-project.vcxproj.filters +++ b/grk-project.vcxproj.filters @@ -54,6 +54,12 @@ Shader Files + + Shader Files + + + Shader Files + diff --git a/shader_particle.frag b/shader_particle.frag new file mode 100644 index 0000000..7c3ba2d --- /dev/null +++ b/shader_particle.frag @@ -0,0 +1,14 @@ +#version 330 core + +in vec2 UV; +in vec4 ParticleColor; + +out vec4 color; + +uniform sampler2D sprite; + +void main() +{ + color = texture( sprite, UV ) * ParticleColor; + +} \ No newline at end of file diff --git a/shader_particle.vert b/shader_particle.vert new file mode 100644 index 0000000..e08cd46 --- /dev/null +++ b/shader_particle.vert @@ -0,0 +1,29 @@ +#version 330 core +layout(location = 0) in vec3 squareVertices; +layout(location = 1) in vec4 xyzs; +layout(location = 2) in vec4 color; + +out vec2 UV; +out vec4 ParticleColor; + +uniform vec3 CameraRight_worldspace; +uniform vec3 CameraUp_worldspace; +uniform mat4 VP; + +void main() +{ + float particleSize = xyzs.w; // because we encoded it this way. + vec3 particleCenter_wordspace = xyzs.xyz; + + vec3 vertexPosition_worldspace = + particleCenter_wordspace + + CameraRight_worldspace * squareVertices.x * particleSize + + CameraUp_worldspace * squareVertices.y * particleSize; + + // Output position of the vertex + gl_Position = VP * vec4(vertexPosition_worldspace, 1.0f); + + // UV of the vertex. No special space for this one. + UV = squareVertices.xy + vec2(0.5, 0.5); + ParticleColor = color; +} \ No newline at end of file diff --git a/shaders/shader_particle.frag b/shaders/shader_particle.frag new file mode 100644 index 0000000..7c3ba2d --- /dev/null +++ b/shaders/shader_particle.frag @@ -0,0 +1,14 @@ +#version 330 core + +in vec2 UV; +in vec4 ParticleColor; + +out vec4 color; + +uniform sampler2D sprite; + +void main() +{ + color = texture( sprite, UV ) * ParticleColor; + +} \ No newline at end of file diff --git a/shaders/shader_particle.vert b/shaders/shader_particle.vert new file mode 100644 index 0000000..e08cd46 --- /dev/null +++ b/shaders/shader_particle.vert @@ -0,0 +1,29 @@ +#version 330 core +layout(location = 0) in vec3 squareVertices; +layout(location = 1) in vec4 xyzs; +layout(location = 2) in vec4 color; + +out vec2 UV; +out vec4 ParticleColor; + +uniform vec3 CameraRight_worldspace; +uniform vec3 CameraUp_worldspace; +uniform mat4 VP; + +void main() +{ + float particleSize = xyzs.w; // because we encoded it this way. + vec3 particleCenter_wordspace = xyzs.xyz; + + vec3 vertexPosition_worldspace = + particleCenter_wordspace + + CameraRight_worldspace * squareVertices.x * particleSize + + CameraUp_worldspace * squareVertices.y * particleSize; + + // Output position of the vertex + gl_Position = VP * vec4(vertexPosition_worldspace, 1.0f); + + // UV of the vertex. No special space for this one. + UV = squareVertices.xy + vec2(0.5, 0.5); + ParticleColor = color; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ea5c7d1..67196e7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,18 +30,28 @@ GLuint programSkybox; GLuint programSun; GLuint programBlur; GLuint programBloom; +GLuint programParticle; +GLuint VertexArrayID; unsigned int pingpongFBO[2]; unsigned int pingpongColorbuffers[2]; unsigned int FBO; unsigned int colorBuffers[2]; - +//particlepart +double lastTime; +static GLfloat* g_particule_position_size_data; +static GLubyte* g_particule_color_data; +GLuint particle_vertex_buffer; +GLuint particles_position_buffer; +GLuint particles_color_buffer; Core::Shader_Loader shaderLoader; Core::RenderContext armContext; std::vector arm; int ballIndex; +bool bothEngines = true; + GLuint textureShip_normals; GLuint sunTexture; @@ -49,6 +59,7 @@ GLuint earthTexture; GLuint moonTexture; GLuint skyboxTexture; GLuint shipTexture; +GLuint particleTexture; obj::Model sphereModel; obj::Model cubeModel; obj::Model shipModel; @@ -72,15 +83,54 @@ glm::mat4 cameraMatrix, perspectiveMatrix; glm::vec3 sunPos = glm::vec3(10.0f, 0.0f, -5.0f); glm::vec3 sunPos2 = glm::vec3(25.0f, -1.0f, 10.0f); +//particlepart +struct Particle { + glm::vec3 pos, speed; + unsigned char r, g, b, a; // Color + float size, angle, weight; + float life; // Remaining life of the particle. if <0 : dead and unused. + float cameradistance; // *Squared* distance to the camera. if dead : -1.0f + bool operator<(const Particle& that) const { + return this->cameradistance > that.cameradistance; + } +}; +const int MaxParticles = 1000; +Particle ParticlesContainer[MaxParticles]; +int LastUsedParticle = 0; + +void SortParticles() { + std::sort(&ParticlesContainer[0], &ParticlesContainer[MaxParticles]); +} + +int FindUnusedParticle() { + + for (int i = LastUsedParticle; i < MaxParticles; i++) { + if (ParticlesContainer[i].life < 0) { + LastUsedParticle = i; + return i; + } + } + + for (int i = 0; i < LastUsedParticle; i++) { + if (ParticlesContainer[i].life < 0) { + LastUsedParticle = i; + return i; + } + } + + return 0; // All particles are taken, override the first one +} + +//Light struct Light { glm::vec3 position; glm::vec3 color; float intensity; }; -int engineLightTimer; +int engineLightTimer = 50; //wczytywanie skyboxa (musi byc jpg!) std::vector faces @@ -102,7 +152,7 @@ void keyboard(unsigned char key, int x, int y) float moveSpeed = 0.1f; switch (key) { - case 'q': + case 'q': { cameraAngle -= angleSpeed; lights[3].intensity = 0.005; @@ -110,7 +160,7 @@ void keyboard(unsigned char key, int x, int y) break; } - case 'e': + case 'e': { cameraAngle += angleSpeed; lights[2].intensity = 0.005; @@ -118,7 +168,7 @@ void keyboard(unsigned char key, int x, int y) break; } - case 'w': + case 'w': { cameraPos += cameraDir * moveSpeed; lights[2].intensity = 0.005; @@ -169,7 +219,7 @@ glm::mat4 createCameraMatrix() cameraDir = glm::vec3(cosf(cameraAngle), 0.0f, sinf(cameraAngle)); glm::vec3 up = glm::vec3(0, 1, 0); - cameraSide = glm::cross(cameraDir,up); + cameraSide = glm::cross(cameraDir, up); return Core::createViewMatrix(cameraPos, cameraDir, up); } @@ -220,7 +270,7 @@ unsigned int loadCubemap(std::vector faces) int width, height, nrChannels; for (unsigned int i = 0; i < faces.size(); i++) { - unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0); + unsigned char* data = stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0); if (data) { glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, @@ -259,6 +309,63 @@ void drawSkybox(GLuint program, Core::RenderContext context, GLuint texID) glUseProgram(0); } +void drawParticles(int ParticlesCount, glm::mat4 &transformation) +{ + glBindBuffer(GL_ARRAY_BUFFER, particles_position_buffer); + glBufferData(GL_ARRAY_BUFFER, MaxParticles * 4 * sizeof(GLfloat), NULL, GL_STREAM_DRAW); // Buffer orphaning, a common way to improve streaming perf. See above link for details. + glBufferSubData(GL_ARRAY_BUFFER, 0, ParticlesCount * sizeof(GLfloat) * 4, g_particule_position_size_data); + + glBindBuffer(GL_ARRAY_BUFFER, particles_color_buffer); + glBufferData(GL_ARRAY_BUFFER, MaxParticles * 4 * sizeof(GLubyte), NULL, GL_STREAM_DRAW); // Buffer orphaning, a common way to improve streaming perf. See above link for details. + glBufferSubData(GL_ARRAY_BUFFER, 0, ParticlesCount * sizeof(GLubyte) * 4, g_particule_color_data); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, particleTexture); + glUniform1i(glGetUniformLocation(programParticle, "sprite"), 0); + glUniform3f(glGetUniformLocation(programParticle, "CameraRight_worldspace"), cameraSide.x, cameraSide.y, cameraSide.z); + glUniform3f(glGetUniformLocation(programParticle, "CameraUp_worldspace"), 0, 1, 0); + + glUniformMatrix4fv(glGetUniformLocation(programParticle, "VP"), 1, GL_FALSE, &transformation[0][0]); + + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, particle_vertex_buffer); + glVertexAttribPointer( + 0, // attribute. No particular reason for 0, but must match the layout in the shader. + 3, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, particles_position_buffer); + glVertexAttribPointer( + 1, // attribute. No particular reason for 1, but must match the layout in the shader. + 4, // size : x + y + z + size => 4 + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + glEnableVertexAttribArray(2); + glBindBuffer(GL_ARRAY_BUFFER, particles_color_buffer); + glVertexAttribPointer( + 2, // attribute. No particular reason for 1, but must match the layout in the shader. + 4, // size : r + g + b + a => 4 + GL_UNSIGNED_BYTE, // type + GL_TRUE, // normalized? *** YES, this means that the unsigned char[4] will be accessible with a vec4 (floats) in the shader *** + 0, // stride + (void*)0 // array buffer offset + ); + glVertexAttribDivisor(0, 0); // particles vertices : always reuse the same 4 vertices -> 0 + glVertexAttribDivisor(1, 1); // positions : one per quad (its center) -> 1 + glVertexAttribDivisor(2, 1); // color : one per quad -> 1 + glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, ParticlesCount); + + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(2); +} + //Textures void drawObjectTexture(GLuint program, Core::RenderContext context, glm::mat4 modelMatrix, glm::vec3 texture, GLuint texID) { @@ -278,7 +385,7 @@ void drawObjectTexture(GLuint program, Core::RenderContext context, glm::mat4 mo glm::mat4 drawPlanet(float time, glm::vec3 sunPos, glm::vec3 orbit, glm::vec3 translation, glm::vec3 scale) { glm::mat4 planetModelMatrix = glm::mat4(1.0f); - planetModelMatrix = glm::translate(planetModelMatrix, sunPos); + planetModelMatrix = glm::translate(planetModelMatrix, sunPos); planetModelMatrix = glm::rotate(planetModelMatrix, time, orbit); planetModelMatrix = glm::translate(planetModelMatrix, translation); planetModelMatrix = glm::scale(planetModelMatrix, scale); @@ -334,13 +441,13 @@ void renderScene() lights[0].position = sunPos; lights[1].position = sunPos2; - - glm::mat4 engineLeft = glm::translate(shipModelMatrix, glm::vec3(700,0,-1500)); + + glm::mat4 engineLeft = glm::translate(shipModelMatrix, glm::vec3(450, 0, -1500)); lights[2].position = glm::vec3(engineLeft[3][0], engineLeft[3][1], engineLeft[3][2]); - glm::mat4 engineRight = glm::translate(shipModelMatrix, glm::vec3(-700, 0, -1500)); + glm::mat4 engineRight = glm::translate(shipModelMatrix, glm::vec3(-450, 0, -1500)); lights[3].position = glm::vec3(engineRight[3][0], engineRight[3][1], engineRight[3][2]); - + for (int i = 0; i < lights.size(); i++) { std::string col = "pointLights[" + std::to_string(i) + "].color"; @@ -356,6 +463,10 @@ void renderScene() drawFromAssimpModel(programTex, corvette, shipModelMatrix, glm::vec3(1)); drawFromAssimpModel(programTex, crewmate, crewmateModelMatrix, glm::vec3(1)); + //rysowanie Ziemi z ksiezycem + glm::mat4 earth = drawPlanet(time / 5.0f, sunPos * glm::vec3(1.5f, 1, 1), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(-10.5f, 0.0f, -10.5f), glm::vec3(0.5f, 0.5f, 0.5f)); + glm::mat4 moon = drawMoon(earth, time / 2.0f, glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0, 1, 1), glm::vec3(1.5f, 1.0f, 1.0f), glm::vec3(0.3f, 0.3f, 0.3f)); + earth = glm::rotate(earth, time / 3.0f, glm::vec3(0.0f, 0.0f, 1.0f)); drawObjectTexture(programTex, sphereContext, earth, glm::vec3(0.8f, 0.8f, 0.8f), earthTexture); drawObjectTexture(programTex, sphereContext, moon, glm::vec3(0.9f, 1.0f, 0.9f), moonTexture); drawObjectTexture(programTex, sphereContext, planet1, glm::vec3(0.4f, 0.2f, 0.9f), moonTexture); @@ -365,6 +476,112 @@ void renderScene() drawObjectTexture(programSun, sphereContext, sunModelMatrix, glm::vec3(3.5f, 3.8f, 3.8f), sunTexture); drawObjectTexture(programSun, sphereContext, sunModelMatrix2, glm::vec3(0.9f, 0.9f, 2.0f), sunTexture); + + //particlepart + glUseProgram(programParticle); + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + double delta = time - lastTime; + lastTime = time; + + glm::mat4 transformation = perspectiveMatrix * cameraMatrix; + + int newparticles = 0; + + if (engineLightTimer < 40) + { + engineLightTimer++; + newparticles = (int)(delta * 10000.0); + if (newparticles > (int)(0.016f * 10000.0)) + newparticles = (int)(0.016f * 10000.0); + } + else + { + lights[2].intensity = 0.00001; + lights[3].intensity = 0.00001; + } + + for (int i = 0; i < newparticles; i++) { + int particleIndex = FindUnusedParticle(); + ParticlesContainer[particleIndex].life = 100.0f; + if (lights[2].intensity > 0.001 && lights[3].intensity > 0.001) + { + if (rand() % 2) + ParticlesContainer[particleIndex].pos = lights[2].position; + + else + ParticlesContainer[particleIndex].pos = lights[3].position; + } + else if(lights[2].intensity > 0.001) + ParticlesContainer[particleIndex].pos = lights[2].position; + + else if (lights[3].intensity > 0.001) + ParticlesContainer[particleIndex].pos = lights[3].position; + + + float spread = 1.0f; + glm::vec3 maindir = glm::vec3(0.0f, 0.0f, 0.0f); + glm::vec3 randomdir = glm::vec3( + (rand() % 2000 - 1000.0f) / 5000.0f, + (rand() % 2000 - 1000.0f) / 5000.0f, + (rand() % 2000 - 1000.0f) / 5000.0f + ); + + ParticlesContainer[particleIndex].speed = maindir + randomdir * spread; + + + // Very bad way to generate a random color + ParticlesContainer[particleIndex].r = rand() % 100 + 100; + ParticlesContainer[particleIndex].g = 0; + ParticlesContainer[particleIndex].b = rand() % 100 + 50; + ParticlesContainer[particleIndex].a = (rand() % 256) / 3; + + ParticlesContainer[particleIndex].size = (rand() % 1000) / 50000.0f + 0.01f; + + } + // Simulate all particles + int ParticlesCount = 0; + for (int i = 0; i < MaxParticles; i++) { + + Particle& p = ParticlesContainer[i]; // shortcut + + if (p.life > 0.0f) { + + // Decrease life + p.life -= delta; + if (p.life > 0.0f) { + + // Simulate simple physics : gravity only, no collisions + p.speed += glm::vec3(0.0f, -9.81f, 0.0f) * (float)delta * 0.5f; + p.pos += p.speed * (float)delta; + p.cameradistance = glm::length2(p.pos - cameraPos); + //ParticlesContainer[i].pos += glm::vec3(0.0f,10.0f, 0.0f) * (float)delta; + + // Fill the GPU buffer + g_particule_position_size_data[4 * ParticlesCount + 0] = p.pos.x; + g_particule_position_size_data[4 * ParticlesCount + 1] = p.pos.y; + g_particule_position_size_data[4 * ParticlesCount + 2] = p.pos.z; + + g_particule_position_size_data[4 * ParticlesCount + 3] = p.size; + + g_particule_color_data[4 * ParticlesCount + 0] = p.r; + g_particule_color_data[4 * ParticlesCount + 1] = p.g; + g_particule_color_data[4 * ParticlesCount + 2] = p.b; + g_particule_color_data[4 * ParticlesCount + 3] = p.a; + + } + else { + // Particles that just died will be put at the end of the buffer in SortParticles(); + p.cameradistance = -1.0f; + } + + ParticlesCount++; + + } + } + + SortParticles(); + drawParticles(ParticlesCount, transformation); drawSkybox(programSkybox, cubeContext, skyboxTexture); glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -376,7 +593,7 @@ void renderScene() { glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]); glUniform1i(glGetUniformLocation(programBlur, "horizontal"), horizontal); - glBindTexture(GL_TEXTURE_2D, first_iteration ? colorBuffers[1] : pingpongColorbuffers[!horizontal]); + glBindTexture(GL_TEXTURE_2D, first_iteration ? colorBuffers[1] : pingpongColorbuffers[!horizontal]); renderQuad(); horizontal = !horizontal; if (first_iteration) @@ -391,54 +608,48 @@ void renderScene() glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[!horizontal]); renderQuad(); - - if (engineLightTimer < 50) engineLightTimer++; - else - { - lights[2].intensity = 0.00001; - lights[3].intensity = 0.00001; - } - - - glUseProgram(0); glutSwapBuffers(); } -void init() +void init_particles() { - glEnable(GL_DEPTH_TEST); - programTex = shaderLoader.CreateProgram("shaders/shader_tex.vert", "shaders/shader_tex.frag"); - programSkybox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); - programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); - programBlur = shaderLoader.CreateProgram("shaders/shader_blur.vert", "shaders/shader_blur.frag"); - programBloom = shaderLoader.CreateProgram("shaders/shader_bloom.vert", "shaders/shader_bloom.frag"); + glGenVertexArrays(1, &VertexArrayID); + glBindVertexArray(VertexArrayID); + g_particule_position_size_data = new GLfloat[MaxParticles * 4]; + g_particule_color_data = new GLubyte[MaxParticles * 4]; + for (int i = 0; i < MaxParticles; i++) { + ParticlesContainer[i].life = 100.0f; + ParticlesContainer[i].cameradistance = -1.0f; + } + static const GLfloat g_vertex_buffer_data[] = { + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + -0.5f, 0.5f, 0.0f, + 0.5f, 0.5f, 0.0f, + }; + glGenBuffers(1, &particle_vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, particle_vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); + // The VBO containing the positions and sizes of the particles + glGenBuffers(1, &particles_position_buffer); + glBindBuffer(GL_ARRAY_BUFFER, particles_position_buffer); + // Initialize with empty (NULL) buffer : it will be updated later, each frame. + glBufferData(GL_ARRAY_BUFFER, MaxParticles * 4 * sizeof(GLfloat), NULL, GL_STREAM_DRAW); - glUseProgram(programBlur); - glUniform1i(glGetUniformLocation(programBlur, "image"), 0); - glUseProgram(programBloom); - glUniform1i(glGetUniformLocation(programBloom, "scene"), 0); - glUniform1i(glGetUniformLocation(programBloom, "bloomBlur"), 1); - glUseProgram(0); - - - corvette = std::make_shared("models/Corvette-F3.obj"); - crewmate = std::make_shared("models/space_humster.obj"); - //shipModel = obj::loadModelFromFile("models/spaceship.obj"); - sphereModel = obj::loadModelFromFile("models/sphere.obj"); - cubeModel = obj::loadModelFromFile("models/cube.obj"); - - sphereContext.initFromOBJ(sphereModel); - cubeContext.initFromOBJ(cubeModel); - //shipContext.initFromOBJ(shipModel); - shipTexture = Core::LoadTexture("textures/spaceship.png"); - sunTexture = Core::LoadTexture("textures/sun.png"); - earthTexture = Core::LoadTexture("textures/earth2.png"); - moonTexture = Core::LoadTexture("textures/moon.png"); - skyboxTexture = loadCubemap(faces); + // The VBO containing the colors of the particles + glGenBuffers(1, &particles_color_buffer); + glBindBuffer(GL_ARRAY_BUFFER, particles_color_buffer); + // Initialize with empty (NULL) buffer : it will be updated later, each frame. + glBufferData(GL_ARRAY_BUFFER, MaxParticles * 4 * sizeof(GLubyte), NULL, GL_STREAM_DRAW); + lastTime = glutGet(GLUT_ELAPSED_TIME) / 1000.f; +} +void init_bloom() +{ glGenFramebuffers(1, &FBO); glBindFramebuffer(GL_FRAMEBUFFER, FBO); + glGenTextures(2, colorBuffers); for (unsigned int i = 0; i < 2; i++) { @@ -481,6 +692,45 @@ void init() if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; } +} + +void init() +{ + glEnable(GL_DEPTH_TEST); + programTex = shaderLoader.CreateProgram("shaders/shader_tex.vert", "shaders/shader_tex.frag"); + programSkybox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); + programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); + programBlur = shaderLoader.CreateProgram("shaders/shader_blur.vert", "shaders/shader_blur.frag"); + programBloom = shaderLoader.CreateProgram("shaders/shader_bloom.vert", "shaders/shader_bloom.frag"); + programParticle = shaderLoader.CreateProgram("shaders/shader_particle.vert", "shaders/shader_particle.frag"); + + glUseProgram(programBlur); + glUniform1i(glGetUniformLocation(programBlur, "image"), 0); + glUseProgram(programBloom); + glUniform1i(glGetUniformLocation(programBloom, "scene"), 0); + glUniform1i(glGetUniformLocation(programBloom, "bloomBlur"), 1); + glUseProgram(0); + + + corvette = std::make_shared("models/Corvette-F3.obj"); + crewmate = std::make_shared("models/space_humster.obj"); + //shipModel = obj::loadModelFromFile("models/spaceship.obj"); + sphereModel = obj::loadModelFromFile("models/sphere.obj"); + cubeModel = obj::loadModelFromFile("models/cube.obj"); + + sphereContext.initFromOBJ(sphereModel); + cubeContext.initFromOBJ(cubeModel); + //shipContext.initFromOBJ(shipModel); + shipTexture = Core::LoadTexture("textures/spaceship.png"); + sunTexture = Core::LoadTexture("textures/sun.png"); + earthTexture = Core::LoadTexture("textures/earth2.png"); + moonTexture = Core::LoadTexture("textures/moon.png"); + particleTexture = Core::LoadTexture("textures/sun.png"); + skyboxTexture = loadCubemap(faces); + + init_particles(); + init_bloom(); + Light l1; l1.position = sunPos; @@ -510,7 +760,7 @@ void init() void shutdown() { - + } void onReshape(int width, int height) @@ -535,6 +785,8 @@ int main(int argc, char** argv) glutSetOption(GLUT_MULTISAMPLE, 8); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE); glEnable(GL_MULTISAMPLE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glutInitWindowPosition(0, 0); glutInitWindowSize(SCR_WIDTH, SCR_HEIGHT); //glutCreateWindow("GRK-PROJECT WIP"); @@ -542,6 +794,7 @@ int main(int argc, char** argv) glutFullScreen(); glewInit(); + init(); glutKeyboardFunc(keyboard); //to sprawia, że obiekty ukryte przed kamerą nie są renderowane