#include <acknex.h>
#include <default.c>
#define viscosity skill1 //"thickness" of the fluid. 0=Water -> 100=EngineOil
#define vertex_wide skill2 //width of HMP in vertices
#define vertex_high skill3 //height of HMP in vertices
action fluid_action()
{
if(!ent_status(my,2)||!ent_status(my,3)) return; //not a terrain entity.
var size_x=ent_status(my,2)+1, size_y=ent_status(my,3)+1;
var x, y, f, tmp, ***data = malloc(sizeof(var)*2);
for(f=0; f<2; f++)
{ data[f] = malloc(sizeof(var)*size_x);
for(x=0; x<size_x; x++)
{ (data[f])[x] = malloc(sizeof(var)*size_y);
for(y=0; y<size_y; y++)
((data[f])[x])[y] = 0;
}
}
my.viscosity = 0;
my.vertex_wide = size_x;
my.vertex_high = size_y;
while(me)
{
f = !f;
for(y=1; y<(size_y-1); y++) for(x=1; x<(size_x-1); x++)
{
CONTACT* c = ent_getvertex(my,NULL,(y*size_x)+x+1);
if((c.v.y!=((data[0])[x])[y])&&(c.v.y!=((data[1])[x])[y]))
((data[f])[x])[y] = c.v.y;
else
{
tmp = ((data[!f])[x-1])[y] + ((data[!f])[x+1])[y] + ((data[!f])[x])[y-1] + ((data[!f])[x])[y+1];
((data[f])[x])[y] = (tmp / 2 - ((data[f])[x])[y]) * 0.95;
c.v.y = ((data[f])[x])[y];
ent_setvertex(my,c,(y*size_x)+x+1);
}
}
wait(-(25+my.viscosity)/1000);
}
//cleanup
for(x=0; x<size_x; x++) { free((data[0])[x]); free((data[1])[x]); }
free(data[0]); free(data[1]); free(data);
}
ENTITY* waterent;
function main()
{
video_mode = 10;
video_screen = 1;
level_load("");
vec_set(camera.x, vector(0,50,50));
vec_set(camera.pan, vector(270,-45,0));
waterent = ent_create("waterent.hmp", nullvector, fluid_action);
while(1)
{
if(key_cuu)
{
CONTACT* c = ent_getvertex(waterent,NULL,210);
c.v.y += 5; //YES .y IS correct in D3D terms
ent_setvertex(waterent,c,210);
while(key_cuu) wait(1);
}
wait(1);
}
}
//