You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					86 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					86 lines
				
				1.6 KiB
			| 
											5 years ago
										 | #pragma once
 | ||
| 
											6 years ago
										 | 
 | ||
|  | typedef struct vec3 {
 | ||
|  | 	float v[3];
 | ||
|  | } vec3;
 | ||
|  | 
 | ||
|  | typedef struct vec4 {
 | ||
|  |   float v[4];
 | ||
|  | } vec4;
 | ||
|  | 
 | ||
|  | typedef struct mat3 {
 | ||
|  | 	float v[3*3];
 | ||
|  | } mat3;
 | ||
|  | 
 | ||
|  | typedef struct mat4 {
 | ||
|  |   float v[4*4];
 | ||
|  | } mat4;
 | ||
|  | 
 | ||
| 
											5 years ago
										 | static inline mat3 matmul3(const mat3 &a, const mat3 &b) {
 | ||
| 
											6 years ago
										 |   mat3 ret = {{0.0}};
 | ||
|  |   for (int r=0; r<3; r++) {
 | ||
|  |     for (int c=0; c<3; c++) {
 | ||
|  |       float v = 0.0;
 | ||
|  |       for (int k=0; k<3; k++) {
 | ||
|  |         v += a.v[r*3+k] * b.v[k*3+c];
 | ||
|  |       }
 | ||
|  |       ret.v[r*3+c] = v;
 | ||
|  |     }
 | ||
|  |   }
 | ||
|  |   return ret;
 | ||
|  | }
 | ||
|  | 
 | ||
| 
											5 years ago
										 | static inline vec3 matvecmul3(const mat3 &a, const vec3 &b) {
 | ||
| 
											6 years ago
										 |   vec3 ret = {{0.0}};
 | ||
|  |   for (int r=0; r<3; r++) {
 | ||
|  |     for (int c=0; c<3; c++) {
 | ||
|  |       ret.v[r] += a.v[r*3+c] * b.v[c];
 | ||
|  |     }
 | ||
|  |   }
 | ||
|  |   return ret;
 | ||
|  | }
 | ||
|  | 
 | ||
| 
											5 years ago
										 | static inline mat4 matmul(const mat4 &a, const mat4 &b) {
 | ||
| 
											6 years ago
										 |   mat4 ret = {{0.0}};
 | ||
|  |   for (int r=0; r<4; r++) {
 | ||
|  |     for (int c=0; c<4; c++) {
 | ||
|  |       float v = 0.0;
 | ||
|  |       for (int k=0; k<4; k++) {
 | ||
|  |         v += a.v[r*4+k] * b.v[k*4+c];
 | ||
|  |       }
 | ||
|  |       ret.v[r*4+c] = v;
 | ||
|  |     }
 | ||
|  |   }
 | ||
|  |   return ret;
 | ||
|  | }
 | ||
|  | 
 | ||
| 
											5 years ago
										 | static inline vec4 matvecmul(const mat4 &a, const vec4 &b) {
 | ||
| 
											6 years ago
										 |   vec4 ret = {{0.0}};
 | ||
|  |   for (int r=0; r<4; r++) {
 | ||
|  |     for (int c=0; c<4; c++) {
 | ||
|  |       ret.v[r] += a.v[r*4+c] * b.v[c];
 | ||
|  |     }
 | ||
|  |   }
 | ||
|  |   return ret;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // scales the input and output space of a transformation matrix
 | ||
|  | // that assumes pixel-center origin.
 | ||
| 
											5 years ago
										 | static inline mat3 transform_scale_buffer(const mat3 &in, float s) {
 | ||
| 
											6 years ago
										 |   // in_pt = ( transform(out_pt/s + 0.5) - 0.5) * s
 | ||
|  | 
 | ||
|  |   mat3 transform_out = {{
 | ||
|  |     1.0f/s, 0.0f, 0.5f,
 | ||
|  |     0.0f, 1.0f/s, 0.5f,
 | ||
|  |     0.0f, 0.0f, 1.0f,
 | ||
|  |   }};
 | ||
|  | 
 | ||
|  |   mat3 transform_in = {{
 | ||
|  |     s,  0.0f, -0.5f*s,
 | ||
|  |     0.0f, s, -0.5f*s,
 | ||
|  |     0.0f, 0.0f, 1.0f,
 | ||
|  |   }};
 | ||
|  | 
 | ||
|  |   return matmul3(transform_in, matmul3(in, transform_out));
 | ||
|  | }
 |