| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- unit fCsgD;
- 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,
- GLScene.VectorGeometry,
- GLScene.Utils;
- type
- TFormCsg = class(TForm)
- GLScene1: TGLScene;
- FF_A: TGLFreeForm;
- GLCamera1: TGLCamera;
- GLSceneViewer1: TGLSceneViewer;
- GLMaterialLibrary1: TGLMaterialLibrary;
- FF_B: TGLFreeForm;
- FF_C: TGLFreeForm;
- GLLightSource1: TGLLightSource;
- GLDummyCube1: TGLDummyCube;
- PanelLeft: TPanel;
- chbSolidResult: TCheckBox;
- btnReset: TButton;
- gbVisibility: TGroupBox;
- chbA: TCheckBox;
- chbB: TCheckBox;
- chbC: TCheckBox;
- rgOperation: TRadioGroup;
- 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);
- procedure btnResetClick(Sender: TObject);
- procedure chbSolidResultClick(Sender: TObject);
- procedure chbClick(Sender: TObject);
- procedure rgOperationClick(Sender: TObject);
- private
- public
- mx : Integer;
- my : Integer;
- Drag : Boolean;
- end;
- var
- FormCsg: TFormCsg;
- implementation
- {$R *.dfm}
- procedure TFormCsg.FormCreate(Sender: TObject);
- begin
- var Path: TFileName := GetCurrentAssetPath();
- SetCurrentDir(Path + '\model');
- // scaled 40
- FF_A.LoadFromFile('polyhedron.3ds');
- // scaled 20, position.x = 16
- FF_B.LoadFromFile('polyhedron.3ds');
- end;
- //
- // Boolean operations
- //
- procedure TFormCsg.rgOperationClick(Sender: TObject);
- begin
- FF_C.MeshObjects.Clear;
- if FF_C.MeshObjects.Count = 0 then
- TGLMeshObject.CreateOwned(FF_C.MeshObjects).Mode := momFaceGroups;
- case rgOperation.ItemIndex of
- 0: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
- CSG_Union, FF_C.MeshObjects[0], '1', '2');
- 1: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
- CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
- 2: CSG_Operation(FF_B.MeshObjects.Items[0], FF_A.MeshObjects.Items[0],
- CSG_Subtraction, FF_C.MeshObjects[0], '1', '2');
- 3: CSG_Operation(FF_A.MeshObjects.Items[0], FF_B.MeshObjects.Items[0],
- CSG_Intersection, FF_C.MeshObjects[0],'1','2');
- end;
- FF_A.Material.PolygonMode := pmLines;
- FF_B.Material.PolygonMode := pmLines;
- FF_C.StructureChanged;
- GLSceneViewer1.Invalidate;
- 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.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- begin
- GLCamera1.AdjustDistanceToTarget(1/1.1);
- end;
- procedure TFormCsg.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- begin
- GLCamera1.AdjustDistanceToTarget(1.1);
- end;
- procedure TFormCsg.chbClick(Sender: TObject);
- begin
- FF_A.Visible := chbA.Checked;
- FF_B.Visible := chbB.Checked;
- FF_C.Visible := chbC.Checked;
- end;
- procedure TFormCsg.chbSolidResultClick(Sender: TObject);
- begin
- if chbSolidResult.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;
- FF_C.StructureChanged;
- GLSceneViewer1.Invalidate;
- end;
- procedure TFormCsg.btnResetClick(Sender: TObject);
- begin
- FF_C.MeshObjects.Clear;
- FF_C.StructureChanged;
- FF_A.Visible := True; chbA.Checked := True;
- FF_B.Visible := True; chbB.Checked := True;
- FF_C.Visible := True; chbC.Checked := True;
- chbSolidResult.Checked := True;
- FF_A.Material.PolygonMode := pmFill;
- FF_B.Material.PolygonMode := pmFill;
- rgOperation.ItemIndex := 0;
- GLSceneViewer1.Invalidate;
- end;
- end.
|