diff --git a/cw 7/grk-cw7.vcxproj b/cw 7/grk-cw7.vcxproj index 2db9e9f..528ce74 100644 --- a/cw 7/grk-cw7.vcxproj +++ b/cw 7/grk-cw7.vcxproj @@ -80,7 +80,7 @@ - false + true $(SolutionDir)dependencies\freeglut\lib;$(SolutionDir)dependencies\glew-2.0.0\lib\Release\Win32;$(SolutionDir)dependencies\glfw-3.3.8.bin.WIN32\lib-vc2019;$(SolutionDir)dependencies\assimp;$(LibraryPath) $(SolutionDir)dependencies\freeglut\include\GL;$(SolutionDir)dependencies\glew-2.0.0\include\GL;$(SolutionDir)dependencies\glm;$(SolutionDir)dependencies\glfw-3.3.8.bin.WIN32\include;$(SolutionDir)dependencies\assimp\include;$(IncludePath) $(ExecutablePath) diff --git a/cw 7/src/ex_7_1.hpp b/cw 7/src/ex_7_1.hpp index a3da6bd..bab7bce 100644 --- a/cw 7/src/ex_7_1.hpp +++ b/cw 7/src/ex_7_1.hpp @@ -4,11 +4,12 @@ #include "ext.hpp" #include #include - +#include +#include +#include #include "Shader_Loader.h" #include "Render_Utils.h" #include "Texture.h" - #include "Box.cpp" #include #include @@ -16,7 +17,6 @@ #include #include "SOIL/SOIL.h" - namespace texture { GLuint earth; GLuint clouds; @@ -58,8 +58,24 @@ glm::vec3 cameraDir = glm::vec3(1.f, 0.f, 0.f); glm::vec3 spaceshipPos = glm::vec3(-4.f, 0, 0); glm::vec3 spaceshipDir = glm::vec3(1.f, 0.f, 0.f); -GLuint VAO,VBO; +bool START_AS = false; +float a = 3 ; + +std::random_device rd; +std::mt19937 gen(rd()); +std::uniform_real_distribution distribution(-0.5f, 0.5f); +std::uniform_real_distribution planetoidsYDistribution(-1.f, 1.f); +std::uniform_real_distribution planetoidsScaleDistribution(0.01f, 0.05f); +float planetoidsArray[500][4]; +glm::vec3 asteroid_Calc = spaceshipDir * glm::vec3(a, a, a); +glm::vec3 asteroid_Pos = spaceshipPos + glm::vec3(0, a, 0) + asteroid_Calc; +glm::vec3 distance = asteroid_Pos - spaceshipPos; + +double step = 0.0000001; + +GLuint VAO,VBO; +float lastAsteroidTime = 0; float aspectRatio = 1.f; unsigned int textureID; @@ -109,10 +125,11 @@ void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::v glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z); - glUniform3f(glGetUniformLocation(program, "lightPos"), 0,0,0); + glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0); Core::DrawContext(context); } + void drawObjectTexture(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint textureID, GLuint normalMapId) { glUseProgram(programTex); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); @@ -139,6 +156,39 @@ void drawObjectSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix) { glEnable(GL_DEPTH_TEST); } + +void generateAsteroids(glm::vec3 asteroid_Pos, glm::vec3 distance, double step) { + glm::vec3 normalizedDir = glm::normalize(distance); + asteroid_Pos = asteroid_Pos - normalizedDir *step; + drawObjectTexture(sphereContext, glm::translate(asteroid_Pos) * glm::scale(glm::vec3(0.1f)), texture::moon, texture::moonNormal); + +} + +void generatePlanetoidBelt() { + + for (int i = 0; i < 500; ++i) { + + float x = planetoidsArray[i][0]; + float z = planetoidsArray[i][1]; + float y = planetoidsArray[i][2]; + float pScale = planetoidsArray[i][3]; + + float time = glfwGetTime(); + + drawObjectTexture(sphereContext,glm::eulerAngleY(time / 5) * glm::translate(glm::vec3(x, y, z)) * glm::scale(glm::vec3(pScale)), texture::moon, texture::moonNormal); + } +} + +int steps = 0; +glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); +glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir)); +glm::mat4 specshipCameraRotrationMatrix = glm::mat4({ + spaceshipSide.x,spaceshipSide.y,spaceshipSide.z,0, + spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0, + -spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.z,0, + 0.,0.,0.,1., + }); + void renderScene(GLFWwindow* window) { glClearColor(0.0f, 0.3f, 0.3f, 1.0f); @@ -162,35 +212,59 @@ void renderScene(GLFWwindow* window) drawObjectTexture(sphereContext, glm::eulerAngleY(time / 7) * glm::translate(glm::vec3(20.f, 0, 0)) * glm::eulerAngleY(time) * glm::scale(glm::vec3(0.6f)), texture::uranus, texture::rustNormal); drawObjectTexture(sphereContext, glm::eulerAngleY(time / 8) * glm::translate(glm::vec3(23.f, 0, 0)) * glm::eulerAngleY(time) * glm::scale(glm::vec3(0.6f)), texture::neptune, texture::rustNormal); - glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); - glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir)); - glm::mat4 specshipCameraRotrationMatrix = glm::mat4({ + + + //drawObjectColor(shipContext, + // glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi()), + // glm::vec3(0.3, 0.3, 0.5) + // ); + spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); + spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir)); + specshipCameraRotrationMatrix = glm::mat4({ spaceshipSide.x,spaceshipSide.y,spaceshipSide.z,0, spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0, -spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.z,0, 0.,0.,0.,1., }); - - //drawObjectColor(shipContext, - // glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi()), - // glm::vec3(0.3, 0.3, 0.5) - // ); drawObjectTexture(shipContext, - glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi()), + glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi())*glm::scale(glm::vec3(0.1f)), texture::ship, texture::shipNormal ); - + generatePlanetoidBelt(); - + if (time - lastAsteroidTime < 5 && START_AS) { //funkcja generujaca pierwsza asteroide + step = step + 0.03; + generateAsteroids(asteroid_Pos, distance, step); + //steps++; + //std::cout << steps << std::endl; + } + else { + float random_x = distribution(gen); + float random_y = distribution(gen); + float random_z = distribution(gen); + //std::cout << random_x << std::endl; + glm::vec3 random_dir = glm::normalize(glm::vec3(spaceshipDir.x + random_x, spaceshipDir.y + random_y, spaceshipDir.z + random_z)); + asteroid_Calc = a * random_dir; + glm::vec3 estimated_Spaceship_Pos = spaceshipPos + glm::vec3(1.f, 1.f, 1.f) * glm::normalize(spaceshipDir); + asteroid_Pos = spaceshipPos + glm::vec3(0, a / 5, 0) + asteroid_Calc; + + distance = asteroid_Pos - estimated_Spaceship_Pos; + lastAsteroidTime = time; + step = 0.0001; + //std::cout << cameraDir.x << cameraDir.y << cameraDir.z << std::endl; + //steps = 0; + } glUseProgram(0); glfwSwapBuffers(window); } + + void framebuffer_size_callback(GLFWwindow* window, int width, int height) { - aspectRatio = width / float(height); + aspectRatio = static_cast(width) / static_cast(height); glViewport(0, 0, width, height); } void loadModelToContext(std::string path, Core::RenderContext& context) @@ -251,6 +325,19 @@ void init(GLFWwindow* window) glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); + std::uniform_real_distribution angleDistribution(0.0f, 2.0f * glm::pi()); + std::uniform_real_distribution radiusDistribution(10.f, 17.f); + + for (int i = 0; i < 500; ++i) { + float angle = angleDistribution(gen); + float radius = radiusDistribution(gen); + float y = planetoidsYDistribution(gen); + float pScale = planetoidsScaleDistribution(gen); + planetoidsArray[i][0] = radius * std::cos(angle); + planetoidsArray[i][1] = radius * std::sin(angle); + planetoidsArray[i][2] = y; + planetoidsArray[i][3] = pScale; + } std::vector filepaths = { "textures/skybox/space_rt.png", @@ -301,13 +388,38 @@ void shutdown(GLFWwindow* window) shaderLoader.DeleteProgram(program); } +double lastX = 0.0; +double lastY = 0.0; + +void mouseCallback(GLFWwindow* window, double xpos, double ypos) { + + double deltaX = xpos - lastX; + double deltaY = ypos - lastY; + lastX = xpos; + lastY = ypos; + //std::cout << lastY << " " << ypos << std::endl; + const float sensitivity = 0.001f; + deltaX *= sensitivity; + deltaY *= sensitivity; + glm::mat4 rotationMatrix = glm::eulerAngleY(-deltaX); + spaceshipDir = glm::normalize(rotationMatrix * glm::vec4(spaceshipDir,0)); + spaceshipDir = spaceshipDir + glm::vec3(0, - deltaY / 4, 0); + /*specshipCameraRotrationMatrix = glm::rotate(specshipCameraRotrationMatrix, static_cast(deltaX), glm::vec3(0.f, 1.f, 0.f)); + specshipCameraRotrationMatrix = glm::rotate(specshipCameraRotrationMatrix, static_cast(deltaY), spaceshipSide); + spaceshipDir = glm::normalize(glm::vec3(-specshipCameraRotrationMatrix[2])); + spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); + spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir));*/ +} //obsluga wejscia void processInput(GLFWwindow* window) { - glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); - glm::vec3 spaceshipUp = glm::vec3(0.f, 1.f, 0.f); - float angleSpeed = 0.005f; - float moveSpeed = 0.0025f; + spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); + spaceshipUp = glm::vec3(0.f, 1.f, 0.f); + float angleSpeed = 0.01f; + float moveSpeed = 0.01f; + + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); } @@ -327,8 +439,12 @@ void processInput(GLFWwindow* window) spaceshipDir = glm::vec3(glm::eulerAngleY(angleSpeed) * glm::vec4(spaceshipDir, 0)); if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) spaceshipDir = glm::vec3(glm::eulerAngleY(-angleSpeed) * glm::vec4(spaceshipDir, 0)); + if (glfwGetKey(window, GLFW_KEY_G) == GLFW_PRESS) + START_AS = true; - cameraPos = spaceshipPos - 1.5 * spaceshipDir + glm::vec3(0, 1, 0) * 0.5f; + glfwSetCursorPosCallback(window, mouseCallback); + + cameraPos = spaceshipPos - 0.5 * spaceshipDir + glm::vec3(0, 2, 0) * 0.1f; cameraDir = spaceshipDir; //cameraDir = glm::normalize(-cameraPos); @@ -345,4 +461,3 @@ void renderLoop(GLFWwindow* window) { glfwPollEvents(); } } -//} \ No newline at end of file diff --git a/cw 7/src/main.cpp b/cw 7/src/main.cpp index f8c1303..4243c3f 100644 --- a/cw 7/src/main.cpp +++ b/cw 7/src/main.cpp @@ -23,7 +23,8 @@ int main(int argc, char** argv) #endif // tworzenie okna za pomoca glfw - GLFWwindow* window = glfwCreateWindow(500, 500, "FirstWindow", NULL, NULL); + const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "FirstWindow", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; @@ -34,7 +35,7 @@ int main(int argc, char** argv) // ladowanie OpenGL za pomoca glew glewInit(); - glViewport(0, 0, 500, 500); + glViewport(0, 0, mode->width, mode->width); init(window); diff --git a/cw 7/textures/2k_sun.jpg b/cw 7/textures/2k_sun.jpg new file mode 100644 index 0000000..9d787d8 Binary files /dev/null and b/cw 7/textures/2k_sun.jpg differ