- procedure TF_TerrainRendering.SetupGL;
- const light_position : array[0..3] of TGLfloat = (-1.0, 1.0, 1.0, 0.0);
- mat_specular : array[0..3] of TGLfloat = (0.1, 0.1, 0.1, 1.0);
- mat_shininess : array[0..0] of TGLfloat = (0.0);
- mat_ambient : array[0..3] of TGLfloat = (0.7, 0.7, 0.7, 0.0);
- mat_diffuse : array[0..3] of TGLfloat = (0.8, 0.8, 0.8, 0.0);
- begin
- glClearColor(0.1, 0.1, 0.1, 0.1);
- glEnable(GL_DEPTH_TEST);
- glEnable(gl_Cull_Face);
- glCullface(GL_Back);
- glEnable(GL_TEXTURE_2D);
- glShadeModel(GL_SMOOTH);
- glMaterialfv(GL_FRONT, GL_SPECULAR, @mat_specular[0]);
- glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
- glMaterialfv(GL_FRONT, GL_AMBIENT, @mat_ambient[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, @mat_diffuse[0]);
- glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- end;
- procedure TF_TerrainRendering.IdleHandler(Sender: TObject; var Done: Boolean);
- begin
- Render;
- Done:= false;
- end;
- procedure TF_TerrainRendering.Render;
- begin
- Dreiecke := 0;
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(45.0, 1, NearClipping, FarClipping);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- glRotatef(XRotation, 1, 0, 0);
- glRotatef(YRotation, 0, 1, 0);
- glPushAttrib(GL_LIGHTING);
- glPopAttrib();
- glClear(GL_DEPTH_BUFFER_BIT);
- glTranslatef(-256, -200, -256);
- if IsLoaded and IsHeightmap then u_Rendering.ZeichneHeightmap(Aufloesung, Dreiecke)
- else if (not IsLoaded) and IsHeightmap then
- begin
- u_Rendering.LadeHeightmap(Aufloesung);
- IsLoaded := true;
- end;
- SwapBuffers(DC);
- end;
- procedure TF_TerrainRendering.FormCreate(Sender: TObject);
- begin
- YRotation := 0;
- XRotation := 0;
- IsLoaded := false;
- IsHeightmap := false;
- Aufloesung := TrB_MapResolution.Position;
- NearClipping := TrB_NearCLipping.Position;
- FarClipping := TrB_FarClipping.Position;
- u_PerlinNoise.Abstand := TrB_Intervall.Position;
- DC:= GetDC(Pnl_Terrain.Handle);
- if not InitOpenGL then Application.Terminate;
- RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
- ActivateRenderingContext(DC, RC);
- SetupGL;
- Application.OnIdle := IdleHandler;
- end;
- procedure TF_TerrainRendering.Btn_GenHeightmapClick(Sender: TObject);
- begin
- IsLoaded := false;
- IsHeightmap := false;
- u_PerlinNoise.Blur(u_PerlinNoise.Laenge, u_PerlinNoise.Abstand); // Heightmap aufbauen
- Img_Heightmap.Picture.Bitmap := u_PerlinNoise.Heightmap; // Heightmap zeichnen
- Btn_SaveHeightmap.Enabled := true;
- IsHeightmap := true;
- end;