Exemplo n.º 1
0
Arquivo: ANIM.C Projeto: CGSG/SUM2014
/* Функция построения кадра анимации.
 * АРГУМЕНТЫ: Нет.
 * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
 */
VOID VG4_AnimRender( VOID )
{
  INT i;
  LARGE_INTEGER li;
  POINT pt;

  /*** Обновление ввода ***/
  /* Клавиатура */
  GetKeyboardState(VG4_Anim.Keys);
  for (i = 0; i < 256; i++)
    VG4_Anim.Keys[i] >>= 7;
  for (i = 0; i < 256; i++)
    VG4_Anim.KeysClick[i] = VG4_Anim.Keys[i] && !VG4_Anim.KeysOld[i];
  memcpy(VG4_Anim.KeysOld, VG4_Anim.Keys, 256);

  /* Мышь */
  /*  колесо */
  VG4_Anim.MsWheel = VG4_MouseGlobalWheel;
  VG4_MouseGlobalWheel = 0;
  /* абсолютная позиция */
  pt.x = VG4_MouseGlobalX;
  pt.y = VG4_MouseGlobalY;
  ScreenToClient(VG4_Anim.hWnd, &pt);
  VG4_Anim.MsX = pt.x;
  VG4_Anim.MsY = pt.y;
  /* относительное перемещение */
  VG4_Anim.MsDeltaX = VG4_MouseGlobalX - VG4_MouseXOld;
  VG4_Anim.MsDeltaY = VG4_MouseGlobalY - VG4_MouseYOld;
  VG4_MouseXOld = VG4_MouseGlobalX;
  VG4_MouseYOld = VG4_MouseGlobalY;

  /* Джойстик */
  if ((i = joyGetNumDevs()) > 0)
  {
    JOYCAPS jc;

    /* получение общей информации о джостике */
    if (joyGetDevCaps(JOYSTICKID1, &jc, sizeof(jc)) == JOYERR_NOERROR)
    {
      JOYINFOEX ji;

      /* получение текущего состояния */
      ji.dwSize = sizeof(JOYCAPS);
      ji.dwFlags = JOY_RETURNALL;
      if (joyGetPosEx(JOYSTICKID1, &ji) == JOYERR_NOERROR)
      {
        /* Кнопки */
        memcpy(VG4_Anim.JButsOld, VG4_Anim.JButs, sizeof(VG4_Anim.JButs));
        for (i = 0; i < 32; i++)
          VG4_Anim.JButs[i] = (ji.dwButtons >> i) & 1;
        for (i = 0; i < 32; i++)
          VG4_Anim.JButsClick[i] = VG4_Anim.JButs[i] && !VG4_Anim.JButsOld[i];

        /* Оси */
        VG4_Anim.JX = VG4_GET_AXIS_VALUE(X);
        VG4_Anim.JY = VG4_GET_AXIS_VALUE(Y);
        if (jc.wCaps & JOYCAPS_HASZ)
          VG4_Anim.JZ = VG4_GET_AXIS_VALUE(Z);
        if (jc.wCaps & JOYCAPS_HASR)
          VG4_Anim.JR = VG4_GET_AXIS_VALUE(R);
        if (jc.wCaps & JOYCAPS_HASU)
          VG4_Anim.JU = 2.0 * (ji.dwUpos - jc.wUmin) / (jc.wUmax - jc.wUmin - 1) - 1;

        /* Point-Of-View */
        if (jc.wCaps & JOYCAPS_HASPOV)
        {
          if (ji.dwPOV == 0xFFFF)
            VG4_Anim.JPOV = 0;
          else
            VG4_Anim.JPOV = ji.dwPOV / 4500 + 1;
        }
      }
Exemplo n.º 2
0
/* Функция построения кадра анимации.
 * АРГУМЕНТЫ: Нет.
 * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
 */
VOID VG4_AnimRender( VOID )
{
    INT i;
    LARGE_INTEGER li;
    POINT pt;

    /*** Обновление таймера ***/
    QueryPerformanceCounter(&li);
    VG4_Anim.GlobalTime = (DBL)(li.QuadPart - TimeStart) / TimeFreq;
    VG4_Anim.GlobalDeltaTime = (DBL)(li.QuadPart - TimeOld) / TimeFreq;

    if (!VG4_Anim.IsPause)
        VG4_Anim.DeltaTime = VG4_Anim.GlobalDeltaTime;
    else
    {
        TimePause += li.QuadPart - TimeOld;
        VG4_Anim.DeltaTime = 0;
    }

    VG4_Anim.Time = (DBL)(li.QuadPart - TimePause - TimeStart) / TimeFreq;

    /* вычисляем FPS */
    if (li.QuadPart - TimeFPS > TimeFreq)
    {
        VG4_Anim.FPS = FrameCounter / ((DBL)(li.QuadPart - TimeFPS) / TimeFreq);
        TimeFPS = li.QuadPart;
        FrameCounter = 0;
    }

    /* время "прошлого" кадра */
    TimeOld = li.QuadPart;

    /*** Обновление ввода ***/

    /* Клавиатура */
    GetKeyboardState(VG4_Anim.Keys);
    for (i = 0; i < 256; i++)
        VG4_Anim.Keys[i] >>= 7;
    for (i = 0; i < 256; i++)
        VG4_Anim.KeysClick[i] = VG4_Anim.Keys[i] && !VG4_Anim.KeysOld[i];
    memcpy(VG4_Anim.KeysOld, VG4_Anim.Keys, sizeof(VG4_Anim.KeysOld));

    /* Мышь */
    /* колесо */
    VG4_Anim.MsWheel = VG4_MouseWheel;
    VG4_MouseWheel = 0;
    /* абсолютная позиция */
    GetCursorPos(&pt);
    ScreenToClient(VG4_Anim.hWnd, &pt);
    VG4_Anim.MsX = pt.x;
    VG4_Anim.MsY = pt.y;
    /* относительное перемещение */
    VG4_Anim.MsDeltaX = pt.x - VG4_MouseOldX;
    VG4_Anim.MsDeltaY = pt.y - VG4_MouseOldY;
    VG4_MouseOldX = pt.x;
    VG4_MouseOldY = pt.y;

    /* Джойстик */
    if ((i = joyGetNumDevs()) > 0)
    {
        JOYCAPS jc;

        /* получение общей информации о джостике */
        if (joyGetDevCaps(JOYSTICKID2, &jc, sizeof(jc)) == JOYERR_NOERROR)
        {
            JOYINFOEX ji;

            /* получение текущего состояния */
            ji.dwSize = sizeof(JOYCAPS);
            ji.dwFlags = JOY_RETURNALL;
            if (joyGetPosEx(JOYSTICKID2, &ji) == JOYERR_NOERROR)
            {
                /* Кнопки */
                memcpy(VG4_Anim.JButsOld, VG4_Anim.JButs, sizeof(VG4_Anim.JButs));
                for (i = 0; i < 32; i++)
                    VG4_Anim.JButs[i] = (ji.dwButtons >> i) & 1;
                for (i = 0; i < 32; i++)
                    VG4_Anim.JButsClick[i] = VG4_Anim.JButs[i] && !VG4_Anim.JButsOld[i];

                /* Оси */
                VG4_Anim.JX = VG4_GET_AXIS_VALUE(X);
                VG4_Anim.JY = VG4_GET_AXIS_VALUE(Y);
                if (jc.wCaps & JOYCAPS_HASZ)
                    VG4_Anim.JZ = VG4_GET_AXIS_VALUE(Z);
                if (jc.wCaps & JOYCAPS_HASU)
                    VG4_Anim.JU = VG4_GET_AXIS_VALUE(U);
                if (jc.wCaps & JOYCAPS_HASV)
                    VG4_Anim.JV = VG4_GET_AXIS_VALUE(V);
                if (jc.wCaps & JOYCAPS_HASR)
                    VG4_Anim.JR = VG4_GET_AXIS_VALUE(R);

                if (jc.wCaps & JOYCAPS_HASPOV)
                {
                    if (ji.dwPOV == 0xFFFF)
                        VG4_Anim.JPOV = 0;
                    else
                        VG4_Anim.JPOV = ji.dwPOV / 4500 + 1;
                }
            }