Tutorial 05 - Using distortion mesh
In this tutorial we will learn how to use distortion mesh,
a technique allowing you to create effects like water, lenses, page wraps,
various twists and even real-time morphing. In this tutorial we use static
texture, but you could render your whole game scene onto a texture using
render targets functionality and then put it on the screen via distortion
mesh to achieve some cool real-time effects.
First, we include the required headers and declare the variables to handle
our texture and distortion mesh:
#include <hge.h>
#include <hgedistort.h>
#include <math.h>
HGE *hge = 0;
HTEXTURE tex;
hgeDistortionMesh *dis;
Then we declare some constants we will use.
Here we define the mesh resolution and on-screen position:
const int nRows=16;
const int nCols=16;
const float meshx=144;
const float meshy=44;
In the FrameFunc (frame function) we need some variables too.
A couple of them for timing and the rest are used for displacements calculation:
float dt;
static float t=0.0f;
int i, j, col;
Well, here's the tricky part. To animate our mesh we calculate
it's displacements and coloring based on time elapsed:
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);
}
And finally we render the mesh to the screen within the RenderFunc:
hge->Gfx_BeginScene();
hge->Gfx_Clear(0);
dis->Render(meshx, meshy);
hge->Gfx_EndScene();
In the WinMain function we should load a texture and initialize the mesh:
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);
And during shutdown we should delete the texture and the mesh from memory:
delete dis;
hge->Texture_Free(tex);
Voila! It's that simple.
The complete source code with detailed comments for this tutorial you may find in the folder
tutorials\tutorial05. The required media files you'll find in the folder tutorials\precompiled.
|