Пример 05 - Использование сетки искажения

В этом примере мы научимся как использовать сетку искажения, техника, позволяющая создавать эффекты типа воды, линз, скручивания страницы, различные изгибы и даже морфинг в реальном времени. В этом примере мы используем статическую текстуру, но вы можете в своей игре нарисовать в текстуру целую сцену, используя цель рендеринга и затем вывести на экран с помощью сетки искажения, чтобы достичь прикольных эффектов в реальном времени.

        

Для начала мы подключим требуемые заголовки и объявим переменные для работы с нашей текстурой и сеткой искажения:

#include <hge.h>
#include <hgedistort.h>
#include <math.h>

HGE *hge = 0;
HTEXTURE tex;
hgeDistortionMesh *dis;

Затем мы объявим несколько констант, которые нам потребуются. Здесь мы зададим разрешение сетки и положение на экране:

const int nRows=16;
const int nCols=16;

const float meshx=144;
const float meshy=44;

В FrameFunc (функции кадра) нам тоже понадобятся перменные. Некоторые из них нужны для работы со временем и остальные для вычисления перемещений:

  float dt;
  static float t=0.0f;
  int i, j, col;

Ну, вот здесь, самая хитрая часть. Чтобы анимировать нашу сетку, вычислим ее перемещение и цвета, основываясь на времени, которое прошло с предыдущего обновления:

  dt=hge->Timer_GetDelta();
  t+=dt;

  for(i=0; i<nRows; i++)
    for(j=1; j<nCols-1; j++)
    {
      dis->SetDisplacement(j, i, cosf(t*5+j/2)*15,0,HGEDISP_NODE);
      col=int((cosf(t*5+(i+j)/2)+1)*35);
      dis->SetColor(j, i, 0xFF<<24 | col<<16 | col<<8 | col);
    }

И наконец, мы рисуем сетку на экране:

  hge->Gfx_BeginScene();
  hge->Gfx_Clear(0);
  dis->Render(meshx, meshy);
  hge->Gfx_EndScene();

В функции WinMain мы должны загрузить текстуру и проинициализировать сетку:

  tex=hge->Texture_Load("texture.jpg");
  dis=new hgeDistortionMesh(nCols, nRows);
  dis->SetTexture(tex);
  dis->SetTextureRect(0, 0, 512, 512);
  dis->SetBlendMode(BLEND_COLORADD|BLEND_ALPHABLEND|BLEND_ZWRITE);
  dis->Clear(0xFF000000);

И в конце приложения, необходимо удалить текстуру и сетку из памяти:

  delete dis;
  hge->Texture_Free(tex);

Вуаля! Насколько все просто.

Полный исходный код с детальными комментариями для этого примера можно найти в директории tutorials\tutorial05. Требуемые медиа файлы можно найти в директории tutorials\precompiled.