fCsgD.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. unit fCsgD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. System.Types,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.ExtCtrls,
  12. Vcl.ComCtrls,
  13. Vcl.Dialogs,
  14. Vcl.StdCtrls,
  15. GLS.Scene,
  16. GLS.PersistentClasses,
  17. GLS.VectorFileObjects,
  18. GLS.MeshBSP,
  19. GLS.MeshCSG,
  20. GLS.SceneViewer,
  21. GLS.Objects,
  22. GLS.Texture,
  23. GLS.File3DS,
  24. GLS.Material,
  25. GLS.Coordinates,
  26. GLS.BaseClasses,
  27. GLS.State,
  28. GLScene.VectorGeometry,
  29. GLScene.Utils;
  30. type
  31. TFormCsg = class(TForm)
  32. GLScene1: TGLScene;
  33. FF_A: TGLFreeForm;
  34. GLCamera1: TGLCamera;
  35. GLSceneViewer1: TGLSceneViewer;
  36. GLMaterialLibrary1: TGLMaterialLibrary;
  37. FF_B: TGLFreeForm;
  38. FF_C: TGLFreeForm;
  39. GLLightSource1: TGLLightSource;
  40. GLDummyCube1: TGLDummyCube;
  41. PanelLeft: TPanel;
  42. chbSolidResult: TCheckBox;
  43. btnReset: TButton;
  44. gbVisibility: TGroupBox;
  45. chbA: TCheckBox;
  46. chbB: TCheckBox;
  47. chbC: TCheckBox;
  48. rgOperation: TRadioGroup;
  49. procedure GLSceneViewer1MouseDown(Sender: TObject;
  50. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  51. procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton;
  52. Shift: TShiftState; X, Y: Integer);
  53. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  54. X, Y: Integer);
  55. procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  56. MousePos: TPoint; var Handled: Boolean);
  57. procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  58. MousePos: TPoint; var Handled: Boolean);
  59. procedure FormCreate(Sender: TObject);
  60. procedure btnResetClick(Sender: TObject);
  61. procedure chbSolidResultClick(Sender: TObject);
  62. procedure chbClick(Sender: TObject);
  63. procedure rgOperationClick(Sender: TObject);
  64. private
  65. public
  66. mx : Integer;
  67. my : Integer;
  68. Drag : Boolean;
  69. end;
  70. var
  71. FormCsg: TFormCsg;
  72. implementation
  73. {$R *.dfm}
  74. procedure TFormCsg.FormCreate(Sender: TObject);
  75. begin
  76. var Path: TFileName := GetCurrentAssetPath();
  77. SetCurrentDir(Path + '\model');
  78. // scaled 40
  79. FF_A.LoadFromFile('polyhedron.3ds');
  80. // scaled 20, position.x = 16
  81. FF_B.LoadFromFile('polyhedron.3ds');
  82. end;
  83. //
  84. // Boolean operations
  85. //
  86. procedure TFormCsg.rgOperationClick(Sender: TObject);
  87. begin
  88. FF_C.MeshObjects.Clear;
  89. if FF_C.MeshObjects.Count = 0 then
  90. TGLMeshObject.CreateOwned(FF_C.MeshObjects).Mode := momFaceGroups;
  91. case rgOperation.ItemIndex of
  92. 0: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  93. CSG_Union, FF_C.MeshObjects[0], '1', '2');
  94. 1: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  95. CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
  96. 2: CSG_Operation(FF_B.MeshObjects.Items[0], FF_A.MeshObjects.Items[0],
  97. CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
  98. 3: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  99. CSG_Intersection, FF_C.MeshObjects[0],'1','2');
  100. end;
  101. FF_A.Material.PolygonMode := pmLines;
  102. FF_B.Material.PolygonMode := pmLines;
  103. FF_C.StructureChanged;
  104. GLSceneViewer1.Invalidate;
  105. end;
  106. procedure TFormCsg.GLSceneViewer1MouseDown(Sender: TObject;
  107. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  108. begin
  109. Drag := true;
  110. end;
  111. procedure TFormCsg.GLSceneViewer1MouseUp(Sender: TObject;
  112. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  113. begin
  114. Drag := false;
  115. end;
  116. procedure TFormCsg.GLSceneViewer1MouseMove(Sender: TObject;
  117. Shift: TShiftState; X, Y: Integer);
  118. begin
  119. if Drag then
  120. begin
  121. GLCamera1.MoveAroundTarget(my-Y,mx-X);
  122. end;
  123. mx := X;
  124. my := Y;
  125. end;
  126. procedure TFormCsg.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  127. MousePos: TPoint; var Handled: Boolean);
  128. begin
  129. GLCamera1.AdjustDistanceToTarget(1/1.1);
  130. end;
  131. procedure TFormCsg.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  132. MousePos: TPoint; var Handled: Boolean);
  133. begin
  134. GLCamera1.AdjustDistanceToTarget(1.1);
  135. end;
  136. procedure TFormCsg.chbClick(Sender: TObject);
  137. begin
  138. FF_A.Visible := chbA.Checked;
  139. FF_B.Visible := chbB.Checked;
  140. FF_C.Visible := chbC.Checked;
  141. end;
  142. procedure TFormCsg.chbSolidResultClick(Sender: TObject);
  143. begin
  144. if chbSolidResult.Checked then
  145. begin
  146. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmFill;
  147. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmFill;
  148. end
  149. else
  150. begin
  151. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmLines;
  152. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmLines;
  153. end;
  154. FF_C.StructureChanged;
  155. GLSceneViewer1.Invalidate;
  156. end;
  157. procedure TFormCsg.btnResetClick(Sender: TObject);
  158. begin
  159. FF_C.MeshObjects.Clear;
  160. FF_C.StructureChanged;
  161. FF_A.Visible := True; chbA.Checked := True;
  162. FF_B.Visible := True; chbB.Checked := True;
  163. FF_C.Visible := True; chbC.Checked := True;
  164. chbSolidResult.Checked := True;
  165. FF_A.Material.PolygonMode := pmFill;
  166. FF_B.Material.PolygonMode := pmFill;
  167. rgOperation.ItemIndex := 0;
  168. GLSceneViewer1.Invalidate;
  169. end;
  170. end.