GLAPI GLint APIENTRY gluUnProject4(GLfloat winx, GLfloat winy, GLfloat winz, GLfloat clipw, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLclampf nearVal, GLclampf farVal, GLfloat *objx, GLfloat *objy, GLfloat *objz, GLfloat *objw) { GLfloat finalMatrix[16]; GLfloat in[4]; GLfloat out[4]; __gluMultMatricesf(modelMatrix, projMatrix, finalMatrix); if (!__gluInvertMatrixf(finalMatrix, finalMatrix)) { return(GL_FALSE); } in[0]=winx; in[1]=winy; in[2]=winz; in[3]=clipw; /* Map x and y from window coordinates */ in[0] = (in[0] - viewport[0]) / viewport[2]; in[1] = (in[1] - viewport[1]) / viewport[3]; in[2] = (in[2] - nearVal) / (farVal - nearVal); /* Map to range -1 to 1 */ in[0] = in[0] * 2 - 1; in[1] = in[1] * 2 - 1; in[2] = in[2] * 2 - 1; __gluMultMatrixVecf(finalMatrix, in, out); if (out[3] == 0.0) { return(GL_FALSE); } *objx = out[0]; *objy = out[1]; *objz = out[2]; *objw = out[3]; return(GL_TRUE); }
GLU_API GLint GLU_APIENTRY gluUnProject(GLfloat winx, GLfloat winy, GLfloat winz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat* objx, GLfloat* objy, GLfloat* objz) { GLfloat finalMatrix[16]; GLfloat in[4]; GLfloat out[4]; __gluMultMatricesf(modelMatrix, projMatrix, finalMatrix); if (!__gluInvertMatrixf(finalMatrix, finalMatrix)) { return(GL_FALSE); } in[0]=winx; in[1]=winy; in[2]=winz; in[3]=1.0; /* Map x and y from window coordinates */ in[0] = (in[0] - viewport[0]) / viewport[2]; in[1] = (in[1] - viewport[1]) / viewport[3]; /* Map to range -1 to 1 */ in[0] = in[0] * 2 - 1; in[1] = in[1] * 2 - 1; in[2] = in[2] * 2 - 1; __gluMultMatrixVecf(finalMatrix, in, out); if (out[3] == 0.0) { return(GL_FALSE); } out[0] /= out[3]; out[1] /= out[3]; out[2] /= out[3]; *objx = out[0]; *objy = out[1]; *objz = out[2]; return(GL_TRUE); }