matrix math beginnings
This commit is contained in:
parent
40979a9a31
commit
e0f3c7d2ff
|
@ -6,7 +6,8 @@ m_dep = cc.find_library('m', required : false)
|
|||
src_files = [
|
||||
'./src/main.c',
|
||||
'./src/shader.c',
|
||||
'./src/log.c'
|
||||
'./src/log.c',
|
||||
'./src/matrix-math.c'
|
||||
]
|
||||
|
||||
executable('cg1',
|
||||
|
|
11
src/main.c
11
src/main.c
|
@ -10,6 +10,7 @@
|
|||
#include "shader.h"
|
||||
#include "log.h"
|
||||
#include "shader.h"
|
||||
#include "matrix-math.h"
|
||||
|
||||
#define STATUS_INTERVAL 0.5
|
||||
|
||||
|
@ -78,6 +79,16 @@ void updateStatusDisplay() {
|
|||
}
|
||||
|
||||
void init(void) {
|
||||
|
||||
mat4 t = {
|
||||
1, 2, 3, 4,
|
||||
5, 6, 7, 8,
|
||||
9, 10, 11, 12,
|
||||
13, 14, 15, 16
|
||||
};
|
||||
|
||||
mat4Print(t);
|
||||
|
||||
INFO("Compiling Shaders...");
|
||||
|
||||
// create and compile vertex shader
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
#include "matrix-math.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/**
|
||||
* overwrites a 4x4 matrix with the identity matrix
|
||||
*/
|
||||
void mat4Identity(mat4 mat) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
mat[i] = (i % 4 == i / 4) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* copies a mat4 from src to dst
|
||||
*/
|
||||
void mat4Copy(mat4 src, mat4 dst) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
dst[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* sets all the values in a mat4 to zero
|
||||
*/
|
||||
void mat4Empty(mat4 mat) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
mat[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* mutliplies A with B and stores the result in results
|
||||
*/
|
||||
void mat4Multiply(mat4 result, mat4 A, mat4 B) {
|
||||
// if result is one of the arguments, modify copy instead of result directly
|
||||
if (result == A || result == B) {
|
||||
mat4 tempResult;
|
||||
mat4Multiply(tempResult, A, B);
|
||||
mat4Copy(tempResult, result);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
int col = i / 4;
|
||||
int row = i % 4;
|
||||
GLfloat* curr = &(result[i]);
|
||||
|
||||
*curr = 0;
|
||||
|
||||
for (int j = 0; j < 4; j++) {
|
||||
*curr += A[row + j * 4] * B[j + col * 4];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* prints a mat4 to the screen
|
||||
*/
|
||||
void mat4Print(mat4 m) {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
for (int j = 0; j < 4; j++) {
|
||||
printf("%.2f ", m[j * 4 + i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef MATRIX_MATH_H
|
||||
#define MATRIX_MATH_H
|
||||
|
||||
#include <GL/gl.h>
|
||||
|
||||
// TODO: figure out better type definition to avoid constant casting to GLfloat*
|
||||
// possibly typedef float mat4[16];
|
||||
|
||||
/**
|
||||
* !!! ALL matrices are in column major
|
||||
*/
|
||||
|
||||
typedef GLfloat vec4[4];
|
||||
|
||||
typedef GLfloat mat4[16];
|
||||
|
||||
extern void mat4Identity(mat4 mat);
|
||||
extern void mat4Copy(mat4 src, mat4 dst);
|
||||
extern void mat4Empty(mat4 mat);
|
||||
extern void mat4Multiply(mat4 result, mat4 A, mat4 B);
|
||||
extern void mat4Print(mat4 m);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue