fCsg.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. unit fCsg;
  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. GLS.VectorGeometry,
  29. GLS.Utils;
  30. type
  31. TFormCsg = class(TForm)
  32. GLScene1: TGLScene;
  33. GLFreeForm1: TGLFreeForm;
  34. GLCamera1: TGLCamera;
  35. GLSceneViewer1: TGLSceneViewer;
  36. GLMaterialLibrary1: TGLMaterialLibrary;
  37. GLFreeForm2: TGLFreeForm;
  38. GLFreeForm3: TGLFreeForm;
  39. Panel1: TPanel;
  40. btnClear: TButton;
  41. btnUnion: TButton;
  42. btnSubtractAB: TButton;
  43. btnSubtractBA: TButton;
  44. btnIntersect: TButton;
  45. CheckBox1: TCheckBox;
  46. GLLightSource1: TGLLightSource;
  47. GLDummyCube1: TGLDummyCube;
  48. procedure GLSceneViewer1MouseDown(Sender: TObject;
  49. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  50. procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton;
  51. Shift: TShiftState; X, Y: Integer);
  52. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  53. X, Y: Integer);
  54. procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  55. MousePos: TPoint; var Handled: Boolean);
  56. procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  57. MousePos: TPoint; var Handled: Boolean);
  58. procedure FormCreate(Sender: TObject);
  59. // Demo starts here above is just navigation.
  60. procedure btnClearClick(Sender: TObject);
  61. procedure btnUnionClick(Sender: TObject);
  62. procedure btnSubtractABClick(Sender: TObject);
  63. procedure btnSubtractBAClick(Sender: TObject);
  64. procedure btnIntersectClick(Sender: TObject);
  65. procedure CheckBox1Click(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. // Demo starts here above is just navigation.
  77. procedure TFormCsg.FormCreate(Sender: TObject);
  78. begin
  79. SetGLSceneMediaDir();
  80. // scaled 40
  81. GLFreeForm1.LoadFromFile('polyhedron.3ds');
  82. // scaled 20, position.x = 16
  83. GLFreeForm2.LoadFromFile('polyhedron.3ds');
  84. end;
  85. procedure TFormCsg.GLSceneViewer1MouseDown(Sender: TObject;
  86. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  87. begin
  88. Drag := true;
  89. end;
  90. procedure TFormCsg.GLSceneViewer1MouseUp(Sender: TObject;
  91. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  92. begin
  93. Drag := false;
  94. end;
  95. procedure TFormCsg.GLSceneViewer1MouseMove(Sender: TObject;
  96. Shift: TShiftState; X, Y: Integer);
  97. begin
  98. if Drag then
  99. begin
  100. GLCamera1.MoveAroundTarget(my-Y,mx-X);
  101. end;
  102. mx := X;
  103. my := Y;
  104. end;
  105. procedure TFormCsg.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  106. MousePos: TPoint; var Handled: Boolean);
  107. begin
  108. GLCamera1.AdjustDistanceToTarget(1.1);
  109. end;
  110. procedure TFormCsg.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  111. MousePos: TPoint; var Handled: Boolean);
  112. begin
  113. GLCamera1.AdjustDistanceToTarget(1/1.1);
  114. end;
  115. procedure TFormCsg.btnClearClick(Sender: TObject);
  116. begin
  117. GLFreeForm3.MeshObjects.Clear;
  118. GLFreeForm3.StructureChanged;
  119. GLFreeForm1.Material.PolygonMode := pmFill;
  120. GLFreeForm2.Material.PolygonMode := pmFill;
  121. end;
  122. procedure TFormCsg.btnUnionClick(Sender: TObject);
  123. var
  124. Mesh : TMeshObject;
  125. begin
  126. btnClearClick(Sender);
  127. if GLFreeForm3.MeshObjects.Count = 0 then
  128. TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
  129. Mesh := GLFreeForm3.MeshObjects[0];
  130. CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Union,Mesh,'1','2');
  131. GLFreeForm3.StructureChanged;
  132. GLFreeForm1.Material.PolygonMode := pmLines;
  133. GLFreeForm2.Material.PolygonMode := pmLines;
  134. end;
  135. procedure TFormCsg.btnSubtractABClick(Sender: TObject);
  136. var
  137. Mesh : TMeshObject;
  138. begin
  139. btnClearClick(Sender);
  140. if GLFreeForm3.MeshObjects.Count = 0 then
  141. TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
  142. Mesh := GLFreeForm3.MeshObjects[0];
  143. CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Subtraction,Mesh,'1','2');
  144. GLFreeForm3.StructureChanged;
  145. GLFreeForm1.Material.PolygonMode := pmLines;
  146. GLFreeForm2.Material.PolygonMode := pmLines;
  147. end;
  148. procedure TFormCsg.btnSubtractBAClick(Sender: TObject);
  149. var
  150. Mesh : TMeshObject;
  151. begin
  152. btnClearClick(Sender);
  153. if GLFreeForm3.MeshObjects.Count = 0 then
  154. TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
  155. Mesh := GLFreeForm3.MeshObjects[0];
  156. CSG_Operation(GLFreeForm2.MeshObjects.Items[0],GLFreeForm1.MeshObjects.Items[0],CSG_Subtraction,Mesh,'1','2');
  157. GLFreeForm3.StructureChanged;
  158. GLFreeForm1.Material.PolygonMode := pmLines;
  159. GLFreeForm2.Material.PolygonMode := pmLines;
  160. end;
  161. procedure TFormCsg.btnIntersectClick(Sender: TObject);
  162. var
  163. Mesh : TMeshObject;
  164. begin
  165. btnClearClick(Sender);
  166. if GLFreeForm3.MeshObjects.Count = 0 then
  167. TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
  168. Mesh := GLFreeForm3.MeshObjects[0];
  169. CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Intersection,Mesh,'1','2');
  170. GLFreeForm3.StructureChanged;
  171. GLFreeForm1.Material.PolygonMode := pmLines;
  172. GLFreeForm2.Material.PolygonMode := pmLines;
  173. end;
  174. procedure TFormCsg.CheckBox1Click(Sender: TObject);
  175. begin
  176. if CheckBox1.Checked then
  177. begin
  178. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmFill;
  179. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmFill;
  180. end
  181. else
  182. begin
  183. GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmLines;
  184. GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmLines;
  185. end;
  186. GLFreeForm3.StructureChanged;
  187. end;
  188. end.