@@ -191,4 +191,185 @@ begin
191191 SetLength(Result, len div SizeOf(TGraphNode));
192192 Move(bytes[0], Result[0], len);
193193end;
194+
195+
196+ function TVector3Array.ToBytes(): TByteArray;
197+ var
198+ len: Integer;
199+ begin
200+ len := Length(Self) * SizeOf(TVector3);
201+ if len = 0 then Exit;
202+ SetLength(Result, len);
203+ Move(Self[0], Result[0], len);
204+ end;
205+
206+ function TVector3Array.CreateFromBytes(bytes: TByteArray): TVector3Array; static;
207+ var
208+ len: Integer;
209+ begin
210+ len := Length(bytes);
211+ if len = 0 then Exit;
212+ SetLength(Result, len div SizeOf(TVector3));
213+ Move(bytes[0], Result[0], len);
214+ end;
215+
216+
217+ function TColorArray.ToBytes(): TByteArray;
218+ var
219+ len: Integer;
220+ begin
221+ len := Length(Self) * SizeOf(Self[0]);
222+ if len = 0 then Exit;
223+ SetLength(Result, len);
224+ Move(Self[0], Result[0], len);
225+ end;
226+
227+ function TColorArray.CreateFromBytes(bytes: TByteArray): TColorArray; static;
228+ var
229+ len, size: Integer;
230+ begin
231+ len := Length(bytes);
232+ if len = 0 then Exit;
233+ size := SizeOf(Result[0]);
234+ SetLength(Result, len div size);
235+ Move(bytes[0], Result[0], len);
236+ end;
237+
238+
239+ function TModelFaceArray.ToBytes(): TByteArray;
240+ var
241+ len: Integer;
242+ begin
243+ len := Length(Self) * SizeOf(TModelFace);
244+ if len = 0 then Exit;
245+ SetLength(Result, len);
246+ Move(Self[0], Result[0], len);
247+ end;
248+
249+ function TModelFaceArray.CreateFromBytes(bytes: TByteArray): TModelFaceArray; static;
250+ var
251+ len: Integer;
252+ begin
253+ len := Length(bytes);
254+ if len = 0 then Exit;
255+ SetLength(Result, len div SizeOf(TModelFace));
256+ Move(bytes[0], Result[0], len);
257+ end;
258+
259+
194260{$R+}
261+
262+ function TModel.ToBytes(): TByteArray;
263+ var
264+ size, offset: Integer;
265+ vertices, faces, materials: TByteArray;
266+ begin
267+ vertices := Self.Vertices.ToBytes();
268+ Inc(size, SizeOf(Int32) + Length(vertices));
269+
270+ faces := TModelFaceArray(Self.Faces).ToBytes();
271+ Inc(size, SizeOf(Int32) + Length(faces));
272+
273+ materials := Self.Materials.ToBytes();
274+ Inc(size, SizeOf(Int32) + Length(materials));
275+
276+ Inc(size, SizeOf(Int32) + Length(Self.Alphas));
277+
278+ Inc(size, SizeOf(Single) * 3);
279+ Inc(size, SizeOf(TVector3));
280+
281+ SetLength(Result, size);
282+
283+ Move(Length(vertices), Result[offset], SizeOf(Int32));
284+ Inc(offset, SizeOf(Int32));
285+ if Length(vertices) > 0 then
286+ begin
287+ Move(vertices[0], Result[offset], Length(vertices));
288+ Inc(offset, Length(vertices));
289+ end;
290+
291+ faces := TModelFaceArray(Self.Faces).ToBytes();
292+ Move(Length(faces), Result[offset], SizeOf(Int32));
293+ Inc(offset, SizeOf(Int32));
294+ if Length(faces) > 0 then
295+ begin
296+ Move(faces[0], Result[offset], Length(faces));
297+ Inc(offset, Length(faces));
298+ end;
299+
300+ materials := Self.Materials.ToBytes();
301+ Move(Length(materials), Result[offset], SizeOf(Int32));
302+ Inc(offset, SizeOf(Int32));
303+ if Length(materials) > 0 then
304+ begin
305+ Move(materials[0], Result[offset], Length(materials));
306+ Inc(offset, Length(materials));
307+ end;
308+
309+ Move(Length(Self.Alphas), Result[offset], SizeOf(Int32));
310+ Inc(offset, SizeOf(Int32));
311+ if Length(Self.Alphas) > 0 then
312+ begin
313+ Move(Self.Alphas[0], Result[offset], Length(Self.Alphas));
314+ Inc(offset, Length(Self.Alphas));
315+ end;
316+
317+ Move(Self.Width, Result[offset], SizeOf(Single)); Inc(offset, SizeOf(Single));
318+ Move(Self.Depth, Result[offset], SizeOf(Single)); Inc(offset, SizeOf(Single));
319+ Move(Self.Height, Result[offset], SizeOf(Single)); Inc(offset, SizeOf(Single));
320+ Move(Self.Center, Result[offset], SizeOf(TVector3));
321+ end;
322+
323+ function TModel.Construct(bytes: TByteArray): TModel; static; overload;
324+ var
325+ offset, len: Integer;
326+ tmp: TByteArray;
327+ begin
328+ //Vertices
329+ Move(bytes[offset], len, SizeOf(Int32));
330+ Inc(offset, SizeOf(Int32));
331+ if len > 0 then
332+ begin
333+ SetLength(tmp, len);
334+ Move(bytes[offset], tmp[0], len);
335+ Result.Vertices := TVector3Array.CreateFromBytes(tmp);
336+ Inc(offset, len);
337+ end;
338+
339+ // Faces
340+ Move(bytes[offset], len, SizeOf(Int32));
341+ Inc(offset, SizeOf(Int32));
342+ if len > 0 then
343+ begin
344+ SetLength(tmp, len);
345+ Move(bytes[offset], tmp[0], len);
346+ Result.Faces := TModelFaceArray.CreateFromBytes(tmp);
347+ Inc(offset, len);
348+ end;
349+
350+ // Materials
351+ Move(bytes[offset], len, SizeOf(Int32));
352+ Inc(offset, SizeOf(Int32));
353+ if len > 0 then
354+ begin
355+ SetLength(tmp, len);
356+ Move(bytes[offset], tmp[0], len);
357+ Result.Materials := TColorArray.CreateFromBytes(tmp);
358+ Inc(offset, len);
359+ end;
360+
361+ // Alphas
362+ Move(bytes[offset], len, SizeOf(Int32));
363+ Inc(offset, SizeOf(Int32));
364+ SetLength(Result.Alphas, len);
365+ if len > 0 then
366+ begin
367+ Move(bytes[offset], Result.Alphas[0], len);
368+ Inc(offset, len);
369+ end;
370+
371+ Move(bytes[offset], Result.Width, SizeOf(Single)); Inc(offset, SizeOf(Single));
372+ Move(bytes[offset], Result.Depth, SizeOf(Single)); Inc(offset, SizeOf(Single));
373+ Move(bytes[offset], Result.Height, SizeOf(Single)); Inc(offset, SizeOf(Single));
374+ Move(bytes[offset], Result.Center, SizeOf(TVector3));
375+ end;
0 commit comments