chore: extract Triangle class
This commit is contained in:
parent
37dbe741fa
commit
e9cdefe28a
|
@ -24,7 +24,7 @@ elseif(APPLE)
|
||||||
message(FATAL_ERROR "macOS is not supported yet.")
|
message(FATAL_ERROR "macOS is not supported yet.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} src/hello.cpp src/io.cpp)
|
add_executable(${PROJECT_NAME} src/hello.cpp src/io.cpp src/triangle.cpp)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
#include "io.hpp"
|
#include "io.hpp"
|
||||||
|
#include "triangle.hpp"
|
||||||
|
|
||||||
GLuint compileShader(const std::string& shaderPath, GLenum shaderType)
|
GLuint compileShader(const std::string& shaderPath, GLenum shaderType)
|
||||||
{
|
{
|
||||||
|
@ -78,7 +79,6 @@ float getTime()
|
||||||
return timeSpan.count();
|
return timeSpan.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "astro/twoBodyMethods.hpp"
|
#include "astro/twoBodyMethods.hpp"
|
||||||
|
|
||||||
|
@ -114,46 +114,8 @@ int initGraphics(GLFWwindow** window)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
GLuint getShaderProgram()
|
||||||
{
|
{
|
||||||
// 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;
|
|
||||||
|
|
||||||
// VAO, VBO
|
|
||||||
float vertices[] =
|
|
||||||
{
|
|
||||||
-0.5, -0.5, 0.0, // left
|
|
||||||
0.5, -0.5, 0.0, // right
|
|
||||||
0.0, 0.5, 0.0 // top
|
|
||||||
};
|
|
||||||
|
|
||||||
GLuint VBO, VAO;
|
|
||||||
glGenVertexArrays(1, &VAO);
|
|
||||||
glGenBuffers(1, &VBO);
|
|
||||||
|
|
||||||
glBindVertexArray(VAO);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
glBindVertexArray(0);
|
|
||||||
|
|
||||||
// Shaders
|
|
||||||
GLuint vertShader = compileShader("./vert.glsl", GL_VERTEX_SHADER);
|
GLuint vertShader = compileShader("./vert.glsl", GL_VERTEX_SHADER);
|
||||||
GLuint fragShader = compileShader("./frag.glsl", GL_FRAGMENT_SHADER);
|
GLuint fragShader = compileShader("./frag.glsl", GL_FRAGMENT_SHADER);
|
||||||
|
|
||||||
|
@ -176,32 +138,39 @@ int main()
|
||||||
glDeleteShader(vertShader);
|
glDeleteShader(vertShader);
|
||||||
glDeleteShader(fragShader);
|
glDeleteShader(fragShader);
|
||||||
|
|
||||||
|
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());
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
glClearColor(0.2, 0.3, 0.3, 1.0);
|
glClearColor(0.2, 0.3, 0.3, 1.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glUseProgram(shaderProgram);
|
triangle.render(getTime());
|
||||||
|
|
||||||
GLint timeLocation = glGetUniformLocation(shaderProgram, "_Time");
|
|
||||||
if (timeLocation == -1)
|
|
||||||
{
|
|
||||||
std::cerr << "Could not find uniform: _Time" << std::endl;
|
|
||||||
}
|
|
||||||
float timeValue = getTime();
|
|
||||||
glUniform1f(timeLocation, timeValue);
|
|
||||||
|
|
||||||
glBindVertexArray(VAO);
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
glDeleteVertexArrays(1, &VAO);
|
|
||||||
glDeleteBuffers(1, &VBO);
|
|
||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
#include "triangle.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
Triangle::Triangle(GLuint shaderProgram)
|
||||||
|
: _shaderProgram(shaderProgram)
|
||||||
|
{
|
||||||
|
glGenVertexArrays(1, &_vao);
|
||||||
|
glGenBuffers(1, &_vbo);
|
||||||
|
|
||||||
|
glBindVertexArray(_vao);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(_vertices), &_vertices[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Triangle::render(float time)
|
||||||
|
{
|
||||||
|
glUseProgram(_shaderProgram);
|
||||||
|
|
||||||
|
GLint timeLocation = glGetUniformLocation(_shaderProgram, "_Time");
|
||||||
|
if (timeLocation == -1)
|
||||||
|
{
|
||||||
|
std::cerr << "Could not find uniform: _Time" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
float timeValue = time;
|
||||||
|
glUniform1f(timeLocation, timeValue);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
||||||
|
glBindVertexArray(_vao);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
Triangle::~Triangle()
|
||||||
|
{
|
||||||
|
glDeleteVertexArrays(1, &_vao);
|
||||||
|
glDeleteBuffers(1, &_vbo);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Triangle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Triangle(GLuint shaderProgram);
|
||||||
|
void render(float time);
|
||||||
|
|
||||||
|
~Triangle();
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLuint _vbo;
|
||||||
|
GLuint _vao;
|
||||||
|
GLuint _shaderProgram;
|
||||||
|
|
||||||
|
std::vector<float> _vertices =
|
||||||
|
{
|
||||||
|
-0.5, -0.5, 0.0, // left
|
||||||
|
0.5, -0.5, 0.0, // right
|
||||||
|
0.0, 0.5, 0.0 // top
|
||||||
|
};
|
||||||
|
};
|
Loading…
Reference in New Issue