src/graphics: corrected aspect ratio and optimized matrices
This commit is contained in:
parent
0da55ac88b
commit
3bb99b5a26
|
@ -30,6 +30,7 @@
|
||||||
#include <epoxy/gl.h>
|
#include <epoxy/gl.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
#include <GL/glext.h>
|
#include <GL/glext.h>
|
||||||
|
#include <cglm/cglm.h>
|
||||||
|
|
||||||
#define VERTEX_SHADER_FILE "src/graphics/shaders/shader.vert"
|
#define VERTEX_SHADER_FILE "src/graphics/shaders/shader.vert"
|
||||||
#define FRAG_SHADER_FILE "src/graphics/shaders/shader.frag"
|
#define FRAG_SHADER_FILE "src/graphics/shaders/shader.frag"
|
||||||
|
@ -163,67 +164,6 @@ void graphics_draw_line (const int stack_id, GLuint a, GLuint b);
|
||||||
*/
|
*/
|
||||||
void graphics_draw_plan (const int stack_id, GLuint a, GLuint b, GLuint c);
|
void graphics_draw_plan (const int stack_id, GLuint a, GLuint b, GLuint c);
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes an identity matrix
|
|
||||||
*
|
|
||||||
* @param res, target ptr
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
static inline void compute_i(float *res)
|
|
||||||
{
|
|
||||||
/* initialize to the identity matrix */
|
|
||||||
res[0] = 1.f; res[4] = 0.f; res[8] = 0.f; res[12] = 0.f;
|
|
||||||
res[1] = 0.f; res[5] = 1.f; res[9] = 0.f; res[13] = 0.f;
|
|
||||||
res[2] = 0.f; res[6] = 0.f; res[10] = 1.f; res[14] = 0.f;
|
|
||||||
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Computes the projection matrix
|
|
||||||
*
|
|
||||||
* @param res, target ptr
|
|
||||||
* phi, XXX
|
|
||||||
* theta, XXX
|
|
||||||
* psi, XXX
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
static inline void compute_mvp(float *res, float phi, float theta, float psi)
|
|
||||||
{
|
|
||||||
float x = phi *(G_PI / 180.f);
|
|
||||||
float y = theta *(G_PI / 180.f);
|
|
||||||
float z = psi *(G_PI / 180.f);
|
|
||||||
float c1 = cosf(x), s1 = sinf(x);
|
|
||||||
float c2 = cosf(y), s2 = sinf(y);
|
|
||||||
float c3 = cosf(z), s3 = sinf(z);
|
|
||||||
float c3c2 = c3 * c2;
|
|
||||||
float s3c1 = s3 * c1;
|
|
||||||
float c3s2s1 = c3 * s2 * s1;
|
|
||||||
float s3s1 = s3 * s1;
|
|
||||||
float c3s2c1 = c3 * s2 * c1;
|
|
||||||
float s3c2 = s3 * c2;
|
|
||||||
float c3c1 = c3 * c1;
|
|
||||||
float s3s2s1 = s3 * s2 * s1;
|
|
||||||
float c3s1 = c3 * s1;
|
|
||||||
float s3s2c1 = s3 * s2 * c1;
|
|
||||||
float c2s1 = c2 * s1;
|
|
||||||
float c2c1 = c2 * c1;
|
|
||||||
|
|
||||||
compute_i(res);
|
|
||||||
|
|
||||||
/* apply all three rotations using the three matrices:
|
|
||||||
*
|
|
||||||
* ⎡ c3 s3 0 ⎤ ⎡ c2 0 -s2 ⎤ ⎡ 1 0 0 ⎤
|
|
||||||
* ⎢ -s3 c3 0 ⎥ ⎢ 0 1 0 ⎥ ⎢ 0 c1 s1 ⎥
|
|
||||||
* ⎣ 0 0 1 ⎦ ⎣ s2 0 c2 ⎦ ⎣ 0 -s1 c1 ⎦
|
|
||||||
*/
|
|
||||||
res[0] = c3c2; res[4] = s3c1 + c3s2s1; res[8] = s3s1 - c3s2c1; res[12] = 0.f;
|
|
||||||
res[1] = -s3c2; res[5] = c3c1 - s3s2s1; res[9] = c3s1 + s3s2c1; res[13] = 0.f;
|
|
||||||
res[2] = s2; res[6] = -c2s1; res[10] = c2c1; res[14] = 0.f;
|
|
||||||
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created and compile a shader
|
* Created and compile a shader
|
||||||
*
|
*
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <cglm/cglm.h>
|
||||||
#include "../../include/base.h"
|
#include "../../include/base.h"
|
||||||
#include "../../include/ui.h"
|
#include "../../include/ui.h"
|
||||||
#include "../../include/graphics.h"
|
#include "../../include/graphics.h"
|
||||||
|
@ -154,21 +155,20 @@ void graphics_draw(const int stack_id)
|
||||||
|
|
||||||
//print_stack(stack_id);
|
//print_stack(stack_id);
|
||||||
|
|
||||||
float m[16];
|
GLint cur_viewport[4];
|
||||||
float v[16];
|
glGetIntegerv(GL_VIEWPORT, cur_viewport);
|
||||||
float p[16];
|
|
||||||
|
|
||||||
// XXX TODO get stack from stack_id
|
mat4 m = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
glm_rotate_x(m, glm_rad(stack->rotation_angles[X_AXIS]), m);
|
||||||
|
glm_rotate_y(m, glm_rad(stack->rotation_angles[Y_AXIS]), m);
|
||||||
|
glm_rotate_z(m, glm_rad(stack->rotation_angles[Z_AXIS]), m);
|
||||||
|
|
||||||
/* Compute the model view projection matrix using the
|
mat4 v = GLM_MAT4_IDENTITY_INIT; // XXX define zoom and translations here ?
|
||||||
* rotation angles specified through the GtkRange widgets
|
|
||||||
*/
|
mat4 p = GLM_MAT4_IDENTITY_INIT;
|
||||||
compute_mvp(p,
|
//glm_ortho(-1.0f, +1.0f, -1.0f, +1.0f, -1.0f, +1.0f, p);
|
||||||
stack->rotation_angles[X_AXIS],
|
glm_ortho_default((float)cur_viewport[2] / (float)cur_viewport[3], p);
|
||||||
stack->rotation_angles[Y_AXIS],
|
//glm_perspective_default((float)cur_viewport[2] / (float)cur_viewport[3], p);
|
||||||
stack->rotation_angles[Z_AXIS]);
|
|
||||||
compute_i(m);
|
|
||||||
compute_i(v);
|
|
||||||
|
|
||||||
/* Use our shaders */
|
/* Use our shaders */
|
||||||
glUseProgram(stack->program);
|
glUseProgram(stack->program);
|
||||||
|
@ -177,9 +177,9 @@ void graphics_draw(const int stack_id)
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
/* Update the "mvp" matrix we use in the shader */
|
/* Update the "mvp" matrix we use in the shader */
|
||||||
glUniformMatrix4fv(stack->m, 1, GL_FALSE, &m[0]);
|
glUniformMatrix4fv(stack->m, 1, GL_FALSE, (float *)m);
|
||||||
glUniformMatrix4fv(stack->v, 1, GL_FALSE, &v[0]);
|
glUniformMatrix4fv(stack->v, 1, GL_FALSE, (float *)v);
|
||||||
glUniformMatrix4fv(stack->p, 1, GL_FALSE, &p[0]);
|
glUniformMatrix4fv(stack->p, 1, GL_FALSE, (float *)p);
|
||||||
|
|
||||||
/* Use the vertices in our buffer */
|
/* Use the vertices in our buffer */
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
|
|
|
@ -275,12 +275,12 @@ void graphics_model_setup (const int stack_id)
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
draw_space_ridges_vertex (stack_id, stack->buffer_vertex_size,
|
/* draw_space_ridges_vertex (stack_id, stack->buffer_vertex_size, */
|
||||||
space_X, space_Y, space_Z);
|
/* space_X, space_Y, space_Z); */
|
||||||
draw_space_ridges_lines (stack_id);
|
/* draw_space_ridges_lines (stack_id); */
|
||||||
draw_grids_on_space_faces_vertex (stack_id, space_X, space_Y, space_Z);
|
/* draw_grids_on_space_faces_vertex (stack_id, space_X, space_Y, space_Z); */
|
||||||
draw_grids_on_space_faces_lines (stack_id, stack->buffer_lines_size,
|
/* draw_grids_on_space_faces_lines (stack_id, stack->buffer_lines_size, */
|
||||||
space_X, space_Y, space_Z);
|
/* space_X, space_Y, space_Z); */
|
||||||
|
|
||||||
stack->buffer_vertex_0_arrow =
|
stack->buffer_vertex_0_arrow =
|
||||||
stack->buffer_vertex_size;
|
stack->buffer_vertex_size;
|
||||||
|
|
Loading…
Reference in New Issue