// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ // GLint gluES::gluProject(GLfloat objx, GLfloat objy, GLfloat objz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat *winx, GLfloat *winy, GLfloat *winz) { float in[4]; float out[4]; in[0]=objx; in[1]=objy; in[2]=objz; in[3]=1.0; __gluMultMatrixVecf(modelMatrix, in, out); __gluMultMatrixVecf(projMatrix, out, in); if (in[3] == 0.0) return(GL_FALSE); in[0] /= in[3]; in[1] /= in[3]; in[2] /= in[3]; /* Map x, y and z to range 0-1 */ in[0] = in[0] * 0.5f + 0.5f; in[1] = in[1] * 0.5f + 0.5f; in[2] = in[2] * 0.5f + 0.5f; /* Map x,y to viewport */ in[0] = in[0] * viewport[2] + viewport[0]; in[1] = in[1] * viewport[3] + viewport[1]; *winx=in[0]; *winy=in[1]; *winz=in[2]; return(GL_TRUE); }
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); }