utoolphong.pas 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit UToolPhong;
  3. {$mode objfpc}
  4. interface
  5. uses
  6. Classes, SysUtils, UTool, UToolVectorial, BGRABitmapTypes, BGRABitmap, BGRAGradients,
  7. LCVectorOriginal;
  8. type
  9. { TToolPhong }
  10. TToolPhong = class(TVectorialTool)
  11. protected
  12. FMatrix: TAffineMatrix;
  13. procedure ShapeChange({%H-}ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff); override;
  14. procedure AssignShapeStyle(AMatrix: TAffineMatrix; AAlwaysFit: boolean); override;
  15. function ShapeClass: TVectorShapeAny; override;
  16. public
  17. constructor Create(AManager: TToolManager); override;
  18. function GetContextualToolbars: TContextualToolbars; override;
  19. end;
  20. implementation
  21. uses ugraph, Graphics, LazPaintType, LCVectorRectShapes, BGRATransform;
  22. { TToolPhong }
  23. constructor TToolPhong.Create(AManager: TToolManager);
  24. begin
  25. inherited Create(AManager);
  26. FMatrix := AffineMatrixIdentity;
  27. end;
  28. function TToolPhong.GetContextualToolbars: TContextualToolbars;
  29. begin
  30. Result:= [ctBackFill,ctPhong,ctAltitude];
  31. end;
  32. procedure TToolPhong.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff);
  33. var
  34. posF: TPointF;
  35. begin
  36. posF := AffineMatrixInverse(FMatrix)*(FShape as TPhongShape).LightPosition;
  37. Manager.LightPosition := posF;
  38. inherited ShapeChange(ASender, ABounds, ADiff);
  39. end;
  40. procedure TToolPhong.AssignShapeStyle(AMatrix: TAffineMatrix; AAlwaysFit: boolean);
  41. begin
  42. inherited AssignShapeStyle(AMatrix, AAlwaysFit);
  43. FMatrix := AMatrix;
  44. with (FShape as TPhongShape) do
  45. begin
  46. ShapeKind := Manager.PhongShapeKind;
  47. LightPosition := AMatrix*Manager.LightPosition;
  48. ShapeAltitudePercent := Manager.PhongShapeAltitude;
  49. BorderSizePercent:= Manager.PhongShapeBorderSize;
  50. end;
  51. end;
  52. function TToolPhong.ShapeClass: TVectorShapeAny;
  53. begin
  54. result := TPhongShape;
  55. end;
  56. initialization
  57. RegisterTool(ptPhong,TToolPhong);
  58. end.