1 registered members (AndrewAMD),
1,519
guests, and 8
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Terrain is now water - ideas to view from underneath?
[Re: bpc31]
#329461
06/20/10 09:03
06/20/10 09:03
|
Joined: Jan 2010
Posts: 40 Adelaide, Australia
Sub_Game
OP
Newbie
|
OP
Newbie
Joined: Jan 2010
Posts: 40
Adelaide, Australia
|
Sure, here is the code:
action water_terrain_animate()
{
int i; // number of vertices
int j;
var wave_cycle=2;
var wave_cycle_dir=0;
int vert_x;
int vert_y;
set(me,PASSABLE | POLYGON);
//my_under_waves.tilt = 90;
wait(1);
int num_vertices = ent_status(my_waves,0);
int num_x_vertices = ent_status(my_waves,2)+1;
int num_y_vertices = ent_status(my_waves,3)+1;
//ent_clone(me);
for(i = 0; i < 64; i++ )
{ for(j = 0; j < 64; j++ )
{ //vert_move[i][j][VERT_SPEED]=0;
water_vertices_data[i][j][VERT_SPEED]=wave_cycle+random(2)-1;
//vert_move[i][j][VERT_SPEED_CHANGE]=random(1)-0.5;
}
wave_cycle+=wave_cycle_dir;
if( wave_cycle>0 )wave_cycle_dir--;
else wave_cycle_dir++;
}
//vec_scale(my.scale_x,100);
//my.scale_z = my.scale_z/10;
//my.ambient = 100;
while(1)
{
//ent_animate(my,"Wave",anim_percentage, ANM_CYCLE);
//anim_percentage += time_step;
//if(anim_percentage>=100) anim_percentage = 0;
vert_x=0;
vert_y=0;
for (i = num_vertices; i>0; i--)
{ CONTACT* c = ent_getvertex(my_waves,NULL,i);
water_vertices_data[vert_x][vert_y][VERT_SPEED_CHANGE]=-(c.z- my_waves.z)/8;
//if(c.z<= my_waves.z ) vert_move[vert_x][vert_y][VERT_SPEED_CHANGE]++;
//else if(c.v.y> my_waves.z ) vert_move[vert_x][vert_y][VERT_SPEED_CHANGE]--;
water_vertices_data[vert_x][vert_y][VERT_SPEED]+=water_vertices_data[vert_x][vert_y][VERT_SPEED_CHANGE]/64;
//move the vertice
c.v.y += water_vertices_data[vert_x][vert_y][VERT_SPEED]*time_step; // raise the vertex (y is the height in DX coorcinates)
ent_setvertex(my_waves,c,i);
water_vertices_data[vert_x][vert_y][VERT_X] = c.x;
water_vertices_data[vert_x][vert_y][VERT_Y] = c.y;
water_vertices_data[vert_x][vert_y][VERT_Z] = c.z;
//effect(p_trail,1,vector(water_vertices_data[vert_x][vert_y][VERT_X], water_vertices_data[vert_x][vert_y][VERT_Y], 50),vector(0,0,10));
//effect(p_trail,1,vector(c.x, c.y, c.z),vector(0,10,10));
//advance the vert_x & vert_y (for my info)
vert_x++;
if(vert_x >= num_x_vertices)
{ vert_x=0;
vert_y++;
}
}
wait(1);
}
}
And the code to calculate the height at any given point:
function average_height(var av_x, var av_y, var vert_x, var vert_y)
{ var av_height = 0;
var side_x;
var side_y;
var calc_tl_x;
var calc_tl_y;
var calc_br_x;
var calc_br_y;
var calc_face_tri;
var calc_my_tri;
var calc_avheight_x;
var calc_avheight_y;
var calc_ratio;
var calc_length1;
var calc_length2;
vert_x = 0;
vert_y = 0;
while(1)
{ if(av_x > water_vertices_data[vert_x][vert_y][VERT_X])
{ break;
}
else vert_x++;
}
while(1)
{ if(av_y < water_vertices_data[vert_x][vert_y][VERT_Y])
{ break;
}
else vert_y++;
}
calc_tl_x = water_vertices_data[vert_x][vert_y-1][VERT_X];
calc_tl_y = water_vertices_data[vert_x][vert_y-1][VERT_Y];
calc_br_x = water_vertices_data[vert_x-1][vert_y][VERT_X];
calc_br_y = water_vertices_data[vert_x-1][vert_y][VERT_Y];
calc_face_tri = (calc_tl_x-calc_tl_y)-(calc_br_x-calc_br_y);
calc_my_tri = (calc_tl_x-calc_tl_y)-(av_x-av_y);
if(calc_my_tri > calc_face_tri )
{ side_x = av_x - av_y + water_vertices_data[vert_x-1][vert_y][VERT_Y];
calc_ratio = (side_x - water_vertices_data[vert_x-1][vert_y][VERT_X])/(water_vertices_data[vert_x][vert_y][VERT_X] - water_vertices_data[vert_x-1][vert_y][VERT_X]);
calc_avheight_x = (water_vertices_data[vert_x][vert_y][VERT_Z] - water_vertices_data[vert_x-1][vert_y][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y][VERT_Z];
side_y = av_y - av_x + water_vertices_data[vert_x][vert_y-1][VERT_X];
calc_ratio = (side_y - water_vertices_data[vert_x][vert_y-1][VERT_Y])/(water_vertices_data[vert_x][vert_y][VERT_Y] - water_vertices_data[vert_x][vert_y-1][VERT_Y]);
calc_avheight_y = (water_vertices_data[vert_x][vert_y][VERT_Z] - water_vertices_data[vert_x][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x][vert_y-1][VERT_Z];
calc_length1 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y][VERT_Y], 0),vector(water_vertices_data[vert_x][vert_y-1][VERT_X], side_y, 0 ));
calc_length2 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y][VERT_Y], 0),vector(av_x, av_y, 0 ));
calc_ratio = calc_length2/calc_length1;
av_height = -(calc_avheight_x-calc_avheight_y)*calc_ratio + calc_avheight_x;
}
else
{ side_x = av_x - av_y + water_vertices_data[vert_x-1][vert_y-1][VERT_Y];
calc_ratio = (side_x - water_vertices_data[vert_x-1][vert_y-1][VERT_X])/(water_vertices_data[vert_x][vert_y-1][VERT_X] - water_vertices_data[vert_x-1][vert_y-1][VERT_X]);
calc_avheight_x = (water_vertices_data[vert_x][vert_y-1][VERT_Z] - water_vertices_data[vert_x-1][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y-1][VERT_Z];
side_y = av_y - av_x + water_vertices_data[vert_x-1][vert_y-1][VERT_X];
calc_ratio = (side_y - water_vertices_data[vert_x-1][vert_y-1][VERT_Y])/(water_vertices_data[vert_x-1][vert_y][VERT_Y] - water_vertices_data[vert_x-1][vert_y-1][VERT_Y]);
calc_avheight_y = (water_vertices_data[vert_x-1][vert_y][VERT_Z] - water_vertices_data[vert_x-1][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y-1][VERT_Z];
//effect(p_debris,1,vector(water_vertices_data[vert_x][vert_y][VERT_X], side_y, calc_avheight_y),vector(0,0,10));
calc_length1 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y-1][VERT_Y], 0),vector(water_vertices_data[vert_x-1][vert_y-1][VERT_X], side_y, 0 ));
calc_length2 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y-1][VERT_Y], 0),vector(av_x, av_y, 0 ));
calc_ratio = calc_length2/calc_length1;
av_height = -(calc_avheight_x-calc_avheight_y)*calc_ratio + calc_avheight_x;
}
return av_height;
}
Kinda messy isn't it! Hope this helps.
|
|
|
|