fCubemapD.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. unit fCubemapD;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. Vcl.Graphics,
  7. Vcl.Imaging.Jpeg,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.Dialogs,
  11. Vcl.StdCtrls,
  12. GLS.Scene,
  13. GLS.SceneViewer,
  14. GLS.Objects,
  15. GLS.Texture,
  16. GLS.FileDDS,
  17. GLS.Context,
  18. GLS.Utils,
  19. GLS.Coordinates,
  20. GLS.BaseClasses,
  21. GLS.GeomObjects;
  22. type
  23. TFormCubeMap = class(TForm)
  24. GLScene1: TGLScene;
  25. GLSceneViewer1: TGLSceneViewer;
  26. GLCamera1: TGLCamera;
  27. DummyCube1: TGLDummyCube;
  28. GLLightSource1: TGLLightSource;
  29. btnApply: TButton;
  30. Teapot1: TGLTeapot;
  31. Cylinder1: TGLCylinder;
  32. Cone1: TGLCone;
  33. Plane1: TGLPlane;
  34. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  35. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  36. X, Y: Integer);
  37. procedure btnApplyClick(Sender: TObject);
  38. procedure GLSceneViewer1BeforeRender(Sender: TObject);
  39. procedure FormShow(Sender: TObject);
  40. private
  41. Path: TFileName;
  42. CubemapPath: TFileName;
  43. Cubemap: TGLTexture;
  44. public
  45. mx, my: Integer;
  46. end;
  47. var
  48. FormCubeMap: TFormCubeMap;
  49. implementation
  50. {$R *.dfm}
  51. procedure TFormCubeMap.FormShow(Sender: TObject);
  52. begin
  53. // Our cube map images are here
  54. Path := GetCurrentAssetPath() + '\cubemap';
  55. SetCurrentDir(Path);
  56. end;
  57. procedure TFormCubeMap.GLSceneViewer1BeforeRender(Sender: TObject);
  58. begin
  59. GLSceneViewer1.BeforeRender := nil;
  60. end;
  61. procedure TFormCubeMap.btnApplyClick(Sender: TObject);
  62. begin
  63. with Teapot1.Material.Texture do
  64. begin
  65. // We need a CubeMapImage, which unlike the "regular Images" stores
  66. // multiple images.
  67. ImageClassName := TGLCubeMapImage.ClassName;
  68. // The 'PX', 'NX', etc. refer to 'positive X', 'negative X', etc.
  69. // and follow the RenderMan specs/conventions
  70. (Image as TGLCubeMapImage).Picture[cmtPX].LoadFromFile('cm_left.jpg');
  71. (Image as TGLCubeMapImage).Picture[cmtNX].LoadFromFile('cm_right.jpg');
  72. (Image as TGLCubeMapImage).Picture[cmtPY].LoadFromFile('cm_top.jpg');
  73. (Image as TGLCubeMapImage).Picture[cmtNY].LoadFromFile('cm_bottom.jpg');
  74. (Image as TGLCubeMapImage).Picture[cmtPZ].LoadFromFile('cm_back.jpg');
  75. (Image as TGLCubeMapImage).Picture[cmtNZ].LoadFromFile('cm_front.jpg');
  76. // Select reflection cube map environment mapping
  77. // This is the mode you'll most commonly use with cube maps, normal cube
  78. // map generation is also supported (used for diffuse environment lighting)
  79. MappingMode := tmmCubeMapReflection;
  80. // That's all folks, let us see the thing!
  81. Disabled := False;
  82. end;
  83. (* *)
  84. // DDStex(Teapot1.Material.Texture, 'skybox.dds');
  85. // Teapot1.Material.Texture.MappingMode := tmmEyeLinear;
  86. // apply .dds cubemaps to next objects
  87. DDStex(Cylinder1.Material.Texture, 'skybox.dds');
  88. Cylinder1.Material.Texture.MappingMode := tmmEyeLinear;
  89. DDStex(Cone1.Material.Texture, 'skybox.dds');
  90. Cone1.Material.Texture.MappingMode := tmmEyeLinear;
  91. DDStex(Plane1.Material.Texture, 'skybox.dds');
  92. Plane1.Material.Texture.MappingMode := tmmEyeLinear;
  93. btnApply.Visible := False;
  94. end;
  95. // standard issue handlers for mouse movement
  96. procedure TFormCubeMap.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  97. Shift: TShiftState; X, Y: Integer);
  98. begin
  99. mx := X;
  100. my := Y;
  101. end;
  102. procedure TFormCubeMap.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  103. begin
  104. if Shift <> [] then
  105. begin
  106. if ssLeft in Shift then
  107. GLCamera1.MoveAroundTarget(my - Y, mx - X)
  108. else
  109. GLCamera1.RotateTarget(my - Y, mx - X);
  110. mx := X;
  111. my := Y;
  112. end;
  113. end;
  114. end.