static void drawStuff(bool picking) { // Declare an empty uniforms Uniforms uniforms; // if we are not translating, update arcball scale if (!(g_mouseMClickButton || (g_mouseLClickButton && g_mouseRClickButton) || (g_mouseLClickButton && !g_mouseRClickButton && g_spaceDown))) updateArcballScale(); // build & send proj. matrix to vshader const Matrix4 projmat = makeProjectionMatrix(); sendProjectionMatrix(uniforms, projmat); const RigTForm eyeRbt = getPathAccumRbt(g_world, getNodeForEye(g_activeEye)); const RigTForm invEyeRbt = inv(eyeRbt); const Cvec3 eyeLight1 = getPathAccumRbt(g_world, g_light1Node).getTranslation(); const Cvec3 eyeLight2 = getPathAccumRbt(g_world, g_light2Node).getTranslation(); uniforms.put("uLight", eyeLight1); uniforms.put("uLight2", eyeLight2); if (!picking) { Drawer drawer(invEyeRbt, uniforms); g_world->accept(drawer); if (g_displayArcball && shouldUseArcball()) { drawArcBall(uniforms); } } else { Picker picker(invEyeRbt, uniforms); // set overriding material to our picking material g_overridingMaterial = g_pickingMat; g_world->accept(picker); // unset overriding material g_overridingMaterial.reset(); glFlush(); g_currentPickedRbtNode = picker.getRbtNodeAtXY(g_mouseClickX, g_mouseClickY); if (g_currentPickedRbtNode == g_groundNode) { g_currentPickedRbtNode = shared_ptr<SgRbtNode>(); // set to NULL cout << "clicked on ground\n"; } } }
// drawStuff just takes in a picking flag, and no curSS static void drawStuff(bool picking) { // Declare an empty uniforms Uniforms uniforms; // Get your projection matrix into proj mat as usual ... // send proj. matrix to be stored by uniforms, // as opposed to the current vtx shader sendProjectionMatrix(uniforms, projmat); // get your eyeRbt, invEyeRbt and stuff as usual ... // get the eye space coordinates of the two light as usual // suppose they are stored as Cvec3 eyeLight1 and eyeLight2 ... // send the eye space coordinates of lights to uniforms uniforms.put("uLight", eyeLight1); uniforms.put("uLight2", eyeLight2); if (!picking) { // initialize the drawer with our uniforms, as opposed to curSS Drawer drawer(invEyeRbt, uniforms); // draw as before g_world->accept(drawer); ... // draw arcball if neccessary }
static void drawStuff(bool picking) { Uniforms uniforms; // if we are not translating, update arcball scale if (!(g_mouseMClickButton || (g_mouseLClickButton && g_mouseRClickButton) || (g_mouseLClickButton && !g_mouseRClickButton && g_spaceDown))) updateArcballScale(); // build & send proj. matrix to vshader const Matrix4 projmat = makeProjectionMatrix(); sendProjectionMatrix(uniforms, projmat); const RigTForm eyeRbt = getPathAccumRbt(g_world, g_currentCameraNode); const RigTForm invEyeRbt = inv(eyeRbt); // const Cvec3 eyeLight1 = Cvec3(invEyeRbt * Cvec4(g_light1, 1)); // const Cvec3 eyeLight2 = Cvec3(invEyeRbt * Cvec4(g_light2, 1)); const Cvec3 eyeLight1 = getPathAccumRbt(g_world, g_light1Node).getTranslation(); const Cvec3 eyeLight2 = getPathAccumRbt(g_world, g_light2Node).getTranslation(); uniforms.put("uLight", (Cvec3) (invEyeRbt * Cvec4(eyeLight1,1))); uniforms.put("uLight2", (Cvec3) (invEyeRbt * Cvec4(eyeLight2,1))); if (!picking) { Drawer drawer(invEyeRbt, uniforms); g_world->accept(drawer); if (g_displayArcball && shouldUseArcball()) drawArcBall(uniforms); } else { Picker picker(invEyeRbt, uniforms); g_overridingMaterial = g_pickingMat; g_world->accept(picker); g_overridingMaterial.reset(); glFlush(); g_currentPickedRbtNode = picker.getRbtNodeAtXY(g_mouseClickX, g_mouseClickY); if (g_currentPickedRbtNode == g_groundNode) g_currentPickedRbtNode = shared_ptr<SgRbtNode>(); // set to NULL cout << (g_currentPickedRbtNode ? "Part picked" : "No part picked") << endl; } if (g_shellNeedsUpdate) { updateShellGeometry(); } g_shellNeedsUpdate = false; }
static void drawArcBall(Uniforms& uniforms) { // switch to wire frame mode glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); RigTForm arcballEye = inv(getPathAccumRbt(g_world, g_currentCameraNode)) * getArcballRbt(); Matrix4 MVM = rigTFormToMatrix(arcballEye) * Matrix4::makeScale(Cvec3(1, 1, 1) * g_arcballScale * g_arcballScreenRadius); sendModelViewNormalMatrix(uniforms, MVM, normalMatrix(MVM)); uniforms.put("uColor", Cvec3 (0.27, 0.82, 0.35)); // switch back to solid mode g_arcballMat->draw(*g_sphere, uniforms); }
// takes a projection matrix and send to the the shaders inline void sendProjectionMatrix(Uniforms& uniforms, const Matrix4& projMatrix) { uniforms.put("uProjMatrix", projMatrix); }
static void drawStuff(bool picking) { Uniforms uniforms; // build & send proj. matrix to vshader const Matrix4 projmat = makeProjectionMatrix(); sendProjectionMatrix(uniforms, projmat); // choose frame to use as eyeRbt RigTForm eyeRbt = getPathAccumRbt(g_world, g_eyeFrameNode); const RigTForm invEyeRbt = inv(eyeRbt); // get world space coordinates of the light Cvec3 light1 = getPathAccumRbt(g_world, g_light1Node).getTranslation(); // transform to eye space, and set to uLight uniform uniforms.put("uLight", Cvec3(invEyeRbt * Cvec4(light1, 1))); Cvec3 light2 = getPathAccumRbt(g_world, g_light2Node).getTranslation(); // transform to eye space, and set to uLight uniform uniforms.put("uLight2", Cvec3(invEyeRbt * Cvec4(light2, 1))); /* const Cvec3 eyeLight1 = Cvec3(invEyeRbt * Cvec4(g_light1, 1)); // g_light1 position in eye coordinates const Cvec3 eyeLight2 = Cvec3(invEyeRbt * Cvec4(g_light2, 1)); // g_light2 position in eye coordinates // safe_glUniform3f(curSS.h_uLight, eyeLight1[0], eyeLight1[1], eyeLight1[2]); // safe_glUniform3f(curSS.h_uLight2, eyeLight2[0], eyeLight2[1], eyeLight2[2]); uniforms.put("uLight", eyeLight1); uniforms.put("uLight2", eyeLight2); */ RigTForm arcballRbt = makeArcballRbt(); if(!(g_mouseMClickButton || (g_mouseLClickButton && g_mouseRClickButton) || (g_mouseLClickButton && !g_mouseRClickButton && g_spaceDown))){ // update arcballScale g_arcballScale = getScreenToEyeScale((invEyeRbt * arcballRbt).getTranslation()[2], g_frustFovY, g_windowHeight); } if (!picking) { Drawer drawer(invEyeRbt, uniforms); g_world->accept(drawer); // draw arcball as part of asst3 if (g_arcballVisible) { double s = g_arcballScale * g_arcballScreenRadius; RigTForm MVMrbt = invEyeRbt * arcballRbt; Matrix4 MVM = rigTFormToMatrix(MVMrbt); MVM = MVM * Matrix4::makeScale(Cvec3(s, s, s)); Matrix4 NMVM = normalMatrix(MVM); sendModelViewNormalMatrix(uniforms, MVM, NMVM); g_arcballMat->draw(*g_sphere, uniforms); } } else {//if indeed picking Picker picker(invEyeRbt, uniforms); g_overridingMaterial = g_pickingMat; g_world->accept(picker); g_overridingMaterial.reset(); glFlush(); g_currentPickedRbtNode = picker.getRbtNodeAtXY(g_mouseClickX, g_mouseClickY); if (!g_currentPickedRbtNode || g_currentPickedRbtNode == g_groundNode) g_currentPickedRbtNode = g_eyeFrameNode; g_arcballVisible = (g_currentPickedRbtNode != g_eyeFrameNode || (g_currentPickedRbtNode == g_skyNode && g_skyModMode == 0)); g_arcballScale = getScreenToEyeScale((invEyeRbt * arcballRbt).getTranslation()[2], g_frustFovY, g_windowHeight); } }