implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DC:=GetDC(panel1.Handle);
if not InitOpenGL
then showmessage('
Init OpenGL fehlgeschlagen!');
RC:=CreateRenderingContext(
DC,[opDoubleBuffered],32,24,0,0,0,0);
ActivateRenderingContext(
DC, RC);
glClearColor(0, 0, 0, 0);
glEnable(GL_DEPTH_TEST);
fTexture := TglBitmap2D.Create('
myTex\floor.JPG');
// Instanz erstellen und Datei laden
fTexture.GenTexture;
// geladene Textur an OpenGL übergeben
end;
procedure TForm1.Render;
//Hier wird wohl der Fehler liegen....
var x,z:integer;
u,v:real;
begin
glClear(GL_COLOR_BUFFER_BIT
or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight,NEAR_CLIPPING,FAR_CLIPPING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-COUNT_X/2, -3, -14);
glRotatef(45,1,0,0);
fTexture.Bind;
U:=1/COUNT_X; V:=1/COUNT_Z;
{Hier werden Reihe für Reihe die Quads erstellt.
Bei den nebeneinander liegenden Quads klappt es mit gemeinsamen Eckpunkten,
bei den "hintereinander" liegenden (Z-Richtung) klappt es nicht.
}
for z:=0
to COUNT_Z-1
do
begin
glPushMatrix;
for x:=0
to COUNT_X-1
do
begin
glBegin(GL_QUADS);
glTexCoord2f(U*x,V*(z+1));
glVertex3f(0, GetTheFuckingY(x,z) ,0);
//1 "vorne Links"
glTexCoord2f(U*x,V*z);
glVertex3f(0, GetTheFuckingY(x,z+1) ,1);
//2 "hinten Links"
glTexCoord2f(U*(x+1),V*z);
glVertex3f(1, GetTheFuckingY(x+1,z+1) ,1);
//3 "hinten Rechts"
glTexCoord2f(U*(x+1),V*(z+1));
glVertex3f(1, GetTheFuckingY(x+1,z) ,0);
//4 "vorne Rechts"
glEnd;
glTranslatef(1,0,0);
{SwapBuffers(DC);Ich kann leider nicht sehen wie der Fehler entsteht :-D
sleep(1000); }
end;
glPopMatrix;
glTranslatef(0,0,-1);
end;
SwapBuffers(
DC);
end;
function TForm1.GetTheFuckingY(x,z:integer):real;
//Gibt aus dem Memo namens L aus der Zeile z den x'ten Wert zurück
// (gibt die richtigen Werte zurück)
var s:
string;
i,j:integer;
begin
s:=L.Lines[z];
i:=pos('
!'+inttostr(x),s);
while (s[i]<>'
-')
do i:=i+1; i:=i+1;
j:=i;
while s[j]<>'
;'
do j:=j+1; j:=j-i;
result:=strtofloat(copy(s,i,j))/1000;
//(durch 1000 damit die Größe passt)
end;
procedure TForm1.Button3Click(Sender: TObject);
//11*11 Punkte erzeugen
var x,z:integer;
begin
L.Clear;
Randomize;
for z:=0
to COUNT_Z
do
begin
L.lines.add('
');
for x:=0
to COUNT_X
do L.Lines[z]:=L.Lines[z]+'
!'+inttostr(x)+'
-'+inttostr(Random(LIM))+'
;';
end;
end;