void ClickSoundViewer::draw_obj()
{
    const vector<Point3d>&  vtx = mesh_.vertices();
    const vector<Tuple3ui>& tgl = mesh_.surface_indices();
    const vector<Vector3d>& nml = mesh_.normals();

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(3, GL_DOUBLE, 0, (const GLvoid*)(vtx.data()));
    glNormalPointer(GL_DOUBLE, 0, (const GLvoid*)(nml.data()));
    glDrawElements(GL_TRIANGLES, tgl.size()*3, GL_UNSIGNED_INT, (const GLvoid*)(tgl.data()));
}
void ClickSoundViewer::draw_triangle_normal()
{
    const int tid = selTriId_;
    const vector<Point3d>&  vtx = mesh_.vertices();
    const vector<Tuple3ui>& tgl = mesh_.surface_indices();

    const Point3d ctr  = (vtx[tgl[tid].x] + vtx[tgl[tid].y] + vtx[tgl[tid].z])*(1./3.);
    Vector3d nml = Triangle<double>::weighted_normal( vtx[tgl[tid].x], vtx[tgl[tid].y], vtx[tgl[tid].z] );
    double area = nml.normalize2();
    const double len = 0.05;     ///// HARD coded value here!!!
    const Point3d end  = ctr + nml * len;

    glColor3f(1.f, 0.f, 0.f);
    drawArrow( qglviewer::Vec(end.x, end.y, end.z), 
               qglviewer::Vec(ctr.x, ctr.y, ctr.z),
               sqrt(area)*0.8 );
}
void ClickSoundViewer::postSelection(const QPoint&)
{
    selTriId_ = selectedName();
    //cout << "selected triangle ID:  " << selTriId_ << endl;

    //// Now synthesize sound and play
    {
        qglviewer::Vec cam = camera()->position();
        const Point3d camPos( cam.x, cam.y, cam.z );

        const vector<Point3d>&  vtx = mesh_.vertices();
        const vector<Tuple3ui>& tgl = mesh_.surface_indices();
        Vector3d nml = Triangle<double>::normal( 
                vtx[tgl[selTriId_].x], 
                vtx[tgl[selTriId_].y], 
                vtx[tgl[selTriId_].z] );
        nml.normalize();
        audio_->play( mesh_.triangle_ids(selTriId_), nml, camPos );
    }
    
    if ( selTriId_ >= 0 ) update();
}