2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Skeleton colliders for defining and controlling verlet
9
11/12/03 - SG - Now uses AddToVerletWorld to build the constraints.
10
08/10/03 - SG - Creation.
13
unit GLVerletSkeletonColliders;
20
GLPersistentClasses, GLVectorGeometry, GLVectorFileObjects, GLVerletTypes,
27
{ Base verlet skeleton collider class. }
28
TSCVerletBase = class(TGLSkeletonCollider)
30
FVerletConstraint : TVerletConstraint;
33
procedure WriteToFiler(writer : TVirtualWriter); override;
34
procedure ReadFromFiler(reader : TVirtualReader); override;
35
procedure AddToVerletWorld(VerletWorld : TGLVerletWorld); virtual;
37
{ The verlet constraint is created through the AddToVerletWorld
39
property VerletConstraint : TVerletConstraint read FVerletConstraint;
44
{ Sphere shaped verlet constraint in a skeleton collider. }
45
TSCVerletSphere = class(TSCVerletBase)
50
procedure SetRadius(const val : Single);
53
constructor Create; override;
54
procedure WriteToFiler(writer : TVirtualWriter); override;
55
procedure ReadFromFiler(reader : TVirtualReader); override;
56
procedure AddToVerletWorld(VerletWorld : TGLVerletWorld); override;
57
procedure AlignCollider; override;
59
property Radius : Single read FRadius write SetRadius;
64
{ Capsule shaped verlet constraint in a skeleton collider. }
65
TSCVerletCapsule = class(TSCVerletBase)
71
procedure SetRadius(const val : Single);
72
procedure SetLength(const val : Single);
75
constructor Create; override;
76
procedure WriteToFiler(writer : TVirtualWriter); override;
77
procedure ReadFromFiler(reader : TVirtualReader); override;
78
procedure AddToVerletWorld(VerletWorld : TGLVerletWorld); override;
79
procedure AlignCollider; override;
81
property Radius : Single read FRadius write SetRadius;
82
property Length : Single read FLength write SetLength;
85
{ After loading call this function to add all the constraints in a
86
skeleton collider list to a given verlet world. }
87
procedure AddSCVerletConstriantsToVerletWorld(
88
colliders : TGLSkeletonColliderList; world : TGLVerletWorld);
90
// ------------------------------------------------------------------
91
// ------------------------------------------------------------------
92
// ------------------------------------------------------------------
94
// ------------------------------------------------------------------
95
// ------------------------------------------------------------------
96
// ------------------------------------------------------------------
98
// ------------------ Global methods ------------------
101
// AddSCVerletConstriantsToVerletWorld
103
procedure AddSCVerletConstriantsToVerletWorld(
104
colliders : TGLSkeletonColliderList; world : TGLVerletWorld);
108
for i:=0 to colliders.Count-1 do
109
if colliders[i] is TSCVerletBase then
110
TSCVerletBase(colliders[i]).AddToVerletWorld(world);
114
// ------------------ TSCVerletBase ------------------
119
procedure TSCVerletBase.WriteToFiler(writer : TVirtualWriter);
121
inherited WriteToFiler(writer);
123
WriteInteger(0); // Archive Version 0
129
procedure TSCVerletBase.ReadFromFiler(reader : TVirtualReader);
131
archiveVersion : integer;
133
inherited ReadFromFiler(reader);
134
archiveVersion:=reader.ReadInteger;
135
if archiveVersion=0 then with reader do
137
else RaiseFilerException(archiveVersion);
142
procedure TSCVerletBase.AddToVerletWorld(VerletWorld : TGLVerletWorld);
149
// ------------------ TSCVerletSphere ------------------
154
constructor TSCVerletSphere.Create;
163
procedure TSCVerletSphere.WriteToFiler(writer : TVirtualWriter);
165
inherited WriteToFiler(writer);
167
WriteInteger(0); // Archive Version 0
174
procedure TSCVerletSphere.ReadFromFiler(reader : TVirtualReader);
176
archiveVersion : integer;
178
inherited ReadFromFiler(reader);
179
archiveVersion:=reader.ReadInteger;
180
if archiveVersion=0 then with reader do
182
else RaiseFilerException(archiveVersion);
187
procedure TSCVerletSphere.AddToVerletWorld(VerletWorld : TGLVerletWorld);
189
FVerletConstraint:=TVCSphere.Create(VerletWorld);
190
TVCSphere(FVerletConstraint).Radius:=FRadius;
196
procedure TSCVerletSphere.AlignCollider;
199
if Assigned(FVerletConstraint) then
200
TVCSphere(FVerletConstraint).Location:=AffineVectorMake(GlobalMatrix.V[3]);
205
procedure TSCVerletSphere.SetRadius(const val : Single);
207
if val<>FRadius then begin
209
if Assigned(FVerletConstraint) then
210
TVCSphere(FVerletConstraint).Radius:=FRadius;
216
// ------------------ TSCVerletCapsule ------------------
221
constructor TSCVerletCapsule.Create;
231
procedure TSCVerletCapsule.WriteToFiler(writer : TVirtualWriter);
233
inherited WriteToFiler(writer);
235
WriteInteger(0); // Archive Version 0
243
procedure TSCVerletCapsule.ReadFromFiler(reader : TVirtualReader);
245
archiveVersion : integer;
247
inherited ReadFromFiler(reader);
248
archiveVersion:=reader.ReadInteger;
249
if archiveVersion=0 then with reader do begin
252
end else RaiseFilerException(archiveVersion);
257
procedure TSCVerletCapsule.AddToVerletWorld(VerletWorld : TGLVerletWorld);
259
FVerletConstraint:=TVCCapsule.Create(VerletWorld);
260
TVCCapsule(FVerletConstraint).Radius:=FRadius;
261
TVCCapsule(FVerletConstraint).Length:=FLength;
267
procedure TSCVerletCapsule.AlignCollider;
270
if Assigned(FVerletConstraint) then begin
271
TVCCapsule(FVerletConstraint).Location:=AffineVectorMake(GlobalMatrix.V[3]);
272
TVCCapsule(FVerletConstraint).Axis:=AffineVectorMake(GlobalMatrix.V[1]);
278
procedure TSCVerletCapsule.SetRadius(const val : Single);
280
if val<>FRadius then begin
282
if Assigned(FVerletConstraint) then
283
TVCCapsule(FVerletConstraint).Radius:=FRadius;
289
procedure TSCVerletCapsule.SetLength(const val : Single);
291
if val<>FLength then begin
293
if Assigned(FVerletConstraint) then
294
TVCCapsule(FVerletConstraint).Length:=FLength;
298
// ------------------------------------------------------------------
299
// ------------------------------------------------------------------
300
// ------------------------------------------------------------------
302
// ------------------------------------------------------------------
303
// ------------------------------------------------------------------
304
// ------------------------------------------------------------------
306
RegisterClasses([TSCVerletBase,TSCVerletSphere,TSCVerletCapsule]);