void make_rotated_cube( float *vertex, float *normal, float *texture, float x, float y, float z, float n, int w, float rx, float ry) { make_cube(vertex, normal, texture, 1, 1, 1, 1, 1, 1, 0, 0, 0, n, w); float a[16]; float b[16]; float vec[4] = {0}; vec[3] = 1; mat_identity(a); mat_rotate(b, 0, 1, 0, rx); mat_multiply(a, b, a); mat_rotate(b, cosf(rx), 0, sinf(rx), -ry); mat_multiply(a, b, a); mat_translate(b, x, y, z); mat_multiply(a, b, a); for (int i = 0; i < 36; i++) { // vertex float *v = vertex + i * 3; vec[0] = *(v++); vec[1] = *(v++); vec[2] = *(v++); mat_vec_multiply(vec, a, vec); v = vertex + i * 3; *(v++) = vec[0]; *(v++) = vec[1]; *(v++) = vec[2]; // normal float *d = normal + i * 3; vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++); mat_vec_multiply(vec, a, vec); d = normal + i * 3; *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2]; } }
void test_matrices() { //this part tests matrices raw_data mat; mat.length = 4; mat.data = (uint8_t*)alloc_named(mat.length, "main mat"); mat.data[0] = 0xc2; mat.data[1] = 0xca; mat.data[2] = 0xf0; mat.data[3] = 0xd6; uint8_t test_data[2] = {2, 3}; raw_data test; test.length = 2; test.data = test_data; printx(mat_vec_multiply(mat, test)); unsigned int i; for(i = 0; i < mat.length; i++) { mat.data[i] = rand(); } print_matrix(mat); printf("%x\n", determinant(mat)); raw_data mat2 = inverse(mat, determinant(mat)); print_matrix(mat2); dealloc(mat.data); dealloc(mat2.data); }
void mat_apply(float *data, float *matrix, int count) { float vec[4] = {0, 0, 0, 1}; for (int i = 0; i < count; i++) { float *d = data + i * 3; vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++); mat_vec_multiply(vec, matrix, vec); d = data + i * 3; *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2]; } }
void mat_apply(float *data, float *matrix, int count, int offset, int stride) { float vec[4] = {0, 0, 0, 1}; for (int i = 0; i < count; i++) { float *d = data + offset + stride * i; vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++); mat_vec_multiply(vec, matrix, vec); d = data + offset + stride * i; *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2]; } }
int chunk_visible(Chunk *chunk, float *matrix) { for (int dp = 0; dp <= 1; dp++) { for (int dq = 0; dq <= 1; dq++) { for (int y = 0; y < 128; y += 16) { float vec[4] = { (chunk->p + dp) * CHUNK_SIZE - dp, y, (chunk->q + dq) * CHUNK_SIZE - dq, 1}; mat_vec_multiply(vec, matrix, vec); if (vec[3] >= 0) { return 1; } } } } return 0; }
void make_plant( float *vertex, float *normal, float *texture, float x, float y, float z, float n, int w, float rotation) { float *v = vertex; float *d = normal; float *t = texture; float s = 0.0625; float a = 0; float b = s; float du, dv; w--; du = (w % 16) * s; dv = (w / 16 * 3) * s; // left *(v++) = x; *(v++) = y - n; *(v++) = z - n; *(v++) = x; *(v++) = y + n; *(v++) = z + n; *(v++) = x; *(v++) = y + n; *(v++) = z - n; *(v++) = x; *(v++) = y - n; *(v++) = z - n; *(v++) = x; *(v++) = y - n; *(v++) = z + n; *(v++) = x; *(v++) = y + n; *(v++) = z + n; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(t++) = a + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = b + dv; *(t++) = a + du; *(t++) = b + dv; *(t++) = a + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = b + dv; // right *(v++) = x; *(v++) = y - n; *(v++) = z - n; *(v++) = x; *(v++) = y + n; *(v++) = z + n; *(v++) = x; *(v++) = y - n; *(v++) = z + n; *(v++) = x; *(v++) = y - n; *(v++) = z - n; *(v++) = x; *(v++) = y + n; *(v++) = z - n; *(v++) = x; *(v++) = y + n; *(v++) = z + n; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(t++) = b + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = b + dv; *(t++) = a + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = b + dv; *(t++) = a + du; *(t++) = b + dv; // front *(v++) = x - n; *(v++) = y - n; *(v++) = z; *(v++) = x + n; *(v++) = y - n; *(v++) = z; *(v++) = x + n; *(v++) = y + n; *(v++) = z; *(v++) = x - n; *(v++) = y - n; *(v++) = z; *(v++) = x + n; *(v++) = y + n; *(v++) = z; *(v++) = x - n; *(v++) = y + n; *(v++) = z; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(d++) = 0; *(d++) = 0; *(d++) = -1; *(t++) = b + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = b + dv; *(t++) = b + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = b + dv; *(t++) = b + du; *(t++) = b + dv; // back *(v++) = x - n; *(v++) = y - n; *(v++) = z; *(v++) = x + n; *(v++) = y + n; *(v++) = z; *(v++) = x + n; *(v++) = y - n; *(v++) = z; *(v++) = x - n; *(v++) = y - n; *(v++) = z; *(v++) = x - n; *(v++) = y + n; *(v++) = z; *(v++) = x + n; *(v++) = y + n; *(v++) = z; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(d++) = 0; *(d++) = 0; *(d++) = 1; *(t++) = a + du; *(t++) = a + dv; *(t++) = b + du; *(t++) = b + dv; *(t++) = b + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = a + dv; *(t++) = a + du; *(t++) = b + dv; *(t++) = b + du; *(t++) = b + dv; // rotate the plant float mat[16]; float vec[4] = {0}; mat_rotate(mat, 0, 1, 0, RADIANS(rotation)); for (int i = 0; i < 24; i++) { // vertex v = vertex + i * 3; vec[0] = *(v++) - x; vec[1] = *(v++) - y; vec[2] = *(v++) - z; mat_vec_multiply(vec, mat, vec); v = vertex + i * 3; *(v++) = vec[0] + x; *(v++) = vec[1] + y; *(v++) = vec[2] + z; // normal d = normal + i * 3; vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++); mat_vec_multiply(vec, mat, vec); d = normal + i * 3; *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2]; } }