| inlib
    1.2.0
    | 


| Public Member Functions | |
| pick_action (std::ostream &a_out, unsigned int a_ww, unsigned int a_wh, float a_l, float a_r, float a_b, float a_t) | |
| virtual | ~pick_action () | 
| void | reset () | 
| void | set_done (bool a_value) | 
| bool | done () const | 
| void | set_node (inlib::sg::node *a_node) | 
| inlib::sg::node * | node () const | 
| void | set_area (float a_l, float a_r, float a_b, float a_t) | 
| bool | is_inside (float a_x, float a_y) const | 
| bool | intersect (float a_bx, float a_by, float a_ex, float a_ey) const | 
| bool | intersect (float a_1x, float a_1y, float a_2x, float a_2y, float a_3x, float a_3y) const | 
Definition at line 23 of file pick_action.
| inlib::sg::pick_action::pick_action | ( | std::ostream & | a_out, | 
| unsigned int | a_ww, | ||
| unsigned int | a_wh, | ||
| float | a_l, | ||
| float | a_r, | ||
| float | a_b, | ||
| float | a_t | ||
| ) |  [inline] | 
Definition at line 38 of file pick_action.
: mtx_action(a_out,a_ww,a_wh) ,m_l(a_l) ,m_r(a_r) ,m_b(a_b) ,m_t(a_t) ,m_done(false) ,m_node(0) { set_to_pick_ndc(); //OPTIMIZATION }
| virtual inlib::sg::pick_action::~pick_action | ( | ) |  [inline, virtual] | 
Definition at line 52 of file pick_action.
                        {
    //clear_cbks();
  }
| bool inlib::sg::pick_action::done | ( | ) | const  [inline] | 
Definition at line 72 of file pick_action.
{return m_done;}
| bool inlib::sg::pick_action::intersect | ( | float | a_bx, | 
| float | a_by, | ||
| float | a_ex, | ||
| float | a_ey | ||
| ) | const  [inline] | 
Definition at line 138 of file pick_action.
                                                     {
    // ortho_clip_line works by testing against a [-1,1]x[-1,1] box.
    // In principle we should receive (because of proj x model matrix
    // mult of world coord points) points in [-1,1]x[-1,1] too.
    float bx,by;
    to_pick_ndc(a_bx,a_by,bx,by);
    float ex,ey;
    to_pick_ndc(a_ex,a_ey,ex,ey);
    //no check on z is done.
    float bz = 0;
    float ez = 0;
    bool toggle;
    bool status = ortho_clip_line(bx,by,bz,ex,ey,ez,false,toggle);
    //if(status) {
    //  std::cout << "debug : inlib::sg::pick_action::intersect :"
    //        << " intersect !"
    //        << std::endl;
    //}
    return status;
  }
| bool inlib::sg::pick_action::intersect | ( | float | a_1x, | 
| float | a_1y, | ||
| float | a_2x, | ||
| float | a_2y, | ||
| float | a_3x, | ||
| float | a_3y | ||
| ) | const  [inline] | 
Definition at line 167 of file pick_action.
                                                     {
    //test a triangle.
    if(is_inside(a_1x,a_1y)) return true;
    if(is_inside(a_2x,a_2y)) return true;
    if(is_inside(a_3x,a_3y)) return true;
    
    // alll points are outside. 
    if(intersect(a_1x,a_1y, a_2x,a_2y)) return true;
    if(intersect(a_2x,a_2y, a_3x,a_3y)) return true;
    if(intersect(a_1x,a_1y, a_3x,a_3y)) return true;
    // no intersection with edges.
    // but the triangle may surround [-1,1]x[-1,1] !
    float x1,y1;
    to_pick_ndc(a_1x,a_1y,x1,y1);
    float x2,y2;
    to_pick_ndc(a_2x,a_2y,x2,y2);
    float x3,y3;
    to_pick_ndc(a_3x,a_3y,x3,y3);
    // test if (0,0) is inside the triangle :    
    inlib::vec2f p1(x1,y1);
    inlib::vec2f p2(x2,y2);
    inlib::vec2f p3(x3,y3);
    //std::cout << "pick_action::intersect : " << std::endl;
    //std::cout << " p1 " << p1[0] << " " << p1[1] << std::endl;
    //std::cout << " p2 " << p2[0] << " " << p2[1] << std::endl;
    //std::cout << " p3 " << p3[0] << " " << p3[1] << std::endl;
    inlib::vec2f o(0,0);
   {float cp2 = (p2-p1).cross(p3-p1);
    if(cp2==0) return false;       // (p1,p2,p3) aligned points.
    float cp1 = (p2-p1).cross( o-p1);
    if(cp1==0) return true;        // o on (p1,p2). We can't pass here.
    if((cp1*cp2)<0) return false;} // o p3 not on same side than (p1,p2)
   {float cp2 = (p3-p2).cross(p1-p2);
    if(cp2==0) return false;       // (p1,p2,p3) aligned points.
    float cp1 = (p3-p2).cross( o-p2);
    if(cp1==0) return true;        // o on (p2,p3). We can't pass here.
    if((cp1*cp2)<0) return false;} // o p1 not on same side than (p2,p3)
   {float cp2 = (p1-p3).cross(p2-p3);
    if(cp2==0) return false;       // (p1,p2,p3) aligned points.
    float cp1 = (p1-p3).cross( o-p3);
    if(cp1==0) return true;        // o on (p3,p1). We can't pass here.
    if((cp1*cp2)<0) return false;} // o p2 not on same side than (p3,p1)
    //std::cout << " (0,0) inside. " << std::endl;
    return true;
  }
| bool inlib::sg::pick_action::is_inside | ( | float | a_x, | 
| float | a_y | ||
| ) | const  [inline] | 
Definition at line 115 of file pick_action.
                                            {
    //std::cout << "debug : inlib::sg::pick_action::is_inside :"
    //      << " x " << a_x
    //      << " y " << a_y
    //      << std::endl;
    // In principle we should receive (because of proj x model matrix
    // mult of world coord points) point in [-1,1]x[-1,1].
    float x,y;
    to_pick_ndc(a_x,a_y,x,y);
    if(x<-1) return false;
    if(1<x) return false;
    if(y<-1) return false;
    if(1<y) return false;
    //std::cout << "debug : inlib::sg::pick_action::is_inside :"
    //      << " inside !"
    //      << std::endl;
    return true;
  }
| inlib::sg::node* inlib::sg::pick_action::node | ( | ) | const  [inline] | 
Definition at line 75 of file pick_action.
{return m_node;}
| void inlib::sg::pick_action::reset | ( | ) |  [inline] | 
Reimplemented from inlib::sg::mtx_action.
Definition at line 64 of file pick_action.
               {
    mtx_action::reset();
    m_done = false;
    m_node = 0;
    //clear_cbks();
  }
| void inlib::sg::pick_action::set_area | ( | float | a_l, | 
| float | a_r, | ||
| float | a_b, | ||
| float | a_t | ||
| ) |  [inline] | 
Definition at line 103 of file pick_action.
                                            {
    // a_l,a_r,a_b,a_t are in window coordinates (pixels)
    // but handled in floats for intersection computation precision.
    // WARNING : we must have a_t>a_b and a_r>a_l. No check is done for that. 
    m_l = a_l;
    m_r = a_r;
    m_b = a_b;
    m_t = a_t;
    set_to_pick_ndc(); //OPTIMIZATION
  }
| void inlib::sg::pick_action::set_done | ( | bool | a_value | ) |  [inline] | 
Definition at line 71 of file pick_action.
{m_done = a_value;}
| void inlib::sg::pick_action::set_node | ( | inlib::sg::node * | a_node | ) |  [inline] | 
Definition at line 74 of file pick_action.
{m_node = a_node;}
 1.7.5.1
 1.7.5.1