fGizmo.pas 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. unit fGizmo;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.StdCtrls,
  11. Vcl.Dialogs,
  12. Vcl.ExtCtrls,
  13. GLS.Scene,
  14. GLS.Cadencer,
  15. GLS.PersistentClasses,
  16. GLS.Objects,
  17. GLS.SpaceText,
  18. GLS.SceneViewer,
  19. GLS.BitmapFont,
  20. GLS.WindowsFont,
  21. GLS.HUDObjects,
  22. GLS.GeomObjects,
  23. GLS.Gizmo,
  24. GLS.Coordinates,
  25. GLS.BaseClasses, GLS.VectorFileObjects;
  26. type
  27. TFormGizmo = class(TForm)
  28. GLScene1: TGLScene;
  29. Viewer: TGLSceneViewer;
  30. Camera: TGLCamera;
  31. GLDummyCube1: TGLDummyCube;
  32. GLCadencer1: TGLCadencer;
  33. GLLightSource1: TGLLightSource;
  34. GLLightSource2: TGLLightSource;
  35. RootGizmo: TGLDummyCube;
  36. Panel1: TPanel;
  37. Bevel1: TBevel;
  38. CheckBox1: TCheckBox;
  39. CheckBox2: TCheckBox;
  40. CBXAxis: TComboBox;
  41. CheckBox3: TCheckBox;
  42. CBXOperation: TComboBox;
  43. CheckBox4: TCheckBox;
  44. CheckBox5: TCheckBox;
  45. CheckBox6: TCheckBox;
  46. CheckBox7: TCheckBox;
  47. CheckBox8: TCheckBox;
  48. CheckBox9: TCheckBox;
  49. CheckBox10: TCheckBox;
  50. CheckBox11: TCheckBox;
  51. ColorBox1: TColorBox;
  52. Label1: TLabel;
  53. Label2: TLabel;
  54. Label3: TLabel;
  55. ColorBox2: TColorBox;
  56. ColorBox3: TColorBox;
  57. Label4: TLabel;
  58. edAutoZoomFactor: TEdit;
  59. Label5: TLabel;
  60. edZoomFactor: TEdit;
  61. CheckBox12: TCheckBox;
  62. Label6: TLabel;
  63. edMoveCoef: TEdit;
  64. edRotateCoef: TEdit;
  65. CheckBox13: TCheckBox;
  66. CheckBox14: TCheckBox;
  67. CheckBox15: TCheckBox;
  68. GLDodecahedron3: TGLDodecahedron;
  69. GLArrowLine3: TGLArrowLine;
  70. GLArrowLine4: TGLArrowLine;
  71. edScaleCoef: TEdit;
  72. Label10: TLabel;
  73. Label11: TLabel;
  74. edGizmoThickness: TEdit;
  75. GLSphere1: TGLSphere;
  76. GLCube1: TGLCube;
  77. OptPickMode: TRadioGroup;
  78. WindowsBitmapFont: TGLWindowsBitmapFont;
  79. Label7: TLabel;
  80. procedure GLCadencer1Progress(Sender: TObject; const DeltaTime, newTime: Double);
  81. procedure ViewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  82. procedure ViewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  83. procedure ViewerMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  84. procedure FormShow(Sender: TObject);
  85. procedure edAutoZoomFactorKeyPress(Sender: TObject; var Key: Char);
  86. procedure CheckBox12Click(Sender: TObject);
  87. procedure CBXAxisChange(Sender: TObject);
  88. procedure CBXOperationChange(Sender: TObject);
  89. procedure edMoveCoefChange(Sender: TObject);
  90. procedure edRotateCoefChange(Sender: TObject);
  91. procedure edAutoZoomFactorChange(Sender: TObject);
  92. procedure edZoomFactorChange(Sender: TObject);
  93. procedure ColorBox1Change(Sender: TObject);
  94. procedure edScaleCoefChange(Sender: TObject);
  95. procedure edGizmoThicknessChange(Sender: TObject);
  96. procedure OptPickModeClick(Sender: TObject);
  97. procedure FormCreate(Sender: TObject);
  98. procedure FormDestroy(Sender: TObject);
  99. private
  100. procedure FillPickableObjectsList(root: TGLBaseSceneObject; doClearList: Boolean);
  101. public
  102. mx, my: Integer;
  103. // gizmo: TGLGizmoEx;
  104. noMouseMotion: Boolean;
  105. end;
  106. var
  107. FormGizmo: TFormGizmo;
  108. Gizmo: TGLGizmo;
  109. implementation
  110. {$R *.dfm}
  111. procedure TFormGizmo.GLCadencer1Progress(Sender: TObject; const DeltaTime, newTime: Double);
  112. begin
  113. Viewer.Invalidate;
  114. end;
  115. procedure TFormGizmo.OptPickModeClick(Sender: TObject);
  116. begin
  117. Gizmo.PickMode := TGLGizmoPickMode(OptPickMode.ItemIndex);
  118. end;
  119. procedure TFormGizmo.ViewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  120. begin
  121. mx := X;
  122. my := Y;
  123. Gizmo.ViewerMouseDown(X, Y);
  124. end;
  125. procedure TFormGizmo.ViewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  126. begin
  127. //if noMouseMotion then exit;
  128. if (shift = [ssLeft]) and (gizmo.SelectedObj = nil) then
  129. Camera.MoveAroundTarget(Y - my, mx - X)
  130. else if (shift = [ssRight]) and (gizmo.SelectedObj = nil) then
  131. begin
  132. if my > Y then
  133. Camera.AdjustDistanceToTarget(1.05)
  134. else
  135. Camera.AdjustDistanceToTarget(0.95);
  136. Gizmo.MoveCoef := Camera.DistanceToTarget / 1000;
  137. end
  138. else
  139. Gizmo.ViewerMouseMove(X, Y);
  140. mx := X;
  141. my := Y;
  142. end;
  143. procedure TFormGizmo.ViewerMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  144. begin
  145. Gizmo.ViewerMouseUp(X, Y);
  146. end;
  147. procedure TFormGizmo.FormShow(Sender: TObject);
  148. begin
  149. Viewer.SetFocus;
  150. Gizmo.RootGizmo := rootGizmo;
  151. // Fill list of pickable objects when using PickMode=pmRaycast
  152. FillPickableObjectsList(GLDummyCube1, True);
  153. end;
  154. // Recurse root object to fill list of pickable objects when using PickMode=pmRaycast
  155. procedure TFormGizmo.FillPickableObjectsList(root: TGLBaseSceneObject; doClearList: Boolean);
  156. var
  157. t: Integer;
  158. begin
  159. if doClearList then
  160. Gizmo.PickableObjectsWithRayCast.Clear;
  161. for t := 0 to root.Count - 1 do
  162. begin
  163. Gizmo.PickableObjectsWithRayCast.Add(root[t]);
  164. FillPickableObjectsList(root[t], False);
  165. end;
  166. end;
  167. procedure TFormGizmo.edAutoZoomFactorKeyPress(Sender: TObject; var Key: Char);
  168. begin
  169. if not CharInSet(Key,['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',']) then
  170. Key := #0;
  171. end;
  172. procedure TFormGizmo.CheckBox12Click(Sender: TObject);
  173. var
  174. check: Boolean;
  175. begin
  176. // (Sender as TCheckBox).Checked:=Not((Sender as TCheckBox).Checked);
  177. check := (Sender as TCheckBox).Checked;
  178. case (Sender as TCheckBox).Tag of
  179. 0: Gizmo.Enabled := Check;
  180. 1: Gizmo.ExcludeObjects := Check;
  181. 2:
  182. begin
  183. Gizmo.ForceAxis := Check;
  184. CBXAxis.Enabled := Check;
  185. end;
  186. 3:
  187. begin
  188. Gizmo.ForceOperation := Check;
  189. CBXOperation.Enabled := Check;
  190. end;
  191. 4: Gizmo.ForceUniformScale := Check;
  192. 5: if Check then
  193. Gizmo.GizmoElements := Gizmo.GizmoElements + [geAxisLabel]
  194. else
  195. Gizmo.GizmoElements := Gizmo.GizmoElements - [geAxisLabel];
  196. 6:
  197. begin
  198. if Check then
  199. begin
  200. Gizmo.GizmoElements := Gizmo.GizmoElements + [geObjectInfos];
  201. CheckBox7.Enabled := Check;
  202. CheckBox8.Enabled := Check;
  203. CheckBox9.Enabled := Check;
  204. end
  205. else
  206. begin
  207. Gizmo.GizmoElements := Gizmo.GizmoElements - [geObjectInfos];
  208. CheckBox7.Enabled := Check;
  209. CheckBox8.Enabled := Check;
  210. CheckBox9.Enabled := Check;
  211. end;
  212. end;
  213. 7: Gizmo.NoZWrite := Check;
  214. 8:
  215. begin
  216. Gizmo.AutoZoom := Check;
  217. if Check then
  218. begin
  219. edAutoZoomFactor.Enabled := True;
  220. edZoomFactor.Enabled := False;
  221. end
  222. else
  223. begin
  224. edAutoZoomFactor.Enabled := False;
  225. edZoomFactor.Enabled := True;
  226. end;
  227. end;
  228. 9: if Check then
  229. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels + [vliName]
  230. else
  231. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels - [vliName];
  232. 10: if Check then
  233. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels + [vliOperation]
  234. else
  235. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels - [vliOperation];
  236. 11: if Check then
  237. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels + [vliCoords]
  238. else
  239. Gizmo.VisibleInfoLabels := Gizmo.VisibleInfoLabels - [vliCoords];
  240. 12: if Check then
  241. Gizmo.GizmoElements := Gizmo.GizmoElements + [geMove]
  242. else
  243. Gizmo.GizmoElements := Gizmo.GizmoElements - [geMove];
  244. 13: if Check then
  245. Gizmo.GizmoElements := Gizmo.GizmoElements + [geRotate]
  246. else
  247. Gizmo.GizmoElements := Gizmo.GizmoElements - [geRotate];
  248. 14: if Check then
  249. Gizmo.GizmoElements := Gizmo.GizmoElements + [geScale]
  250. else
  251. Gizmo.GizmoElements := Gizmo.GizmoElements - [geScale];
  252. end;
  253. end;
  254. procedure TFormGizmo.CBXAxisChange(Sender: TObject);
  255. begin
  256. case CBXAxis.ItemIndex of
  257. 0: Gizmo.SelAxis := gaNone;
  258. 1: Gizmo.SelAxis := gaX;
  259. 2: Gizmo.SelAxis := gaXY;
  260. 3: Gizmo.SelAxis := gaXZ;
  261. 4: Gizmo.SelAxis := gaY;
  262. 5: Gizmo.SelAxis := gaYZ;
  263. 6: Gizmo.SelAxis := gaZ;
  264. end;
  265. end;
  266. procedure TFormGizmo.CBXOperationChange(Sender: TObject);
  267. begin
  268. case CBXOperation.ItemIndex of
  269. 0: Gizmo.Operation := gopNone;
  270. 1: Gizmo.Operation := gopMove;
  271. 2: Gizmo.Operation := gopRotate;
  272. 3: Gizmo.Operation := gopScale;
  273. end;
  274. end;
  275. procedure TFormGizmo.edMoveCoefChange(Sender: TObject);
  276. begin
  277. if edMoveCoef.Text <> '' then
  278. Gizmo.MoveCoef := StrToFloat(edMoveCoef.Text);
  279. end;
  280. procedure TFormGizmo.edRotateCoefChange(Sender: TObject);
  281. begin
  282. if edRotateCoef.Text <> '' then
  283. Gizmo.RotationCoef := StrToFloat(edRotateCoef.Text);
  284. end;
  285. procedure TFormGizmo.edGizmoThicknessChange(Sender: TObject);
  286. begin
  287. Gizmo.GizmoThickness := StrToFloat(edGizmoThickness.Text);
  288. end;
  289. procedure TFormGizmo.edScaleCoefChange(Sender: TObject);
  290. begin
  291. if edScaleCoef.Text <> '' then
  292. Gizmo.ScaleCoef := StrToFloat(edScaleCoef.Text);
  293. end;
  294. procedure TFormGizmo.edAutoZoomFactorChange(Sender: TObject);
  295. begin
  296. if edAutoZoomFactor.Text <> '' then
  297. Gizmo.AutoZoomFactor := StrToFloat(edAutoZoomFactor.Text);
  298. end;
  299. procedure TFormGizmo.edZoomFactorChange(Sender: TObject);
  300. begin
  301. if edZoomFactor.Text <> '' then
  302. Gizmo.ZoomFactor := StrToFloat(edZoomFactor.Text);
  303. end;
  304. procedure TFormGizmo.ColorBox1Change(Sender: TObject);
  305. begin
  306. case (Sender as TColorBox).Tag of
  307. 0: Gizmo.BoundingBoxColor.AsWinColor := ColorBox1.Selected;
  308. 1: Gizmo.VisibleInfoLabelsColor.AsWinColor := ColorBox2.Selected;
  309. 2: Gizmo.SelectedColor.AsWinColor := ColorBox3.Selected;
  310. end;
  311. end;
  312. procedure TFormGizmo.FormCreate(Sender: TObject);
  313. begin
  314. Gizmo := TGLGizmo.Create(Self);
  315. Gizmo.LabelFont := WindowsBitmapFont;
  316. Gizmo.Viewer := Viewer;
  317. end;
  318. procedure TFormGizmo.FormDestroy(Sender: TObject);
  319. begin
  320. Gizmo.Free;
  321. end;
  322. end.