fCelShadingD.pas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. unit fCelShadingD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.OpenGL,
  6. System.SysUtils,
  7. System.Classes,
  8. System.Math,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.Imaging.Jpeg,
  14. GLS.Scene,
  15. Stage.VectorTypes,
  16. Stage.VectorGeometry,
  17. Stage.Keyboard,
  18. GLS.Cadencer,
  19. GLS.SceneViewer,
  20. GLS.VectorFileObjects,
  21. GLS.AsyncTimer,
  22. GLS.GeomObjects,
  23. GLS.Texture,
  24. GLS.Objects,
  25. GLS.Material,
  26. GLS.Coordinates,
  27. GLS.BaseClasses,
  28. GLS.FileMD2,
  29. GLS.XCollection,
  30. Stage.Utils,
  31. GLSL.ShapeShaders;
  32. type
  33. TFormCelShading = class(TForm)
  34. GLScene1: TGLScene;
  35. GLSceneViewer1: TGLSceneViewer;
  36. GLMaterialLibrary1: TGLMaterialLibrary;
  37. GLCadencer1: TGLCadencer;
  38. GLCamera1: TGLCamera;
  39. GLDummyCube1: TGLDummyCube;
  40. GLLightSource1: TGLLightSource;
  41. GLActor1: TGLActor;
  42. AsyncTimer1: TGLAsyncTimer;
  43. GLTexturedCelShader: TGLCelShader;
  44. GLColoredCelShader: TGLCelShader;
  45. GLTorus1: TGLTorus;
  46. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  47. X, Y: Integer);
  48. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  49. procedure FormCreate(Sender: TObject);
  50. procedure AsyncTimer1Timer(Sender: TObject);
  51. procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  52. private
  53. public
  54. mx, my, lx, ly: Integer;
  55. end;
  56. var
  57. FormCelShading: TFormCelShading;
  58. implementation
  59. {$R *.dfm}
  60. procedure TFormCelShading.FormCreate(Sender: TObject);
  61. begin
  62. var Path: TFileName := GetCurrentAssetPath();
  63. SetCurrentDir(Path + '\modelext');
  64. GLActor1.LoadFromFile('waste.md2');
  65. var
  66. r: Single := GLActor1.BoundingSphereRadius;
  67. GLActor1.Scale.SetVector(2.5 / r, 2.5 / r, 2.5 / r);
  68. GLActor1.AnimationMode := aamLoop;
  69. GLMaterialLibrary1.Materials[0].Material.Texture.Image.LoadFromFile('wastecell.jpg');
  70. end;
  71. procedure TFormCelShading.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  72. Shift: TShiftState; X, Y: Integer);
  73. begin
  74. mx := X;
  75. my := Y;
  76. lx := X;
  77. ly := Y;
  78. end;
  79. procedure TFormCelShading.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  80. X, Y: Integer);
  81. begin
  82. mx := X;
  83. my := Y;
  84. end;
  85. procedure TFormCelShading.AsyncTimer1Timer(Sender: TObject);
  86. begin
  87. FormCelShading.Caption := Format('GLScene Cel Shading - %.2f FPS',
  88. [GLSceneViewer1.FramesPerSecond]);
  89. GLSceneViewer1.ResetPerformanceMonitor;
  90. end;
  91. procedure TFormCelShading.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  92. begin
  93. if IsKeyDown(VK_LBUTTON) then
  94. begin
  95. GLCamera1.MoveAroundTarget(ly - my, lx - mx);
  96. lx := mx;
  97. ly := my;
  98. end;
  99. GLTorus1.TurnAngle := 15 * Sin(newTime * 5);
  100. GLTorus1.PitchAngle := 15 * Cos(newTime * 5);
  101. end;
  102. end.