#include #include #include #include #include #include #include #include #include #include #include #include void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow* window); void mouse_callback(GLFWwindow* window, double xpos, double ypos); void scroll_callback(GLFWwindow* window, double xoffset, double yoffset); int SCR_WIDTH = 800; int SCR_HEIGHT = 800; Camera camera(glm::vec3(0.0f, 0.0f, 20.0f)); float lastX = SCR_WIDTH / 2.0f; float lastY = SCR_HEIGHT / 2.0f; bool firstMouse = true; float deltaTime = 0.0f; float lastFrame = 0.0f; float elapsedTime = 0.0f; //glm::vec3 lightPos(1.2f, 1.0f, 2.0f); int main() { IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl; glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearningOpenGl", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetScrollCallback(window, scroll_callback); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } glEnable(GL_DEPTH_TEST); std::cout << "Loaded GLFW context, OpenGL 3.3" << std::endl; CubeFactory cubeFactory; float offset = 2.0f; int xAmount = 10; int yAmount = 10; int zAmount = 10; for (int x = 0; x < xAmount; x++) { for (int y = 0; y < yAmount; y++) { for (int z = 0; z < zAmount; z++) { glm::vec3 position = glm::vec3( (x * offset) - (xAmount * offset / 2.0f), (y * offset) - (yAmount * offset / 2.0f), (z * offset) - (zAmount * offset / 2.0f)); glm::vec3 scale = glm::vec3(1.0f, 1.0f, 1.0f); glm::vec3 rotation = glm::vec3(0.0f, 0.0f, 0.0f); glm::vec3 color = glm::vec3(x/10.0f, y/10.0f, z/10.0f); cubeFactory.addCube(position, scale, rotation, color); } } } //std::cout << "Amount of cubes: " << cubeFactory.getCubes().size() << std::endl; float r = 0.05f, g = 0.05f, b = 0.05f; while (!glfwWindowShouldClose(window)) { //timing float currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; elapsedTime += deltaTime; //input processInput(window); glClearColor(r, g, b, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // view/projection transformations glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); glm::mat4 view = camera.GetViewMatrix(); glm::vec3 lightPos = glm::vec3(100.2f, 100.0f, 200.0f); cubeFactory.render(view, projection, lightPos, deltaTime); //check and call glfwSwapBuffers(window); glfwPollEvents(); } //cubeFactory.clear(); glfwTerminate(); return 0; } void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } void processInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); } const float cameraSpeed = 5.0f * deltaTime; if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) camera.ProcessKeyboard(FORWARD, deltaTime); if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) camera.ProcessKeyboard(BACKWARD, deltaTime); if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) camera.ProcessKeyboard(LEFT, deltaTime); if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) camera.ProcessKeyboard(RIGHT, deltaTime); } void mouse_callback(GLFWwindow* window, double xposIn, double yposIn) { //std::cout << "Mouse callback" << std::endl; float xpos = static_cast(xposIn); float ypos = static_cast(yposIn); if (firstMouse) { lastX = xpos; lastY = ypos; firstMouse = false; } float xoffset = xpos - lastX; float yoffset = lastY - ypos; lastX = xpos; lastY = ypos; camera.ProcessMouseMovement(xoffset, yoffset); } void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) { camera.ProcessMouseScroll(static_cast(yoffset)); }