GBE.ConeExtend.pas 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. unit GBE.ConeExtend;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. FMX.Types,
  7. FMX.Controls3D,
  8. FMX.Objects3D,
  9. FMX.Types3D,
  10. System.Math.Vectors,
  11. FMX.MaterialSources;
  12. type
  13. TCustomMeshHelper = class(TCustomMesh);
  14. TConeForme = (PyramidTriangle, PyramidSquare, Tipi, Cone);
  15. TGBEConeExtend = class(TCone)
  16. private
  17. fForme: TConeForme;
  18. fShowlines: boolean;
  19. fMaterialLignes: TColorMaterialSource;
  20. procedure SetForme(const Value: TConeForme);
  21. procedure CreateGBECone(const aData: TMeshData;
  22. const aForme: TConeForme = TConeForme.Cone);
  23. protected
  24. public
  25. constructor Create(AOwner: TComponent); override;
  26. procedure Render; override;
  27. published
  28. property Forme: TConeForme read fForme write SetForme;
  29. property ShowLines: boolean read fShowlines write fShowlines;
  30. property MaterialLines: TColorMaterialSource read fMaterialLignes
  31. write fMaterialLignes;
  32. end;
  33. procedure Register;
  34. implementation // --------------------------------------------------------------
  35. // TGBEConeExtend
  36. constructor TGBEConeExtend.Create(AOwner: TComponent);
  37. begin
  38. inherited;
  39. fForme := TConeForme.Cone;
  40. end;
  41. procedure TGBEConeExtend.SetForme(const Value: TConeForme);
  42. begin
  43. if Value <> fForme then
  44. begin
  45. fForme := Value;
  46. CreateGBECone(self.Data, fForme);
  47. end;
  48. end;
  49. procedure TGBEConeExtend.CreateGBECone(Const aData: TMeshData;
  50. Const aForme: TConeForme = TConeForme.Cone);
  51. var
  52. D: TMeshData;
  53. Co: TCone;
  54. begin
  55. D := TMeshData.Create;
  56. Co := TCone.Create(nil);
  57. case fForme of
  58. PyramidTriangle:
  59. Co.SubdivisionsAxes := 3;
  60. PyramidSquare:
  61. Co.SubdivisionsAxes := 4;
  62. Tipi:
  63. Co.SubdivisionsAxes := 6;
  64. Cone:
  65. Co.SubdivisionsAxes := 12;
  66. end;
  67. Co.SubdivisionsHeight := self.SubdivisionsHeight;
  68. Co.SubdivisionsCap := self.SubdivisionsCap;
  69. D.Assign(TCustomMeshHelper(Co).Data);
  70. TCustomMeshHelper(Co).Data.Clear;
  71. Co.Free;
  72. D.CalcTangentBinormals;
  73. aData.Clear;
  74. aData.Assign(D);
  75. D.Free;
  76. end;
  77. procedure TGBEConeExtend.Render;
  78. begin
  79. inherited;
  80. if ShowLines then
  81. Context.DrawLines(self.Data.VertexBuffer, self.Data.IndexBuffer,
  82. TMaterialSource.ValidMaterial(fMaterialLignes), 1);
  83. end;
  84. //----------------------------------------------------------------------------
  85. procedure Register;
  86. begin
  87. RegisterComponents('GXScene GBE', [TGBEConeExtend]);
  88. end;
  89. end.