From 89f88b0918aa5e972f83b9ceadfcaff629ce09d3 Mon Sep 17 00:00:00 2001 From: dpethes Date: Mon, 6 Jul 2015 18:35:34 +0200 Subject: [PATCH] terrain viewer: simple lighting with per-face normals --- terrain_viewer/terrain_mesh.pas | 32 ++++++++++++++++++++++++++++++- terrain_viewer/terrain_viewer.pas | 12 +++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/terrain_viewer/terrain_mesh.pas b/terrain_viewer/terrain_mesh.pas index 495681f..9a72375 100644 --- a/terrain_viewer/terrain_mesh.pas +++ b/terrain_viewer/terrain_mesh.pas @@ -136,15 +136,45 @@ begin GenTexture(i); end; + +//cross product + normalize +function GetNormalv(const v0, v1, v2: TVertex3f): TVertex3f; +var + a, b: TVertex3f; + len: single; +begin + a.x := v0.x - v1.x; + a.y := v0.y - v1.y; + a.z := v0.z - v1.z; + + b.x := v1.x - v2.x; + b.y := v1.y - v2.y; + b.z := v1.z - v2.z; + + result.x := (a.y * b.z) - (a.z * b.y); + result.y := (a.z * b.x) - (a.x * b.z); + result.z := (a.x * b.y) - (a.y * b.x); + + len := sqrt( sqr(result.x) + sqr(result.y) + sqr(result.z) ); + if len = 0 then len := 1; + + result.x /= len; + result.y /= len; + result.z /= len; +end; + + //draw vertices from each block procedure TTerrainMesh.DrawGL(opts: TRenderOpts); procedure RenderBlock(var blk: TTerrainBlock); procedure RenderTri(i0, i1, i2:integer); var - v: TVertex3f; + v, n: TVertex3f; begin + n := GetNormalv(blk.vertices[i0], blk.vertices[i1], blk.vertices[i2]); v := blk.vertices[i0]; + glNormal3f(n.x, n.y, n.z); glTexCoord2f(v.u, v.v); glVertex3fv(@v); v := blk.vertices[i1]; diff --git a/terrain_viewer/terrain_viewer.pas b/terrain_viewer/terrain_viewer.pas index 76c02a2..b644667 100644 --- a/terrain_viewer/terrain_viewer.pas +++ b/terrain_viewer/terrain_viewer.pas @@ -78,6 +78,10 @@ end; // initial parameters procedure InitGL; +const + LightAmbient: array[0..3] of single = (0.5, 0.5, 0.5, 1); + LightDiffuse: array[0..3] of single = (1, 1, 1, 1); + LightPosition: array[0..3] of single = (1, 1, 0, 1); var ogl_info: string; begin @@ -86,7 +90,7 @@ begin ogl_info := 'version: ' + glGetString(GL_VERSION); writeln(ogl_info); - //glShadeModel( GL_SMOOTH ); // Enable smooth shading + glShadeModel( GL_SMOOTH ); // Enable smooth shading glClearColor( 0.0, 0.0, 0.0, 0.0 ); glClearDepth( 1.0 ); // Depth buffer setup glEnable( GL_DEPTH_TEST ); // Enables Depth Testing @@ -97,6 +101,12 @@ begin //glCullFace( GL_BACK ); glEnable(GL_TEXTURE_2D); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); + glLightfv(GL_LIGHT0, GL_POSITION,LightPosition); end;