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 } } }
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; }
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; }
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(); }