-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathGBEGrass.pas
90 lines (77 loc) · 2.04 KB
/
GBEGrass.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
{
Ecrit par Grégory Bersegeay
Le TGBEGrass permet de simuler de la végétation dans une scène 3D.
}
unit GBEGrass;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Controls3D, FMX.Objects3D, FMX.Graphics, System.UITypes, FMX.Materials,FMX.types3D, System.Types,
System.Math.Vectors, FMX.Materialsources, system.threading;
type
TGBEGrass = class(TMesh)
private
fWind : boolean;
fTemps : single;
protected
procedure Render; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure generateGrass;
published
property Locked default False;
property HitTest default False;
property Temps : single read fTemps write fTemps;
property Wind : boolean read fWind write fWind;
property ZWrite default false;
property Visible default True;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('GBE3D', [TGBEGrass]);
end;
{ TGBECubemap }
constructor TGBEGrass.Create(AOwner: TComponent);
begin
inherited;
Wind := true;
fTemps := 0;
zWrite := false;
TwoSide := true;
hitTest := false;
generateGrass;
end;
procedure TGBEGrass.Render;
var
valeur : single;
begin
inherited;
if wind then
begin
TTask.create(procedure
begin
fTemps := fTemps + 0.1;
valeur := sin(fTemps) * 0.1;
self.Data.VertexBuffer.VerticesPtr[0].X := self.Data.VertexBuffer.VerticesPtr[2].X + valeur;
self.Data.VertexBuffer.VerticesPtr[1].X := self.Data.VertexBuffer.VerticesPtr[3].X + valeur;
end).start;
end;
end;
procedure TGBEGrass.generateGrass;
begin
self.Data.Clear;
self.Data.Points :=
'-1 -1 0, 1 -1 0, -1 1 0, 1 1 0';
// Positionnement de la texture à chaque points
self.Data.TexCoordinates :=
'0.0 0.0, 1 0, 0.0 1, 1 1';
// Création et indexation des triangles en fonction du besoin
self.Data.TriangleIndices := '0 1 2 ,2 1 3';
end;
destructor TGBEGrass.Destroy;
begin
inherited;
end;
end.