Example #1
0
/*!
Mouse wheel eventhandler that moves the camera foreward or backwards
*/
void onMouseWheel(GLFWwindow* window, double xscroll, double yscroll)
{  
    if (_modifiers == NONE)
    {
        _camZ += (SLfloat)SL_sign(yscroll)*0.1f;
        onPaint();
    }
}
Example #2
0
/*!
Mouse wheel eventhandler forwards the events to slMouseWheel
*/
static void onMouseWheel(GLFWwindow* window, double xscroll, double yscroll)
{
   // make sure the delta is at least one integer
   int dY = (int)yscroll;
   if (dY==0) dY = (int)(SL_sign(yscroll));

   if (slMouseWheel(svIndex, dY, modifiers)) onPaint();
}
Example #3
0
/*! 
SLCamera::onMouseWheel event handler moves camera forwards or backwards
*/
SLbool SLCamera::onMouseWheel(const SLint delta, const SLKey mod)
{  
   SLScene* s = SLScene::current;
   SLSceneView* sv = s->activeSV();
   SLfloat sign = (SLfloat)SL_sign(delta);
   
   if (_camAnim==turntableYUp || _camAnim==turntableZUp) //....................
   {  if (mod==KeyNone)
      {  
         // Determine the lookAt point by ray cast
         eyeToPixelRay((SLfloat)sv->scrWdiv2(), 
                       (SLfloat)sv->scrHdiv2(), &_lookAtRay);
         s->root3D()->hit(&_lookAtRay);
         if (_lookAtRay.length < FLT_MAX) 
            _lookAtRay.hitPoint = _lookAtRay.origin + 
                                  _lookAtRay.dir*_lookAtRay.length;
         
         // Scale the mouse delta by the lookAt distance
         SLfloat lookAtDist;
         if (_lookAtRay.length < FLT_MAX && _lookAtRay.hitShape)
         {  lookAtDist = _lookAtRay.length;
         }
         else lookAtDist = _focalDist;
                  
         _vm.translation(_vm.m(12),_vm.m(13),_vm.m(14) + sign*lookAtDist*_dPos);
         _lookAtRay.length = FLT_MAX;
         setWMandState();
      }
      if (mod==KeyCtrl)
      {  _eyeSeparation *= (1.0f + sign*0.1f);
      }
      if (mod==KeyAlt)
      {  _fov += sign*5.0f;
         currentFOV = _fov;
      }
      if (mod==KeyShift)
      {  _focalDist *= (1.0f + sign*0.05f);
         
      }
      return true;
   }
   else if (_camAnim==walkingYUp || _camAnim==walkingZUp) //...................
   {  
      _speedLimit *= (1.0f + sign*0.1f);
   }
   return false;
}
Example #4
0
/*! 
SLCamera::onMouseWheel event handler moves camera forwards or backwards
*/
SLbool SLCamera::onMouseWheel(const SLint delta, const SLKey mod)
{  
    SLScene* s = SLScene::current;
    SLfloat sign = (SLfloat)SL_sign(delta);
   
    if (_camAnim==turntableYUp || _camAnim==turntableZUp) //....................
    {   if (mod==KeyNone)
        {  
            // Determine the lookAt point by ray cast
            eyeToPixelRay((SLfloat)(_scrW>>1),
                        (SLfloat)(_scrH>>1), &_lookAtRay);

            if (s->root3D()) s->root3D()->hitRec(&_lookAtRay);

            if (_lookAtRay.length < FLT_MAX) 
                _lookAtRay.hitPoint = _lookAtRay.origin + 
                                      _lookAtRay.dir*_lookAtRay.length;
         
            // Scale the mouse delta by the lookAt distance
            SLfloat lookAtDist;
            if (_lookAtRay.length < FLT_MAX && _lookAtRay.hitNode)
                 lookAtDist = _lookAtRay.length;
            else lookAtDist = _focalDist;
                  
            translate(SLVec3f(0, 0, -sign*lookAtDist*_dPos), TS_Object);

            _lookAtRay.length = FLT_MAX;
        }
        if (mod==KeyCtrl)
        {   _eyeSeparation *= (1.0f + sign*0.1f);
        }
        if (mod==KeyAlt)
        {   _fov += sign*5.0f;
            currentFOV = _fov;
        }
        if (mod==KeyShift)
        {  _focalDist *= (1.0f + sign*0.05f);
        }
        return true;
    }
Example #5
0
/*! 
SLCamera::onTouch2Move gets called whenever two fingers move on a handheld 
screen.
*/
SLbool SLCamera::onTouch2Move(const SLint x1, const SLint y1,
                              const SLint x2, const SLint y2)
{	
   SLScene* s = SLScene::current;
   SLSceneView* sv = s->activeSV();
   SLVec2f now1((SLfloat)x1, (SLfloat)y1);
   SLVec2f now2((SLfloat)x2, (SLfloat)y2);
   SLVec2f delta1(now1-_oldTouchPos1);
   SLVec2f delta2(now2-_oldTouchPos2);
   
   // Average out the deltas over the last 4 events for correct 1 pixel moves
   static SLuint  cnt=0;
   static SLVec2f d1[4];
   static SLVec2f d2[4];
   d1[cnt%4] = delta1;
   d2[cnt%4] = delta2;
   SLVec2f avgDelta1(d1[0].x+d1[1].x+d1[2].x+d1[3].x, d1[0].y+d1[1].y+d1[2].y+d1[3].y);
   SLVec2f avgDelta2(d2[0].x+d2[1].x+d2[2].x+d2[3].x, d2[0].y+d2[1].y+d2[2].y+d2[3].y);
   avgDelta1 /= 4.0f;
   avgDelta2 /= 4.0f;
   cnt++;
      
   SLfloat r1, phi1, r2, phi2;
   avgDelta1.toPolar(r1, phi1);
   avgDelta2.toPolar(r2, phi2);
    
   // Scale the mouse delta by the lookAt distance
   SLfloat lookAtDist;
   if (_lookAtRay.length < FLT_MAX)
        lookAtDist = _lookAtRay.length;
   else lookAtDist = _focalDist;
         
   // scale factor depending on the space sice at focal dist
   SLfloat spaceH = tan(SL_DEG2RAD*_fov/2) * lookAtDist * 2.0f;
   SLfloat spaceW = spaceH * sv->scrWdivH();
   
   //SL_LOG("avgDelta1: (%05.2f,%05.2f), dPhi=%05.2f\n", avgDelta1.x, avgDelta1.y, SL_abs(phi1-phi2));
   
   // if fingers move parallel slide camera vertically or horizontally
   if (SL_abs(phi1-phi2) < 0.2f)
   {  
      // Calculate center between finger points
      SLVec2f nowCenter((now1+now2)*0.5f);
      SLVec2f oldCenter((_oldTouchPos1+_oldTouchPos2)*0.5f);
      
      // For first move set oldCenter = nowCenter
      if (oldCenter == SLVec2f::ZERO) oldCenter = nowCenter;
      
      SLVec2f delta(nowCenter - oldCenter);

      // scale to 0-1
      delta.x /= (SLfloat)sv->scrW();
      delta.y /= (SLfloat)sv->scrH();

      // scale to space size
      delta.x *= spaceW;
      delta.y *= spaceH;
      
      if (_camAnim==turntableYUp || _camAnim==turntableZUp)
      {           
         // apply delta to x- and y-position
         _vm.translation(_vm.m(12) + delta.x,
                         _vm.m(13) - delta.y,
                         _vm.m(14));

         setWMandState();
      } 
      else if (_camAnim == walkingYUp || _camAnim == walkingZUp)
      {
      	_maxSpeed.x = delta.x * 100.0f,
         _maxSpeed.z = delta.y * 100.0f;
      }

   } else // Two finger pinch
   {  
      // Calculate vector between fingers
      SLVec2f nowDist(now2 - now1);
      SLVec2f oldDist(_oldTouchPos2-_oldTouchPos1);
      
      // For first move set oldDist = nowDist
      if (oldDist == SLVec2f::ZERO) oldDist = nowDist;
      
      SLfloat delta = oldDist.length() - nowDist.length();

      if (_camAnim==turntableYUp)
      {  // scale to 0-1
         delta /= (SLfloat)sv->scrH();

         // scale to space height
         delta *= spaceH*2;
         
         // apply delta to the z-position
         _vm.translation(_vm.m(12),
                         _vm.m(13),
                         _vm.m(14) - delta);

         setWMandState();
      } 
      else if (_camAnim == walkingYUp)
      {  
         // change field of view
         _fov += SL_sign(delta) * 0.5f;
         currentFOV = _fov;
      }
   }

   _oldTouchPos1.set((SLfloat)x1, (SLfloat)y1);
   _oldTouchPos2.set((SLfloat)x2, (SLfloat)y2);
   return true;
}