Example #1
0
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();
    
}