123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- unit fDiffuseShader;
- interface
- uses
- System.SysUtils,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.ExtCtrls,
- Vcl.StdCtrls,
- GLS.Texture,
- GLS.Cadencer,
- GLS.SceneViewer,
- GLS.Scene,
- GLS.Objects,
- GLS.Graph,
- GLS.VectorTypes,
- GLS.Context,
- GLS.VectorGeometry,
- GLS.GeomObjects,
- GLS.VectorFileObjects,
- GLSL.Shader,
- GLSL.DiffuseSpecularShader,
- GLSL.CustomShader,
- GLSL.UserShader,
- GLS.SimpleNavigation,
-
- GLS.Material,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.Utils,
- GLS.FileMD2,
- GLS.FileMS3D,
- GLS.File3DS,
- Formats.DDSImage;
- type
- TFormDiffuseShader = class(TForm)
- Scene: TGLScene;
- Viewer: TGLSceneViewer;
- Cadencer: TGLCadencer;
- Camera: TGLCamera;
- Light: TGLLightSource;
- LightCube: TGLDummyCube;
- GLSphere1: TGLSphere;
- GLXYZGrid1: TGLXYZGrid;
- GLArrowLine1: TGLArrowLine;
- Panel1: TPanel;
- LightMovingCheckBox: TCheckBox;
- GUICube: TGLDummyCube;
- WorldCube: TGLDummyCube;
- Fighter: TGLActor;
- Teapot: TGLActor;
- Sphere_big: TGLActor;
- Sphere_little: TGLActor;
- MaterialLibrary: TGLMaterialLibrary;
- ShaderEnabledCheckBox: TCheckBox;
- TurnPitchrollCheckBox: TCheckBox;
- RealisticSpecularCheckBox: TCheckBox;
- LightCube2: TGLDummyCube;
- Light2: TGLLightSource;
- MultiLightShaderCheckBox: TCheckBox;
- DiffuseSpecularShader: TGLSLDiffuseSpecularShader; GLSimpleNavigation1: TGLSimpleNavigation;
- EnableFogCheckBox: TCheckBox;
- GLArrowLine2: TGLArrowLine;
- procedure FormCreate(Sender: TObject);
- procedure CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
- procedure LightCubeProgress(Sender: TObject; const deltaTime,
- newTime: Double);
- procedure ShaderEnabledCheckBoxClick(Sender: TObject);
- procedure RealisticSpecularCheckBoxClick(Sender: TObject);
- procedure MultiLightShaderCheckBoxClick(Sender: TObject);
- procedure EnableFogCheckBoxClick(Sender: TObject);
- end;
- var
- FormDiffuseShader: TFormDiffuseShader;
- MultiLightShader: TGLSLMLDiffuseSpecularShader;
- implementation
- {$R *.dfm}
- procedure TFormDiffuseShader.FormCreate(Sender: TObject);
- begin
- // First load models.
- SetGLSceneMediaDir();
- Fighter.LoadFromFile('waste.md2'); //Fighter
- Fighter.SwitchToAnimation(0, True);
- Fighter.AnimationMode := aamLoop;
- Fighter.Scale.Scale(3);
- Teapot.LoadFromFile('Teapot.3ds'); //Teapot (no texture coordinates)
- Teapot.Scale.Scale(0.8);
- Sphere_big.LoadFromFile('Sphere_big.3DS'); //Sphere_big
- Sphere_big.Scale.Scale(70);
- Sphere_little.LoadFromFile('Sphere_little.3ds'); //Sphere_little
- Sphere_little.Scale.Scale(4);
- MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('Earth.jpg');
- MaterialLibrary.LibMaterialByName('Fighter').Material.Texture.Image.LoadFromFile('Waste.jpg');
- MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
- MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
- // This is how a shader is created in runtime.
- MultiLightShader := TGLSLMLDiffuseSpecularShader.Create(Self);
- // Disable fog.
- EnableFogCheckBoxClick(nil);
- end;
- procedure TFormDiffuseShader.CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
- begin
- Viewer.Invalidate;
- if TurnPitchrollCheckBox.Checked then
- begin
- Sphere_big.Pitch(40 * deltaTime);
- Fighter.Turn(40 * deltaTime);
- Sphere_little.Roll(40 * deltaTime);
- Teapot.Roll(-20 * deltaTime);
- end;
- end;
- procedure TFormDiffuseShader.LightCubeProgress(Sender: TObject; const deltaTime,
- newTime: Double);
- begin
- if LightMovingCheckBox.Checked then
- LightCube.MoveObjectAround(Camera.TargetObject, sin(NewTime) * deltaTime * 10, deltaTime * 20);
- end;
- procedure TFormDiffuseShader.ShaderEnabledCheckBoxClick(Sender: TObject);
- begin
- DiffuseSpecularShader.Enabled := ShaderEnabledCheckBox.Checked;
- MultiLightShader.Enabled := ShaderEnabledCheckBox.Checked;
- end;
- procedure TFormDiffuseShader.RealisticSpecularCheckBoxClick(Sender: TObject);
- begin
- DiffuseSpecularShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
- MultiLightShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
- if DiffuseSpecularShader.RealisticSpecular then
- begin
- MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 20;
- MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 20;
- end
- else
- begin
- MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 8;
- MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 8;
- end;
- end;
- procedure TFormDiffuseShader.MultiLightShaderCheckBoxClick(Sender: TObject);
- begin
- if MultiLightShaderCheckBox.Checked then
- begin
- MaterialLibrary.LibMaterialByName('Earth').Shader := MultiLightShader;
- MaterialLibrary.LibMaterialByName('Fighter').Shader := MultiLightShader;
- end
- else
- begin
- MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
- MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
- end;
- Light2.Shining := MultiLightShaderCheckBox.Checked;
- LightCube2.Visible := MultiLightShaderCheckBox.Checked;
- end;
- procedure TFormDiffuseShader.EnableFogCheckBoxClick(Sender: TObject);
- begin
- if EnableFogCheckBox.Checked then
- begin
- Viewer.Buffer.FogEnable := True;
-
- DiffuseSpecularShader.NotifyChange(Self);
- MultiLightShader.NotifyChange(Self);
- end
- else
- begin
- Viewer.Buffer.FogEnable := False;
- DiffuseSpecularShader.NotifyChange(Self);
- MultiLightShader.NotifyChange(Self);
- end;
- end;
- end.
|