123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- unit fCsg;
- interface
- uses
- Winapi.OpenGL,
- System.SysUtils,
- System.Classes,
- System.Types,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.ExtCtrls,
- Vcl.ComCtrls,
- Vcl.Dialogs,
- Vcl.StdCtrls,
-
- GLS.Scene,
- GLS.PersistentClasses,
- GLS.VectorFileObjects,
- GLS.MeshBSP,
- GLS.MeshCSG,
- GLS.SceneViewer,
- GLS.Objects,
- GLS.Texture,
- GLS.File3DS,
-
- GLS.Material,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.State,
- GLS.VectorGeometry,
- GLS.Utils;
- type
- TFormCsg = class(TForm)
- GLScene1: TGLScene;
- GLFreeForm1: TGLFreeForm;
- GLCamera1: TGLCamera;
- GLSceneViewer1: TGLSceneViewer;
- GLMaterialLibrary1: TGLMaterialLibrary;
- GLFreeForm2: TGLFreeForm;
- GLFreeForm3: TGLFreeForm;
- Panel1: TPanel;
- btnClear: TButton;
- btnUnion: TButton;
- btnSubtractAB: TButton;
- btnSubtractBA: TButton;
- btnIntersect: TButton;
- CheckBox1: TCheckBox;
- GLLightSource1: TGLLightSource;
- GLDummyCube1: TGLDummyCube;
- procedure GLSceneViewer1MouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- procedure FormCreate(Sender: TObject);
- // Demo starts here above is just navigation.
- procedure btnClearClick(Sender: TObject);
- procedure btnUnionClick(Sender: TObject);
- procedure btnSubtractABClick(Sender: TObject);
- procedure btnSubtractBAClick(Sender: TObject);
- procedure btnIntersectClick(Sender: TObject);
- procedure CheckBox1Click(Sender: TObject);
- private
-
- public
- mx : Integer;
- my : Integer;
- Drag : Boolean;
- end;
- var
- FormCsg: TFormCsg;
- implementation
- {$R *.dfm}
- // Demo starts here above is just navigation.
- procedure TFormCsg.FormCreate(Sender: TObject);
- begin
- SetGLSceneMediaDir();
- // scaled 40
- GLFreeForm1.LoadFromFile('polyhedron.3ds');
- // scaled 20, position.x = 16
- GLFreeForm2.LoadFromFile('polyhedron.3ds');
- end;
- procedure TFormCsg.GLSceneViewer1MouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- Drag := true;
- end;
- procedure TFormCsg.GLSceneViewer1MouseUp(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- Drag := false;
- end;
- procedure TFormCsg.GLSceneViewer1MouseMove(Sender: TObject;
- Shift: TShiftState; X, Y: Integer);
- begin
- if Drag then
- begin
- GLCamera1.MoveAroundTarget(my-Y,mx-X);
- end;
- mx := X;
- my := Y;
- end;
- procedure TFormCsg.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- begin
- GLCamera1.AdjustDistanceToTarget(1.1);
- end;
- procedure TFormCsg.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- begin
- GLCamera1.AdjustDistanceToTarget(1/1.1);
- end;
- procedure TFormCsg.btnClearClick(Sender: TObject);
- begin
- GLFreeForm3.MeshObjects.Clear;
- GLFreeForm3.StructureChanged;
- GLFreeForm1.Material.PolygonMode := pmFill;
- GLFreeForm2.Material.PolygonMode := pmFill;
- end;
- procedure TFormCsg.btnUnionClick(Sender: TObject);
- var
- Mesh : TMeshObject;
- begin
- btnClearClick(Sender);
- if GLFreeForm3.MeshObjects.Count = 0 then
- TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
- Mesh := GLFreeForm3.MeshObjects[0];
- CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Union,Mesh,'1','2');
- GLFreeForm3.StructureChanged;
- GLFreeForm1.Material.PolygonMode := pmLines;
- GLFreeForm2.Material.PolygonMode := pmLines;
- end;
- procedure TFormCsg.btnSubtractABClick(Sender: TObject);
- var
- Mesh : TMeshObject;
- begin
- btnClearClick(Sender);
- if GLFreeForm3.MeshObjects.Count = 0 then
- TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
- Mesh := GLFreeForm3.MeshObjects[0];
- CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Subtraction,Mesh,'1','2');
- GLFreeForm3.StructureChanged;
- GLFreeForm1.Material.PolygonMode := pmLines;
- GLFreeForm2.Material.PolygonMode := pmLines;
- end;
- procedure TFormCsg.btnSubtractBAClick(Sender: TObject);
- var
- Mesh : TMeshObject;
- begin
- btnClearClick(Sender);
- if GLFreeForm3.MeshObjects.Count = 0 then
- TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
- Mesh := GLFreeForm3.MeshObjects[0];
- CSG_Operation(GLFreeForm2.MeshObjects.Items[0],GLFreeForm1.MeshObjects.Items[0],CSG_Subtraction,Mesh,'1','2');
- GLFreeForm3.StructureChanged;
- GLFreeForm1.Material.PolygonMode := pmLines;
- GLFreeForm2.Material.PolygonMode := pmLines;
- end;
- procedure TFormCsg.btnIntersectClick(Sender: TObject);
- var
- Mesh : TMeshObject;
- begin
- btnClearClick(Sender);
- if GLFreeForm3.MeshObjects.Count = 0 then
- TMeshObject.CreateOwned(GLFreeForm3.MeshObjects).Mode := momFaceGroups;
- Mesh := GLFreeForm3.MeshObjects[0];
- CSG_Operation(GLFreeForm1.MeshObjects.Items[0],GLFreeForm2.MeshObjects.Items[0],CSG_Intersection,Mesh,'1','2');
- GLFreeForm3.StructureChanged;
- GLFreeForm1.Material.PolygonMode := pmLines;
- GLFreeForm2.Material.PolygonMode := pmLines;
- end;
- procedure TFormCsg.CheckBox1Click(Sender: TObject);
- begin
- if CheckBox1.Checked then
- begin
- GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmFill;
- GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmFill;
- end
- else
- begin
- GLMaterialLibrary1.Materials[0].Material.PolygonMode := pmLines;
- GLMaterialLibrary1.Materials[1].Material.PolygonMode := pmLines;
- end;
- GLFreeForm3.StructureChanged;
- end;
- end.
|