fCsgD.pas 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. Stage.VectorGeometry,
  29. Stage.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. ffSphere: TGLFreeForm;
  50. ffHalhSphere: TGLFreeForm;
  51. procedure GLSceneViewer1MouseDown(Sender: TObject;
  52. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  53. procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton;
  54. Shift: TShiftState; X, Y: Integer);
  55. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  56. X, Y: Integer);
  57. procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  58. MousePos: TPoint; var Handled: Boolean);
  59. procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  60. MousePos: TPoint; var Handled: Boolean);
  61. procedure FormCreate(Sender: TObject);
  62. procedure btnResetClick(Sender: TObject);
  63. procedure chbSolidResultClick(Sender: TObject);
  64. procedure chbClick(Sender: TObject);
  65. procedure rgOperationClick(Sender: TObject);
  66. private
  67. public
  68. mx : Integer;
  69. my : Integer;
  70. Drag : Boolean;
  71. end;
  72. var
  73. FormCsg: TFormCsg;
  74. implementation
  75. {$R *.dfm}
  76. procedure TFormCsg.FormCreate(Sender: TObject);
  77. begin
  78. var Path: TFileName := GetCurrentAssetPath();
  79. SetCurrentDir(Path + '\model');
  80. // scaled 40
  81. FF_A.LoadFromFile('polyhedron.3ds');
  82. // scaled 20, position.x = 32
  83. FF_B.LoadFromFile('polyhedron.3ds');
  84. ffSphere.LoadFromFile('sphere.3ds');
  85. end;
  86. //
  87. // Boolean operations
  88. //
  89. procedure TFormCsg.rgOperationClick(Sender: TObject);
  90. begin
  91. FF_C.MeshObjects.Clear;
  92. if FF_C.MeshObjects.Count = 0 then
  93. TGLMeshObject.CreateOwned(FF_C.MeshObjects).Mode := momFaceGroups;
  94. case rgOperation.ItemIndex of
  95. 0: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  96. CSG_Union, FF_C.MeshObjects[0], '1', '2');
  97. 1: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  98. CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
  99. 2: CSG_Operation(FF_B.MeshObjects.Items[0], FF_A.MeshObjects.Items[0],
  100. CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
  101. 3: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
  102. CSG_Intersection, FF_C.MeshObjects[0],'1','2');
  103. end;
  104. FF_A.Material.PolygonMode := pmLines;
  105. FF_B.Material.PolygonMode := pmLines;
  106. FF_C.StructureChanged;
  107. GLSceneViewer1.Invalidate;
  108. end;
  109. procedure TFormCsg.GLSceneViewer1MouseDown(Sender: TObject;
  110. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  111. begin
  112. Drag := true;
  113. end;
  114. procedure TFormCsg.GLSceneViewer1MouseUp(Sender: TObject;
  115. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  116. begin
  117. Drag := false;
  118. end;
  119. procedure TFormCsg.GLSceneViewer1MouseMove(Sender: TObject;
  120. Shift: TShiftState; X, Y: Integer);
  121. begin
  122. if Drag then
  123. begin
  124. GLCamera1.MoveAroundTarget(my-Y,mx-X);
  125. end;
  126. mx := X;
  127. my := Y;
  128. end;
  129. procedure TFormCsg.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  130. MousePos: TPoint; var Handled: Boolean);
  131. begin
  132. GLCamera1.AdjustDistanceToTarget(1/1.1);
  133. end;
  134. procedure TFormCsg.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  135. MousePos: TPoint; var Handled: Boolean);
  136. begin
  137. GLCamera1.AdjustDistanceToTarget(1.1);
  138. end;
  139. procedure TFormCsg.chbClick(Sender: TObject);
  140. begin
  141. FF_A.Visible := chbA.Checked;
  142. FF_B.Visible := chbB.Checked;
  143. FF_C.Visible := chbC.Checked;
  144. end;
  145. procedure TFormCsg.chbSolidResultClick(Sender: TObject);
  146. begin
  147. if chbSolidResult.Checked then
  148. begin
  149. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmFill;
  150. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmFill;
  151. end
  152. else
  153. begin
  154. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmLines;
  155. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmLines;
  156. end;
  157. FF_C.StructureChanged;
  158. GLSceneViewer1.Invalidate;
  159. end;
  160. procedure TFormCsg.btnResetClick(Sender: TObject);
  161. begin
  162. FF_C.MeshObjects.Clear;
  163. FF_C.StructureChanged;
  164. FF_A.Visible := True; chbA.Checked := True;
  165. FF_B.Visible := True; chbB.Checked := True;
  166. FF_C.Visible := True; chbC.Checked := True;
  167. chbSolidResult.Checked := True;
  168. FF_A.Material.PolygonMode := pmFill;
  169. FF_B.Material.PolygonMode := pmFill;
  170. rgOperation.ItemIndex := 0;
  171. GLSceneViewer1.Invalidate;
  172. end;
  173. end.