1
unit LUX.GPU.OpenGL.Shaper;
9
System.RegularExpressions,
10
System.Generics.Collections,
20
LUX.GPU.OpenGL.Atom.Buffer,
21
LUX.GPU.OpenGL.Atom.Buffer.VerBuf,
22
LUX.GPU.OpenGL.Atom.Buffer.EleBuf,
23
LUX.GPU.OpenGL.Scener,
24
LUX.GPU.OpenGL.Matery;
29
TGLShaperPoin = class;
30
TGLShaperLine = class;
31
TGLShaperFace = class;
33
TGLShaper = class(TGLObject, IGLShaper)
38
constructor Create; override;
39
destructor Destroy; override;
40
property Matery: IGLMatery read _Matery write _Matery;
41
procedure BeginDraw; override;
42
procedure EndDraw; override;
45
TGLShaperZeroPoins = class(TGLShaper)
49
function GetPoinsN: Integer;
50
procedure SetPoinsN(const PoinsN_: Integer);
52
constructor Create; override;
53
destructor Destroy; override;
54
property PoinsN: Integer read GetPoinsN write SetPoinsN;
55
procedure BeginDraw; override;
56
procedure DrawMain; override;
57
procedure EndDraw; override;
60
TGLShaperZeroLines = class(TGLShaper)
64
function GetLinesN: Integer;
65
procedure SetLinesN(const LinesN_: Integer);
67
constructor Create; override;
68
destructor Destroy; override;
69
property LinesN: Integer read GetLinesN write SetLinesN;
70
procedure BeginDraw; override;
71
procedure DrawMain; override;
72
procedure EndDraw; override;
75
TGLShaperZeroTrias = class(TGLShaper)
79
function GetTriasN: Integer;
80
procedure SetTriasN(const TriasN_: Integer);
82
constructor Create; override;
83
destructor Destroy; override;
84
property TriasN: Integer read GetTriasN write SetTriasN;
85
procedure BeginDraw; override;
86
procedure DrawMain; override;
87
procedure EndDraw; override;
90
TGLShaperPoin = class(TGLShaper)
93
_PosBuf: TGLVerBufS<TSingle3D>;
94
_NorBuf: TGLVerBufS<TSingle3D>;
95
_TexBuf: TGLVerBufS<TSingle2D>;
97
constructor Create; override;
98
destructor Destroy; override;
99
property PosBuf: TGLVerBufS<TSingle3D> read _PosBuf;
100
property NorBuf: TGLVerBufS<TSingle3D> read _NorBuf;
101
property TexBuf: TGLVerBufS<TSingle2D> read _TexBuf;
102
procedure BeginDraw; override;
103
procedure DrawMain; override;
104
procedure EndDraw; override;
105
procedure CalcBouBox; override;
106
procedure LoadFromFunc(const Func_: TConstFunc<TdSingle2D, TdSingle3D>;
107
const DivU_, DivV_: Integer); virtual;
108
procedure LoadFromFileSTL(const FileName_: String);
109
procedure LoadFromFileOBJ(const FileName_: String);
112
TGLShaperLine = class(TGLShaperPoin)
115
_EleBuf: TGLEleBufLine32;
118
constructor Create; override;
119
destructor Destroy; override;
120
property EleBuf: TGLEleBufLine32 read _EleBuf;
121
property LineW: Single read _LineW write _LineW;
122
procedure BeginDraw; override;
123
procedure DrawMain; override;
124
procedure EndDraw; override;
125
procedure LoadFromFunc(const Func_: TConstFunc<TdSingle2D, TdSingle3D>;
126
const DivU_, DivV_: Integer); override;
127
procedure LoadFromFileSTL(const FileName_: String);
128
procedure LoadFromFileOBJ(const FileName_: String);
131
TGLShaperQuadLine = class(TGLShaperPoin)
134
_EleBuf: TGLEleBufQuadLines32;
137
constructor Create; override;
138
destructor Destroy; override;
139
property EleBuf: TGLEleBufQuadLines32 read _EleBuf;
140
property LineW: Single read _LineW write _LineW;
141
procedure BeginDraw; override;
142
procedure DrawMain; override;
143
procedure EndDraw; override;
146
TGLShaperFace = class(TGLShaperPoin)
149
_EleBuf: TGLEleBufFace32;
151
constructor Create; override;
152
destructor Destroy; override;
153
property EleBuf: TGLEleBufFace32 read _EleBuf;
154
procedure DrawMain; override;
155
procedure LoadFromFunc(const Func_: TConstFunc<TdSingle2D, TdSingle3D>;
156
const DivU_, DivV_: Integer); override;
157
procedure LoadFromFileSTL(const FileName_: String);
158
procedure LoadFromFileOBJ(const FileName_: String);
162
// ############################################################### ■
164
constructor TGLShaper.Create;
171
destructor TGLShaper.Destroy;
177
/// //////////////////////////////////////////////////////////////////// メソッド
179
procedure TGLShaper.BeginDraw;
183
if Assigned(_Matery) then
187
procedure TGLShaper.EndDraw;
189
if Assigned(_Matery) then
195
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperZeroPoins
197
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
199
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
201
/// //////////////////////////////////////////////////////////////////// アクセス
203
function TGLShaperZeroPoins.GetPoinsN: Integer;
208
procedure TGLShaperZeroPoins.SetPoinsN(const PoinsN_: Integer);
213
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
215
constructor TGLShaperZeroPoins.Create;
222
destructor TGLShaperZeroPoins.Destroy;
228
/// //////////////////////////////////////////////////////////////////// メソッド
230
procedure TGLShaperZeroPoins.BeginDraw;
236
procedure TGLShaperZeroPoins.DrawMain;
238
glDrawArrays(GL_POINTS, 0, _PoinsN);
241
procedure TGLShaperZeroPoins.EndDraw;
247
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperZeroLines
249
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
251
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
253
/// //////////////////////////////////////////////////////////////////// アクセス
255
function TGLShaperZeroLines.GetLinesN: Integer;
260
procedure TGLShaperZeroLines.SetLinesN(const LinesN_: Integer);
265
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
267
constructor TGLShaperZeroLines.Create;
274
destructor TGLShaperZeroLines.Destroy;
280
/// //////////////////////////////////////////////////////////////////// メソッド
282
procedure TGLShaperZeroLines.BeginDraw;
288
procedure TGLShaperZeroLines.DrawMain;
290
glDrawArrays(GL_LINES, 0, _LinesN);
293
procedure TGLShaperZeroLines.EndDraw;
299
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperZeroTrias
301
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
303
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
305
/// //////////////////////////////////////////////////////////////////// アクセス
307
function TGLShaperZeroTrias.GetTriasN: Integer;
312
procedure TGLShaperZeroTrias.SetTriasN(const TriasN_: Integer);
317
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
319
constructor TGLShaperZeroTrias.Create;
326
destructor TGLShaperZeroTrias.Destroy;
332
/// //////////////////////////////////////////////////////////////////// メソッド
334
procedure TGLShaperZeroTrias.BeginDraw;
340
procedure TGLShaperZeroTrias.DrawMain;
342
glDrawArrays(GL_TRIANGLES, 0, _TriasN);
345
procedure TGLShaperZeroTrias.EndDraw;
351
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperPoin
353
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
355
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
357
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
359
constructor TGLShaperPoin.Create;
363
_PosBuf := TGLVerBufS<TSingle3D>.Create(GL_STATIC_DRAW);
364
_NorBuf := TGLVerBufS<TSingle3D>.Create(GL_STATIC_DRAW);
365
_TexBuf := TGLVerBufS<TSingle2D>.Create(GL_STATIC_DRAW);
368
destructor TGLShaperPoin.Destroy;
377
/// //////////////////////////////////////////////////////////////////// メソッド
379
procedure TGLShaperPoin.BeginDraw;
383
_PosBuf.Use(0 { BinP } );
384
_NorBuf.Use(1 { BinP } );
385
_TexBuf.Use(2 { BinP } );
388
procedure TGLShaperPoin.DrawMain;
390
glDrawArrays(GL_POINTS, 0, _PosBuf.Count);
393
procedure TGLShaperPoin.EndDraw;
395
_PosBuf.Unuse(0 { BinP } );
396
_NorBuf.Unuse(1 { BinP } );
397
_TexBuf.Unuse(2 { BinP } );
402
// ------------------------------------------------------------------------------
404
procedure TGLShaperPoin.CalcBouBox;
411
B := TSingleArea3D.NeMax;
413
with _PosBuf.Map(GL_READ_ONLY) do
415
for I := 0 to Count - 1 do
442
// ------------------------------------------------------------------------------
444
procedure TGLShaperPoin.LoadFromFunc(const Func_
445
: TConstFunc<TdSingle2D, TdSingle3D>; const DivU_, DivV_: Integer);
446
// ··································
447
function XYtoI(const X_, Y_: Integer): Integer;
449
Result := (DivU_ + 1) * Y_ + X_;
452
// ··································
455
Ps, Ns: TGLBufferData<TSingle3D>;
456
Ts: TGLBufferData<TSingle2D>;
460
C := (DivV_ + 1) * (DivU_ + 1);
466
Ps := _PosBuf.Map(GL_WRITE_ONLY);
467
Ns := _NorBuf.Map(GL_WRITE_ONLY);
468
Ts := _TexBuf.Map(GL_WRITE_ONLY);
470
for Y := 0 to DivV_ do
473
for X := 0 to DivU_ do
481
M := Tensor(T, Func_);
495
// ------------------------------------------------------------------------------
497
procedure TGLShaperPoin.LoadFromFileSTL(const FileName_: String);
500
Hs: array [0 .. 80 - 1] of AnsiChar;
502
Fs: array of packed record Nor: TSingle3D;
508
Ps, Ns: TGLBufferData<TSingle3D>;
512
F := TFileStream.Create(FileName_, fmOpenRead);
514
F.Read(Hs, SizeOf(Hs));
516
F.Read(FsN, SizeOf(FsN));
520
F.Read(Fs[0], 50 * FsN);
525
_PosBuf.Count := 3 * FsN;
526
_NorBuf.Count := 3 * FsN;
528
Ps := _PosBuf.Map(GL_WRITE_ONLY);
529
Ns := _NorBuf.Map(GL_WRITE_ONLY);
534
for I := 0 to FsN - 1 do
558
// ------------------------------------------------------------------------------
560
procedure TGLShaperPoin.LoadFromFileOBJ(const FileName_: String);
568
Vs: TDictionary<TVert, Integer>;
569
// ·····································
570
function ReadVert(const M_: TMatch): Cardinal;
576
P := StrToIntDef(M_.Groups[1].Value, 0) - 1;
577
T := StrToIntDef(M_.Groups[2].Value, 0) - 1;
578
N := StrToIntDef(M_.Groups[3].Value, 0) - 1;
581
if Vs.ContainsKey(V) then
590
// ·····································
593
RV, RN, RT, RF, RI: TRegEx;
594
Ps, Ns: TArray<TSingle3D>;
595
Ts: TArray<TSingle2D>;
599
Ms: TMatchCollection;
601
V: TPair<TVert, Integer>;
603
Vs := TDictionary<TVert, Integer>.Create;
605
F := TStreamReader.Create(FileName_, TEncoding.Default);
607
RV := TRegEx.Create('v[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
608
RN := TRegEx.Create('vn[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
609
RT := TRegEx.Create('vt[ \t]+([^ \t]+)[ \t]+([^ \t]+)');
610
RF := TRegEx.Create('f( [^\n]+)');
611
RI := TRegEx.Create('[ \t]+(\d+)/?(\d*)/?(\d*)');
616
while not F.EndOfStream do
624
P.X := Groups[1].Value.ToSingle;
625
P.Y := Groups[2].Value.ToSingle;
626
P.Z := Groups[3].Value.ToSingle;
636
N.X := Groups[1].Value.ToSingle;
637
N.Y := Groups[2].Value.ToSingle;
638
N.Z := Groups[3].Value.ToSingle;
648
T.X := Groups[1].Value.ToSingle;
649
T.Y := Groups[2].Value.ToSingle;
659
Ms := RI.Matches(Groups[1].Value);
661
for K := 0 to Ms.Count - 1 do
670
if Length(Ps) > 0 then
676
with Map(GL_WRITE_ONLY) do
679
Items[V.Value] := Ps[V.Key.P];
686
if Length(Ns) > 0 then
692
with Map(GL_WRITE_ONLY) do
695
Items[V.Value] := Ns[V.Key.N];
702
if Length(Ts) > 0 then
708
with Map(GL_WRITE_ONLY) do
711
Items[V.Value] := Ts[V.Key.T];
723
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperLine
725
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
727
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
729
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
731
constructor TGLShaperLine.Create;
735
_EleBuf := TGLEleBufLine32.Create(GL_STATIC_DRAW);
740
destructor TGLShaperLine.Destroy;
747
/// //////////////////////////////////////////////////////////////////// メソッド
749
procedure TGLShaperLine.BeginDraw;
756
procedure TGLShaperLine.DrawMain;
761
procedure TGLShaperLine.EndDraw;
767
// ------------------------------------------------------------------------------
769
procedure TGLShaperLine.LoadFromFunc(const Func_
770
: TConstFunc<TdSingle2D, TdSingle3D>; const DivU_, DivV_: Integer);
771
// ··································
772
function XYtoI(const X_, Y_: Integer): Integer;
774
Result := (DivU_ + 1) * Y_ + X_;
777
// ··································
779
Es: TGLBufferData<TCardinal2D>;
780
X, Y, I, I0, I1: Integer;
784
_EleBuf.Count := DivV_ * (DivU_ + 1) + (DivV_ + 1) * DivU_;
786
Es := _EleBuf.Map(GL_WRITE_ONLY);
790
for Y := 0 to DivV_ do
792
for X := 0 to DivU_ - 1 do
794
I0 := XYtoI(X + 0, Y);
795
I1 := XYtoI(X + 1, Y);
797
Es[I] := TCardinal2D.Create(I0, I1);
802
for X := 0 to DivU_ do
804
for Y := 0 to DivV_ - 1 do
806
I0 := XYtoI(X, Y + 0);
807
I1 := XYtoI(X, Y + 1);
809
Es[I] := TCardinal2D.Create(I0, I1);
817
// ------------------------------------------------------------------------------
819
procedure TGLShaperLine.LoadFromFileSTL(const FileName_: String);
822
Hs: array [0 .. 80 - 1] of AnsiChar;
824
Fs: array of packed record Nor: TSingle3D;
830
Ps, Ns: TGLBufferData<TSingle3D>;
832
TGLBufferData<TCardinal2D>;
836
F := TFileStream.Create(FileName_, fmOpenRead);
838
F.Read(Hs, SizeOf(Hs));
840
F.Read(FsN, SizeOf(FsN));
844
F.Read(Fs[0], 50 * FsN);
849
_PosBuf.Count := 3 * FsN;
850
_NorBuf.Count := 3 * FsN;
851
_EleBuf.Count := 3 * FsN;
853
Ps := _PosBuf.Map(GL_WRITE_ONLY);
854
Ns := _NorBuf.Map(GL_WRITE_ONLY);
855
Es := _EleBuf.Map(GL_WRITE_ONLY);
860
for I := 0 to FsN - 1 do
873
Es[I * 3 + 0] := TCardinal2D.Create(E.X, E.Y);
874
Es[I * 3 + 1] := TCardinal2D.Create(E.Y, E.Z);
875
Es[I * 3 + 2] := TCardinal2D.Create(E.Z, E.X);
889
// ------------------------------------------------------------------------------
891
procedure TGLShaperLine.LoadFromFileOBJ(const FileName_: String);
899
Vs: TDictionary<TVert, Integer>;
900
// ·····································
901
function ReadVert(const M_: TMatch): Cardinal;
907
P := StrToIntDef(M_.Groups[1].Value, 0) - 1;
908
T := StrToIntDef(M_.Groups[2].Value, 0) - 1;
909
N := StrToIntDef(M_.Groups[3].Value, 0) - 1;
912
if Vs.ContainsKey(V) then
921
// ·····································
924
RV, RN, RT, RF, RI: TRegEx;
925
Ps, Ns: TArray<TSingle3D>;
926
Ts: TArray<TSingle2D>;
930
Es: TArray<TCardinal2D>;
931
Ms: TMatchCollection;
934
V: TPair<TVert, Integer>;
936
Vs := TDictionary<TVert, Integer>.Create;
938
F := TStreamReader.Create(FileName_, TEncoding.Default);
940
RV := TRegEx.Create('v[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
941
RN := TRegEx.Create('vn[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
942
RT := TRegEx.Create('vt[ \t]+([^ \t]+)[ \t]+([^ \t]+)');
943
RF := TRegEx.Create('f( [^\n]+)');
944
RI := TRegEx.Create('[ \t]+(\d+)/?(\d*)/?(\d*)');
950
while not F.EndOfStream do
958
P.X := Groups[1].Value.ToSingle;
959
P.Y := Groups[2].Value.ToSingle;
960
P.Z := Groups[3].Value.ToSingle;
970
N.X := Groups[1].Value.ToSingle;
971
N.Y := Groups[2].Value.ToSingle;
972
N.Z := Groups[3].Value.ToSingle;
982
T.X := Groups[1].Value.ToSingle;
983
T.Y := Groups[2].Value.ToSingle;
993
Ms := RI.Matches(Groups[1].Value);
995
E.X := ReadVert(Ms[0]);
996
E.Y := ReadVert(Ms[1]);
1000
for K := 2 to Ms.Count - 1 do
1003
E.Y := ReadVert(Ms[K]);
1014
if Length(Ps) > 0 then
1020
with Map(GL_WRITE_ONLY) do
1023
Items[V.Value] := Ps[V.Key.P];
1030
if Length(Ns) > 0 then
1036
with Map(GL_WRITE_ONLY) do
1039
Items[V.Value] := Ns[V.Key.N];
1046
if Length(Ts) > 0 then
1052
with Map(GL_WRITE_ONLY) do
1055
Items[V.Value] := Ts[V.Key.T];
1064
_EleBuf.CopyFrom(Es);
1069
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperLine
1071
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1073
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
1075
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1077
constructor TGLShaperQuadLine.Create;
1081
_EleBuf := TGLEleBufQuadLines32.Create(GL_STATIC_DRAW);
1086
destructor TGLShaperQuadLine.Destroy;
1093
/// //////////////////////////////////////////////////////////////////// メソッド
1095
procedure TGLShaperQuadLine.BeginDraw;
1099
glLineWidth(_LineW);
1102
procedure TGLShaperQuadLine.DrawMain;
1107
procedure TGLShaperQuadLine.EndDraw;
1113
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLShaperFace
1115
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1117
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
1119
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1121
constructor TGLShaperFace.Create;
1125
_EleBuf := TGLEleBufFace32.Create(GL_STATIC_DRAW);
1128
destructor TGLShaperFace.Destroy;
1135
/// //////////////////////////////////////////////////////////////////// メソッド
1137
procedure TGLShaperFace.DrawMain;
1142
// ------------------------------------------------------------------------------
1144
procedure TGLShaperFace.LoadFromFunc(const Func_
1145
: TConstFunc<TdSingle2D, TdSingle3D>; const DivU_, DivV_: Integer);
1146
// ··································
1147
function XYtoI(const X_, Y_: Integer): Integer;
1149
Result := (DivU_ + 1) * Y_ + X_;
1152
// ··································
1154
Es: TGLBufferData<TCardinal3D>;
1155
X0, Y0, X1, Y1, I, I00, I01, I10, I11: Integer;
1159
_EleBuf.Count := 2 * DivV_ * DivU_;
1161
Es := _EleBuf.Map(GL_WRITE_ONLY);
1164
for Y0 := 0 to DivV_ - 1 do
1167
for X0 := 0 to DivU_ - 1 do
1171
I00 := XYtoI(X0, Y0);
1172
I01 := XYtoI(X1, Y0);
1173
I10 := XYtoI(X0, Y1);
1174
I11 := XYtoI(X1, Y1);
1182
Es[I] := TCardinal3D.Create(I00, I10, I11);
1184
Es[I] := TCardinal3D.Create(I11, I01, I00);
1192
// ------------------------------------------------------------------------------
1194
procedure TGLShaperFace.LoadFromFileSTL(const FileName_: String);
1197
Hs: array [0 .. 80 - 1] of AnsiChar;
1199
Fs: array of packed record Nor: TSingle3D;
1205
Ps, Ns: TGLBufferData<TSingle3D>;
1207
TGLBufferData<TCardinal3D>;
1211
F := TFileStream.Create(FileName_, fmOpenRead);
1213
F.Read(Hs, SizeOf(Hs));
1215
F.Read(FsN, SizeOf(FsN));
1219
F.Read(Fs[0], 50 * FsN);
1224
_PosBuf.Count := 3 * FsN;
1225
_NorBuf.Count := 3 * FsN;
1226
_EleBuf.Count := FsN;
1228
Ps := _PosBuf.Map(GL_WRITE_ONLY);
1229
Ns := _NorBuf.Map(GL_WRITE_ONLY);
1230
Es := _EleBuf.Map(GL_WRITE_ONLY);
1235
for I := 0 to FsN - 1 do
1262
// ------------------------------------------------------------------------------
1264
procedure TGLShaperFace.LoadFromFileOBJ(const FileName_: String);
1272
Vs: TDictionary<TVert, Integer>;
1273
// ·····································
1274
function ReadVert(const M_: TMatch): Cardinal;
1280
P := StrToIntDef(M_.Groups[1].Value, 0) - 1;
1281
T := StrToIntDef(M_.Groups[2].Value, 0) - 1;
1282
N := StrToIntDef(M_.Groups[3].Value, 0) - 1;
1285
if Vs.ContainsKey(V) then
1294
// ·····································
1297
RV, RN, RT, RF, RI: TRegEx;
1298
Ps, Ns: TArray<TSingle3D>;
1299
Ts: TArray<TSingle2D>;
1303
Es: TArray<TCardinal3D>;
1304
Ms: TMatchCollection;
1307
V: TPair<TVert, Integer>;
1309
Vs := TDictionary<TVert, Integer>.Create;
1311
F := TStreamReader.Create(FileName_, TEncoding.Default);
1313
RV := TRegEx.Create('v[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
1314
RN := TRegEx.Create('vn[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t\n]+)');
1315
RT := TRegEx.Create('vt[ \t]+([^ \t]+)[ \t]+([^ \t]+)');
1316
RF := TRegEx.Create('f( [^\n]+)');
1317
RI := TRegEx.Create('[ \t]+(\d+)/?(\d*)/?(\d*)');
1323
while not F.EndOfStream do
1331
P.X := Groups[1].Value.ToSingle;
1332
P.Y := Groups[2].Value.ToSingle;
1333
P.Z := Groups[3].Value.ToSingle;
1343
N.X := Groups[1].Value.ToSingle;
1344
N.Y := Groups[2].Value.ToSingle;
1345
N.Z := Groups[3].Value.ToSingle;
1355
T.X := Groups[1].Value.ToSingle;
1356
T.Y := Groups[2].Value.ToSingle;
1366
Ms := RI.Matches(Groups[1].Value);
1368
E.X := ReadVert(Ms[0]);
1369
E.Y := ReadVert(Ms[1]);
1370
E.Z := ReadVert(Ms[2]);
1374
for K := 3 to Ms.Count - 1 do
1377
E.Z := ReadVert(Ms[K]);
1388
if Length(Ps) > 0 then
1394
with Map(GL_WRITE_ONLY) do
1397
Items[V.Value] := Ps[V.Key.P];
1404
if Length(Ns) > 0 then
1410
with Map(GL_WRITE_ONLY) do
1413
Items[V.Value] := Ns[V.Key.N];
1420
if Length(Ts) > 0 then
1426
with Map(GL_WRITE_ONLY) do
1429
Items[V.Value] := Ts[V.Key.T];
1438
_EleBuf.CopyFrom(Es);
1443
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
1445
// ############################################################################## □
1447
initialization // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
1449
finalization // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
1451
end. // ######################################################################### ■