void CglAxis::display(){ int shaderID = initProgram(pcv->fresnelID()); GLuint MatrixID = glGetUniformLocation(shaderID, "MVP"); GLuint colorID = glGetUniformLocation(shaderID, "COL"); GLuint MID = glGetUniformLocation(shaderID, "M"); GLuint VID = glGetUniformLocation(shaderID, "V"); int fill_light_ID = glGetUniformLocation(shaderID, "FILL"); int side_light_ID = glGetUniformLocation(shaderID, "SIDE"); int back_light_ID = glGetUniformLocation(shaderID, "BACK"); int gridID = glGetUniformLocation(shaderID, "GRID"); //GRID if( (pcv->profile.displayBottomGrid) && (pScene->scene_type != CGL_GALERY) ){ enableFog(shaderID); glm::mat4 VIEW = sVIEW(); glm::mat4 MVP = sPROJ() * sVIEW() * sMODEL() * glm::translate( glm::scale(glm::mat4(1), glm::vec3(pScene->getScale(),1,pScene->getScale())), glm::vec3(0) );//glm::vec3(sMODEL()[3]) ); //glm::translate(glm::mat4(1), center) * // glm::scale(glm::translate( sPROJ() * VIEW * MODEL, center), // glm::vec3(pScene->getScale(), 1, pScene->getScale())) * // glm::translate(glm::mat4(1), -center); uniform(MatrixID, MVP); uniform(MID, MODEL); uniform(VID, VIEW); uniform(colorID, glm::vec3(0.,0.,1.0)); std::vector<pCglLight> lights = pcv->getSubWindow()->getScene()->getLights(); uniform( fill_light_ID, *(lights[0]->getLightMatrix(pMaterial))); uniform( side_light_ID, *(lights[1]->getLightMatrix(pMaterial))); uniform( back_light_ID, *(lights[2]->getLightMatrix(pMaterial))); uniform(gridID, 1.0f); //glLineWidth(1.0); //bindBuffer(0, GL_ARRAY_BUFFER, secondaryGridBuffer); //glBindAttribLocation( shaderID, 0, "vertex_position"); //glDrawArrays(GL_LINES, 0, secondaryGrid.size()/3); glEnable(GL_BLEND); //glLineWidth(2.0); bindBuffer(0, GL_ARRAY_BUFFER, mainGridBuffer); glBindAttribLocation( shaderID, 0, "vertex_position"); bindBuffer(1, GL_ARRAY_BUFFER, nBuffer); glBindAttribLocation( shaderID, 1, "vertex_normal"); //glDrawArrays(GL_QUADS, 0, mainGrid.size()/3); //STENCIL WRITING glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 0xFF); // Set any stencil to 1 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilMask(0xFF); // Write to stencil buffer glDepthMask(GL_FALSE); // Don't write to depth buffer glClear(GL_STENCIL_BUFFER_BIT); glDrawArrays(GL_QUADS, 0, mainGrid.size()/3); glStencilFunc(GL_EQUAL, 1, 0xFF); // Pass test if stencil value is 1 glStencilMask(0x00); // Don't write anything to stencil buffer glDepthMask(GL_TRUE); // Write to depth buffer glDisable(GL_STENCIL_TEST); //Draw d'un contour //glLineWidth(10.0f); //uniform(gridID, 0.0f); //glEnable(GL_POLYGON_OFFSET_LINE); //glPolygonOffset(1.0,1.0); //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //glDrawArrays(GL_QUADS, 0, mainGrid.size()/3); //glDisable(GL_POLYGON_OFFSET_LINE); //glLineWidth(1.0f); glDisable(GL_BLEND); disableFog(shaderID); glPolygonMode(GL_FRONT, GL_FILL); } shaderID = initProgram(pcv->simpleID()); glPolygonMode(GL_FRONT, GL_LINE); MatrixID = glGetUniformLocation(shaderID, "MVP"); colorID = glGetUniformLocation(shaderID, "COL"); MID = glGetUniformLocation(shaderID, "M"); VID = glGetUniformLocation(shaderID, "V"); //Axes if(pcv->profile.displayAxes){ glDisable(GL_DEPTH_TEST); glViewport(0,0,view->width/6,view->width/6); glm::mat4 NEUTRAL = glm::mat4(glm::perspective(70.0, 1.0, view->m_znear, view->m_zfar)) * sVIEW() * glm::mat4(1); glm::mat4 M = glm::scale(NEUTRAL, glm::vec3(view->zoom)); uniform(MatrixID, M); bindBuffer(0, GL_ARRAY_BUFFER, axesBuffer); glBindAttribLocation( shaderID, 0, "vertex_position"); glLineWidth(2.0); uniform(colorID, glm::vec3(1,0,0)); glDrawArrays(GL_LINES, 0, 2); uniform(colorID, glm::vec3(0,1,0)); glDrawArrays(GL_LINES, 2, 4); uniform(colorID, glm::vec3(0,0,1)); glDrawArrays(GL_LINES, 4, 6); view->reshape(view->width,view->height); glEnable(GL_DEPTH_TEST); } glLineWidth(1.0); glPolygonMode(GL_FRONT, GL_FILL); freeBuffer(); }
//-------------------------------------------------------------- void ofApp::draw(){ ofBackground(scaledVol); ofNoFill(); ofSetColor(scaledVol); cam.begin(); ofScale(1, 1, -1); enableFog(fogNear, fogFar); float moveOffset = moveSpeed * ofGetElapsedTimef() / tunnelSeparation; int moveWhole = floor(moveOffset); float moveFraction = fmodf(moveOffset, 1); ofVboMesh tunnelSegment; tunnelSegment.setMode(OF_PRIMITIVE_LINES); ofVec3f segmentOffset(0, 0, tunnelSeparation); for(int i = 0; i < circleResolution; i++) { float theta0 = ofMap(i + 0, 0, circleResolution - 1, 0, 360); float theta1 = ofMap(i + 1, 0, circleResolution - 1, 0, 360); ofVec2f v0(tunnelRadius, 0); ofVec2f v1(tunnelRadius, 0); v0.rotate(theta0); v1.rotate(theta1); tunnelSegment.addVertex(v0); tunnelSegment.addVertex(v1); tunnelSegment.addVertex(v0); tunnelSegment.addVertex(segmentOffset + v0); tunnelSegment.addVertex(segmentOffset + v0); tunnelSegment.addVertex(segmentOffset + v1); } ofPushMatrix(); ofVec2f lerpOrientation = ofVec2f().interpolate(getOrientation(rotationChange * (1 + moveWhole)), moveFraction); ofRotateX(-lerpOrientation.x); ofRotateY(-lerpOrientation.y); ofTranslate(0, 0, -moveFraction * tunnelSeparation); for(int i = 0; i < tunnelLength; i++) { if(i > 0) { ofVec2f orientation = getOrientation(rotationChange * (i + moveWhole)); ofRotateX(orientation.x); ofRotateY(orientation.y); } ofSetColor(255); tunnelSegment.draw(); ofTranslate(0, 0, tunnelSeparation); } ofPopMatrix(); disableFog(); cam.end(); }