2
0

fSkeletal.pas 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. unit fSkeletal;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. System.Types,
  7. System.Math,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.StdCtrls,
  13. Vcl.ComCtrls,
  14. Vcl.ExtCtrls,
  15. GLS.VectorFileObjects,
  16. GLS.Scene,
  17. GLS.Objects,
  18. GLS.Texture,
  19. GLS.Cadencer,
  20. GLS.SceneViewer,
  21. GLS.Graph,
  22. GLS.FileSMD,
  23. GLS.Material,
  24. GLS.Coordinates,
  25. GLS.BaseClasses,
  26. GLS.VectorGeometry,
  27. GLS.Utils;
  28. type
  29. TFormSkeletal = class(TForm)
  30. GLScene1: TGLScene;
  31. GLSceneViewer1: TGLSceneViewer;
  32. GLCamera1: TGLCamera;
  33. GLLightSource1: TGLLightSource;
  34. Actor1: TGLActor;
  35. DummyCube1: TGLDummyCube;
  36. GLMaterialLibrary1: TGLMaterialLibrary;
  37. Timer1: TTimer;
  38. GLCadencer1: TGLCadencer;
  39. Panel1: TPanel;
  40. BULongJump: TButton;
  41. CheckBox1: TCheckBox;
  42. LabelFPS: TLabel;
  43. BUHighJump: TButton;
  44. XYZGrid1: TGLXYZGrid;
  45. RBWalk: TRadioButton;
  46. RBRun: TRadioButton;
  47. AnimationControler1: TGLAnimationControler;
  48. Panel2: TPanel;
  49. TrackBar1: TTrackBar;
  50. CBBlend: TCheckBox;
  51. procedure FormCreate(Sender: TObject);
  52. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  53. X, Y: Integer);
  54. procedure GLSceneViewer1MouseDown(Sender: TObject;
  55. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  56. procedure Timer1Timer(Sender: TObject);
  57. procedure BULongJumpClick(Sender: TObject);
  58. procedure CheckBox1Click(Sender: TObject);
  59. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  60. newTime: Double);
  61. procedure Actor1EndFrameReached(Sender: TObject);
  62. procedure BUHighJumpClick(Sender: TObject);
  63. procedure RBWalkClick(Sender: TObject);
  64. procedure RBRunClick(Sender: TObject);
  65. procedure TrackBar1Change(Sender: TObject);
  66. procedure CBBlendClick(Sender: TObject);
  67. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  68. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  69. private
  70. public
  71. baseAnimation : String;
  72. mx, my : Integer;
  73. end;
  74. var
  75. FormSkeletal: TFormSkeletal;
  76. implementation
  77. {$R *.DFM}
  78. procedure TFormSkeletal.FormCreate(Sender: TObject);
  79. begin
  80. SetGLSceneMediaDir();
  81. // We load the SMD model here
  82. // Note the actor was linked to a material library, and textures are loaded
  83. // automatically (4 textures are used by this model)
  84. //
  85. // Kind thanks to ~A.u.s.t.i.n. & Neal 'Guplik' Corbett for the model
  86. // and allowing its use ;)
  87. Actor1.LoadFromFile('trinityRage.smd');
  88. // Now we load the walk & run animations and "fix" their translation
  89. // (HL walk/run animations have a built-in "slide" that we don't want here)
  90. Actor1.AddDataFromFile('walk.smd');
  91. Actor1.Animations[1].MakeSkeletalTranslationStatic;
  92. Actor1.AddDataFromFile('run.smd');
  93. Actor1.Animations[2].MakeSkeletalTranslationStatic;
  94. // Then load the two jumps
  95. Actor1.AddDataFromFile('long_jump.smd');
  96. Actor1.AddDataFromFile('jump.smd');
  97. // And the 'look_left_right' blending animations, that we immediately
  98. // assign to the controler. The MakeSkeletalRotationDelta removes absolute
  99. // information from the SMD (which HL may use, but GLScene doesn't)
  100. Actor1.AddDataFromFile('look_left_right.smd');
  101. Actor1.Animations[5].MakeSkeletalRotationDelta;
  102. AnimationControler1.AnimationName:='look_left_right';
  103. // Skeleton visible, and start with walk animation
  104. // (pseudo-animation 0 is for the static model in its default attitude)
  105. Actor1.OverlaySkeleton:=True;
  106. baseAnimation:='walk';
  107. Actor1.SwitchToAnimation(baseAnimation);
  108. end;
  109. procedure TFormSkeletal.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  110. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  111. begin
  112. GLCamera1 := GLSceneViewer1.Camera;
  113. GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  114. end;
  115. procedure TFormSkeletal.RBWalkClick(Sender: TObject);
  116. begin
  117. // user requested 'walk'
  118. baseAnimation:='walk';
  119. Actor1.SwitchToAnimation(baseAnimation, True);
  120. end;
  121. procedure TFormSkeletal.RBRunClick(Sender: TObject);
  122. begin
  123. // user requested 'run'
  124. baseAnimation:='run';
  125. Actor1.SwitchToAnimation(baseAnimation, True);
  126. end;
  127. procedure TFormSkeletal.BULongJumpClick(Sender: TObject);
  128. begin
  129. // Smoothly switch to Long Jump
  130. Actor1.SwitchToAnimation(3, True);
  131. end;
  132. procedure TFormSkeletal.BUHighJumpClick(Sender: TObject);
  133. begin
  134. // Smoothly switch to High Jump
  135. Actor1.SwitchToAnimation(4, True);
  136. end;
  137. procedure TFormSkeletal.Actor1EndFrameReached(Sender: TObject);
  138. begin
  139. // If we weren't walking, switch back to walk
  140. if Actor1.CurrentAnimation<>baseAnimation then
  141. Actor1.SwitchToAnimation(baseAnimation, True);
  142. end;
  143. procedure TFormSkeletal.CBBlendClick(Sender: TObject);
  144. begin
  145. // Enable/disable blending by binding or unbinding the animation controler
  146. // to the actor
  147. if CBBlend.Checked then begin
  148. AnimationControler1.Actor:=Actor1;
  149. TrackBar1Change(Self);
  150. end else AnimationControler1.Actor:=nil;
  151. end;
  152. procedure TFormSkeletal.TrackBar1Change(Sender: TObject);
  153. begin
  154. // Blending along the controler's animation is just a matter of adjusting
  155. // the ratio, with 0 = first frame and 1 = last frame.
  156. AnimationControler1.Ratio:=TrackBar1.Position*0.01;
  157. end;
  158. // Nothing fancy below, just the same old stuff
  159. procedure TFormSkeletal.CheckBox1Click(Sender: TObject);
  160. begin
  161. Actor1.OverlaySkeleton:=CheckBox1.Checked;
  162. end;
  163. procedure TFormSkeletal.GLSceneViewer1MouseDown(Sender: TObject;
  164. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  165. begin
  166. mx:=x; my:=y;
  167. end;
  168. procedure TFormSkeletal.GLSceneViewer1MouseMove(Sender: TObject;
  169. Shift: TShiftState; X, Y: Integer);
  170. begin
  171. if Shift<>[] then begin
  172. GLCamera1.MoveAroundTarget(my-y, mx-x);
  173. mx:=x; my:=y;
  174. end;
  175. end;
  176. procedure TFormSkeletal.Timer1Timer(Sender: TObject);
  177. begin
  178. LabelFPS.Caption:=Format('%.1f FPS', [GLSceneViewer1.FramesPerSecond]);
  179. GLSceneViewer1.ResetPerformanceMonitor;
  180. end;
  181. procedure TFormSkeletal.GLCadencer1Progress(Sender: TObject; const deltaTime,
  182. newTime: Double);
  183. begin
  184. GLScene1.NotifyChange(nil);
  185. end;
  186. end.