/// Draw the 3D cursor void View3D::drawCursor(const TransformState& transStateIn, const V3d& cursorPos, float centerPointRadius) const { V3d offset = transStateIn.cameraPos(); TransformState transState = transStateIn.translate(offset); V3d relCursor = cursorPos - offset; // Cull if behind camera if((relCursor * transState.modelViewMatrix).z > 0) return; // Find position of cursor in screen space V3d screenP3 = relCursor * transState.modelViewMatrix * transState.projMatrix; // Position in ortho coord system V2f p2 = 0.5f * V2f(width(), height()) * (V2f(screenP3.x, screenP3.y) + V2f(1.0f)); // Draw cursor if (m_cursorShader->isValid()) { QGLShaderProgram& cursorShader = m_cursorShader->shaderProgram(); // shader cursorShader.bind(); // vertex array glBindVertexArray(m_cursorVertexArray); transState.projMatrix.makeIdentity(); transState.setOrthoProjection(0, width(), 0, height(), 0, 1); transState.modelViewMatrix.makeIdentity(); if (centerPointRadius > 0) { // fake drawing of white point through scaling ... // TransformState pointState = transState.translate( V3d(p2.x, p2.y, 0) ); pointState = pointState.scale( V3d(0.0,0.0,0.0) ); glLineWidth(centerPointRadius); cursorShader.setUniformValue("color", 1.0f, 1.0f, 1.0f, 1.0f); pointState.setUniforms(cursorShader.programId()); glDrawArrays( GL_POINTS, 0, 1 ); } // Now draw a 2D overlay over the 3D scene to allow user to pinpoint the // cursor, even when when it's behind something. glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); glLineWidth(1); // this won't work anymore for values larger than 1 (2.0f); // draw white lines transState = transState.translate( V3d(p2.x, p2.y, 0) ); cursorShader.setUniformValue("color", 1.0f, 1.0f, 1.0f, 1.0f); transState.setUniforms(cursorShader.programId()); glDrawArrays( GL_LINES, 0, 8 ); // draw black lines transState = transState.rotate( V4d(0,0,1,0.785398) ); //45 deg cursorShader.setUniformValue("color", 0.0f, 0.0f, 0.0f, 1.0f); transState.setUniforms(cursorShader.programId()); glDrawArrays( GL_LINES, 0, 8 ); } }