skein/src/hello.cpp

177 lines
4.3 KiB
C++
Raw Normal View History

2023-07-23 16:46:30 +02:00
// To compile on Windows
2023-07-24 23:15:49 +02:00
// Install GLFW 3.3.8
// https://www.glfw.org/download.html
// Install GLEW 2.2.0
// https://github.com/nigels-com/glew/releases/tag/glew-2.2.0
//
// extract the downloaded .zip files to "C:/libs"; this is currently expected
2023-07-24 23:15:49 +02:00
// by our CMakeLists.txt.
2023-07-23 16:46:30 +02:00
// Install CMake
// https://cmake.org/download
// Add to PATH for all users
// from project root:
// mkdir build
// cd build
// cmake ..
// cmake --build .
2023-07-23 17:46:53 +02:00
// The last step compiles the executable - this can also be done from Visual
// Studio
2023-07-23 16:46:30 +02:00
2023-07-23 17:46:53 +02:00
// To run in VS
// Set startup project in Solution Explorer
2023-07-24 23:15:49 +02:00
// Press F5 to run
2023-08-02 00:29:52 +02:00
// To run in VSCode
// https://code.visualstudio.com/docs/cpp/config-mingw
2023-07-24 23:15:49 +02:00
// To compile on Arch Linux
//
// Install dependencies
2023-07-24 23:31:58 +02:00
// sudo pacman -S glfw mesa glew
2023-07-24 23:15:49 +02:00
//
// Build
// cmake ..
// cmake --build .
2023-07-23 17:46:53 +02:00
#include <glm/glm.hpp>
2023-07-24 23:31:58 +02:00
#include <GL/glew.h>
2023-07-23 17:46:53 +02:00
#include <GLFW/glfw3.h>
2023-07-23 16:45:15 +02:00
2023-07-24 23:31:58 +02:00
#include <iostream>
#include <string>
2023-07-27 21:54:06 +02:00
#include <chrono>
2023-07-28 00:23:51 +02:00
#include "io.hpp"
2023-07-30 23:02:20 +02:00
#include "triangle.hpp"
GLuint compileShader(const std::string& shaderPath, GLenum shaderType)
{
GLuint shader;
GLint success;
std::string shaderSource = readFile(shaderPath);
const char* source = shaderSource.c_str();
shader = glCreateShader(shaderType);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success)
{
GLchar infoLog[512];
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cerr << "shader compilation failed" << std::endl
<< infoLog << std::endl;
}
return shader;
}
2023-07-24 23:31:58 +02:00
2023-07-27 21:54:06 +02:00
std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
float getTime()
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
std::chrono::duration<float> timeSpan = std::chrono::duration_cast<std::chrono::duration<float>>(now - startTime);
return timeSpan.count();
}
2023-07-27 01:04:23 +02:00
#include <cmath>
#include "astro/twoBodyMethods.hpp"
// Initialize GLFW, OpenGL and GLEW, open a window and make it the current context.
// Returns 0 for success, and -1 for any failure.
// Failures are printed to STDERR.
int initGraphics(GLFWwindow** window)
2023-07-23 16:45:15 +02:00
{
// Set up GLFW, OpenGL and GLEW.
2023-07-23 17:46:53 +02:00
if (!glfwInit())
{
std::cerr << "Failed to initialize GLFW" << std::endl;
2023-07-23 17:46:53 +02:00
return -1;
}
2023-07-23 17:46:53 +02:00
*window = glfwCreateWindow(640, 480, "Hello Astro", NULL, NULL);
2023-07-23 17:46:53 +02:00
if (!window)
{
glfwTerminate();
std::cerr << "Failed to open window with GLFW" << std::endl;
2023-07-23 17:46:53 +02:00
return -1;
}
glfwMakeContextCurrent(*window);
2023-07-23 17:46:53 +02:00
2023-07-24 23:31:58 +02:00
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cerr << "Failed to initialize GLEW" << std::endl;
return -1;
}
return 0;
}
2023-07-30 23:02:20 +02:00
GLuint getShaderProgram()
{
GLuint vertShader = compileShader("./vert.glsl", GL_VERTEX_SHADER);
GLuint fragShader = compileShader("./frag.glsl", GL_FRAGMENT_SHADER);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertShader);
glAttachShader(shaderProgram, fragShader);
glLinkProgram(shaderProgram);
GLint success;
GLchar infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cerr << "shader linking failed" << std::endl
<< infoLog << std::endl;
}
// We no longer need the individual shaders
glDeleteShader(vertShader);
glDeleteShader(fragShader);
2023-07-30 23:02:20 +02:00
return shaderProgram;
}
int main()
{
// Calculate period of ISS orbit around the Earth
const float semiMajorAxis = 6738000;
const float gravitationalParameter = 3.986e14;
float period = astro::computeKeplerOrbitalPeriod(semiMajorAxis, gravitationalParameter);
period /= 60.0;
std::cout << period << std::endl;
glm::vec3 v(0.0, 1.0, 2.0);
std::cout << "(" << v.x << ", " << v.y << ", " << v.z << ")" << std::endl;
GLFWwindow* window = nullptr;
if (initGraphics(&window) != 0)
return -1;
Triangle triangle(getShaderProgram());
2023-07-27 21:54:06 +02:00
// Main loop
2023-07-23 17:46:53 +02:00
while (!glfwWindowShouldClose(window))
{
glClearColor(0.2, 0.3, 0.3, 1.0);
2023-07-23 18:21:44 +02:00
glClear(GL_COLOR_BUFFER_BIT);
2023-07-30 23:02:20 +02:00
triangle.render(getTime());
2023-07-23 18:21:44 +02:00
glfwSwapBuffers(window);
2023-07-23 17:46:53 +02:00
glfwPollEvents();
}
glfwTerminate();
2023-07-23 16:45:15 +02:00
return 0;
2023-07-24 23:15:49 +02:00
}