procedure TQuake3BSP.SetVertexCoords(shaderId, numOfVerts : integer);
var shader : TShader;
i, j, nv : integer;
args : TWaveFunc;
startoff, off, wavesize, inc : single;
p, v, middle, d, h : TVector3f;
st : TVector2f;
const speed = 2.0;
begin
shader := FShaderManager[shaderId];
if shader.numOfDeformVertexes > 0 then begin
startoff := 0;
wavesize := 1;
for i := 0 to shader.numOfDeformVertexes-1 do begin
case shader.DeformVertexes[i].deformType of
DEFORMVERTEXES_WAVE :
begin
args.func := enWave(trunc(shader.DeformVertexes[i].values[1]));
args.base := shader.DeformVertexes[i].values[2];
args.amp := shader.DeformVertexes[i].values[3];
wavesize := shader.DeformVertexes[i].values[0];
startoff := shader.DeformVertexes[i].values[4];
args.freq := shader.DeformVertexes[i].values[5];
nv := numOfVerts;
for j := 0 to numOfVerts-1 do begin
v := inputBuffer[j].normal;
p := inputBuffer[j].Position; // buffer it
off := (p.x+p.y+p.z) / waveSize;
args.phase := startoff + off;
inc := Eval(args);
inputBuffer[j].Position.x := p.x + inc*v.x;
inputBuffer[j].Position.y := p.y + inc*v.y;
inputBuffer[j].Position.z := p.z + inc*v.z;
end;
end;
DEFORMVERTEXES_NORMAL :
begin
args.func := enWave(trunc(shader.DeformVertexes[i].values[1]));
args.base := shader.DeformVertexes[i].values[2];
args.amp := shader.DeformVertexes[i].values[3];
args.freq := shader.DeformVertexes[i].values[4];
nv := numOfVerts;
for j := 0 to numOfVerts-1 do begin
v := inputBuffer[j].normal;
p := inputBuffer[j].Position; // buffer it
off := (p.x+p.y+p.z) / (speed*waveSize);
args.phase := startoff + off;
inc := Eval(args);
inputBuffer[j].Normal.x := p.x + inc*v.x;
inputBuffer[j].Normal.y := p.y + inc*v.y;
inputBuffer[j].Normal.z := p.z + inc*v.z;
end;
end;
DEFORMVERTEXES_MOVE :
begin
args.func := enWave(trunc(shader.DeformVertexes[i].values[3]));
args.base := shader.DeformVertexes[i].values[4];
args.amp := shader.DeformVertexes[i].values[5];
args.phase := shader.DeformVertexes[i].values[6];
args.freq := shader.DeformVertexes[i].values[7];
for j := 0 to numOfVerts-1 do begin
inc := Eval(args);
inputBuffer[j].position.x := inputBuffer[j].position.x + inc*shader.DeformVertexes[i].values[0];
inputBuffer[j].position.y := inputBuffer[j].position.y + inc*shader.DeformVertexes[i].values[1];
inputBuffer[j].position.z := inputBuffer[j].position.z + inc*shader.DeformVertexes[i].values[2];
end;
end;
DEFORMVERTEXES_AUTOSPRITE :
begin
(*
glGetFloatv(GL_MODELVIEW_MATRIX, @cam_mat);
right := Make3DVector_f(cam_mat[0], cam_mat[4], cam_mat[8]);
up := Make3DVector_f(cam_mat[1], cam_mat[5], cam_mat[9]);
right := vec_normalize(right);
up := vec_normalize(up);
middle := Make3DVector_f(0,0,0);
// Compute middle of quad
for j := 0 to numOfVerts-1 do begin
middle.X := middle.X + inputBuffer[j].position.x;
middle.Y := middle.Y + inputBuffer[j].position.y;
middle.Z := middle.Z + inputBuffer[j].position.z;
end;
middle := vec_scale(middle, 1/numOfVerts);
//glColor3ub(255, 0, 0);
//glPointSize(2);
// middle point
//glBegin(GL_POINTS);
// glVertex3f(middle.X, middle.y, middle.Z);
//glEnd;
//glPointSize(4);
//glColor3ub(0, 0, 255);
//glBegin(GL_POINTS);
// world points
for j := 0 to numOfVerts-1 do begin
p.x := middle.X + (inputBuffer[j].Position.X - middle.x);
p.y := middle.y + (inputBuffer[j].Position.y - middle.y);
p.z := middle.z + (inputBuffer[j].Position.z - middle.z);
// glVertex3f(p.X, p.y, p.Z);
end;
//glEnd;
//glPointSize(8);
//glColor3ub(255, 255, 0);
//glBegin(GL_POINTS);
// billboard points
for j := 0 to numOfVerts-1 do begin
dx := (inputBuffer[j].Position.X - middle.x);
dy := (inputBuffer[j].Position.y - middle.y);
dz := (inputBuffer[j].Position.z - middle.z);
{ if (dx < 0) or (dz < 0) then
if (dx < 0) and (dz < 0) then
dx := -Sqrt(dx*dx + dz*dz)
else
dx := Sqrt(dx*dx + dz*dz)
else
dx := Sqrt(dx*dx + dz*dz);}
p := vec_add(vec_scale(up, dy), vec_scale(right, dx));
p := vec_add(middle, p);
// glVertex3f(p.X, p.y, p.Z);
inputBuffer[j].Position := p;
end;
//glEnd;
//glColor3ub(255, 255, 255);
*)
end;
DEFORMVERTEXES_BULGE :
begin
args.func := WF_SIN;
args.base := 0;
args.amp := shader.DeformVertexes[i].values[1];
args.freq := 1/(speed*shader.DeformVertexes[i].values[0]);
nv := numOfVerts;
for j := 0 to numOfVerts-1 do begin
st := inputBuffer[j].TextureCoord;
v := inputBuffer[j].normal;
p := inputBuffer[j].Position; // buffer it
args.phase := st.X*speed*shader.DeformVertexes[i].values[2];
inc := Eval(args);
inputBuffer[j].Position.x := p.x + inc*v.x;
inputBuffer[j].Position.y := p.y + inc*v.y;
inputBuffer[j].Position.z := p.z + inc*v.z;
end;
end;
end;
end;
end;
end;