refactor: extract sphere model matrix calc
This commit is contained in:
parent
f752fa0c80
commit
ae78f0a399
18
src/gfx.cpp
18
src/gfx.cpp
|
@ -116,18 +116,22 @@ void updateProjectionMatrix(GLuint shaderProgram)
|
||||||
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, &projection[0][0]);
|
glUniformMatrix4fv(projectionLocation, 1, GL_FALSE, &projection[0][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateModelMatrix(GLuint shaderProgram, float time)
|
void updateModelMatrix(GLuint shaderProgram)
|
||||||
{
|
{
|
||||||
constexpr float angle = glm::radians(10.0);
|
glm::mat4 model = glm::mat4(1.0);
|
||||||
glm::vec3 axis = glm::vec3(0.0, 1.0, 0.0);
|
|
||||||
glm::mat4 model = glm::rotate(glm::mat4(1.0), angle * time, axis);
|
|
||||||
GLint modelLocation = getShaderUniformLocation(shaderProgram, "_Model");
|
GLint modelLocation = getShaderUniformLocation(shaderProgram, "_Model");
|
||||||
glUniformMatrix4fv(modelLocation, 1, GL_FALSE, &model[0][0]);
|
glUniformMatrix4fv(modelLocation, 1, GL_FALSE, &model[0][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateViewMatrix(GLuint shaderProgram)
|
void updateViewMatrix(GLuint shaderProgram, float time)
|
||||||
{
|
{
|
||||||
glm::mat4 view = glm::mat4(1.0);
|
glm::mat4 view = glm::mat4(1.0);
|
||||||
|
|
||||||
|
// Rotation
|
||||||
|
constexpr float angle = glm::radians(10.0);
|
||||||
|
glm::vec3 axis = glm::vec3(0.0, 1.0, 0.0);
|
||||||
|
view = glm::rotate(view, angle * time, axis);
|
||||||
|
|
||||||
GLint viewLocation = getShaderUniformLocation(shaderProgram, "_View");
|
GLint viewLocation = getShaderUniformLocation(shaderProgram, "_View");
|
||||||
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, &view[0][0]);
|
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, &view[0][0]);
|
||||||
}
|
}
|
||||||
|
@ -136,8 +140,8 @@ void updateModelViewProjectionMatrix(GLuint shaderProgram, float time)
|
||||||
{
|
{
|
||||||
// Calculate matrices
|
// Calculate matrices
|
||||||
updateProjectionMatrix(shaderProgram);
|
updateProjectionMatrix(shaderProgram);
|
||||||
updateModelMatrix(shaderProgram, time);
|
updateModelMatrix(shaderProgram);
|
||||||
updateViewMatrix(shaderProgram);
|
updateViewMatrix(shaderProgram, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint getShaderUniformLocation(GLuint shaderProgram, const std::string& uniformName)
|
GLint getShaderUniformLocation(GLuint shaderProgram, const std::string& uniformName)
|
||||||
|
|
|
@ -13,6 +13,6 @@ GLuint compileShader(const std::string& shaderPath, GLenum shaderType);
|
||||||
GLint getShaderUniformLocation(GLuint shaderProgram, const std::string& uniformName);
|
GLint getShaderUniformLocation(GLuint shaderProgram, const std::string& uniformName);
|
||||||
|
|
||||||
void updateProjectionMatrix(GLuint shaderProgram);
|
void updateProjectionMatrix(GLuint shaderProgram);
|
||||||
void updateModelMatrix(GLuint shaderProgram, float time);
|
void updateModelMatrix(GLuint shaderProgram);
|
||||||
void updateViewMatrix(GLuint shaderProgram);
|
void updateViewMatrix(GLuint shaderProgram, float time);
|
||||||
void updateModelViewProjectionMatrix(GLuint shaderProgram, float time);
|
void updateModelViewProjectionMatrix(GLuint shaderProgram, float time);
|
||||||
|
|
|
@ -3,7 +3,13 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
Icosphere::Icosphere(float radius, int subdivisions)
|
#include "glm/gtc/matrix_transform.hpp"
|
||||||
|
|
||||||
|
#include "gfx.hpp"
|
||||||
|
|
||||||
|
Icosphere::Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::vec3 position) :
|
||||||
|
_shaderProgram(shaderProgram),
|
||||||
|
_position(position)
|
||||||
{
|
{
|
||||||
VertexList vertices = _isocahedronVertices;
|
VertexList vertices = _isocahedronVertices;
|
||||||
TriangleList triangles = _isocahedronTriangles;
|
TriangleList triangles = _isocahedronTriangles;
|
||||||
|
@ -125,8 +131,20 @@ Icosphere::TriangleList Icosphere::subdivide(VertexList& vertices, TriangleList
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Icosphere::updateModelMatrix()
|
||||||
|
{
|
||||||
|
// To be able to define a position for a particular instance of a sphere we will
|
||||||
|
// need to calculate a model projection matrix per-instance
|
||||||
|
glm::mat4 model = glm::translate(glm::mat4(1.0), _position);
|
||||||
|
|
||||||
|
GLint modelLocation = getShaderUniformLocation(_shaderProgram, "_Model");
|
||||||
|
glUniformMatrix4fv(modelLocation, 1, GL_FALSE, &model[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
void Icosphere::render()
|
void Icosphere::render()
|
||||||
{
|
{
|
||||||
|
updateModelMatrix();
|
||||||
|
|
||||||
glBindVertexArray(_vao);
|
glBindVertexArray(_vao);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
class Icosphere
|
class Icosphere
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Icosphere(float radius, int subdivisions);
|
Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::vec3 position);
|
||||||
void render();
|
void render();
|
||||||
|
|
||||||
~Icosphere();
|
~Icosphere();
|
||||||
|
@ -19,10 +19,13 @@ private:
|
||||||
GLuint _vbo;
|
GLuint _vbo;
|
||||||
GLuint _vao;
|
GLuint _vao;
|
||||||
GLuint _ebo;
|
GLuint _ebo;
|
||||||
|
GLuint _shaderProgram;
|
||||||
|
|
||||||
std::vector<float> _vertices;
|
std::vector<float> _vertices;
|
||||||
std::vector<unsigned int> _indices;
|
std::vector<unsigned int> _indices;
|
||||||
|
|
||||||
|
glm::vec3 _position;
|
||||||
|
|
||||||
// Generating an isosphere
|
// Generating an isosphere
|
||||||
// https://schneide.blog/2016/07/15/generating-an-icosphere-in-c/
|
// https://schneide.blog/2016/07/15/generating-an-icosphere-in-c/
|
||||||
struct Triangle
|
struct Triangle
|
||||||
|
@ -56,4 +59,6 @@ private:
|
||||||
|
|
||||||
int vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second);
|
int vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second);
|
||||||
TriangleList subdivide(VertexList& vertices, TriangleList triangles);
|
TriangleList subdivide(VertexList& vertices, TriangleList triangles);
|
||||||
|
|
||||||
|
void updateModelMatrix();
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,7 +51,7 @@ int main()
|
||||||
GLuint litProgram = compileShaderProgram("./frag_lit.glsl");
|
GLuint litProgram = compileShaderProgram("./frag_lit.glsl");
|
||||||
GLuint unlitProgram = compileShaderProgram("./frag_unlit.glsl");
|
GLuint unlitProgram = compileShaderProgram("./frag_unlit.glsl");
|
||||||
|
|
||||||
Icosphere sphere(0.5, 2);
|
Icosphere sphere(0.5, 2, litProgram, glm::vec3(0.0, 0.0, 0.0));
|
||||||
Orbit orbit(100);
|
Orbit orbit(100);
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
|
|
Loading…
Reference in New Issue