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;
procedure TQuake3BSP.SetVertexColors(shaderId, stageId, numOfVerts : integer);
var shader : TShader;
i, j : integer;
c : integer;
begin
shader := FShaderManager[shaderId];
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := inputBuffer[j].Color[0]; // red
colorBuffer[j, 1] := inputBuffer[j].Color[1]; // green
colorBuffer[j, 2] := inputBuffer[j].Color[2]; // blue
colorBuffer[j, 3] := inputBuffer[j].Color[3]; // gamma
end;
if shader.numOfLayers > 0 then begin
if shader.Layers[stageId].numOfrgbGen > 0 then begin
case shader.Layers[stageId].rgbGen[0].rgbGType of
rgbGen_IdentityLightning :
begin
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := 127; // red
colorBuffer[j, 1] := 127; // green
colorBuffer[j, 2] := 127; // blue
colorBuffer[j, 3] := 255; // gamma
end;
end;
rgbGen_Identity :
begin
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := 255; // red
colorBuffer[j, 1] := 255; // green
colorBuffer[j, 2] := 255; // blue
colorBuffer[j, 3] := 255; // gamma
end;
end;
rgbGen_Wave :
begin
c := Round(255*Eval(shader.Layers[stageId].rgbGen[0].Wave));
if c < 0 then c := 0;
if c > 255 then c := 255;
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := c; // red
colorBuffer[j, 1] := c; // green
colorBuffer[j, 2] := c; // blue
colorBuffer[j, 3] := 255; // gamma
end;
end;
else begin
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := inputBuffer[j].Color[0]; // red
colorBuffer[j, 1] := inputBuffer[j].Color[1]; // green
colorBuffer[j, 2] := inputBuffer[j].Color[2]; // blue
colorBuffer[j, 3] := inputBuffer[j].Color[3]; // gamma
end;
end;
end;
end
else begin
// no rgbgen use vertex colors
for j := 0 to numOfVerts-1 do begin
colorBuffer[j, 0] := inputBuffer[j].Color[0]; // red
colorBuffer[j, 1] := inputBuffer[j].Color[1]; // green
colorBuffer[j, 2] := inputBuffer[j].Color[2]; // blue
colorBuffer[j, 3] := inputBuffer[j].Color[3]; // gamma
end;
end;
end;
end;
procedure TQuake3BSP.SetTextureCoordinates(shaderId, stageId, numOfVerts : integer);
var i, j : integer;
shader : TShader;
dir : TVector3f;
// tcmod
angulo, cost, sint, factor : single;
v, scroll : TVector2f;
v2 : TVector3f;
now : single;
frame : integer;
begin
shader := FShaderManager[shaderId];
(* for j := 0 to numOfVerts-1 do
texCoordBuffer[j] := inputBuffer[j].TextureCoord;
*)
if shader.numOfLayers > 0 then begin
//Animation
if shader.Layers[StageID].animFreq <> 0 then begin
frame := Trunc(gTimer.TotalTime *shader.Layers[StageID].animFreq) mod shader.Layers[StageID].numOfTextures;
if frame >= shader.Layers[StageID].numOfTextures then
frame := 0;
Shader.Layers[StageID].curTexture := frame;
end
else
Shader.Layers[StageID].curTexture := 0;
// tcGen ******************************************************************
case shader.Layers[stageId].tcGen of
TCGEN_LIGHTMAP :
begin
for j := 0 to numOfVerts-1 do
texCoordBuffer[j] := inputBuffer[j].LightmapCoord;
end;
TCGEN_ENVIRONMENT :
begin
// wrong calc !!!!
for j := 0 to numOfVerts-1 do begin
dir := SubtractVector(inputBuffer[j].Position, Camera.Position);//vec_sub(inputBuffer[j].Position, Camera.Position);
//dir := Normalize(dir);//vec_normalize(dir);
Normalize(dir);
{ dir.x := dir.x + inputBuffer[j].Normal.X;
dir.y := dir.y + inputBuffer[j].Normal.Y;
texCoordBuffer[j].X := dir.x;
texCoordBuffer[j].Y := dir.y;}
dir.x := dir.x + inputBuffer[j].Normal.X;
dir.z := dir.z + inputBuffer[j].Normal.z;
texCoordBuffer[j].X := dir.x;
texCoordBuffer[j].y := dir.z;
end;
end;
else
for j := 0 to numOfVerts-1 do
texCoordBuffer[j] := inputBuffer[j].TextureCoord;
end;
// tcMod *******************************************************************
if shader.Layers[stageId].numOftcMods > 0 then begin
for i := 0 to numOfVerts-1 do begin
for j := 0 to shader.layers[stageId].numOftcMods-1 do begin
case shader.Layers[stageId].tcMods[j].modType of
TCMOD_ROTATE :
begin
angulo := shader.Layers[stageId].tcMods[j].Values[0]*gTimer.TotalTime/M_180_PI;
cost := cos(angulo);
sint := sin(angulo);
v := texCoordBuffer[i];
v.x := v.x - 0.5;
v.y := v.y + 0.5;
texCoordBuffer[i].x := v.x*cost - v.y*sint + 0.5;
texCoordBuffer[i].y := v.x*sint + v.y*cost + 0.5;
end;
TCMOD_SCALE :
begin
texCoordBuffer[i].x := (texCoordBuffer[i].x-0.5) * shader.Layers[stageId].tcMods[j].Values[0] + 0.5;
texCoordBuffer[i].y := (texCoordBuffer[i].y-0.5) * shader.Layers[stageId].tcMods[j].Values[1] + 0.5;
end;
TCMOD_SCROLL :
begin
scroll.x := shader.Layers[stageId].tcMods[j].Values[0]*gTimer.TotalTime;
scroll.y := shader.Layers[stageId].tcMods[j].Values[1]*gTimer.TotalTime;
texCoordBuffer[i].x := texCoordBuffer[i].x + scroll.x;
texCoordBuffer[i].y := texCoordBuffer[i].y - scroll.y;
end;
TCMOD_STRETCH :
begin
factor := (1/Eval(shader.Layers[StageID].tcMods[j].Wave));
texCoordBuffer[i].x := (texCoordBuffer[i].x - 0.5) * factor + 0.5;
texCoordBuffer[i].y := (texCoordBuffer[i].y - 0.5) * factor + 0.5;
end;
TCMOD_TRANSFORM :
begin
v := texCoordBuffer[i];
texCoordBuffer[i].x := v.x*shader.Layers[stageId].tcMods[j].Values[0] + v.y*shader.Layers[stageId].tcMods[j].Values[2] + shader.Layers[stageId].tcMods[j].Values[4];
texCoordBuffer[i].y := v.x*shader.Layers[stageId].tcMods[j].Values[1] + v.y*shader.Layers[stageId].tcMods[j].Values[3] + shader.Layers[stageId].tcMods[j].Values[5];
end;
TCMOD_TURB :
begin
// v2 := inputBuffer[i].Position;
v2.x := texCoordBuffer[i].x;
v2.y := texCoordBuffer[i].y;
v2.z := inputBuffer[i].Position.z;
texCoordBuffer[i].x := texCoordBuffer[i].x + Sin((v2.x+v2.z)*0.1*shader.Layers[stageId].tcMods[j].Values[3] + gTimer.TotalTime + shader.Layers[stageId].tcMods[j].Values[2])*shader.Layers[stageId].tcMods[j].Values[1]*0.5;
texCoordBuffer[i].y := texCoordBuffer[i].y + Sin((v2.y )*0.1*shader.Layers[stageId].tcMods[j].Values[3] + gTimer.TotalTime + shader.Layers[stageId].tcMods[j].Values[2])*shader.Layers[stageId].tcMods[j].Values[1]*0.5;
// v := texCoordBuffer[i];
// texCoordBuffer[i].x := texCoordBuffer[i].x + Sin((v.x )*0.1*shader.Layers[stageId].tcMods[j].Values[3] + gTimer.TotalTime + shader.Layers[stageId].tcMods[j].Values[2])*shader.Layers[stageId].tcMods[j].Values[1]*0.5;
// texCoordBuffer[i].y := texCoordBuffer[i].y + Sin((v.y )*0.1*shader.Layers[stageId].tcMods[j].Values[3] + gTimer.TotalTime + shader.Layers[stageId].tcMods[j].Values[2])*shader.Layers[stageId].tcMods[j].Values[1]*0.5;
end;
end;
end;
end;
end;
end;
end;
procedure TQuake3BSP.SetDefaults;
begin
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDepthMask(true);
glDisable(GL_BLEND);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// glDisable(GL_COLOR);
if MultiTexture then begin
glActiveTexture(GL_TEXTURE1);
glDisableClientState(GL_COLOR_ARRAY);
glActiveTexture(GL_TEXTURE0);
end;
glDisableClientState(GL_COLOR_ARRAY);
glColor3ub(255,255,255);
glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);
end;