void CGizmoTransformRotate::Rotate1Axe(const tvector3& rayOrigin,const tvector3& rayDir)
{
    tvector3 inters;
    m_plan=vector4(m_pMatrix->GetTranslation(), m_Axis2);
    m_plan.RayInter(inters,rayOrigin,rayDir);
    ptd = inters;

    tvector3 df = inters - m_pMatrix->GetTranslation();

    df.Normalize();
    m_LockVertex2 = df;

    float acosng = df.Dot(m_LockVertex);
    m_Ng2 = (float)acos(acosng);

    if (df.Dot(m_Vty)>0)
        m_Ng2 = -m_Ng2;

    tmatrix mt,mt2;

    if (m_bUseSnap)
    {
        m_Ng2*=(360.0f/ZPI);
        SnapIt(m_Ng2,m_AngleSnap);
        m_Ng2/=(360.0f/ZPI);
    }

    mt.RotationAxis(m_Axis,m_Ng2);
    mt.Multiply(m_InvOrigScale);
    mt.Multiply(m_svgMatrix);
    mt2 = m_OrigScale;
    mt2.Multiply(mt);
    *m_pMatrix=mt2;

    if (m_Axis == tvector3::ZAxis)
    {
        if (mEditQT)
        {
            /*
            Dans le cadre du jeu, et vu les pb avec les quaternions,
            le 1er float du quaternion en stockage est l'angle en radian.
            le stockage reste un quaternion.
            il y a des pbs de conversion quaternion/matrix
            */
#if USE_QUATERNION
            tquaternion gth(*m_pMatrix);

            gth.Normalize();
            gth.UnitInverse();

            tquaternion qtg;
            qtg.RotationAxis(m_Axis,m_Ng2);
            *mEditQT = gth;//gth+qtg;//tquaternion(mt2);
            mEditQT->Normalize();
#else
            mEditQT->z = m_Ng2;
#endif
        }
    }
}
Exemple #2
0
int Cascade::enternotify(XEvent *ev)
 {
 int x=ev->xcrossing.x;
 int y=ev->xcrossing.y;
 if(/* gtmom(b)->funcs==&menufuncs && */ grabber && !greedy &&
    x>=0 && y>=0 && x<gtw() && y<=gth() && !state)
   {
   stfocus(this);
   zapto((Widget *)gtmom());
   press(0,0);
   }
 return 0;
 }
Exemple #3
0
int Menu::umenurelease1(int key,int state,int x,int y,Time time,Widget *org)
  {
  /*  printf("Menu release %d,%d greedy=%d\n",x,y,greedy); */
  greedygrab(1);
  stfocus((Widget *)nth(0));
  if(x>=0 && x<gtw() && y>=0 && y<gth())
    {
    ev.type=ButtonPress;
    calcpointer();
    doevent(gtmain(),&ev);
    calcpointer();
    ev.type=ButtonRelease;
    doevent(gtmain(),&ev);
    }
  return 0;
  }
Exemple #4
0
void Cascade::press(int x,int y)
  {
  int xpos, ypos;
  if(help)
    help->deactivate();

  if(state)
    { /* Already pressed */
    if(x<0 || x>=gtwidth()+2 || y<0 || y>=gtheight()+2)
      { /* Mouse is outside our window */
      popgrab();
      }
    else
      {
      greedygrab(0);
      }
    return;
    }


  trigger();

  if(!gtmom()->is_menu)
    {
    calcpos(gtouter()->gtwin(),&xpos,&ypos);
    m->stx(xpos);
    m->sty(ypos+gth()+2);
    }
  else
    {
    calcpos(gtouter()->gtwin(),&xpos,&ypos);
    m->stx(xpos+gtw()+2);
    m->sty(ypos);
    }
  grab(this,0);
  state=1;
  m->enable();
  }