| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175 |
- unit fGLSViewer;
- interface
- uses
- Winapi.Windows,
- Winapi.Messages,
- Winapi.OpenGL,
- Winapi.ShellAPI,
- System.SysUtils,
- System.Classes,
- System.IniFiles,
- System.Win.Registry,
- System.ImageList,
- System.Math,
- System.Actions,
- System.Types,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.ActnList,
- Vcl.Menus,
- Vcl.ImgList,
- Vcl.ToolWin,
- Vcl.ComCtrls,
- Vcl.ExtDlgs,
- Vcl.ExtCtrls,
- Vcl.ActnMan,
- Vcl.ActnCtrls,
- Vcl.ActnMenus,
- Vcl.StdActns,
- Vcl.BandActn,
- Vcl.StdStyleActnCtrls,
- Vcl.VirtualImageList,
- Vcl.BaseImageCollection,
- Vcl.ImageCollection,
- GLS.Material,
- GLS.Scene,
- GLS.SceneViewer,
- GLS.VectorFileObjects,
- GLS.Objects,
- GLS.VectorGeometry,
- GLS.Texture,
- GLS.Context,
- GLS.VectorLists,
- GLS.Cadencer,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.State,
- GLS.RenderContextInfo,
- GLS.TextureFormat,
- GLS.Color,
- GLS.Keyboard,
- GLS.Graphics,
- GLS.PersistentClasses,
- GLS.MeshUtils,
- GLS.VectorTypes,
- GnuGettext,
- GLS.AsyncTimer,
- GLS.Graph,
- GLS.MeshBuilder,
- GLS.Navigator,
- GLS.Utils,
- GLS.SimpleNavigation,
- fGLForm,
- fGLAbout,
- fGLOptions,
- fGLDialog,
- dImages,
- dDialogs;
- type
- TFormGLSViewer = class(TGLForm)
- StatusBar: TStatusBar;
- Scene: TGLScene;
- ffObject: TGLFreeForm;
- LightSource: TGLLightSource;
- MaterialLib: TGLMaterialLibrary;
- CubeLines: TGLCube;
- dcObject: TGLDummyCube;
- Camera: TGLCamera;
- dcAxis: TGLDummyCube;
- Cadencer: TGLCadencer;
- Timer: TTimer;
- snViewer: TGLSceneViewer;
- ActionManager: TActionManager;
- acOptimizeMesh: TAction;
- acProcessInvertNormals: TAction;
- acReverseRendering: TAction;
- acConvertToTriangles: TAction;
- acProcessStripify: TAction;
- acToolsOptions: TAction;
- acToolsFaceCulling: TAction;
- acToolsTexturing: TAction;
- acToolsLighting: TAction;
- acToolsCustomize: TCustomizeActionBars;
- acToolsShowFPS: TAction;
- acViewSmoothShading: TAction;
- acViewFlatShading: TAction;
- acViewFlatLines: TAction;
- acViewHiddenLines: TAction;
- acViewWireFrame: TAction;
- acViewZoomIn: TAction;
- acViewZoomOut: TAction;
- acViewReset: TAction;
- acFileOpen: TAction;
- acFilePick: TAction;
- acFileOpenTexLib: TAction;
- acFileSaveAs: TAction;
- acFileSaveTextures: TAction;
- acFileExit: TAction;
- acHelpContents: THelpContents;
- acHelpTopicSearch: THelpTopicSearch;
- acHelpGLSHomePage: TAction;
- acHelpAbout: TAction;
- acAADefault: TAction;
- acAA2X: TAction;
- acAA4X: TAction;
- acEditUndo: TEditUndo;
- acEditCut: TEditCut;
- acEditCopy: TEditCopy;
- acEditPaste: TEditPaste;
- acEditSelectAll: TEditSelectAll;
- acEditDelete: TEditDelete;
- ImageListMenu: TImageList;
- ControlBar: TControlBar;
- amMenuBar: TActionMainMenuBar;
- acAA8X: TAction;
- acAA16X: TAction;
- acCSA8X: TAction;
- acCSA16X: TAction;
- atbTools: TActionToolBar;
- atbView: TActionToolBar;
- atbFile: TActionToolBar;
- acPoints: TAction;
- AsyncTimer: TGLAsyncTimer;
- dcWorld: TGLDummyCube;
- XYZGrid: TGLXYZGrid;
- acToolsNaviCube: TAction;
- GLPoints: TGLPoints;
- acToolsInfo: TAction;
- GLSimpleNavigation: TGLSimpleNavigation;
- acSpheres: TAction;
- PanelLeft: TPanel;
- tvScene: TTreeView;
- ImageListObjects: TImageList;
- acSaveTreeView: TAction;
- acLoadTreeView: TAction;
- OpenDialog: TOpenDialog;
- SaveDialog: TSaveDialog;
- procedure FormCreate(Sender: TObject);
- procedure snViewerMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure snViewerMouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
- WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
- procedure snViewerMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure snViewerBeforeRender(Sender: TObject);
- procedure snViewerAfterRender(Sender: TObject);
- procedure FormShow(Sender: TObject);
- procedure MaterialLibTextureNeeded(Sender: TObject;
- var textureFileName: String);
- procedure acInvertNormalsExecute(Sender: TObject);
- procedure acSaveAsUpdate(Sender: TObject);
- procedure acReverseRenderingOrderExecute(Sender: TObject);
- procedure acConvertToIndexedTrianglesExecute(Sender: TObject);
- procedure CadencerProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- procedure TimerTimer(Sender: TObject);
- procedure acOptimizeExecute(Sender: TObject);
- procedure acStripifyExecute(Sender: TObject);
- procedure acHelpAboutExecute(Sender: TObject);
- procedure acFilePickExecute(Sender: TObject);
- procedure acFileOpenTexLibExecute(Sender: TObject);
- procedure acFileOpenExecute(Sender: TObject);
- procedure acFileSaveAsExecute(Sender: TObject);
- procedure acFileSaveTexturesExecute(Sender: TObject);
- procedure acFileExitExecute(Sender: TObject);
- procedure acToolsOptionsExecute(Sender: TObject);
- procedure acToolsTexturingExecute(Sender: TObject);
- procedure acToolsFaceCullingExecute(Sender: TObject);
- procedure acToolsLightingExecute(Sender: TObject);
- procedure acToolsShowFPSExecute(Sender: TObject);
- procedure acAADefaultExecute(Sender: TObject);
- procedure acViewSmoothShadingExecute(Sender: TObject);
- procedure acViewFlatShadingExecute(Sender: TObject);
- procedure acViewFlatLinesExecute(Sender: TObject);
- procedure acViewHiddenLinesExecute(Sender: TObject);
- procedure acViewWireFrameExecute(Sender: TObject);
- procedure acViewResetExecute(Sender: TObject);
- procedure acViewZoomOutExecute(Sender: TObject);
- procedure acViewZoomInExecute(Sender: TObject);
- procedure acPointsExecute(Sender: TObject);
- procedure AsyncTimerTimer(Sender: TObject);
- procedure acToolsNaviCubeExecute(Sender: TObject);
- procedure acToolsInfoExecute(Sender: TObject);
- procedure snViewerMouseLeave(Sender: TObject);
- procedure tvSceneCheckStateChanged(Sender: TCustomTreeView; Node: TTreeNode;
- CheckState: TNodeCheckState);
- procedure acHelpGLSHomePageExecute(Sender: TObject);
- procedure acHelpContentsExecute(Sender: TObject);
- procedure acHelpTopicSearchExecute(Sender: TObject);
- procedure acSaveTreeViewExecute(Sender: TObject);
- procedure acLoadTreeViewExecute(Sender: TObject);
- procedure tvSceneClick(Sender: TObject);
- procedure acSpheresExecute(Sender: TObject);
- private
- AssetPath: TFileName;
- procedure DoResetCamera;
- procedure SetupFreeFormShading;
- procedure ApplyShadeModeToMaterial(aMaterial: TGLMaterial);
- procedure ApplyShadeMode;
- procedure ApplyFSAA;
- procedure ApplyFaceCull;
- procedure ApplyTexturing;
- procedure ApplyFPS;
- procedure DoOpen(const FileName: String);
- public
- md, nthShow: Boolean;
- mx, my: Integer;
- hlShader: TGLShader;
- lastFileName: String;
- lastLoadWithTextures: Boolean;
- Points: TGLPoints;
- procedure ApplyBgColor;
- procedure ReadIniFile; override;
- procedure WriteIniFile; override;
- end;
- var
- FormGLSViewer: TFormGLSViewer;
- NaviCube: TGLNaviCube;
- //=======================================================================
- implementation
- //=======================================================================
- {$R *.dfm}
- uses
- GLS.FileOBJ,
- GLS.FileSTL,
- GLS.FileLWO,
- GLS.FileQ3BSP,
- GLS.FileOCT,
- GLS.FileMS3D,
- GLS.FileNMF,
- GLS.FileMD3,
- GLS.File3DS,
- GLS.FileMD2,
- GLS.FileSMD,
- GLS.FilePLY,
- GLS.FileGTS,
- GLS.FileVRML,
- GLS.FileMD5,
- GLS.FileTIN,
- GLS.FileDXF,
- GLS.FileGRD,
- GLS.FileX,
- GLS.FileGLTF;
- type
- // Hidden line shader (specific implem for the viewer, *not* generic)
- THiddenLineShader = class(TGLShader)
- private
- LinesColor: TGLColorVector;
- BackgroundColor: TGLColorVector;
- PassCount: Integer;
- public
- procedure DoApply(var rci: TGLRenderContextInfo; Sender: TObject); override;
- function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
- end;
- //---------------------------------------------------------------------------
- procedure THiddenLineShader.DoApply(var rci: TGLRenderContextInfo;
- Sender: TObject);
- begin
- PassCount := 1;
- with rci.GLStates do
- begin
- PolygonMode := pmFill;
- gl.Color3fv(@BackgroundColor);
- ActiveTextureEnabled[ttTexture2D] := False;
- Enable(stPolygonOffsetFill);
- PolygonOffsetFactor := 1;
- PolygonOffsetUnits := 2;
- end;
- end;
- function THiddenLineShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
- begin
- case PassCount of
- 1:
- with rci.GLStates do
- begin
- PassCount := 2;
- PolygonMode := pmLines;
- glColor3fv(@LinesColor);
- Disable(stLighting);
- Result := True;
- end;
- 2:
- begin
- rci.GLStates.Disable(stPolygonOffsetFill);
- Result := False;
- end;
- else
- // doesn't hurt to be cautious
- Assert(False);
- Result := False;
- end;
- end;
- //---------------------------------------------------------------------------
- procedure TFormGLSViewer.FormCreate(Sender: TObject);
- begin
- inherited;
- AssetPath := GetCurrentAssetPath();
- NaviCube := TGLNaviCube.CreateAsChild(Scene.Objects);
- NaviCube.SceneViewer := snViewer;
- NaviCube.FPS := 30;
- // instantiate our specific hidden-lines shader
- hlShader := THiddenLineShader.Create(Self);
- ffObject.IgnoreMissingTextures := True;
- end;
- procedure TFormGLSViewer.FormShow(Sender: TObject);
- begin
- if not nthShow then
- begin
- // using formats supported by gls
- dmDialogs.OpenDialog.InitialDir := AssetPath + '\model';;
- dmDialogs.OpenDialog.Filter := VectorFileFormatsFilter;
- dmDialogs.SaveDialog.Filter := VectorFileFormatsSaveFilter;
- ApplyFSAA;
- ApplyFaceCull;
- ApplyFPS;
- if ParamCount > 0 then
- DoOpen(ParamStr(0));
- nthShow := True;
- end;
- end;
- //---------------------------------------------------------------------------
- // OpenDialog
- //---------------------------------------------------------------------------
- procedure TFormGLSViewer.acFileOpenExecute(Sender: TObject);
- begin
- NaviCube.ActiveMouse := False;
- if dmDialogs.OpenDialog.Execute then
- DoOpen(dmDialogs.OpenDialog.FileName);
- end;
- procedure TFormGLSViewer.acFileOpenTexLibExecute(Sender: TObject);
- var
- I: Integer;
- begin
- dmDialogs.ODTextures.InitialDir := AssetPath + '\texture';;
- if dmDialogs.ODTextures.Execute then
- with MaterialLib do
- begin
- LoadFromFile(dmDialogs.ODTextures.FileName);
- for I := 0 to Materials.Count - 1 do
- with Materials[I].Material do
- BackProperties.Assign(FrontProperties);
- ApplyShadeMode;
- ApplyTexturing;
- end;
- end;
- procedure TFormGLSViewer.acFilePickExecute(Sender: TObject);
- begin
- dmDialogs.ODTextures.InitialDir := AssetPath + '\texture';;
- if dmDialogs.opDialog.Execute then
- begin
- with MaterialLib.Materials do
- begin
- with Items[Count - 1] do
- begin
- Tag := 1;
- Material.Texture.Image.LoadFromFile(dmDialogs.opDialog.FileName);
- Material.Texture.Enabled := True;
- end;
- end;
- ApplyTexturing;
- end;
- end;
- procedure TFormGLSViewer.acFileSaveAsExecute(Sender: TObject);
- var
- ext: String;
- begin
- if dmDialogs.SaveDialog.Execute then
- begin
- ext := ExtractFileExt(dmDialogs.SaveDialog.FileName);
- if ext = '' then
- dmDialogs.SaveDialog.FileName :=
- ChangeFileExt(dmDialogs.SaveDialog.FileName,
- '.' + GetVectorFileFormats.FindExtByIndex
- (dmDialogs.SaveDialog.FilterIndex, False, True));
- if GetVectorFileFormats.FindFromFileName(dmDialogs.SaveDialog.FileName) = nil
- then
- ShowMessage(_('Unsupported or unspecified file extension.'))
- else
- ffObject.SaveToFile(dmDialogs.SaveDialog.FileName);
- end;
- end;
- procedure TFormGLSViewer.acFileSaveTexturesExecute(Sender: TObject);
- begin
- if dmDialogs.SDTextures.Execute then
- MaterialLib.SaveToFile(dmDialogs.SDTextures.FileName);
- end;
- procedure TFormGLSViewer.snViewerBeforeRender(Sender: TObject);
- begin
- THiddenLineShader(hlShader).LinesColor := VectorMake(107 / 256, 123 / 256,
- 173 / 256, 1);
- THiddenLineShader(hlShader).BackgroundColor :=
- ConvertWinColor(snViewer.Buffer.BackgroundColor);
- if not gl.ARB_multisample then
- begin
- acAADefault.Checked := True;
- acAA2X.Enabled := False;
- acAA4X.Enabled := False;
- acAA8X.Enabled := False;
- acAA16X.Enabled := False;
- acCSA8X.Enabled := False;
- acCSA16X.Enabled := False;
- end;
- end;
- procedure TFormGLSViewer.snViewerAfterRender(Sender: TObject);
- begin
- ApplyFSAA;
- Screen.Cursor := crDefault;
- end;
- procedure TFormGLSViewer.DoResetCamera;
- var
- objSize: Single;
- begin
- dcObject.Position.AsVector := NullHmgPoint;
- Camera.Position.SetPoint(0, 4, 5);
- ffObject.Position.AsVector := NullHmgPoint;
- ffObject.Up.Assign(dcAxis.Up);
- ffObject.Direction.Assign(dcAxis.Direction);
- objSize := ffObject.BoundingSphereRadius;
- if objSize > 0 then
- begin
- if objSize < 1 then
- begin
- Camera.SceneScale := 1 / objSize;
- objSize := 1;
- end
- else
- Camera.SceneScale := 1;
- Camera.AdjustDistanceToTarget(objSize * 0.27);
- Camera.DepthOfView := 1.5 * Camera.DistanceToTarget + 2 * objSize;
- end;
- end;
- procedure TFormGLSViewer.ApplyShadeModeToMaterial(aMaterial: TGLMaterial);
- begin
- if acViewSmoothShading.Checked then
- begin
- snViewer.Buffer.Lighting := True;
- snViewer.Buffer.ShadeModel := smSmooth;
- aMaterial.PolygonMode := pmFill;
- end
- else if acViewFlatShading.Checked then
- begin
- snViewer.Buffer.Lighting := True;
- snViewer.Buffer.ShadeModel := smFlat;
- aMaterial.PolygonMode := pmFill;
- end
- else if acViewFlatLines.Checked then
- begin
- snViewer.Buffer.Lighting := True;
- snViewer.Buffer.ShadeModel := smFlat;
- aMaterial.PolygonMode := pmLines;
- end
- else if acViewHiddenLines.Checked then
- begin
- snViewer.Buffer.Lighting := False;
- snViewer.Buffer.ShadeModel := smSmooth;
- aMaterial.PolygonMode := pmLines;
- end
- else if acViewWireFrame.Checked then
- begin
- snViewer.Buffer.Lighting := False;
- snViewer.Buffer.ShadeModel := smSmooth;
- aMaterial.PolygonMode := pmLines;
- end;
- end;
- procedure TFormGLSViewer.ApplyShadeMode;
- var
- I: Integer;
- begin
- with MaterialLib.Materials do
- for I := 0 to Count - 1 do
- begin
- ApplyShadeModeToMaterial(Items[I].Material);
- if (acViewHiddenLines.Checked) or (acViewFlatLines.Checked) then
- Items[I].Shader := hlShader
- else
- Items[I].Shader := nil;
- end;
- snViewer.Buffer.Lighting := acToolsLighting.Checked;
- ffObject.StructureChanged;
- end;
- procedure TFormGLSViewer.ApplyFSAA;
- begin
- with snViewer.Buffer do
- begin
- if acAADefault.Checked then
- AntiAliasing := aaDefault
- else if acAA2X.Checked then
- AntiAliasing := aa2x
- else if acAA4X.Checked then
- AntiAliasing := aa4x
- else if acAA8X.Checked then
- AntiAliasing := aa8x
- else if acAA16X.Checked then
- AntiAliasing := aa16x
- else if acCSA8X.Checked then
- AntiAliasing := csa8x
- else if acCSA16X.Checked then
- AntiAliasing := csa16x;
- end;
- end;
- procedure TFormGLSViewer.ApplyFaceCull;
- begin
- with snViewer.Buffer do
- begin
- if acToolsFaceCulling.Checked then
- begin
- FaceCulling := True;
- ContextOptions := ContextOptions - [roTwoSideLighting];
- end
- else
- begin
- FaceCulling := False;
- ContextOptions := ContextOptions + [roTwoSideLighting];
- end;
- end;
- end;
- procedure TFormGLSViewer.ApplyBgColor;
- var
- bmp: TBitmap;
- col: TColor;
- begin
- bmp := TBitmap.Create;
- try
- bmp.Width := 16;
- bmp.Height := 16;
- col := ColorToRGB(dmDialogs.ColorDialog.Color);
- snViewer.Buffer.BackgroundColor := col;
- bmp.Canvas.Pen.Color := col xor $FFFFFF;
- bmp.Canvas.Rectangle(0, 0, 16, 16);
- bmp.Canvas.Brush.Color := col;
- finally
- bmp.Free;
- end;
- end;
- procedure TFormGLSViewer.ApplyTexturing;
- var
- I: Integer;
- begin
- with MaterialLib.Materials do
- for I := 0 to Count - 1 do
- begin
- with Items[I].Material.Texture do
- begin
- if Enabled then
- Items[I].Tag := Integer(True);
- Enabled := Boolean(Items[I].Tag) and acToolsTexturing.Checked;
- end;
- end;
- ffObject.StructureChanged;
- end;
- //--------------------------------------------------------------------------
- procedure TFormGLSViewer.AsyncTimerTimer(Sender: TObject);
- begin
- snViewer.ResetPerformanceMonitor;
- end;
- procedure TFormGLSViewer.ApplyFPS;
- begin
- if acToolsShowFPS.Checked then
- begin
- Timer.Enabled := True;
- Cadencer.Enabled := True;
- end
- else
- begin
- Timer.Enabled := False;
- Cadencer.Enabled := False;
- // StatusBar.Panels[3].Text := ' FPS';
- end;
- end;
- procedure TFormGLSViewer.SetupFreeFormShading;
- var
- I: Integer;
- LibMat: TGLLibMaterial;
- begin
- if MaterialLib.Materials.Count = 0 then
- begin
- ffObject.Material.MaterialLibrary := MaterialLib;
- LibMat := MaterialLib.Materials.Add;
- ffObject.Material.LibMaterialName := LibMat.Name;
- LibMat.Material.FrontProperties.Diffuse.Red := 0;
- end;
- for I := 0 to MaterialLib.Materials.Count - 1 do
- with MaterialLib.Materials[I].Material do
- BackProperties.Assign(FrontProperties);
- ApplyShadeMode;
- ApplyTexturing;
- ApplyFPS;
- end;
- procedure TFormGLSViewer.DoOpen(const FileName: String);
- var
- min, max: TAffineVector;
- Name: TFileName;
- begin
- if not FileExists(FileName) then
- Exit;
- Screen.Cursor := crHourGlass;
- FormGLSViewer.Caption := 'GLSViewer - ' + FileName;
- MaterialLib.Materials.Clear;
- ffObject.MeshObjects.Clear;
- ffObject.LoadFromFile(FileName);
- SetupFreeFormShading;
- acFileSaveTextures.Enabled := (MaterialLib.Materials.Count > 0);
- acFileOpenTexLib.Enabled := (MaterialLib.Materials.Count > 0);
- lastFileName := FileName;
- lastLoadWithTextures := acToolsTexturing.Enabled;
- ffObject.GetExtents(min, max);
- CubeLines.CubeWidth := max.X - min.X;
- CubeLines.CubeHeight := max.Y - min.Y;
- CubeLines.CubeDepth := max.Z - min.Z;
- CubeLines.Position.AsAffineVector := VectorLerp(min, max, 0.5);
- StatusBar.Panels[0].Text := 'X: ' + ' ';
- StatusBar.Panels[1].Text := 'Y: ' + ' ';
- StatusBar.Panels[2].Text := 'Z: ' + ' ';
- Name := ExtractFileName(FileName);
- StatusBar.Panels[3].Text := Name;
- DoResetCamera;
- end;
- procedure TFormGLSViewer.snViewerMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- mx := X;
- my := Y;
- md := True;
- end;
- procedure TFormGLSViewer.snViewerMouseLeave(Sender: TObject);
- begin
- Cadencer.Enabled := False;
- end;
- procedure TFormGLSViewer.snViewerMouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- var
- d: Single;
- begin
- if md and (Shift <> []) then
- begin
- if ssLeft in Shift then
- if ssShift in Shift then
- Camera.MoveAroundTarget((my - Y) * 0.1, (mx - X) * 0.1)
- else
- Camera.MoveAroundTarget(my - Y, mx - X)
- else if ssRight in Shift then
- begin
- d := Camera.DistanceToTarget * 0.01 * (X - mx + Y - my);
- if IsKeyDown('x') then
- ffObject.Translate(d, 0, 0)
- else if IsKeyDown('y') then
- ffObject.Translate(0, d, 0)
- else if IsKeyDown('z') then
- ffObject.Translate(0, 0, d)
- else
- begin
- if ssShift in Shift then
- Camera.RotateObject(ffObject, (my - Y) * 0.1, (mx - X) * 0.1)
- else
- Camera.RotateObject(ffObject, my - Y, mx - X);
- end;
- end;
- mx := X;
- my := Y;
- end;
- end;
- procedure TFormGLSViewer.snViewerMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- md := False;
- end;
- procedure TFormGLSViewer.FormMouseWheel(Sender: TObject; Shift: TShiftState;
- WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
- begin
- if ffObject.MeshObjects.Count > 0 then
- begin
- Camera.AdjustDistanceToTarget(Power(1.05, WheelDelta / 120));
- Camera.DepthOfView := 2 * Camera.DistanceToTarget + 2 *
- ffObject.BoundingSphereRadius;
- end;
- Handled := True;
- end;
- procedure TFormGLSViewer.MaterialLibTextureNeeded(Sender: TObject;
- var textureFileName: String);
- begin
- if not acToolsTexturing.Enabled then
- textureFileName := '';
- end;
- procedure TFormGLSViewer.acInvertNormalsExecute(Sender: TObject);
- var
- I: Integer;
- begin
- with ffObject.MeshObjects do
- for I := 0 to Count - 1 do
- Items[I].Normals.Scale(-1);
- ffObject.StructureChanged;
- end;
- procedure TFormGLSViewer.acReverseRenderingOrderExecute(Sender: TObject);
- var
- I, j, n: Integer;
- fg: TGLFaceGroup;
- begin
- with ffObject.MeshObjects do
- begin
- // invert meshobjects order
- for I := 0 to (Count div 2) do
- Exchange(I, Count - 1 - I);
- // for each mesh object
- for I := 0 to Count - 1 do
- with Items[I] do
- begin
- // invert facegroups order
- n := FaceGroups.Count;
- for j := 0 to (n div 2) do
- Exchange(j, n - 1 - j);
- // for each facegroup
- for j := 0 to n - 1 do
- begin
- fg := FaceGroups[j];
- fg.Reverse;
- end;
- end;
- end;
- ffObject.StructureChanged;
- end;
- procedure TFormGLSViewer.acSaveAsUpdate(Sender: TObject);
- begin
- acFileSaveAs.Enabled := (ffObject.MeshObjects.Count > 0);
- end;
- procedure TFormGLSViewer.acHelpAboutExecute(Sender: TObject);
- begin
- with TGLAbout.Create(Self) do
- try
- ShowModal;
- finally
- Free;
- end;
- end;
- procedure TFormGLSViewer.acHelpContentsExecute(Sender: TObject);
- begin
- inherited;
- ShellExecute(0, 'open', 'https://en.wikipedia.org/wiki/GLScene', '', '', SW_SHOW);
- end;
- procedure TFormGLSViewer.acHelpTopicSearchExecute(Sender: TObject);
- begin
- inherited;
- ShellExecute(0, 'open', 'https://glscene.org', '', '', SW_SHOW);
- end;
- procedure TFormGLSViewer.acHelpGLSHomePageExecute(Sender: TObject);
- begin
- inherited;
- ShellExecute(0, 'open','https://github.com/glscene', '', '', SW_SHOW);
- end;
- procedure TFormGLSViewer.acAADefaultExecute(Sender: TObject);
- begin
- (Sender as TAction).Checked := True;
- ApplyFSAA;
- end;
- procedure TFormGLSViewer.acConvertToIndexedTrianglesExecute(Sender: TObject);
- var
- v: TGLAffineVectorList;
- I: TGLIntegerList;
- m: TGLMeshObject;
- fg: TFGVertexIndexList;
- begin
- v := ffObject.MeshObjects.ExtractTriangles;
- try
- I := BuildVectorCountOptimizedIndices(v);
- try
- RemapAndCleanupReferences(v, I);
- IncreaseCoherency(I, 12);
- I.Capacity := I.Count;
- ffObject.MeshObjects.Clean;
- m := TGLMeshObject.CreateOwned(ffObject.MeshObjects);
- m.Vertices := v;
- m.BuildNormals(I, momTriangles);
- m.Mode := momFaceGroups;
- fg := TFGVertexIndexList.CreateOwned(m.FaceGroups);
- fg.VertexIndices := I;
- fg.Mode := fgmmTriangles;
- ffObject.StructureChanged;
- finally
- I.Free;
- end;
- finally
- v.Free;
- end;
- MaterialLib.Materials.Clear;
- SetupFreeFormShading;
- end;
- procedure TFormGLSViewer.acStripifyExecute(Sender: TObject);
- var
- I: Integer;
- mo: TGLMeshObject;
- fg: TFGVertexIndexList;
- strips: TGLPersistentObjectList;
- begin
- acConvertToTriangles.Execute;
- mo := ffObject.MeshObjects[0];
- fg := (mo.FaceGroups[0] as TFGVertexIndexList);
- strips := StripifyMesh(fg.VertexIndices, mo.Vertices.Count, True);
- try
- fg.Free;
- for I := 0 to strips.Count - 1 do
- begin
- fg := TFGVertexIndexList.CreateOwned(mo.FaceGroups);
- fg.VertexIndices := (strips[I] as TGLIntegerList);
- if I = 0 then
- fg.Mode := fgmmTriangles
- else
- fg.Mode := fgmmTriangleStrip;
- end;
- finally
- strips.Free;
- end;
- end;
- procedure TFormGLSViewer.acSaveTreeViewExecute(Sender: TObject);
- begin
- if SaveDialog.Execute then
- begin
- tvScene.SaveToFile(SaveDialog.FileName);
- // CurrentStar := GetCurrentDir();
- end;
- end;
- procedure TFormGLSViewer.acSpheresExecute(Sender: TObject);
- begin
- inherited;
- // random spheres
- end;
- procedure TFormGLSViewer.acLoadTreeViewExecute(Sender: TObject);
- begin
- inherited;
- //
- end;
- procedure TFormGLSViewer.acViewFlatShadingExecute(Sender: TObject);
- begin
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acViewHiddenLinesExecute(Sender: TObject);
- begin
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acViewResetExecute(Sender: TObject);
- begin
- DoResetCamera;
- end;
- procedure TFormGLSViewer.acViewFlatLinesExecute(Sender: TObject);
- begin
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acViewSmoothShadingExecute(Sender: TObject);
- begin
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acViewWireFrameExecute(Sender: TObject);
- begin
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acViewZoomInExecute(Sender: TObject);
- var
- h: Boolean;
- begin
- FormMouseWheel(Self, [], -120 * 4, Point(0, 0), h);
- end;
- procedure TFormGLSViewer.acViewZoomOutExecute(Sender: TObject);
- var
- h: Boolean;
- begin
- FormMouseWheel(Self, [], 120 * 4, Point(0, 0), h);
- end;
- procedure TFormGLSViewer.acOptimizeExecute(Sender: TObject);
- begin
- OptimizeMesh(ffObject.MeshObjects, [mooVertexCache, mooSortByMaterials]);
- ffObject.StructureChanged;
- SetupFreeFormShading;
- end;
- procedure TFormGLSViewer.acToolsOptionsExecute(Sender: TObject);
- begin
- with TGLOptions.Create(Self) do
- try
- ShowModal;
- finally
- Free;
- end;
- end;
- procedure TFormGLSViewer.acToolsFaceCullingExecute(Sender: TObject);
- begin
- acToolsFaceCulling.Checked := not acToolsFaceCulling.Checked;
- ApplyFaceCull;
- end;
- procedure TFormGLSViewer.acToolsInfoExecute(Sender: TObject);
- begin
- with TGLDialog.Create(Self) do
- try
- Memo.Lines[0] := 'Triangles: ' +
- IntToStr(ffObject.MeshObjects.TriangleCount);
- Memo.Lines[1] := 'Area: ' + FloatToStr(ffObject.MeshObjects.Area);
- Memo.Lines[2] := 'Volume: ' + FloatToStr(ffObject.MeshObjects.Volume);
- ShowModal;
- finally
- Free;
- end;
- end;
- procedure TFormGLSViewer.acToolsLightingExecute(Sender: TObject);
- begin
- acToolsLighting.Checked := not acToolsLighting.Checked;
- // TBLighting
- ApplyShadeMode;
- end;
- procedure TFormGLSViewer.acToolsShowFPSExecute(Sender: TObject);
- begin
- acToolsShowFPS.Checked := not acToolsShowFPS.Checked;
- ApplyFPS;
- end;
- procedure TFormGLSViewer.acToolsTexturingExecute(Sender: TObject);
- begin
- acToolsTexturing.Checked := not acToolsTexturing.Checked;
- if acToolsTexturing.Checked then
- if lastLoadWithTextures then
- ApplyTexturing
- else
- begin
- DoOpen(lastFileName);
- end
- else
- ApplyTexturing;
- end;
- procedure TFormGLSViewer.acToolsNaviCubeExecute(Sender: TObject);
- begin
- acToolsNaviCube.Checked := not acToolsNaviCube.Checked;
- if acToolsNaviCube.Checked = True then
- begin
- NaviCube.Visible := True;
- Cadencer.Enabled := True;
- end
- else
- begin
- NaviCube.Visible := False;
- Cadencer.Enabled := False;
- end;
- snViewer.Invalidate;
- end;
- // Show Base and Additional Objects
- procedure TFormGLSViewer.acPointsExecute(Sender: TObject);
- var
- I: Integer;
- Color: TVector3f;
- NumPoints: Integer;
- X, Y, Z: Single;
- begin
- NumPoints := 10000;
- GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
- GLPoints.Size := 5.0;
- GLPoints.Style := psSmooth;
- for I := 0 to NumPoints - 1 do
- begin
- Color.X := Random();
- Color.Y := Random();
- Color.Z := Random();
- X := Random(10) - 5;
- Y := Random(10) - 5;
- Z := Random(10) - 5;
- GLPoints.Positions.Add(X * 0.05, Y * 0.05, Z * 0.05);
- // Fill array of GLPoints
- GLPoints.Colors.AddPoint(Color);
- end;
- // dcWorld.Remove(GLPoints, False);
- // GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
- end;
- (*
- procedure TMainForm.acDeletePoints(Sender: TObject);
- var
- I: Integer;
- Color: TVector3f;
- NumPoints: Integer;
- X, Y, Z: Single;
- begin
- NumPoints := 10000;
- GLPoints := TGLPoints(dcWorld.AddNewChild(TGLPoints));
- for I := 0 to NumPoints - 1 do
- begin
- Color.X := Random();
- Color.Y := Random();
- Color.Z := Random();
- X := Random(100) - 50;
- Y := Random(100) - 50;
- Z := Random(100) - 50;
- GLPoints.Positions.Add(X * 0.05, Y * 0.05, Z * 0.05);
- // Fill array of GLPoints
- end;
- end;
- *)
- procedure TFormGLSViewer.acFileExitExecute(Sender: TObject);
- begin
- Close;
- end;
- procedure TFormGLSViewer.CadencerProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- begin
- if NaviCube.InactiveTime > 5 then
- begin
- if NaviCube.InactiveTime < 8 then
- Camera.TurnAngle := Camera.TurnAngle + (NaviCube.InactiveTime - 5) *
- deltaTime * 2
- else
- Camera.TurnAngle := Camera.TurnAngle + deltaTime * 6;
- end;
- snViewer.Refresh;
- if Self.Focused then
- snViewer.Invalidate;
- end;
- procedure TFormGLSViewer.TimerTimer(Sender: TObject);
- begin
- // StatusBar.Panels[3].Text := Format('%.1f FPS', [snViewer.FramesPerSecond]);
- snViewer.ResetPerformanceMonitor;
- end;
- //---------------------------------------------------------------------------
- procedure TFormGLSViewer.tvSceneCheckStateChanged(Sender: TCustomTreeView;
- Node: TTreeNode; CheckState: TNodeCheckState);
- begin
- inherited;
- // Add or removed scene's objects
- end;
- //---------------------------------------------------------------------------
- procedure TFormGLSViewer.tvSceneClick(Sender: TObject);
- var
- ObjectName: String;
- Cube: TGLCube;
- begin
- ObjectName := tvScene.Selected.Text;
- case tvScene.Selected.SelectedIndex of
- 4: acPointsExecute(Sender); //Points
- 5: ; //Lines
- 8: // Create GLCube
- begin
- // Scene.FindSceneObject(Cube);
- dcObject.ClearStructureChanged;
- Cube := TGLCube.CreateAsChild(dcObject);
- Cube.CubeDepth := 0.8;
- Cube.CubeHeight := 0.8;
- Cube.CubeWidth := 0.8;
- Cube.Position.SetPoint(1, 0.2, 0);
- Cube.Material.FrontProperties.Diffuse.SetColor(1.0,0.5,0.0);
- end;
- 9: ; //Frustum
- 10: ; //Sphere
- end;
- // ase True of
- //
- // end;
- end;
- procedure TFormGLSViewer.ReadIniFile;
- begin
- inherited;
- IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
- try
- Top := IniFile.ReadInteger(Name, 'Top', 100);
- Left := IniFile.ReadInteger(Name, 'Left', 200);
- finally
- IniFile.Free;
- end;
- end;
- procedure TFormGLSViewer.WriteIniFile;
- begin
- IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
- with IniFile do
- try
- WriteInteger(Name, 'Top', Top);
- WriteInteger(Name, 'Left', Left);
- // WriteBool(Name, 'InitMax', WindowState = wsMaximized);
- finally
- IniFile.Free;
- end;
- inherited;
- end;
- end.
|