/* ==================== R_LightProjectionMatrix ==================== */ void R_LightProjectionMatrix( const idVec3 &origin, const idPlane &rearPlane, idVec4 mat[4] ) { idVec4 lv; float lg; // calculate the homogenious light vector lv.x = origin.x; lv.y = origin.y; lv.z = origin.z; lv.w = 1; lg = rearPlane.ToVec4() * lv; // outer product mat[0][0] = lg -rearPlane[0] * lv[0]; mat[0][1] = -rearPlane[1] * lv[0]; mat[0][2] = -rearPlane[2] * lv[0]; mat[0][3] = -rearPlane[3] * lv[0]; mat[1][0] = -rearPlane[0] * lv[1]; mat[1][1] = lg -rearPlane[1] * lv[1]; mat[1][2] = -rearPlane[2] * lv[1]; mat[1][3] = -rearPlane[3] * lv[1]; mat[2][0] = -rearPlane[0] * lv[2]; mat[2][1] = -rearPlane[1] * lv[2]; mat[2][2] = lg -rearPlane[2] * lv[2]; mat[2][3] = -rearPlane[3] * lv[2]; mat[3][0] = -rearPlane[0] * lv[3]; mat[3][1] = -rearPlane[1] * lv[3]; mat[3][2] = -rearPlane[2] * lv[3]; mat[3][3] = lg -rearPlane[3] * lv[3]; }