/usr/src/castle-game-engine-5.2.0/x3d/x3dloadinternalspine.pas is in castle-game-engine-src 5.2.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | {
Copyright 2014-2014 Michalis Kamburelis.
This file is part of "Castle Game Engine".
"Castle Game Engine" is free software; see the file COPYING.txt,
included in this distribution, for details about the copyright.
"Castle Game Engine" is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
----------------------------------------------------------------------------
}
{ Spine 2D animations loader. }
unit X3DLoadInternalSpine;
interface
uses X3DNodes;
function LoadSpine(URL: string): TX3DRootNode;
implementation
uses SysUtils, Classes, FGL, FpJson, JSONParser, Math,
CastleVectors, CastleUtils, CastleLog, CastleURIUtils, CastleDownload,
CastleStringUtils, CastleClassUtils, CastleColors,
X3DLoadInternalUtils, CastleWarnings, X3DFields, CastleGenericLists;
type
ESpineReadError = class(Exception);
{$I x3dloadinternalspine_textureloader.inc}
{$I x3dloadinternalspine_simpletextureloader.inc}
{$I x3dloadinternalspine_atlas.inc}
{ JSON skeleton -------------------------------------------------------------- }
type
{ forward declarations }
TBoneList = class;
TAttachmentList = class;
{$define read_interface}
{$I x3dloadinternalspine_json.inc}
{$I x3dloadinternalspine_bones.inc}
{$I x3dloadinternalspine_slots.inc}
{$I x3dloadinternalspine_attachments.inc}
{$I x3dloadinternalspine_skins.inc}
{$I x3dloadinternalspine_bonetimelines.inc}
{$I x3dloadinternalspine_slottimelines.inc}
{$I x3dloadinternalspine_drawordertimelines.inc}
{$I x3dloadinternalspine_animations.inc}
{$I x3dloadinternalspine_skeleton.inc}
{$undef read_interface}
{$define read_implementation}
{$I x3dloadinternalspine_json.inc}
{$I x3dloadinternalspine_bones.inc}
{$I x3dloadinternalspine_slots.inc}
{$I x3dloadinternalspine_attachments.inc}
{$I x3dloadinternalspine_skins.inc}
{$I x3dloadinternalspine_bonetimelines.inc}
{$I x3dloadinternalspine_slottimelines.inc}
{$I x3dloadinternalspine_drawordertimelines.inc}
{$I x3dloadinternalspine_animations.inc}
{$I x3dloadinternalspine_skeleton.inc}
{$undef read_implementation}
{ Main loading function ------------------------------------------------------ }
function LoadSpine(URL: string): TX3DRootNode;
function CreateTextureLoader: TTextureLoader;
var
AtlasURL: string;
Atlas: TAtlas;
begin
AtlasURL := ChangeURIExt(URL, '.atlas');
if URIFileExists(AtlasURL) then
begin
Atlas := TAtlas.Create;
try
Atlas.Parse(AtlasURL);
Atlas.BuildNodes(URL);
Result := Atlas;
except FreeAndNil(Atlas); raise end;
end else
begin
WritelnLog('Spine', 'Atlas not found under URL "' + AtlasURL + '", will directly load images using "images/xxx.png" filenames');
Result := TSimpleTextureLoader.Create(URL);
end;
end;
var
Json: TJSONData;
P: TJSONParser;
S: TStream;
Skeleton: TSkeleton;
SkinName: string;
TextureLoader: TTextureLoader;
begin
{ Strip SkinName from URL anchor. }
URIExtractAnchor(URL, SkinName, true);
TextureLoader := CreateTextureLoader;
try
S := Download(URL);
try
P := TJSONParser.Create(S);
try
Json := P.Parse;
try
Result := TX3DRootNode.Create('', URL);
try
if Assigned(Json) then
begin
Skeleton := TSkeleton.Create;
try
Skeleton.Parse(Json);
Skeleton.BuildNodes(URL, TextureLoader, Result, SkinName);
finally FreeAndNil(Skeleton) end;
end;
except FreeAndNil(Result); raise end;
finally FreeAndNil(Json) end;
finally FreeAndNil(P) end;
finally FreeAndNil(S) end;
finally FreeAndNil(TextureLoader) end;
end;
end.
|