| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463 |
- unit fCloudSkyD;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- System.SysUtils,
- System.Variants,
- System.Classes,
- System.Math,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.StdCtrls,
- Vcl.ExtCtrls,
- GLS.Scene,
- GLS.Objects,
- GLS.SceneViewer,
- GLS.AsyncTimer,
- GLS.Cadencer,
- GLS.VectorGeometry,
- GLS.SkyDome,
- GLS.Texture,
- GLS.FileTGA,
- GLS.Keyboard,
- GLS.Material,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.Utils,
- GLS.SimpleNavigation,
- GLS.CgShader;
- type
- TMainForm = class(TForm)
- GLScene: TGLScene;
- GLSV: TGLSceneViewer;
- dc_cam: TGLDummyCube;
- cam: TGLCamera;
- Cadencer: TGLCadencer;
- Timer: TGLAsyncTimer;
- SbBackground: TGLSkyBox;
- MatLib: TGLMaterialLibrary;
- CgBackground: TCgShader;
- CgClouds: TCgShader;
- SbClouds: TGLSkyBox;
- Moons: TGLDummyCube;
- sprSecunda: TGLSprite;
- sprMasser: TGLSprite;
- CgMasser: TCgShader;
- CgSecunda: TCgShader;
- CgSun: TCgShader;
- sprSun: TGLSprite;
- Panel1: TPanel;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- Label5: TLabel;
- GLSimpleNavigation1: TGLSimpleNavigation;
- PanelFPS: TPanel;
- procedure CgCloudsApplyVP(CgProgram: TCgProgram; Sender: TObject);
- procedure CgSunUnApplyFP(CgProgram: TCgProgram);
- procedure CgSunApplyFP(CgProgram: TCgProgram; Sender: TObject);
- procedure CgSecundaUnApplyFP(CgProgram: TCgProgram);
- procedure CgSecundaApplyFP(CgProgram: TCgProgram; Sender: TObject);
- procedure CgMasserUnApplyFP(CgProgram: TCgProgram);
- procedure CgMasserApplyFP(CgProgram: TCgProgram; Sender: TObject);
- procedure CgCloudsUnApplyFP(CgProgram: TCgProgram);
- procedure CgCloudsApplyFP(CgProgram: TCgProgram; Sender: TObject);
- procedure CgBackgroundUnApplyFP(CgProgram: TCgProgram);
- procedure CgBackgroundApplyFP(CgProgram: TCgProgram; Sender: TObject);
- procedure CadencerProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- procedure FormCreate(Sender: TObject);
- procedure GLSVMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure GLSVMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
- WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
- procedure TimerTimer(Sender: TObject);
- private
- mx, my: Integer;
- bg_w1, bg_w2, c_w1, c_w2, m_w, a_w: single;
- DayMode, WeatherMode: byte;
- procedure HandleKeys;
- procedure AssignMaterials;
- procedure CreateMaterials;
- public
- end;
- var
- MainForm: TMainForm;
- dirSelf, dirTextures, dirShaders: TFileName;
- const
- Coeff = 0.1;
- // ---------------------------------------------------------
- implementation
- {$R *.dfm}
- // ---------------------------FormCreate--------------------
- procedure TMainForm.FormCreate(Sender: TObject);
- begin
- // GetDir(0, dirSelf);
- dirSelf := GetCurrentAssetPath(); // current assets
- dirTextures := dirSelf + '\texture\';
- dirShaders := dirSelf + '\shader\';
- CreateMaterials;
- AssignMaterials;
- bg_w1 := 1;
- bg_w2 := 0;
- c_w1 := 1;
- c_w2 := 0;
- m_w := 0; // moons
- a_w := 0; // ambient
- WeatherMode := 0;
- ClientWidth := 1024;
- ClientHeight := 712;
- Position := poScreenCenter;
- GLSV.Align := alClient;
- Timer.Enabled := True;
- end;
- // ---------------------------CreateMaterials---------------
- procedure TMainForm.CreateMaterials;
- begin
- CgBackground.FragmentProgram.LoadFromFile
- (dirShaders + 'fragment_bkground.cg');
- CgClouds.FragmentProgram.LoadFromFile(dirShaders + 'fragment_clouds.cg');
- CgMasser.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
- CgSecunda.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
- CgSun.FragmentProgram.LoadFromFile(dirShaders + 'fragment_moon.cg');
- // day background
- MatLib.AddTextureMaterial('day', dirTextures + 'tx_day.tga');
- // night background
- MatLib.AddTextureMaterial('night', dirTextures + 'tx_night.tga');
- // main skybox material
- with MatLib.Materials.Add do
- begin
- Name := 'background';
- Shader := CgBackground;
- end;
- // clouds
- MatLib.AddTextureMaterial('clouds_clear', dirTextures + 'tx_sky_clear.tga');
- MatLib.AddTextureMaterial('clouds_cloudy', dirTextures + 'tx_sky_cloudy.tga');
- // main clouds material
- with MatLib.Materials.Add do
- begin
- Name := 'clouds';
- Material.BlendingMode := bmTransparency;
- Shader := CgClouds;
- end;
- // moons
- MatLib.AddTextureMaterial('masser', dirTextures + 'tx_masser_three_wan.tga');
- MatLib.AddTextureMaterial('secunda',
- dirTextures + 'tx_secunda_three_wan.tga');
- MatLib.AddTextureMaterial('sun', dirTextures + 'tx_sun.tga');
- with MatLib.Materials.Add do
- begin
- Name := 'moon_masser';
- Material.BlendingMode := bmTransparency;
- Shader := CgMasser;
- end;
- with MatLib.Materials.Add do
- begin
- Name := 'moon_secunda';
- Material.BlendingMode := bmTransparency;
- Shader := CgSecunda;
- end;
- with MatLib.Materials.Add do
- begin
- Name := 'moon_sun';
- Material.BlendingMode := bmTransparency;
- Shader := CgSun;
- end;
- end;
- // ---------------------------AssignMaterials---------------
- procedure TMainForm.AssignMaterials;
- begin
- with SbBackground do
- begin
- MaterialLibrary := MatLib;
- MatNameTop := 'background';
- MatNameRight := 'background';
- MatNameFront := 'background';
- MatNameLeft := 'background';
- MatNameBack := 'background';
- MatNameBottom := 'background';
- end;
- with SbClouds do
- begin
- MaterialLibrary := MatLib;
- MatNameClouds := 'clouds';
- end;
- with sprMasser.Material do
- begin
- MaterialLibrary := MatLib;
- LibMaterialName := 'moon_masser';
- end;
- with sprSecunda.Material do
- begin
- MaterialLibrary := MatLib;
- LibMaterialName := 'moon_secunda';
- end;
- with sprSun.Material do
- begin
- MaterialLibrary := MatLib;
- LibMaterialName := 'moon_sun';
- end;
- end;
- // ---------------------------GLSVMouseDown-----------------
- procedure TMainForm.GLSVMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- mx := X;
- my := Y;
- end;
- // ---------------------------GLSVMouseMove-----------------
- procedure TMainForm.GLSVMouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- begin
- if Shift = [ssRight] then
- cam.MoveAroundTarget(my - Y, mx - X);
- mx := X;
- my := Y;
- end;
- // ---------------------------FormMouseWheel----------------
- procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
- WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
- begin
- cam.AdjustDistanceToTarget(Power(1.1, WheelDelta / 100));
- end;
- // ---------------------------TimerTimer--------------------
- procedure TMainForm.TimerTimer(Sender: TObject);
- begin
- PanelFPS.Caption := GLSV.FramesPerSecondText(2);
- GLSV.ResetPerformanceMonitor;
- end;
- // ---------------------------CadencerProgress--------------
- procedure TMainForm.CadencerProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- begin
- HandleKeys;
- case DayMode of
- 1: // day
- begin
- bg_w1 := bg_w1 + deltaTime * Coeff;
- if bg_w1 > 1 then
- bg_w1 := 1;
- bg_w2 := bg_w2 - deltaTime * Coeff;
- if bg_w2 < 0 then
- bg_w2 := 0;
- m_w := m_w - deltaTime * Coeff;
- if m_w < 0 then
- m_w := 0;
- end;
- 2: // night
- begin
- bg_w1 := bg_w1 - deltaTime * Coeff;
- if bg_w1 < 0 then
- bg_w1 := 0;
- bg_w2 := bg_w2 + deltaTime * Coeff;
- if bg_w2 > 1 then
- bg_w2 := 1;
- m_w := m_w + deltaTime * Coeff;
- if m_w > 1 then
- m_w := 1;
- if bg_w2 > 0.3 then
- a_w := a_w - deltaTime * Coeff
- else
- a_w := a_w + deltaTime * Coeff;
- if a_w < 0 then
- a_w := 0.01;
- end;
- end;
- case WeatherMode of
- 1:
- begin
- c_w1 := c_w1 - deltaTime * Coeff;
- if c_w1 < 0 then
- c_w1 := 0;
- c_w2 := c_w2 + deltaTime * Coeff;
- if c_w2 > 1 then
- c_w2 := 1;
- end;
- 0:
- begin
- c_w1 := c_w1 + deltaTime * Coeff;
- if c_w1 > 1 then
- c_w1 := 1;
- c_w2 := c_w2 - deltaTime * Coeff;
- if c_w2 < 0 then
- c_w2 := 0;
- end;
- end;
- GLSV.Invalidate;
- end;
- // ---------------------------HandleKeys--------------------
- procedure TMainForm.HandleKeys;
- begin
- if IsKeyDown('c') then // weather1
- WeatherMode := 0
- else if IsKeyDown('s') then // weather2
- WeatherMode := 1
- else if IsKeyDown('n') then // night
- DayMode := 2
- else if IsKeyDown('d') then // day
- DayMode := 1
- else
- end;
- // ---------------------------CgShaderApplyFP---------------
- procedure TMainForm.CgBackgroundApplyFP(CgProgram: TCgProgram; Sender: TObject);
- var
- w1, w2: single;
- begin
- with CgProgram.ParamByName('channel1') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('day').Material.Texture.Handle);
- EnableTexture;
- end;
- with CgProgram.ParamByName('channel2') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('night')
- .Material.Texture.Handle);
- EnableTexture;
- end;
- CgProgram.ParamByName('w1').SetAsScalar(bg_w1);
- CgProgram.ParamByName('w2').SetAsScalar(bg_w2);
- end;
- // ---------------------------CgShaderUnApplyFP-------------
- procedure TMainForm.CgBackgroundUnApplyFP(CgProgram: TCgProgram);
- begin
- CgProgram.ParamByName('channel1').DisableTexture;
- CgProgram.ParamByName('channel2').DisableTexture;
- end;
- // ---------------------------CgShaderCloudsApplyFP---------
- procedure TMainForm.CgCloudsApplyFP(CgProgram: TCgProgram; Sender: TObject);
- begin
- with CgProgram.ParamByName('channel1') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('clouds_clear')
- .Material.Texture.Handle);
- EnableTexture;
- end;
- with CgProgram.ParamByName('channel2') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('clouds_cloudy')
- .Material.Texture.Handle);
- EnableTexture;
- end;
- // if a_w < 0.1 then
- // a:= 0.5;
- CgProgram.ParamByName('w1').SetAsScalar(c_w1);
- CgProgram.ParamByName('w2').SetAsScalar(c_w2 - bg_w2 / 2);
- if a_w > 0 then
- begin
- CgProgram.ParamByName('redoffset1').SetAsScalar(a_w);
- CgProgram.ParamByName('redoffset2').SetAsScalar(a_w);
- end;
- end;
- // ---------------------------CgCloudsApplyVP---------------
- procedure TMainForm.CgCloudsApplyVP(CgProgram: TCgProgram; Sender: TObject);
- begin
- //
- end;
- // ---------------------------CgShaderCloudsUnApplyFP-------
- procedure TMainForm.CgCloudsUnApplyFP(CgProgram: TCgProgram);
- begin
- CgProgram.ParamByName('channel1').DisableTexture;
- CgProgram.ParamByName('channel2').DisableTexture;
- end;
- // ---------------------------CgMoonApplyFP-----------------
- procedure TMainForm.CgMasserApplyFP(CgProgram: TCgProgram; Sender: TObject);
- begin
- with CgProgram.ParamByName('channel1') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('masser').Material.Texture.Handle);
- EnableTexture;
- end;
- CgProgram.ParamByName('w').SetAsScalar(m_w);
- end;
- // ---------------------------CgMoonUnApplyFP---------------
- procedure TMainForm.CgMasserUnApplyFP(CgProgram: TCgProgram);
- begin
- CgProgram.ParamByName('channel1').DisableTexture;
- end;
- // ---------------------------CgSecundaApplyFP--------------
- procedure TMainForm.CgSecundaApplyFP(CgProgram: TCgProgram; Sender: TObject);
- begin
- with CgProgram.ParamByName('channel1') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('secunda').Material.Texture.Handle);
- EnableTexture;
- end;
- CgProgram.ParamByName('w').SetAsScalar(m_w);
- end;
- // ---------------------------CgSecundaUnApplyFP------------
- procedure TMainForm.CgSecundaUnApplyFP(CgProgram: TCgProgram);
- begin
- CgProgram.ParamByName('channel1').DisableTexture;
- end;
- // ---------------------------CgSunApplyFP------------------
- procedure TMainForm.CgSunApplyFP(CgProgram: TCgProgram; Sender: TObject);
- begin
- with CgProgram.ParamByName('channel1') do
- begin
- SetAsTexture2d(MatLib.LibMaterialByName('sun').Material.Texture.Handle);
- EnableTexture;
- end;
- CgProgram.ParamByName('w').SetAsScalar(1.2 * (1 - m_w));
- end;
- // ---------------------------CgSunUnApplyFP----------------
- procedure TMainForm.CgSunUnApplyFP(CgProgram: TCgProgram);
- begin
- CgProgram.ParamByName('channel1').DisableTexture;
- end;
- end.
|