Vector3 torus_normal(Prim *p, Real u, Real v) { Vector3 w; w.x = cos(u)*cos(v); w.y = sin(u)*cos(v); w.z = sin(v); return v3_unit(v3_m3mult(w, m4_transpose(p->ti))); }
Vector3 cylin_normal(Prim *p, Real u, Real v) { Vector3 w; if (u < 0){ w.x = 0; w.y = 0; w.z = -1; } else if (u > 1){ w.x = 0; w.y = 0; w.z = 1; } else { w.x = cos(v); w.y = cos(v); w.z = 0; } return v3_unit(v3_m3mult(w, m4_transpose(p->ti))); }
Vector3 cylin_gradient(Prim *p, Vector3 q) { Vector3 w = v3_m4mult(q, p->ti); w.z = 0; return v3_m3mult(v3_scale(2., w), m4_transpose(p->ti)); }
void m4_adjoint(mat4_t res, mat4_t m) { int i, j; mat4_t coef; coef[0][0] = (m[1][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[1][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + (m[1][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); coef[0][1] = (m[1][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[1][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[1][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); coef[0][2] = (m[1][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - (m[1][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[1][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); coef[0][3] = (m[1][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - (m[1][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + (m[1][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); coef[1][0] = (m[0][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[0][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + (m[0][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); coef[1][1] = (m[0][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[0][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[0][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); coef[1][2] = (m[0][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - (m[0][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[0][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); coef[1][3] = (m[0][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - (m[0][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + (m[0][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); coef[2][0] = (m[0][1] * (m[1][2] * m[3][3] - m[3][2] * m[1][3])) - (m[0][2] * (m[1][1] * m[3][3] - m[3][1] * m[1][3])) + (m[0][3] * (m[1][1] * m[3][2] - m[3][1] * m[1][2])); coef[2][1] = (m[0][0] * (m[1][2] * m[3][3] - m[3][2] * m[1][3])) - (m[0][2] * (m[1][0] * m[3][3] - m[3][0] * m[1][3])) + (m[0][3] * (m[1][0] * m[3][2] - m[3][0] * m[1][2])); coef[2][2] = (m[0][0] * (m[1][1] * m[3][3] - m[3][1] * m[1][3])) - (m[0][1] * (m[1][0] * m[3][3] - m[3][0] * m[1][3])) + (m[0][3] * (m[1][0] * m[3][1] - m[3][0] * m[1][1])); coef[2][3] = (m[0][0] * (m[1][1] * m[3][2] - m[3][1] * m[1][2])) - (m[0][1] * (m[1][0] * m[3][2] - m[3][0] * m[1][2])) + (m[0][2] * (m[1][0] * m[3][1] - m[3][0] * m[1][1])); coef[3][0] = (m[0][1] * (m[1][2] * m[2][3] - m[2][2] * m[1][3])) - (m[0][2] * (m[1][1] * m[2][3] - m[2][1] * m[1][3])) + (m[0][3] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])); coef[3][1] = (m[0][0] * (m[1][2] * m[2][3] - m[2][2] * m[1][3])) - (m[0][2] * (m[1][0] * m[2][3] - m[2][0] * m[1][3])) + (m[0][3] * (m[1][0] * m[2][2] - m[2][0] * m[1][2])); coef[3][2] = (m[0][0] * (m[1][1] * m[2][3] - m[2][1] * m[1][3])) - (m[0][1] * (m[1][0] * m[2][3] - m[2][0] * m[1][3])) + (m[0][3] * (m[1][0] * m[2][1] - m[2][0] * m[1][1])); coef[3][3] = (m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])) - (m[0][1] * (m[1][0] * m[2][2] - m[2][0] * m[1][2])) + (m[0][2] * (m[1][0] * m[2][1] - m[2][0] * m[1][1])); m4_transpose(res, coef); for(i=0; i<4; i++) { for(j=0; j<4; j++) { res[i][j] = j % 2 ? -res[i][j] : res[i][j]; if(i % 2) res[i][j] = -res[i][j]; } } }
Vector3 s4_n3xform(Stack4 *s, Vector3 nv) { return v3_m4mult(nv, m4_transpose(*s->itop)); }