- function GetNormal(v1,v2,v3:TVertex):TVertex;
- var
- v4,v5, nor: TVertex;
- lenght:GLfloat;
- begin
- v4.x:=V1.x-V2.x;
- v4.y:=V1.y-V2.y;
- v4.z:=V1.z-V2.z;
- v5.x:=V2.x-V3.x;
- v5.y:=V2.y-V3.y;
- v5.z:=V2.z-V3.z;
- nor.x:=v4.y*v5.z-v4.z*v5.y;
- nor.y:=v4.z*v5.x-v4.x*v5.z;
- nor.z:=v4.x*v5.y-v4.y*v5.x;
- lenght:=sqrt(nor.x*nor.x+nor.y*nor.y+nor.z*nor.z);
- nor.x:=nor.x/lenght;
- nor.y:=nor.y/lenght;
- nor.z:=nor.z/lenght;
- Result:=nor;
- end;
- constructor TTerrain.create(Width, Height: integer);
- var X,Z,K : integer ;
- Vnormals:array[0..7] of Tvertex;
- lenght:Glfloat;
- begin
- inherited create ;
- LoadTexture('data\mainmenu.tga',tex,FALSE);
- setLight ;
- MX := Width ;
- MZ := Height ;
- //setLength(ter,MX,MZ);
- for X := 0 to MX-1 do
- for Z := 0 to MZ-1 do
- begin
- ter[X ,Z].ver.x:=X ;
- ter[X ,Z].ver.y:=random(10)/20 ;
- ter[X ,Z].ver.z:=Z ;
- ter[X ,Z].u:=X/(MX-1); // ?
- ter[X ,Z].v:=Z/(MZ-1); // ?
- end;
- for X:=0 to MX-1 do
- for Z:=0 to MZ-1 do
- begin
- if (X>0) and (X<MX-1) and (Z>0)and(Z<MZ-1) then
- begin
- Vnormals[0]:=GetNormal(ter[X,Z].ver,ter[X+1,Z ].ver,ter[X+1,Z-1].ver);
- Vnormals[1]:=GetNormal(ter[X,Z].ver,ter[X+1,Z-1].ver,ter[X ,Z-1].ver);
- Vnormals[2]:=GetNormal(ter[X,Z].ver,ter[X+1,Z+1].ver,ter[X+1,Z ].ver);
- Vnormals[3]:=GetNormal(ter[X,Z].ver,ter[X ,Z+1].ver,ter[X+1,Z+1].ver);
- Vnormals[4]:=GetNormal(ter[X,Z].ver,ter[X-1,Z+1].ver,ter[X ,Z+1].ver);
- Vnormals[5]:=GetNormal(ter[X,Z].ver,ter[X-1,Z ].ver,ter[X-1,Z+1].ver);
- Vnormals[6]:=GetNormal(ter[X,Z].ver,ter[X-1,Z-1].ver,ter[X-1,Z ].ver);
- Vnormals[7]:=GetNormal(ter[X,Z].ver,ter[X ,Z-1].ver,ter[X-1,Z-1].ver);
- end;
- ter[X,Z].n:=Vnormals[0];
- for K:=1 to 7 do
- begin
- ter[X,Z].n.x:=(ter[X,Z].n.x+Vnormals[k].x);
- ter[X,Z].n.y:=(ter[X,Z].n.y+Vnormals[k].y);
- ter[X,Z].n.z:=(ter[X,Z].n.z+Vnormals[k].z);
- end;
- lenght:=sqrt(sqr(ter[X,Z].n.x)+sqr(ter[X,Z].n.y)+sqr(ter[X,Z].n.z));
- ter[X,Z].n.x:=ter[X,Z].n.x/lenght;
- ter[X,Z].n.y:=ter[X,Z].n.y/lenght;
- ter[X,Z].n.z:=ter[X,Z].n.z/lenght;
- setLength(poly,Length(poly)+1);
- poly[High(poly)].v[0]:=@ter[X ,Z ];
- poly[High(poly)].v[1]:=@ter[X+1,Z+1];
- poly[High(poly)].v[2]:=@ter[X+1,Z ];
- setLength(poly,Length(poly)+1);
- poly[High(poly)].v[0]:=@ter[X ,Z ];
- poly[High(poly)].v[1]:=@ter[X ,Z+1];
- poly[High(poly)].v[2]:=@ter[X+1,Z+1];
- end;
- for X:=0 to MX-1 do
- for Z:=0 to MZ-1 do
- begin
- if (X=0) and(Z>0)and(Z<MZ-1) then ter[X,Z].n:=ter[X+1,Z].n;
- if (X= MX-1)and(Z>0)and(Z<MZ-1) then ter[X,Z].n:=ter[X-1,Z].n;
- if (Z=0)and(X>0)and(X<MX-1) then ter[X,Z].n:=ter[X,Z+1].n;
- if (Z= MZ-1)and(X>0)and(X<MX-1) then ter[X,Z].n:=ter[X,Z-1].n;
- end;
- Form1.Panel1.Caption := IntToStr(Length(poly));
- end;
- procedure TTerrain.render(aCamera : TECamera);
- var X,I : integer ;
- begin
- glLoadIdentity ;
- aCamera.setMatrix ;
- begin
- glEnable(GL_CULL_FACE);
- glBindTexture(GL_TEXTURE_2D,tex);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glBegin(GL_TRIANGLES);
- for X:=0 to High(poly) do
- for i:=0 to 2 do
- with poly[X].v[i]^ do
- begin
- glNormal3fv(@n);
- glTexCoord2f(u,v);
- glVertex3fv(@ver);
- end;
- glEnd;
- end;
- end;