From: Adeel Kazmi Date: Wed, 23 Dec 2020 17:11:58 +0000 (+0000) Subject: Merge "Make -DUSE_DEFAULT_RESOURCE_DIR=OFF compile again" into devel/master X-Git-Tag: dali_2.0.7~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=bd126b5d480c08bf7a995b2c4532e80e76ec4ad2;hp=ea014e3440f8df4426bd32d76f07150bd0810d30 Merge "Make -DUSE_DEFAULT_RESOURCE_DIR=OFF compile again" into devel/master --- diff --git a/README.md b/README.md index ff51191..dd18745 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * [3. Building for MS Windows](#3-building-for-ms-windows) * Build with the Visual Studio project. * Build with CMake. + * [DALi Scene Loader](#dali-scene-loader) # Build Instructions @@ -109,3 +110,7 @@ vcpkg-script folder in the windows-dependencies repository. - INSTALL_CMAKE_MODULES ---> Whether to install the CMake modules (Used by the CMake command find_package() to find previously installed libraries). - ENABLE_DEBUG ---> Whether to build with debug enabled. - USE_DEFAULT_RESOURCE_DIR ---> Whether to use the default resource folders. Otherwise set environment variables for DALI_IMAGE_DIR, DALI_SOUND_DIR, DALI_STYLE_DIR, DALI_STYLE_IMAGE_DIR and DALI_DATA_READ_ONLY_DIR + +# DALi Scene Loader + +For information about the DALi Scene Loader library, refer to dali-scene-loader/README.md. \ No newline at end of file diff --git a/automated-tests/patch-coverage.pl b/automated-tests/patch-coverage.pl index b3cf098..1f836a4 100755 --- a/automated-tests/patch-coverage.pl +++ b/automated-tests/patch-coverage.pl @@ -83,7 +83,7 @@ my %options = ( "output:s" => { "optvar"=>\$opt_output, "desc"=>"Generate html output"}, "help" => { "optvar"=>\$opt_help, "desc"=>""}, "quiet" => { "optvar"=>\$opt_quiet, "desc"=>""}, - "verbose" => { "optvar"=>\$opt_verbose, "desc"=>"" }); + "verbose" => { "optvar"=>\$opt_verbose, "desc"=>"Also output coverage" }); my %longOptions = map { $_ => $options{$_}->{"optvar"} } keys(%options); GetOptions( %longOptions ) or pod2usage(2); @@ -875,15 +875,14 @@ sub info(@) } } -# NEW STUFF -## Format per file, repeated, no linebreak +# Format per file, repeated, no linebreak # # index c1..c2 c3 # --- a/ # +++ b/ # - +# # Format of each diff hunk, repeated, no linebreak # @@ @@ line # 3 lines of context @@ -986,7 +985,7 @@ sub parse_diff $files{$file}->{"patch"} = [@checklines]; $files{$file}->{"b_lines"} = {%b_lines}; - my %filter = map { $_ => $files{$_} } grep {m!^dali(-toolkit)?/!} (keys(%files));; + my %filter = map { $_ => $files{$_} } grep {m!^dali(-toolkit|-scene-loader)?/!} (keys(%files)); if($pd_debug) { @@ -1064,6 +1063,13 @@ sub calc_patch_coverage_percentage my $abs_filename = File::Spec->rel2abs($file, $root); my $sumcountref = $info_data{$abs_filename}->{"sum"}; + if($debug>1) + { + print("File: $abs_filename\n"); + print Dumper($info_data{$abs_filename}); + print "\n"; + } + if( $sumcountref ) { for my $patch (@$patchref) @@ -1312,27 +1318,6 @@ EOH ## MAIN ## ################################################################################ -my $cwd = getcwd(); # expect this to be automated-tests folder - -# execute coverage.sh, generating build/tizen/dali.info from lib, and -# *.dir/dali.info. Don't generate html -print `./coverage.sh -n`; -chdir ".."; -$root = getcwd(); - -our %info_data; # Hash of all data from .info files -my @info_files = split(/\n/, `find . -name dali.info`); -my %new_info; - -# Read in all specified .info files -foreach (@info_files) -{ - %new_info = %{read_info_file($_)}; - - # Combine %new_info with %info_data - %info_data = %{combine_info_files(\%info_data, \%new_info)}; -} - # Generate git diff command my @cmd=('--no-pager','diff','--no-ext-diff','-U0','--no-color'); @@ -1362,7 +1347,7 @@ else } else { - die "Both cached & working files - cannot get correct patch from git\n"; + die "Error: Both cached & working files - cannot get correct patch from git\nRun git add first."; # Would have to diff from separate clone. } } @@ -1370,6 +1355,31 @@ else push @cmd, @ARGV; +# Before executing the diff, run the coverage.sh script. This is done here so that the +# error condition above happens straight away, rather than after spewing out lots of information. + +my $cwd = getcwd(); # expect this to be automated-tests folder +# execute coverage.sh, generating build/tizen/dali.info from lib, and +# *.dir/dali.info. Don't generate html +printf("Running coverage.sh\n"); +my $coverage_output=`./coverage.sh -n`; +chdir ".."; +$root = getcwd(); + +our %info_data; # Hash of all data from .info files +my @info_files = split(/\n/, `find . -name dali.info`); +my %new_info; + +# Read in all specified .info files +foreach (@info_files) +{ + %new_info = %{read_info_file($_)}; + + # Combine %new_info with %info_data + %info_data = %{combine_info_files(\%info_data, \%new_info)}; +} + + # Execute diff & coverage from root directory my $filesref = run_diff(@cmd); @@ -1386,21 +1396,33 @@ foreach my $file (keys(%$filesref)) } if( $filecount == 0 ) { - print "No source files found\n"; + print "Warning: No source files found\n"; exit 0; # Exit with no error. } #print_simplified_info() if $debug; #exit 0; +if($debug > 1) +{ + print "Info keys:\n"; + for my $key (keys(%info_data)) + { + print "$key\n"; + } + print "\n\n"; +} my $percentref = calc_patch_coverage_percentage($filesref); if($percentref->[0] == 0) { - print "No coverable lines found\n"; + print "Warning: No coverable lines found\n"; exit 0; } my $percent = $percentref->[1]; +printf(join("\n", grep { $_ !~ /^Remov/ } split(/\n/,$coverage_output))) if $opt_verbose; +#printf($coverage_output) if $opt_verbose; + my $color=BOLD RED; if($opt_output) { @@ -1417,6 +1439,7 @@ elsif( ! $opt_quiet ) print RESET; } +printf("\n\n=========================\nPatch coverage output:\n=========================\n"); printf("Line Coverage: %d/%d\n", $percentref->[2], $percentref->[0]); printf("Percentage of change covered: %5.2f%\n", $percent); diff --git a/automated-tests/resources/2CylinderEngine.gltf b/automated-tests/resources/2CylinderEngine.gltf new file mode 100644 index 0000000..c4caf78 --- /dev/null +++ b/automated-tests/resources/2CylinderEngine.gltf @@ -0,0 +1,4390 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 81, + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 80, + 79, + 78, + 77, + 76, + 75, + 74, + 73, + 13, + 10, + 7, + 4, + 1 + ] + }, + { + "children": [ + 3, + 2 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 136.860107421875, + -64.45372009277344, + -36.179630279541019, + 1.0 + ] + }, + { + "mesh": 0, + "matrix": [ + -1.0, + 8.979318677493353e-11, + 0.0, + 0.0, + -8.979318677493353e-11, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -294.67718505859377, + 73.97987365722656, + 16.17963218688965, + 1.0 + ] + }, + { + "mesh": 1, + "matrix": [ + 0.9995650053024292, + 0.029493184760212896, + 0.0, + 0.0, + -0.029493184760212896, + 0.9995650053024292, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -45.315460205078128, + -24.617263793945317, + -26.320369720458986, + 1.0 + ] + }, + { + "children": [ + 6, + 5 + ], + "matrix": [ + -1.0, + 8.979318677493353e-11, + 0.0, + 0.0, + -8.979318677493353e-11, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -136.860107421875, + 64.45372009277344, + 3.8203670978546144, + 1.0 + ] + }, + { + "mesh": 0, + "matrix": [ + -1.0, + 8.979318677493353e-11, + 0.0, + 0.0, + -8.979318677493353e-11, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -294.67718505859377, + 73.97987365722656, + 16.17963218688965, + 1.0 + ] + }, + { + "mesh": 1, + "matrix": [ + 0.9995650053024292, + 0.029493184760212896, + 0.0, + 0.0, + -0.029493184760212896, + 0.9995650053024292, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -45.315460205078128, + -24.617263793945317, + -26.32036781311035, + 1.0 + ] + }, + { + "children": [ + 9, + 8 + ], + "matrix": [ + -0.5, + -0.8660253882408142, + 0.0, + 0.0, + 0.8660253882408142, + -0.5, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 18.09818458557129, + -69.69783782958985, + -105.559814453125, + 1.0 + ] + }, + { + "mesh": 2, + "matrix": [ + -0.9390941858291626, + 0.3436597883701325, + 0.0, + 0.0, + -0.3436597883701325, + -0.9390941858291626, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -51.311012268066409, + -50.52240753173828, + -18.440185546875, + 1.0 + ] + }, + { + "mesh": 3, + "matrix": [ + -0.9390941858291626, + 0.3436597883701325, + 0.0, + 0.0, + -0.3436597883701325, + -0.9390941858291626, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -51.311012268066409, + -50.52240753173828, + 107.559814453125, + 1.0 + ] + }, + { + "children": [ + 12, + 11 + ], + "matrix": [ + 0.7071067690849304, + -0.7071067690849304, + 0.0, + 0.0, + 0.7071067690849304, + 0.7071067690849304, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 47.17867660522461, + -52.821327209472659, + -88.94477081298828, + 1.0 + ] + }, + { + "mesh": 4, + "matrix": [ + -0.4234085381031037, + -0.9059388637542724, + -7.575183536001616e-11, + 0.0, + -0.9059388637542724, + 0.4234085381031037, + -4.821281221478735e-11, + 0.0, + 7.575183536001616e-11, + 4.821281221478735e-11, + -1.0, + 0.0, + -90.59386444091796, + -24.379817962646489, + -40.05522918701172, + 1.0 + ] + }, + { + "mesh": 5, + "matrix": [ + -1.877404400829619e-7, + -1.194886607436274e-7, + 1.0, + 0.0, + -0.905938446521759, + 0.42340943217277529, + -1.194886607436274e-7, + 0.0, + -0.42340943217277529, + -0.905938446521759, + -1.877404400829619e-7, + 0.0, + -30.2958984375, + -52.56131362915039, + 25.05522727966309, + 1.0 + ] + }, + { + "children": [ + 72, + 71, + 70, + 69, + 68, + 67, + 66, + 65, + 14 + ] + }, + { + "children": [ + 64, + 63, + 62, + 61, + 60, + 59, + 58, + 57, + 56, + 43, + 29, + 15 + ], + "matrix": [ + -2.430540746445331e-7, + 0.0000014087579529586949, + -1.0, + 0.0, + -1.0, + -2.430540746445331e-7, + 2.4305373358402006e-7, + 0.0, + -2.4305373358402006e-7, + 1.0, + 0.0000014087580666455324, + 0.0, + -48.26182556152344, + -59.11042404174805, + 34.595985412597659, + 1.0 + ] + }, + { + "children": [ + 28, + 27, + 16 + ], + "matrix": [ + -0.4546820223331452, + 0.6541662216186523, + -0.6044260263442993, + 0.0, + 0.8696397542953491, + 0.4726206660270691, + -0.1426759660243988, + 0.0, + 0.19233042001724244, + -0.590505063533783, + -0.7837810516357422, + 0.0, + 14.898193359375, + 85.82951354980469, + -48.034645080566409, + 1.0 + ] + }, + { + "children": [ + 26, + 25, + 24, + 23, + 22, + 21, + 20, + 19, + 18, + 17 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8450329899787903, + 0.005398945417255163, + -0.5346869230270386, + 0.0, + -0.4710906744003296, + 0.4805830717086792, + -0.7396712303161621, + 0.0, + 0.25296804308891299, + 0.8769326210021973, + 0.4086519181728363, + 0.0, + -74.0894775390625, + 71.41646575927735, + -157.91323852539066, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.7145451903343201, + -0.1154177337884903, + 0.6900028586387634, + 0.0, + -0.6522517800331116, + 0.4665486216545105, + -0.5974110960960388, + 0.0, + -0.25296807289123537, + -0.8769327998161316, + -0.4086515009403229, + 0.0, + 122.53109741210938, + 86.64814758300781, + -312.3133850097656, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8450329899787903, + 0.005398945417255163, + -0.5346869230270386, + 0.0, + -0.4710906744003296, + 0.4805830717086792, + -0.7396712303161621, + 0.0, + 0.25296804308891299, + 0.8769326210021973, + 0.4086519181728363, + 0.0, + -69.3792953491211, + 71.78133392333985, + -161.61203002929688, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.7145451903343201, + -0.1154177337884903, + 0.6900028586387634, + 0.0, + -0.6522517800331116, + 0.4665486216545105, + -0.5974110960960388, + 0.0, + -0.25296807289123537, + -0.8769327998161316, + -0.4086515009403229, + 0.0, + 127.24127197265624, + 87.01302337646485, + -316.0121765136719, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8450329899787903, + 0.005398945417255163, + -0.5346869230270386, + 0.0, + -0.4710906744003296, + 0.4805830717086792, + -0.7396712303161621, + 0.0, + 0.25296804308891299, + 0.8769326210021973, + 0.4086519181728363, + 0.0, + -64.66907501220703, + 72.14624786376953, + -165.310791015625, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.7145451903343201, + -0.1154177337884903, + 0.6900028586387634, + 0.0, + -0.6522517800331116, + 0.4665486216545105, + -0.5974110960960388, + 0.0, + -0.25296807289123537, + -0.8769327998161316, + -0.4086515009403229, + 0.0, + 131.9515380859375, + 87.37792205810547, + -319.7109680175781, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8450329899787903, + 0.005398945417255163, + -0.5346869230270386, + 0.0, + -0.4710906744003296, + 0.4805830717086792, + -0.7396712303161621, + 0.0, + 0.25296804308891299, + 0.8769326210021973, + 0.4086519181728363, + 0.0, + -59.958885192871097, + 72.5111312866211, + -169.00955200195313, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.7145451903343201, + -0.1154177337884903, + 0.6900028586387634, + 0.0, + -0.6522517800331116, + 0.4665486216545105, + -0.5974110960960388, + 0.0, + -0.25296807289123537, + -0.8769327998161316, + -0.4086515009403229, + 0.0, + 136.66165161132813, + 87.74280548095703, + -323.4097595214844, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8450329899787903, + 0.005398945417255163, + -0.5346869230270386, + 0.0, + -0.4710906744003296, + 0.4805830717086792, + -0.7396712303161621, + 0.0, + 0.25296804308891299, + 0.8769326210021973, + 0.4086519181728363, + 0.0, + -55.24869537353516, + 72.87601470947266, + -172.70831298828126, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.7145451903343201, + -0.1154177337884903, + 0.6900028586387634, + 0.0, + -0.6522517800331116, + 0.4665486216545105, + -0.5974110960960388, + 0.0, + -0.25296807289123537, + -0.8769327998161316, + -0.4086515009403229, + 0.0, + 141.37188720703126, + 88.10767364501953, + -327.1084899902344, + 1.0 + ] + }, + { + "mesh": 7, + "matrix": [ + 0.7850325703620911, + 0.06081420928239823, + -0.6164620518684387, + 0.0, + -0.13561886548995973, + 0.9878994822502136, + -0.07524696737527847, + 0.0, + 0.6044265031814575, + 0.14267520606517793, + 0.7837808728218079, + 0.0, + -5.746735095977783, + -250.409912109375, + -86.68790435791016, + 1.0 + ] + }, + { + "mesh": 8, + "matrix": [ + 0.785033106803894, + 0.06081344559788704, + -0.616461455821991, + 0.0, + -0.3681585192680359, + -0.7545340061187744, + -0.5432658195495606, + 0.0, + -0.4981790184974671, + 0.6534371972084045, + -0.569945216178894, + 0.0, + 34.187137603759769, + 252.666015625, + 65.06369018554688, + 1.0 + ] + }, + { + "children": [ + 42, + 41, + 30 + ], + "matrix": [ + 0.4546822011470794, + 0.6541662216186523, + 0.604425847530365, + 0.0, + -0.8696396350860596, + 0.4726209044456482, + 0.14267593622207642, + 0.0, + -0.1923305094242096, + -0.5905048847198486, + 0.7837811708450317, + 0.0, + 91.87051391601564, + 80.63255310058594, + 166.26089477539066, + 1.0 + ] + }, + { + "children": [ + 40, + 39, + 38, + 37, + 36, + 35, + 34, + 33, + 32, + 31 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8620702028274536, + -0.015319700352847577, + -0.506557285785675, + 0.0, + -0.4340354502201081, + 0.4936883449554444, + -0.7535814642906189, + 0.0, + 0.26162606477737429, + 0.8695039749145508, + 0.41894471645355227, + 0.0, + -77.39921569824219, + 74.49835205078125, + -159.90199279785157, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.6893031001091003, + -0.13550062477588654, + 0.7116886973381043, + 0.0, + -0.6755834221839905, + 0.47497618198394778, + -0.5639013051986694, + 0.0, + -0.2616262137889862, + -0.8695039749145508, + -0.4189445376396179, + 0.0, + 115.9541015625, + 89.47693634033203, + -311.7364501953125, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8620702028274536, + -0.015319700352847577, + -0.506557285785675, + 0.0, + -0.4340354502201081, + 0.4936883449554444, + -0.7535814642906189, + 0.0, + 0.26162606477737429, + 0.8695039749145508, + 0.41894471645355227, + 0.0, + -71.11894989013672, + 74.98487091064453, + -164.83367919921876, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.6893031001091003, + -0.13550062477588654, + 0.7116886973381043, + 0.0, + -0.6755834221839905, + 0.47497618198394778, + -0.5639013051986694, + 0.0, + -0.2616262137889862, + -0.8695039749145508, + -0.4189445376396179, + 0.0, + 122.234375, + 89.96346282958985, + -316.668212890625, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8620702028274536, + -0.015319700352847577, + -0.506557285785675, + 0.0, + -0.4340354502201081, + 0.4936883449554444, + -0.7535814642906189, + 0.0, + 0.26162606477737429, + 0.8695039749145508, + 0.41894471645355227, + 0.0, + -64.83870697021485, + 75.47139739990235, + -169.76536560058598, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.6893031001091003, + -0.13550062477588654, + 0.7116886973381043, + 0.0, + -0.6755834221839905, + 0.47497618198394778, + -0.5639013051986694, + 0.0, + -0.2616262137889862, + -0.8695039749145508, + -0.4189445376396179, + 0.0, + 128.51461791992188, + 90.44998931884766, + -321.5999145507813, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8620702028274536, + -0.015319700352847577, + -0.506557285785675, + 0.0, + -0.4340354502201081, + 0.4936883449554444, + -0.7535814642906189, + 0.0, + 0.26162606477737429, + 0.8695039749145508, + 0.41894471645355227, + 0.0, + -58.558441162109378, + 75.9579086303711, + -174.6970672607422, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.6893031001091003, + -0.13550062477588654, + 0.7116886973381043, + 0.0, + -0.6755834221839905, + 0.47497618198394778, + -0.5639013051986694, + 0.0, + -0.2616262137889862, + -0.8695039749145508, + -0.4189445376396179, + 0.0, + 134.79489135742188, + 90.9365005493164, + -326.5315856933594, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + 0.8620702028274536, + -0.015319700352847577, + -0.506557285785675, + 0.0, + -0.4340354502201081, + 0.4936883449554444, + -0.7535814642906189, + 0.0, + 0.26162606477737429, + 0.8695039749145508, + 0.41894471645355227, + 0.0, + -52.27817535400391, + 76.44441223144531, + -179.62875366210938, + 1.0 + ] + }, + { + "mesh": 6, + "matrix": [ + -0.6893031001091003, + -0.13550062477588654, + 0.7116886973381043, + 0.0, + -0.6755834221839905, + 0.47497618198394778, + -0.5639013051986694, + 0.0, + -0.2616262137889862, + -0.8695039749145508, + -0.4189445376396179, + 0.0, + 141.07516479492188, + 91.42301940917968, + -331.4632263183594, + 1.0 + ] + }, + { + "mesh": 7, + "matrix": [ + 0.7850325703620911, + 0.06081420928239823, + -0.6164620518684387, + 0.0, + -0.13561886548995973, + 0.9878994822502136, + -0.07524696737527847, + 0.0, + 0.6044265031814575, + 0.14267520606517793, + 0.7837808728218079, + 0.0, + -1.248520016670227, + -250.06192016601566, + -90.22713470458985, + 1.0 + ] + }, + { + "mesh": 8, + "matrix": [ + 0.7850322723388672, + 0.06081392988562584, + -0.6164625287055969, + 0.0, + -0.3924780488014221, + -0.7211048007011414, + -0.5709367990493774, + 0.0, + -0.4792549908161164, + 0.6901518106460571, + -0.5422223806381226, + 0.0, + 45.59693908691406, + 243.51312255859376, + 69.38878631591797, + 1.0 + ] + }, + { + "children": [ + 55, + 54, + 49, + 44 + ], + "matrix": [ + 0.9999974370002748, + 0.0, + -0.0022710729390382768, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0022710729390382768, + 0.0, + 0.9999974370002748, + 0.0, + -0.13409000635147096, + -12.999988555908204, + 0.12365700304508208, + 1.0 + ] + }, + { + "children": [ + 48, + 47, + 46, + 45 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -0.000007999999979801942, + -0.000011000000085914508, + -99.9995346069336, + 1.0 + ] + }, + { + "mesh": 9, + "matrix": [ + 0.9999974370002748, + 0.0, + 0.002270043129101396, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + -0.002270043129101396, + 0.0, + 0.9999974370002748, + 0.0, + 49.7321662902832, + 344.3533630371094, + 79.59915161132813, + 1.0 + ] + }, + { + "mesh": 10, + "matrix": [ + 0.9999974370002748, + 1.0191530236923485e-13, + 0.0022699993569403888, + 0.0, + -1.0191530236923485e-13, + -1.0, + 8.97931243248884e-11, + 0.0, + 0.0022699993569403888, + -8.97931243248884e-11, + -0.9999974370002748, + 0.0, + 49.69811248779297, + 257.12298583984377, + 94.59911346435549, + 1.0 + ] + }, + { + "mesh": 11, + "matrix": [ + 0.9986716508865356, + -4.959933574966158e-10, + -0.051525991410017017, + 0.0, + -0.051525991410017017, + -1.9239376314317274e-8, + -0.9986716508865356, + 0.0, + -4.959933574966158e-10, + 1.0, + -1.9239376314317274e-8, + 0.0, + 67.53964233398438, + 326.7381286621094, + 297.74066162109377, + 1.0 + ] + }, + { + "mesh": 11, + "matrix": [ + 0.9986629486083984, + -1.884843170429917e-9, + -0.05169397220015526, + 0.0, + -0.05169397220015526, + -7.287438563707839e-8, + -0.9986629486083984, + 0.0, + -1.884843170429917e-9, + 1.0, + -7.287438563707839e-8, + 0.0, + 17.574960708618165, + 326.7381286621094, + 297.6291809082031, + 1.0 + ] + }, + { + "children": [ + 53, + 52, + 51, + 50 + ] + }, + { + "mesh": 9, + "matrix": [ + 0.9999974370002748, + 0.0, + 0.002270043129101396, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + -0.002270043129101396, + 0.0, + 0.9999974370002748, + 0.0, + 49.50515365600586, + 344.3533630371094, + 79.59934997558594, + 1.0 + ] + }, + { + "mesh": 10, + "matrix": [ + 0.9999974370002748, + 1.0191530236923485e-13, + 0.0022699993569403888, + 0.0, + -1.0191530236923485e-13, + -1.0, + 8.97931243248884e-11, + 0.0, + 0.0022699993569403888, + -8.97931243248884e-11, + -0.9999974370002748, + 0.0, + 49.47110366821289, + 257.1229553222656, + 94.59931182861328, + 1.0 + ] + }, + { + "mesh": 11, + "matrix": [ + 0.9984543323516846, + -6.428584886641885e-10, + -0.05557801201939583, + 0.0, + -0.05557801201939583, + -2.311567648405344e-8, + -0.9984543323516846, + 0.0, + -6.428584886641885e-10, + 1.0, + -2.311567648405344e-8, + 0.0, + 68.16710662841797, + 326.7381286621094, + 297.7886657714844, + 1.0 + ] + }, + { + "mesh": 11, + "matrix": [ + 0.998445212841034, + 5.507552747197052e-10, + -0.05574197694659233, + 0.0, + -0.05574197694659233, + 1.97455189976381e-8, + -0.998445212841034, + 0.0, + 5.507552747197052e-10, + 1.0, + 1.97455189976381e-8, + 0.0, + 18.201759338378908, + 326.7381286621094, + 297.6770324707031, + 1.0 + ] + }, + { + "mesh": 12, + "matrix": [ + -0.9999873638153076, + -0.004487415309995413, + -0.0022699744440615179, + 0.0, + 0.004487401805818081, + -0.999989926815033, + 0.000011093182365584652, + 0.0, + -0.0022700014524161817, + 9.06754564766743e-7, + 0.9999974370002748, + 0.0, + -29.98022842407227, + 768.69921875, + -20.581327438354493, + 1.0 + ] + }, + { + "mesh": 12, + "matrix": [ + -0.9999850392341614, + -0.004973169881850481, + -0.002269970485940576, + 0.0, + 0.004973156377673149, + -0.9999876618385316, + 0.00001164450713986298, + 0.0, + -0.0022700002882629639, + 3.554153522600245e-7, + 0.9999974370002748, + 0.0, + 48.794708251953128, + 768.6771850585938, + -20.40250396728516, + 1.0 + ] + }, + { + "mesh": 13, + "matrix": [ + -0.8213930726051331, + 0.3830228745937348, + 0.4226191341876984, + 0.0, + -0.3830228745937348, + 0.17860689759254456, + -0.9063073992729188, + 0.0, + -0.4226191341876984, + -0.9063073992729188, + 4.807415265872805e-8, + 0.0, + -141.64085388183598, + 388.6727600097656, + 122.00779724121094, + 1.0 + ] + }, + { + "mesh": 13, + "matrix": [ + -0.8213450312614441, + -0.38299909234046938, + 0.42273396253585818, + 0.0, + -0.38312679529190077, + -0.1786557286977768, + -0.9062538146972656, + 0.0, + 0.4226182401180268, + -0.906307816505432, + 7.823305168130901e-7, + 0.0, + -270.7940673828125, + 145.4340057373047, + 122.04411315917968, + 1.0 + ] + }, + { + "mesh": 14, + "matrix": [ + 1.0, + -0.000060999998822808269, + -0.000001000000338535756, + 0.0, + 0.000001000000338535756, + 9.44896494381453e-10, + 1.0, + 0.0, + -0.000060999998822808269, + -1.0, + 1.0058964772241553e-9, + 0.0, + 51.087928771972659, + 325.7384033203125, + 91.09835815429688, + 1.0 + ] + }, + { + "mesh": 15, + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 4.4896641959724089e-11, + -1.0, + 0.0, + 0.0, + 1.0, + 4.4896641959724089e-11, + 0.0, + 24.52630043029785, + 213.73817443847657, + 283.0735778808594, + 1.0 + ] + }, + { + "mesh": 16, + "matrix": [ + 0.9026297926902772, + -0.4304177761077881, + 0.0, + 0.0, + 0.4304177761077881, + 0.9026297926902772, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 353.9793395996094, + 330.9040222167969, + -5.389931201934815, + 1.0 + ] + }, + { + "mesh": 17, + "matrix": [ + 0.9026297330856324, + 0.4304178953170777, + 0.0, + 0.0, + -0.4304178953170777, + 0.9026297330856324, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 277.7611083984375, + 580.0806274414063, + -5.3898539543151859, + 1.0 + ] + }, + { + "mesh": 18, + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 4.4896641959724089e-11, + 1.0, + 0.0, + 0.0, + -1.0, + 4.4896641959724089e-11, + 0.0, + 49.58733749389649, + 175.73818969726566, + 89.59835815429688, + 1.0 + ] + }, + { + "mesh": 19, + "matrix": [ + 0.9999933242797852, + -1.649976856532565e-11, + 0.003653998486697674, + 0.0, + 0.003653998486697674, + 9.031045244967118e-9, + -0.9999933242797852, + 0.0, + -1.649976856532565e-11, + 1.0, + 9.031045244967118e-9, + 0.0, + 81.19497680664063, + 247.73817443847657, + 220.1460723876953, + 1.0 + ] + }, + { + "mesh": 19, + "matrix": [ + 0.9999898672103882, + -4.353116391658807e-12, + -0.004497999791055918, + 0.0, + -0.004497999791055918, + -1.9355692604250409e-9, + -0.9999898672103882, + 0.0, + -4.353116391658807e-12, + 1.0, + -1.9355692604250409e-9, + 0.0, + -23.12494468688965, + 247.73817443847657, + 220.35459899902345, + 1.0 + ] + }, + { + "mesh": 20, + "matrix": [ + -2.907086411596538e-7, + 0.7071071863174439, + -0.7071064114570618, + 0.0, + 7.018321639407077e-7, + -0.7071064114570618, + -0.7071071863174439, + 0.0, + -1.0, + -7.018321639407077e-7, + -2.907086411596538e-7, + 0.0, + 65.0, + 128.71702575683598, + -3.270524024963379, + 1.0 + ] + }, + { + "mesh": 21, + "matrix": [ + 4.4896641959724089e-11, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 4.4896641959724089e-11, + 0.0, + 223.9999847412109, + 31.98792839050293, + 23.50873374938965, + 1.0 + ] + }, + { + "mesh": 22, + "matrix": [ + 4.4896641959724089e-11, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 4.4896641959724089e-11, + 0.0, + 223.9999847412109, + 30.487924575805665, + 25.008731842041017, + 1.0 + ] + }, + { + "mesh": 23, + "matrix": [ + 1.1084333451094608e-10, + -0.0009251347510144116, + -0.9999995827674866, + 0.0, + 2.396268712345773e-7, + -0.9999995827674866, + 0.0009251347510144116, + 0.0, + -1.0, + -2.396268712345773e-7, + 1.1084333451094608e-10, + 0.0, + -295.0, + 21.498876571655278, + 0.49255698919296267, + 1.0 + ] + }, + { + "mesh": 23, + "matrix": [ + 5.062397168131838e-10, + 0.002356505487114191, + -0.9999971985816956, + 0.0, + -4.2965237412317949e-7, + -0.9999971985816956, + -0.002356505487114191, + 0.0, + -1.0, + 4.2965237412317949e-7, + 5.062397168131838e-10, + 0.0, + -295.0, + 21.60527801513672, + -105.32867431640624, + 1.0 + ] + }, + { + "mesh": 24, + "matrix": [ + -1.0, + 6.349337028366264e-11, + 6.349337028366264e-11, + 0.0, + -6.349337028366264e-11, + -2.220446049250313e-16, + -1.0, + 0.0, + -6.349337028366264e-11, + -1.0, + -2.220446049250313e-16, + 0.0, + -126.93566131591796, + 0.000003000000106112566, + 36.558841705322269, + 1.0 + ] + }, + { + "mesh": 25, + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 4.4896641959724089e-11, + 1.0, + 0.0, + 0.0, + -1.0, + 4.4896641959724089e-11, + 0.0, + 126.93566131591796, + -0.00005299999975250103, + -36.5588493347168, + 1.0 + ] + }, + { + "mesh": 26 + }, + { + "mesh": 27, + "matrix": [ + -0.9861037135124208, + 0.16613073647022248, + 0.0, + 0.0, + -0.16613073647022248, + -0.9861037135124208, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -71.01806640625, + -22.193012237548829, + -20.0, + 1.0 + ] + }, + { + "mesh": 27, + "matrix": [ + 0.9861037135124208, + -0.16613082587718965, + 0.0, + 0.0, + 0.16613082587718965, + 0.9861037135124208, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 71.01806640625, + 22.19301414489746, + 22.0, + 1.0 + ] + }, + { + "mesh": 28, + "matrix": [ + 4.4896641959724089e-11, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + -1.0, + 0.0, + 4.4896641959724089e-11, + 0.0, + -100.0, + -66.15117645263672, + -5.627896785736084, + 1.0 + ] + }, + { + "mesh": 28, + "matrix": [ + 4.4896641959724089e-11, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + -1.0, + 0.0, + 4.4896641959724089e-11, + 0.0, + -100.0, + -66.15116882324219, + 14.372098922729493, + 1.0 + ] + }, + { + "mesh": 28, + "matrix": [ + -2.220446049250313e-16, + 6.349337028366264e-11, + 1.0, + 0.0, + -6.349337028366264e-11, + -1.0, + 6.349337028366264e-11, + 0.0, + 1.0, + -6.349337028366264e-11, + -2.220446049250313e-16, + 0.0, + 100.0, + -133.8488311767578, + 34.37212753295899, + 1.0 + ] + }, + { + "mesh": 28, + "matrix": [ + -2.220446049250313e-16, + 6.349337028366264e-11, + 1.0, + 0.0, + -6.349337028366264e-11, + -1.0, + 6.349337028366264e-11, + 0.0, + 1.0, + -6.349337028366264e-11, + -2.220446049250313e-16, + 0.0, + 100.0, + -133.8488311767578, + 54.37212371826172, + 1.0 + ] + }, + { + "mesh": 23, + "matrix": [ + 5.062397168131838e-10, + 0.002356505487114191, + -0.9999971985816956, + 0.0, + -4.2965237412317949e-7, + -0.9999971985816956, + -0.002356505487114191, + 0.0, + -1.0, + 4.2965237412317949e-7, + 5.062397168131838e-10, + 0.0, + -295.0, + 123.80779266357422, + -100.10150146484377, + 1.0 + ] + }, + { + "mesh": 23, + "matrix": [ + 5.062397168131838e-10, + 0.002356505487114191, + -0.9999971985816956, + 0.0, + -4.2965237412317949e-7, + -0.9999971985816956, + -0.002356505487114191, + 0.0, + -1.0, + 4.2965237412317949e-7, + 5.062397168131838e-10, + 0.0, + -295.0, + 132.1395263671875, + -3.9833459854125978, + 1.0 + ] + }, + { + "matrix": [ + 0.7071067690849304, + -2.1563657526257888e-7, + -0.7071068286895752, + 0.0, + -0.3312943577766419, + 0.883452296257019, + -0.33129459619522097, + 0.0, + 0.6246951818466187, + 0.4685211479663849, + 0.6246950030326843, + 0.0, + 1005.9874267578124, + 766.3170776367188, + 953.3455810546876, + 1.0 + ], + "camera": 0 + } + ], + "cameras": [ + { + "perspective": { + "aspectRatio": 1.0, + "yfov": 0.3143463730812073, + "zfar": 1000000.0, + "znear": 0.04999999701976776 + }, + "type": "perspective" + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + }, + { + "attributes": { + "NORMAL": 4, + "POSITION": 5 + }, + "indices": 3, + "mode": 4, + "material": 1 + } + ], + "name": "Piston_123-844_0_Parts_1" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 7, + "POSITION": 8 + }, + "indices": 6, + "mode": 4, + "material": 2 + } + ], + "name": "body_24" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 10, + "POSITION": 11 + }, + "indices": 9, + "mode": 4, + "material": 3 + } + ], + "name": "body_23" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 13, + "POSITION": 14 + }, + "indices": 12, + "mode": 4, + "material": 4 + } + ], + "name": "body_22" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 16, + "POSITION": 17 + }, + "indices": 15, + "mode": 4, + "material": 5 + } + ], + "name": "body_21" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 19, + "POSITION": 20 + }, + "indices": 18, + "mode": 4, + "material": 6 + } + ], + "name": "body_20" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 22, + "POSITION": 23 + }, + "indices": 21, + "mode": 4, + "material": 7 + }, + { + "attributes": { + "NORMAL": 25, + "POSITION": 26 + }, + "indices": 24, + "mode": 4, + "material": 8 + }, + { + "attributes": { + "NORMAL": 28, + "POSITION": 29 + }, + "indices": 27, + "mode": 4, + "material": 9 + } + ], + "name": "Spring_Link__0_Parts_1" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 31, + "POSITION": 32 + }, + "indices": 30, + "mode": 4, + "material": 10 + } + ], + "name": "body_19" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 34, + "POSITION": 35 + }, + "indices": 33, + "mode": 4, + "material": 11 + } + ], + "name": "body_18" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 37, + "POSITION": 38 + }, + "indices": 36, + "mode": 4, + "material": 12 + } + ], + "name": "body_17" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 40, + "POSITION": 41 + }, + "indices": 39, + "mode": 4, + "material": 13 + } + ], + "name": "body_16" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 43, + "POSITION": 44 + }, + "indices": 42, + "mode": 4, + "material": 14 + } + ], + "name": "body_15" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 46, + "POSITION": 47 + }, + "indices": 45, + "mode": 4, + "material": 15 + } + ], + "name": "body_14" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 49, + "POSITION": 50 + }, + "indices": 48, + "mode": 4, + "material": 16 + } + ], + "name": "body_13" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 52, + "POSITION": 53 + }, + "indices": 51, + "mode": 4, + "material": 17 + } + ], + "name": "body_12" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 55, + "POSITION": 56 + }, + "indices": 54, + "mode": 4, + "material": 18 + } + ], + "name": "body_11" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 58, + "POSITION": 59 + }, + "indices": 57, + "mode": 4, + "material": 19 + } + ], + "name": "body_10" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 61, + "POSITION": 62 + }, + "indices": 60, + "mode": 4, + "material": 20 + } + ], + "name": "body_9" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 64, + "POSITION": 65 + }, + "indices": 63, + "mode": 4, + "material": 21 + } + ], + "name": "body_8" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 67, + "POSITION": 68 + }, + "indices": 66, + "mode": 4, + "material": 22 + } + ], + "name": "body_7" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 70, + "POSITION": 71 + }, + "indices": 69, + "mode": 4, + "material": 23 + } + ], + "name": "body_6" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 73, + "POSITION": 74 + }, + "indices": 72, + "mode": 4, + "material": 24 + } + ], + "name": "body_5" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 76, + "POSITION": 77 + }, + "indices": 75, + "mode": 4, + "material": 25 + } + ], + "name": "body_4" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 79, + "POSITION": 80 + }, + "indices": 78, + "mode": 4, + "material": 26 + } + ], + "name": "body" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 82, + "POSITION": 83 + }, + "indices": 81, + "mode": 4, + "material": 27 + } + ], + "name": "body_3" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 85, + "POSITION": 86 + }, + "indices": 84, + "mode": 4, + "material": 28 + } + ], + "name": "body_2" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 88, + "POSITION": 89 + }, + "indices": 87, + "mode": 4, + "material": 29 + } + ], + "name": "body_1" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 91, + "POSITION": 92 + }, + "indices": 90, + "mode": 4, + "material": 30 + }, + { + "attributes": { + "NORMAL": 94, + "POSITION": 95 + }, + "indices": 93, + "mode": 4, + "material": 31 + } + ], + "name": "rod_123-699_0_Parts_1" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 97, + "POSITION": 98 + }, + "indices": 96, + "mode": 4, + "material": 32 + }, + { + "attributes": { + "NORMAL": 100, + "POSITION": 101 + }, + "indices": 99, + "mode": 4, + "material": 33 + } + ], + "name": "Lifter_123-923_0_Parts_1" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 8250, + "max": [ + 2011 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 2012, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 24144, + "componentType": 5126, + "count": 2012, + "max": [ + 63.35246658325195, + 56.026153564453128, + 46.5 + ], + "min": [ + -43.13071060180664, + -36.97384643554688, + -46.5 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 16500, + "componentType": 5123, + "count": 5034, + "max": [ + 1295 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 48288, + "componentType": 5126, + "count": 1296, + "max": [ + 1.0, + 1.0, + 0.9992589950561525 + ], + "min": [ + -1.0, + -1.0, + -0.9992589950561525 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 63840, + "componentType": 5126, + "count": 1296, + "max": [ + 53.35246658325195, + 56.026153564453128, + 46.46559143066406 + ], + "min": [ + 31.869285583496095, + -36.97384643554688, + -46.46559143066406 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 26568, + "componentType": 5123, + "count": 936, + "max": [ + 263 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 79392, + "componentType": 5126, + "count": 264, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 82560, + "componentType": 5126, + "count": 264, + "max": [ + -242.49256896972657, + 107.58116149902344, + 85.0 + ], + "min": [ + -264.4925537109375, + 85.59744262695313, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 28440, + "componentType": 5123, + "count": 1845, + "max": [ + 669 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 85728, + "componentType": 5126, + "count": 670, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 93768, + "componentType": 5126, + "count": 670, + "max": [ + 35.97993087768555, + 35.75779342651367, + 10.0 + ], + "min": [ + -35.97993087768555, + -35.97336959838867, + -15.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 32130, + "componentType": 5123, + "count": 6489, + "max": [ + 1552 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 101808, + "componentType": 5126, + "count": 1553, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 120444, + "componentType": 5126, + "count": 1553, + "max": [ + 63.0, + 35.0, + 113.5 + ], + "min": [ + -62.99030303955078, + -35.0, + -140.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 45108, + "componentType": 5123, + "count": 9267, + "max": [ + 2469 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 139080, + "componentType": 5126, + "count": 2470, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 168720, + "componentType": 5126, + "count": 2470, + "max": [ + 68.9806137084961, + -31.11992645263672, + 10.0 + ], + "min": [ + -68.9806137084961, + -168.8800811767578, + -15.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 63642, + "componentType": 5123, + "count": 4839, + "max": [ + 1381 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 198360, + "componentType": 5126, + "count": 1382, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 214944, + "componentType": 5126, + "count": 1382, + "max": [ + 177.38954162597657, + -14.305740356445313, + 18.985939025878908 + ], + "min": [ + -76.1104507446289, + -55.56795501708985, + -19.073078155517576 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 73320, + "componentType": 5123, + "count": 123, + "max": [ + 42 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 231528, + "componentType": 5126, + "count": 43, + "max": [ + 0.9818310141563416, + 0.9992589950561525, + 0.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 232044, + "componentType": 5126, + "count": 43, + "max": [ + 131.15240478515626, + -35.549163818359378, + 5.0 + ], + "min": [ + 129.44984436035157, + -37.250465393066409, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 73566, + "componentType": 5123, + "count": 123, + "max": [ + 42 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 232560, + "componentType": 5126, + "count": 43, + "max": [ + 0.9992589950561525, + 1.0, + 0.0 + ], + "min": [ + -0.9992589950561525, + -0.9818310141563416, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 233076, + "componentType": 5126, + "count": 43, + "max": [ + 131.19471740722657, + -61.50555038452149, + 5.0 + ], + "min": [ + 129.4075164794922, + -63.2940788269043, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 73812, + "componentType": 5123, + "count": 4842, + "max": [ + 869 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 233592, + "componentType": 5126, + "count": 870, + "max": [ + 1.0, + 0.9992589950561525, + 0.9992589950561525 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 244032, + "componentType": 5126, + "count": 870, + "max": [ + 132.30111694335938, + -34.40129470825195, + 14.998519897460938 + ], + "min": [ + 128.30111694335938, + -64.39833068847656, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 83496, + "componentType": 5123, + "count": 987, + "max": [ + 293 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 254472, + "componentType": 5126, + "count": 294, + "max": [ + 1.0, + 1.0, + 0.9992589950561525 + ], + "min": [ + -1.0, + -1.0, + -0.9992589950561525 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 258000, + "componentType": 5126, + "count": 294, + "max": [ + 181.5590057373047, + 312.1140747070313, + 17.986684799194337 + ], + "min": [ + 71.55899810791016, + 276.1140747070313, + -17.986684799194337 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 85470, + "componentType": 5123, + "count": 2145, + "max": [ + 623 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 261528, + "componentType": 5126, + "count": 624, + "max": [ + 1.0, + 1.0, + 0.9992589950561525 + ], + "min": [ + -1.0, + -1.0, + -0.9992589950561525 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 269016, + "componentType": 5126, + "count": 624, + "max": [ + 211.16444396972657, + 300.2055358886719, + 15.988161087036133 + ], + "min": [ + 202.16444396972657, + 268.2055358886719, + -15.988161087036133 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 89760, + "componentType": 5123, + "count": 1566, + "max": [ + 407 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 276504, + "componentType": 5126, + "count": 408, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 281400, + "componentType": 5126, + "count": 408, + "max": [ + 54.54435348510742, + -38.61518478393555, + 15.0 + ], + "min": [ + -44.45564651489258, + -80.61518859863281, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 92892, + "componentType": 5123, + "count": 1359, + "max": [ + 339 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 286296, + "componentType": 5126, + "count": 340, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 290376, + "componentType": 5126, + "count": 340, + "max": [ + 54.54435348510742, + -48.61518478393555, + 15.0 + ], + "min": [ + -44.45564651489258, + -61.61518478393555, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 95610, + "componentType": 5123, + "count": 1032, + "max": [ + 323 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 294456, + "componentType": 5126, + "count": 324, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 298344, + "componentType": 5126, + "count": 324, + "max": [ + 30.5535831451416, + 217.1583709716797, + 0.0 + ], + "min": [ + 15.553584098815918, + 202.16946411132813, + -81.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 97674, + "componentType": 5123, + "count": 288, + "max": [ + 95 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 302232, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 303384, + "componentType": 5126, + "count": 96, + "max": [ + -36.67900466918945, + 469.6546325683594, + 115.00000762939452 + ], + "min": [ + -49.67900466918945, + 456.6642761230469, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 98250, + "componentType": 5123, + "count": 1266, + "max": [ + 347 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 304536, + "componentType": 5126, + "count": 348, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 308712, + "componentType": 5126, + "count": 348, + "max": [ + -278.3986206054688, + -55.62376022338867, + 65.0 + ], + "min": [ + -296.3985900878906, + -73.61044311523438, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 100782, + "componentType": 5123, + "count": 5787, + "max": [ + 1408 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 312888, + "componentType": 5126, + "count": 1409, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 329796, + "componentType": 5126, + "count": 1409, + "max": [ + 105.0087432861328, + 60.05363082885742, + 75.0 + ], + "min": [ + -97.99126434326172, + -124.0295867919922, + 2.307800054550171 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 112356, + "componentType": 5123, + "count": 8964, + "max": [ + 1939 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 346704, + "componentType": 5126, + "count": 1940, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 369984, + "componentType": 5126, + "count": 1940, + "max": [ + 40.85147476196289, + 233.1286773681641, + 70.0 + ], + "min": [ + 19.2884521484375, + 214.79766845703129, + -28.7859001159668 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 130284, + "componentType": 5123, + "count": 10167, + "max": [ + 1753 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 393264, + "componentType": 5126, + "count": 1754, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9999880194664002, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 414312, + "componentType": 5126, + "count": 1754, + "max": [ + -252.55343627929688, + -164.07803344726566, + 85.0 + ], + "min": [ + -330.4447326660156, + -199.1783599853516, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 150618, + "componentType": 5123, + "count": 10125, + "max": [ + 1748 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 435360, + "componentType": 5126, + "count": 1749, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9999880194664002, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 456348, + "componentType": 5126, + "count": 1749, + "max": [ + -248.47320556640626, + -164.07803344726566, + 85.0 + ], + "min": [ + -326.3644409179688, + -199.1783599853516, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 170868, + "componentType": 5123, + "count": 21150, + "max": [ + 5473 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 477336, + "componentType": 5126, + "count": 5474, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 543024, + "componentType": 5126, + "count": 5474, + "max": [ + 113.00873565673828, + 59.71368026733399, + 0.0026710000820457937 + ], + "min": [ + -102.99126434326172, + -120.6896514892578, + -82.39035034179688 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 213168, + "componentType": 5123, + "count": 1359, + "max": [ + 371 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 608712, + "componentType": 5126, + "count": 372, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 613176, + "componentType": 5126, + "count": 372, + "max": [ + 37.65166091918945, + 226.15505981445316, + 0.0 + ], + "min": [ + 13.65165901184082, + 202.1728057861328, + -17.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 215886, + "componentType": 5123, + "count": 684, + "max": [ + 239 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 617640, + "componentType": 5126, + "count": 240, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 620520, + "componentType": 5126, + "count": 240, + "max": [ + -25.97146224975586, + 156.0619659423828, + 0.0 + ], + "min": [ + -188.97146606445316, + -6.938029766082764, + -230.0000152587891 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 217254, + "componentType": 5123, + "count": 5889, + "max": [ + 1413 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 623400, + "componentType": 5126, + "count": 1414, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 640368, + "componentType": 5126, + "count": 1414, + "max": [ + 105.0087432861328, + 60.05352783203125, + 147.6921844482422 + ], + "min": [ + -97.99126434326172, + -124.0295867919922, + 75.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 229032, + "componentType": 5123, + "count": 20607, + "max": [ + 5363 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 657336, + "componentType": 5126, + "count": 5364, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 721704, + "componentType": 5126, + "count": 5364, + "max": [ + 113.00873565673828, + 59.71368026733399, + 82.39035034179688 + ], + "min": [ + -102.99126434326172, + -120.6896514892578, + -0.002749999985098839 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 270246, + "componentType": 5123, + "count": 573, + "max": [ + 191 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 786072, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 788376, + "componentType": 5126, + "count": 192, + "max": [ + -25.97146224975586, + 81.05715942382813, + 0.0 + ], + "min": [ + -38.97146224975586, + 68.06676483154297, + -230.0000152587891 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 271392, + "componentType": 5123, + "count": 32934, + "max": [ + 8617 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 790680, + "componentType": 5126, + "count": 8618, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 894096, + "componentType": 5126, + "count": 8618, + "max": [ + 99.06433868408205, + 151.558837890625, + 80.00056457519531 + ], + "min": [ + -61.93566513061524, + -38.4411506652832, + -80.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 337260, + "componentType": 5123, + "count": 33420, + "max": [ + 8617 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 997512, + "componentType": 5126, + "count": 8618, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1100928, + "componentType": 5126, + "count": 8618, + "max": [ + 99.06433868408205, + 151.558837890625, + 80.00056457519531 + ], + "min": [ + -61.93566513061524, + -38.4411506652832, + -80.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 404100, + "componentType": 5123, + "count": 17691, + "max": [ + 3671 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1204344, + "componentType": 5126, + "count": 3672, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1248408, + "componentType": 5126, + "count": 3672, + "max": [ + 95.0, + 90.0, + 112.99999237060549 + ], + "min": [ + -95.0, + -180.9715576171875, + -120.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 439482, + "componentType": 5123, + "count": 3903, + "max": [ + 1280 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1292472, + "componentType": 5126, + "count": 1281, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1307844, + "componentType": 5126, + "count": 1281, + "max": [ + 111.05359649658205, + 30.67658042907715, + 10.0 + ], + "min": [ + -70.94640350341797, + -43.32342147827149, + -10.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 447288, + "componentType": 5123, + "count": 960, + "max": [ + 179 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1323216, + "componentType": 5126, + "count": 180, + "max": [ + 1.0, + 0.9992589950561525, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1325376, + "componentType": 5126, + "count": 180, + "max": [ + 76.06450653076172, + 2.5340518951416017, + 7.0 + ], + "min": [ + -11.810647010803225, + -15.180893898010254, + -7.0 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 449208, + "componentType": 5123, + "count": 423, + "max": [ + 142 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1327536, + "componentType": 5126, + "count": 143, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -0.9992589950561525, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1329252, + "componentType": 5126, + "count": 143, + "max": [ + -16.62210273742676, + -26.09882354736328, + 0.0 + ], + "min": [ + -32.12210464477539, + -41.59605407714844, + -81.32071685791016 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 450054, + "componentType": 5123, + "count": 2163, + "max": [ + 385 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1330968, + "componentType": 5126, + "count": 386, + "max": [ + 0.7761409878730774, + 0.7761409878730774, + -0.6286939978599548 + ], + "min": [ + -0.7758179903030396, + -0.7761409878730774, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1335600, + "componentType": 5126, + "count": 386, + "max": [ + -16.62210273742676, + -26.09882354736328, + -81.31858825683594 + ], + "min": [ + -32.11616134643555, + -41.59875106811524, + -85.0 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_21" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.42500001192092898, + 0.42500001192092898, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_22" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.42500001192092898, + 0.42500001192092898, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_22" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_18" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.5609999895095825, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_23" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.5609999895095825, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_23" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.42500001192092898, + 0.42500001192092898, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_22" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.5609999895095825, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_23" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_16" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_19" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.8500000238418579, + 0.8500000238418579, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_20" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.5609999895095825, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_17" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8500000238418579, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ], + "name": "Material_18" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 1340232, + "byteLength": 454380, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 1340232, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 1794612, + "uri": "2CylinderEngine0.bin" + } + ] +} diff --git a/automated-tests/resources/2CylinderEngine0.bin b/automated-tests/resources/2CylinderEngine0.bin new file mode 100644 index 0000000..e8cb49d Binary files /dev/null and b/automated-tests/resources/2CylinderEngine0.bin differ diff --git a/automated-tests/resources/AnimatedMorphCube.bin b/automated-tests/resources/AnimatedMorphCube.bin new file mode 100644 index 0000000..7b14a17 Binary files /dev/null and b/automated-tests/resources/AnimatedMorphCube.bin differ diff --git a/automated-tests/resources/AnimatedMorphCube.gltf b/automated-tests/resources/AnimatedMorphCube.gltf new file mode 100644 index 0000000..fa99bc5 --- /dev/null +++ b/automated-tests/resources/AnimatedMorphCube.gltf @@ -0,0 +1,282 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 24, + "type": "VEC4" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0100000035, + 0.0100000035, + 0.01 + ], + "min": [ + -0.0100000044, + -0.0100000054, + -0.01 + ] + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "thin" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0, + 0.01893253, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "name": "thin" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "thin" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "angle" + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "max": [ + 0.0, + 0.0198908355, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "name": "angle" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 24, + "type": "VEC3", + "name": "angle" + }, + { + "bufferView": 9, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 127, + "type": "SCALAR", + "max": [ + 4.19999743 + ], + "min": [ + 0.0 + ] + }, + { + "bufferView": 11, + "componentType": 5126, + "count": 254, + "type": "SCALAR" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "weights" + } + } + ], + "samplers": [ + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + } + ], + "name": "Square" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 288, + "byteLength": 384 + }, + { + "buffer": 0, + "byteOffset": 672, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 960, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1248, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1536, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 1824, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2112, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2400, + "byteLength": 288 + }, + { + "buffer": 0, + "byteOffset": 2688, + "byteLength": 72 + }, + { + "buffer": 0, + "byteOffset": 2760, + "byteLength": 508 + }, + { + "buffer": 0, + "byteOffset": 3268, + "byteLength": 1016 + } + ], + "buffers": [ + { + "uri": "AnimatedMorphCube.bin", + "byteLength": 4284 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 0, + "TANGENT": 1, + "POSITION": 2 + }, + "indices": 9, + "material": 0, + "targets": [ + { + "NORMAL": 3, + "POSITION": 4, + "TANGENT": 5 + }, + { + "NORMAL": 6, + "POSITION": 7, + "TANGENT": 8 + } + ] + } + ], + "weights": [ + 0.0, + 0.0 + ], + "name": "Cube" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.6038274, + 0.6038274, + 0.6038274, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + }, + "name": "Material" + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0.0, + 0.7071067, + -0.7071068, + 0.0 + ], + "scale": [ + 100.0, + 100.0, + 100.0 + ], + "name": "AnimatedMorphCube" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/automated-tests/resources/AnimatedMorphSphere.bin b/automated-tests/resources/AnimatedMorphSphere.bin new file mode 100644 index 0000000..5bc8fc6 --- /dev/null +++ b/automated-tests/resources/AnimatedMorphSphere.bin @@ -0,0 +1,185 @@ +†ô=½uñ>f‡a¿†ô=½uñ>f‡a¿†ô=½uñ>f‡a¿†ô=½uñ>f‡a¿å7±½Çì`?9sð>å7±½Çì`?9sð>å7±½Çì`?9sð>å7±½Çì`?9sð>nk½±"?kE¿nk½±"?kE¿nk½±"?kE¿nk½±"?kE¿Õw›½ßQE?•ï!?Õw›½ßQE?•ï!?Õw›½ßQE?•ï!?Õw›½ßQE?•ï!?Õw›½ßQE?•ï!¿Õw›½ßQE?•ï!¿Õw›½ßQE?•ï!¿Õw›½ßQE?•ï!¿¹k½°"?jE?¹k½°"?jE?¹k½°"?jE?¹k½°"?jE?ð7±½Çì`?6sð¾ð7±½Çì`?6sð¾ð7±½Çì`?6sð¾ð7±½Çì`?6sð¾ˆô=½ñ>d‡a?ˆô=½ñ>d‡a?ˆô=½ñ>d‡a?ˆô=½ñ>d‡a?‹*À½_ås?4ø“¾‹*À½_ås?4ø“¾‹*À½_ås?4ø“¾‹*À½_ås?4ø“¾ ê¼¢”>màt? ê¼¢”>màt? ê¼¢”>màt? ê¼¢”>màt?ãÅǽe}?IÈǽãÅǽe}?IÈǽãÅǽe}?IÈǽãÅǽe}?IÈǽ¼ËºÈ=dÁ~¿¼ËºÈ=dÁ~¿¼ËºÈ=dÁ~¿Î5ê¼÷Á=bÁ~¿A+>½Pâ±=bÁ~¿ù5ê< Á=bÁ~¿f+>=fâ±=bÁ~¿R罪ê›=fÁ~¿R罪ê›=fÁ~¿[뛽Cê=bÁ~¿íà±½u)>=hÁ~¿Á½Ò3ê½bÁ~¿\雽vê½fÁ~¿·ë½Ê꛽bÁ~¿·ë½Ê꛽bÁ~¿E'>½xâ±½dÁ~¿ª-ê¼#Á½dÁ~¿!<¼çºÈ½bÁ~¿!<¼çºÈ½bÁ~¿#<<éºÈ½bÁ~¿¾-ê<'Á½dÁ~¿T'>=‚â±½dÁ~¿T'>=‚â±½dÁ~¿×ë=Õ꛽bÁ~¿~ê›=‚ê½dÁ~¿1â±=°)>½dÁ~¿1â±=°)>½dÁ~¿ÂÁ=þ3ê¼aÁ~¿_»È=+)¼bÁ~¿qºÈ=M)=fÁ~¿wë›=rê=bÁ~¿wë›=rê=bÁ~¿Šç=Äê›=fÁ~¿”#¼ÂºÈ=dÁ~?”#¼ÂºÈ=dÁ~?”#¼ÂºÈ=dÁ~?Y1ê¼ñÁ=dÁ~?{+>½Râ±=bÁ~?s1ê<þÁ=dÁ~?Š+>=Yâ±=bÁ~?«è½ªê›=dÁ~?«è½ªê›=dÁ~?ø꛽;ê=bÁ~?¯â±½l)>=bÁ~?¾Á½É3ê½bÁ~?¾ê›½Kê½dÁ~?µè½¬ê›½dÁ~?µè½¬ê›½dÁ~?„+>½Vâ±½bÁ~?f1ê¼üÁ½dÁ~?´&¼½ºÈ½dÁ~?´&¼½ºÈ½dÁ~?='<ÀºÈ½dÁ~?ò1ê<úÁ½dÁ~?Š+>=Vâ±½bÁ~?Š+>=Vâ±½bÁ~?½è=®ê›½dÁ~?Ãê›=Kê½bÁ~?½â±=t)>½bÁ~?½â±=t)>½bÁ~?ÇÁ=á3ê¼dÁ~?Œ»È=7)¼aÁ~?‚ºÈ=8)â±=ƒ)>=dÁ~?Äê›=Mê=bÁ~?Äê›=Mê=bÁ~?Áè=³ê›=dÁ~?ÎÅǽe}?FÈÇ=ÎÅǽe}?FÈÇ=ÎÅǽe}?FÈÇ=ÎÅǽe}?FÈÇ=ê¼³”>kàt¿ê¼³”>kàt¿ê¼³”>kàt¿ê¼³”>kàt¿e*À½cås?'ø“>e*À½cås?'ø“>e*À½cås?'ø“>e*À½cås?'ø“>Æ꓾îÎs?FÈÇ=Æ꓾îÎs?FÈÇ=Æ꓾îÎs?FÈÇ=Æ꓾îÎs?FÈÇ=òV­½ێ>màt¿òV­½ێ>màt¿òV­½ێ>màt¿òV­½ێ>màt¿£HŽ¾è…j?Dø“>£HŽ¾è…j?Dø“>£HŽ¾è…j?Dø“>£HŽ¾è…j?Dø“>\¦ ¾ŽÔç>f‡a¿\¦ ¾ŽÔç>f‡a¿\¦ ¾ŽÔç>f‡a¿\¦ ¾ŽÔç>f‡a¿m7ƒ¾ûGX?sð>m7ƒ¾ûGX?sð>m7ƒ¾ûGX?sð>m7ƒ¾ûGX?sð>E=¾Ü?gE¿E=¾Ü?gE¿E=¾Ü?gE¿E=¾Ü?gE¿o9f¾™¼=? ï!?o9f¾™¼=? ï!?o9f¾™¼=? ï!?o9f¾™¼=? ï!?s9f¾š¼=?žï!¿s9f¾š¼=?žï!¿s9f¾š¼=?žï!¿s9f¾š¼=?žï!¿==¾Ü?jE?==¾Ü?jE?==¾Ü?jE?==¾Ü?jE?j7ƒ¾øGX?(sð¾j7ƒ¾øGX?(sð¾j7ƒ¾øGX?(sð¾j7ƒ¾øGX?(sð¾[¦ ¾Ôç>d‡a?[¦ ¾Ôç>d‡a?[¦ ¾Ôç>d‡a?[¦ ¾Ôç>d‡a?ŸHŽ¾è…j?Iø“¾ŸHŽ¾è…j?Iø“¾ŸHŽ¾è…j?Iø“¾ŸHŽ¾è…j?Iø“¾«W­½ێ>kàt?«W­½ێ>kàt?«W­½ێ>kàt?«W­½ێ>kàt?À꓾îÎs?FÈǽÀ꓾îÎs?FÈǽÀ꓾îÎs?FÈǽÀ꓾îÎs?FÈǽ.Ž™¾¤?iE?.Ž™¾¤?iE?.Ž™¾¤?iE?.Ž™¾¤?iE?tÕ¾nSG?sð¾tÕ¾nSG?sð¾tÕ¾nSG?sð¾tÕ¾nSG?sð¾xgd¾í§Õ>b‡a?xgd¾í§Õ>b‡a?xgd¾í§Õ>b‡a?xgd¾í§Õ>b‡a?Zç¾<#X?\ø“¾Zç¾<#X?\ø“¾Zç¾<#X?\ø“¾Zç¾<#X?\ø“¾r¾ ¾¨ƒ>màt?r¾ ¾¨ƒ>màt?r¾ ¾¨ƒ>màt?r¾ ¾¨ƒ>màt?@4ð¾ï±`?öÇǽ@4ð¾ï±`?öÇǽ@4ð¾ï±`?öÇǽ@4ð¾ï±`?öÇǽ@4ð¾ï±`?öÇÇ=@4ð¾ï±`?öÇÇ=@4ð¾ï±`?öÇÇ=@4ð¾ï±`?öÇÇ=l¾ ¾¨ƒ>màt¿l¾ ¾¨ƒ>màt¿l¾ ¾¨ƒ>màt¿l¾ ¾¨ƒ>màt¿\ç¾=#X?Pø“>\ç¾=#X?Pø“>\ç¾=#X?Pø“>\ç¾=#X?Pø“>Igd¾ë§Õ>d‡a¿Igd¾ë§Õ>d‡a¿Igd¾ë§Õ>d‡a¿Igd¾ë§Õ>d‡a¿~Õ¾qSG?sð>~Õ¾qSG?sð>~Õ¾qSG?sð>~Õ¾qSG?sð>1Ž™¾¤?gE¿1Ž™¾¤?gE¿1Ž™¾¤?gE¿1Ž™¾¤?gE¿ƒîº¾ÇÜ.?Ÿï!?ƒîº¾ÇÜ.?Ÿï!?ƒîº¾ÇÜ.?Ÿï!?ƒîº¾ÇÜ.?Ÿï!?îº¾ÆÜ.?¢ï!¿îº¾ÆÜ.?¢ï!¿îº¾ÆÜ.?¢ï!¿îº¾ÆÜ.?¢ï!¿{y¿Cr=?Eø“>{y¿Cr=?Eø“>{y¿Cr=?Eø“>{y¿Cr=?Eø“>z°™¾gE»>f‡a¿z°™¾gE»>f‡a¿z°™¾gE»>f‡a¿z°™¾gE»>f‡a¿ža¿éµ.?!sð>ža¿éµ.?!sð>ža¿éµ.?!sð>ža¿éµ.?!sð>¦¦Î¾Îû>fE¿¦¦Î¾Îû>fE¿¦¦Î¾Îû>fE¿¦¦Î¾Îû>fE¿b‘û¾©D?šï!?b‘û¾©D?šï!?b‘û¾©D?šï!?b‘û¾©D?šï!?b‘û¾¨D?ï!¿b‘û¾¨D?ï!¿b‘û¾¨D?ï!¿b‘û¾¨D?ï!¿§¦Î¾Îû>jE?§¦Î¾Îû>jE?§¦Î¾Îû>jE?§¦Î¾Îû>jE?a¿éµ.?sð¾a¿éµ.?sð¾a¿éµ.?sð¾a¿éµ.?sð¾g°™¾iE»>i‡a?g°™¾iE»>i‡a?g°™¾iE»>i‡a?g°™¾iE»>i‡a?zy¿?r=?Oø“¾zy¿?r=?Oø“¾zy¿?r=?Oø“¾zy¿?r=?Oø“¾i=¾¨Ëf>kàt?i=¾¨Ëf>kàt?i=¾¨Ëf>kàt?i=¾¨Ëf>kàt?O¡!¿eòD?dÈǽO¡!¿eòD?dÈǽO¡!¿eòD?dÈǽO¡!¿eòD?dÈǽN¡!¿fòD?eÈÇ=N¡!¿fòD?eÈÇ=N¡!¿fòD?eÈÇ=N¡!¿fòD?eÈÇ=i=¾ÅËf>jàt¿i=¾ÅËf>jàt¿i=¾ÅËf>jàt¿i=¾ÅËf>jàt¿]E»¾}°™>f‡a?]E»¾}°™>f‡a?]E»¾}°™>f‡a?]E»¾}°™>f‡a?Cr=¿{y?Bø“¾Cr=¿{y?Bø“¾Cr=¿{y?Bø“¾Cr=¿{y?Bø“¾vËf¾Ãh=>sàt?vËf¾Ãh=>sàt?vËf¾Ãh=>sàt?vËf¾Ãh=>sàt?hòD¿K¡!?uÈǽhòD¿K¡!?uÈǽhòD¿K¡!?uÈǽhòD¿K¡!?uÈǽhòD¿J¡!?sÈÇ=hòD¿J¡!?sÈÇ=hòD¿J¡!?sÈÇ=hòD¿J¡!?sÈÇ=œËf¾Ïh=>oàt¿œËf¾Ïh=>oàt¿œËf¾Ïh=>oàt¿œËf¾Ïh=>oàt¿Br=¿{y?Bø“>Br=¿{y?Bø“>Br=¿{y?Bø“>Br=¿{y?Bø“>kE»¾}°™>b‡a¿kE»¾}°™>b‡a¿kE»¾}°™>b‡a¿kE»¾}°™>b‡a¿êµ.¿a?sð>êµ.¿a?sð>êµ.¿a?sð>êµ.¿a?sð>Îû¾¦Î>gE¿Îû¾¦Î>gE¿Îû¾¦Î>gE¿Îû¾¦Î>gE¿¦D¿]‘û>žï!?¦D¿]‘û>žï!?¦D¿]‘û>žï!?¦D¿]‘û>žï!?¦D¿]‘û>žï!¿¦D¿]‘û>žï!¿¦D¿]‘û>žï!¿¦D¿]‘û>žï!¿Îû¾˜¦Î>iE?Îû¾˜¦Î>iE?Îû¾˜¦Î>iE?Îû¾˜¦Î>iE?êµ.¿—a?*sð¾êµ.¿—a?*sð¾êµ.¿—a?*sð¾êµ.¿—a?*sð¾ô§Õ¾0gd>d‡a¿ô§Õ¾0gd>d‡a¿ô§Õ¾0gd>d‡a¿ô§Õ¾0gd>d‡a¿qSG¿mÕ>sð>qSG¿mÕ>sð>qSG¿mÕ>sð>qSG¿mÕ>sð>¤¿1Ž™>kE¿¤¿1Ž™>kE¿¤¿1Ž™>kE¿¤¿1Ž™>kE¿ÊÜ.¿îº>›ï!?ÊÜ.¿îº>›ï!?ÊÜ.¿îº>›ï!?ÊÜ.¿îº>›ï!?ÊÜ.¿„îº>ï!¿ÊÜ.¿„îº>ï!¿ÊÜ.¿„îº>ï!¿ÊÜ.¿„îº>ï!¿¤¿8Ž™>kE?¤¿8Ž™>kE?¤¿8Ž™>kE?¤¿8Ž™>kE?nSG¿tÕ>sð¾nSG¿tÕ>sð¾nSG¿tÕ>sð¾nSG¿tÕ>sð¾÷§Õ¾+gd>b‡a?÷§Õ¾+gd>b‡a?÷§Õ¾+gd>b‡a?÷§Õ¾+gd>b‡a?F#X¿Fç>Cø“¾F#X¿Fç>Cø“¾F#X¿Fç>Cø“¾F#X¿Fç>Cø“¾¨ƒ¾a¾ >màt?¨ƒ¾a¾ >màt?¨ƒ¾a¾ >màt?¨ƒ¾a¾ >màt?ò±`¿04ð>~Èǽò±`¿04ð>~Èǽò±`¿04ð>~Èǽò±`¿04ð>~Èǽò±`¿.4ð>~ÈÇ=ò±`¿.4ð>~ÈÇ=ò±`¿.4ð>~ÈÇ=ò±`¿.4ð>~ÈÇ=¨ƒ¾i¾ >màt¿¨ƒ¾i¾ >màt¿¨ƒ¾i¾ >màt¿¨ƒ¾i¾ >màt¿G#X¿Gç>=ø“>G#X¿Gç>=ø“>G#X¿Gç>=ø“>G#X¿Gç>=ø“>é…j¿ŸHŽ>Aø“¾é…j¿ŸHŽ>Aø“¾é…j¿ŸHŽ>Aø“¾é…j¿ŸHŽ>Aø“¾ÿڎ¾ÉV­=qàt?ÿڎ¾ÉV­=qàt?ÿڎ¾ÉV­=qàt?ÿڎ¾ÉV­=qàt?îÎs¿¼ê“>ÈǽîÎs¿¼ê“>ÈǽîÎs¿¼ê“>ÈǽîÎs¿¼ê“>ÈǽîÎs¿¼ê“>ÈÇ=îÎs¿¼ê“>ÈÇ=îÎs¿¼ê“>ÈÇ=îÎs¿¼ê“>ÈÇ=ێ¾ÅV­=kàt¿ێ¾ÅV­=kàt¿ێ¾ÅV­=kàt¿ێ¾ÅV­=kàt¿é…j¿ŸHŽ>@ø“>é…j¿ŸHŽ>@ø“>é…j¿ŸHŽ>@ø“>é…j¿ŸHŽ>@ø“>’Ôç¾N¦ >f‡a¿’Ôç¾N¦ >f‡a¿’Ôç¾N¦ >f‡a¿’Ôç¾N¦ >f‡a¿ÿGX¿b7ƒ>sð>ÿGX¿b7ƒ>sð>ÿGX¿b7ƒ>sð>ÿGX¿b7ƒ>sð>Ü¿1=>iE¿Ü¿1=>iE¿Ü¿1=>iE¿Ü¿1=>iE¿¼=¿H9f>Ÿï!?¼=¿H9f>Ÿï!?¼=¿H9f>Ÿï!?¼=¿H9f>Ÿï!?¼=¿H9f>Ÿï!¿¼=¿H9f>Ÿï!¿¼=¿H9f>Ÿï!¿¼=¿H9f>Ÿï!¿Ü¿>=>gE?Ü¿>=>gE?Ü¿>=>gE?Ü¿>=>gE?ÿGX¿[7ƒ>sð¾ÿGX¿[7ƒ>sð¾ÿGX¿[7ƒ>sð¾ÿGX¿[7ƒ>sð¾‹Ôç¾Z¦ >f‡a?‹Ôç¾Z¦ >f‡a?‹Ôç¾Z¦ >f‡a?‹Ôç¾Z¦ >f‡a?Ìì`¿›9±=sð>Ìì`¿›9±=sð>Ìì`¿›9±=sð>Ìì`¿›9±=sð>²"¿ðm=fE¿²"¿ðm=fE¿²"¿ðm=fE¿²"¿ðm=fE¿ÒQE¿yy›=Ÿï!?ÒQE¿yy›=Ÿï!?ÒQE¿yy›=Ÿï!?ÒQE¿yy›=Ÿï!?ÒQE¿yy›=Ÿï!¿ÒQE¿yy›=Ÿï!¿ÒQE¿yy›=Ÿï!¿ÒQE¿yy›=Ÿï!¿²"¿•m=fE?²"¿•m=fE?²"¿•m=fE?²"¿•m=fE?Çì`¿¢9±=#sð¾Çì`¿¢9±=#sð¾Çì`¿¢9±=#sð¾Çì`¿¢9±=#sð¾ñ¾ ÷==a‡a?ñ¾ ÷==a‡a?ñ¾ ÷==a‡a?ñ¾ ÷==a‡a?Zås¿:,À==ø“¾Zås¿:,À==ø“¾Zås¿:,À==ø“¾Zås¿:,À==ø“¾›”¾ÆêZås¿:,À=<ø“>Zås¿:,À=<ø“>Zås¿:,À=<ø“>qñ¾÷==d‡a¿qñ¾÷==d‡a¿qñ¾÷==d‡a¿qñ¾÷==d‡a¿›”¾#ê¼oàt?›”¾#ê¼oàt?›”¾#ê¼oàt?›”¾#ê¼oàt?[}¿(ÈǽÛÈǽ[}¿(ÈǽÛÈǽ[}¿(ÈǽÛÈǽ[}¿(ÈǽÛÈǽ[}¿(ÈǽÛÈÇ=[}¿(ÈǽÛÈÇ=[}¿(ÈǽÛÈÇ=[}¿(ÈǽÛÈÇ=®”¾ê¼kàt¿®”¾ê¼kàt¿®”¾ê¼kàt¿®”¾ê¼kàt¿Zås¿q,À½7ø“>Zås¿q,À½7ø“>Zås¿q,À½7ø“>Zås¿q,À½7ø“>nñ¾¸÷=½f‡a¿nñ¾¸÷=½f‡a¿nñ¾¸÷=½f‡a¿nñ¾¸÷=½f‡a¿Êì`¿Õ9±½sð>Êì`¿Õ9±½sð>Êì`¿Õ9±½sð>Êì`¿Õ9±½sð>­"¿ým½kE¿­"¿ým½kE¿­"¿ým½kE¿­"¿ým½kE¿ÕQE¿wy›½ï!?ÕQE¿wy›½ï!?ÕQE¿wy›½ï!?ÕQE¿wy›½ï!?ÕQE¿wy›½ï!¿ÕQE¿wy›½ï!¿ÕQE¿wy›½ï!¿ÕQE¿wy›½ï!¿¬"¿Bn½kE?¬"¿Bn½kE?¬"¿Bn½kE?¬"¿Bn½kE?Çì`¿¢9±½#sð¾Çì`¿¢9±½#sð¾Çì`¿¢9±½#sð¾Çì`¿¢9±½#sð¾sñ¾H÷=½d‡a?sñ¾H÷=½d‡a?sñ¾H÷=½d‡a?sñ¾H÷=½d‡a?Zås¿p,À½6ø“¾Zås¿p,À½6ø“¾Zås¿p,À½6ø“¾Zås¿p,À½6ø“¾Ü¿4=¾iE¿Ü¿4=¾iE¿Ü¿4=¾iE¿Ü¿4=¾iE¿ž¼=¿h9f¾šï!?ž¼=¿h9f¾šï!?ž¼=¿h9f¾šï!?ž¼=¿h9f¾šï!?ž¼=¿h9f¾šï!¿ž¼=¿h9f¾šï!¿ž¼=¿h9f¾šï!¿ž¼=¿h9f¾šï!¿Ü¿B=¾jE?Ü¿B=¾jE?Ü¿B=¾jE?Ü¿B=¾jE?øGX¿i7ƒ¾(sð¾øGX¿i7ƒ¾(sð¾øGX¿i7ƒ¾(sð¾øGX¿i7ƒ¾(sð¾‘Ôç¾g¦ ¾b‡a?‘Ôç¾g¦ ¾b‡a?‘Ôç¾g¦ ¾b‡a?‘Ôç¾g¦ ¾b‡a?ë…j¿ŸHŽ¾3ø“¾ë…j¿ŸHŽ¾3ø“¾ë…j¿ŸHŽ¾3ø“¾ë…j¿ŸHŽ¾3ø“¾ێ¾àV­½kàt?ێ¾àV­½kàt?ێ¾àV­½kàt?ێ¾àV­½kàt?ìÎs¿»ê“¾àÈǽìÎs¿»ê“¾àÈǽìÎs¿»ê“¾àÈǽìÎs¿»ê“¾àÈǽìÎs¿»ê“¾àÈÇ=ìÎs¿»ê“¾àÈÇ=ìÎs¿»ê“¾àÈÇ=ìÎs¿»ê“¾àÈÇ=ێ¾ùV­½oàt¿ێ¾ùV­½oàt¿ێ¾ùV­½oàt¿ێ¾ùV­½oàt¿é…j¿¡HŽ¾6ø“>é…j¿¡HŽ¾6ø“>é…j¿¡HŽ¾6ø“>é…j¿¡HŽ¾6ø“>ŽÔç¾\¦ ¾f‡a¿ŽÔç¾\¦ ¾f‡a¿ŽÔç¾\¦ ¾f‡a¿ŽÔç¾\¦ ¾f‡a¿þGX¿c7ƒ¾sð>þGX¿c7ƒ¾sð>þGX¿c7ƒ¾sð>þGX¿c7ƒ¾sð>ì±`¿?4ð¾ÛÈǽì±`¿?4ð¾ÛÈǽì±`¿?4ð¾ÛÈǽì±`¿?4ð¾ÛÈǽì±`¿=4ð¾ÙÈÇ=ì±`¿=4ð¾ÙÈÇ=ì±`¿=4ð¾ÙÈÇ=ì±`¿=4ð¾ÙÈÇ=,¨ƒ¾n¾ ¾jàt¿,¨ƒ¾n¾ ¾jàt¿,¨ƒ¾n¾ ¾jàt¿,¨ƒ¾n¾ ¾jàt¿B#X¿cç¾4ø“>B#X¿cç¾4ø“>B#X¿cç¾4ø“>B#X¿cç¾4ø“>ó§Õ¾5gd¾d‡a¿ó§Õ¾5gd¾d‡a¿ó§Õ¾5gd¾d‡a¿ó§Õ¾5gd¾d‡a¿mSG¿xÕ¾sð>mSG¿xÕ¾sð>mSG¿xÕ¾sð>mSG¿xÕ¾sð> ¤¿?Ž™¾eE¿ ¤¿?Ž™¾eE¿ ¤¿?Ž™¾eE¿ ¤¿?Ž™¾eE¿ÈÜ.¿“˜ï!?ÈÜ.¿“˜ï!?ÈÜ.¿“˜ï!?ÈÜ.¿“˜ï!?ÈÜ.¿“šï!¿ÈÜ.¿“šï!¿ÈÜ.¿“šï!¿ÈÜ.¿“šï!¿¤¿1Ž™¾kE?¤¿1Ž™¾kE?¤¿1Ž™¾kE?¤¿1Ž™¾kE?kSG¿tÕ¾+sð¾kSG¿tÕ¾+sð¾kSG¿tÕ¾+sð¾kSG¿tÕ¾+sð¾ð§Õ¾0gd¾d‡a?ð§Õ¾0gd¾d‡a?ð§Õ¾0gd¾d‡a?ð§Õ¾0gd¾d‡a?B#X¿cç¾2ø“¾B#X¿cç¾2ø“¾B#X¿cç¾2ø“¾B#X¿cç¾2ø“¾¨ƒ¾e¾ ¾qàt?¨ƒ¾e¾ ¾qàt?¨ƒ¾e¾ ¾qàt?¨ƒ¾e¾ ¾qàt?§D¿k‘û¾šï!?§D¿k‘û¾šï!?§D¿k‘û¾šï!?§D¿k‘û¾šï!?¤D¿l‘û¾œï!¿¤D¿l‘û¾œï!¿¤D¿l‘û¾œï!¿¤D¿l‘û¾œï!¿Îû¾¨¦Î¾kE?Îû¾¨¦Î¾kE?Îû¾¨¦Î¾kE?Îû¾¨¦Î¾kE?çµ.¿›a¿-sð¾çµ.¿›a¿-sð¾çµ.¿›a¿-sð¾çµ.¿›a¿-sð¾kE»¾„°™¾b‡a?kE»¾„°™¾b‡a?kE»¾„°™¾b‡a?kE»¾„°™¾b‡a?Hr=¿vy¿8ø“¾Hr=¿vy¿8ø“¾Hr=¿vy¿8ø“¾Hr=¿vy¿8ø“¾Ìf¾¾h=¾jàt?Ìf¾¾h=¾jàt?Ìf¾¾h=¾jàt?Ìf¾¾h=¾jàt?bòD¿P¡!¿ËÈǽbòD¿P¡!¿ËÈǽbòD¿P¡!¿ËÈǽbòD¿P¡!¿ËÈǽbòD¿P¡!¿ËÈÇ=bòD¿P¡!¿ËÈÇ=bòD¿P¡!¿ËÈÇ=bòD¿P¡!¿ËÈÇ=ËËf¾Ðh=¾kàt¿ËËf¾Ðh=¾kàt¿ËËf¾Ðh=¾kàt¿ËËf¾Ðh=¾kàt¿Hr=¿wy¿5ø“>Hr=¿wy¿5ø“>Hr=¿wy¿5ø“>Hr=¿wy¿5ø“>^E»¾{°™¾g‡a¿^E»¾{°™¾g‡a¿^E»¾{°™¾g‡a¿^E»¾{°™¾g‡a¿ëµ.¿›a¿"sð>ëµ.¿›a¿"sð>ëµ.¿›a¿"sð>ëµ.¿›a¿"sð>Îû¾¦¦Î¾fE¿Îû¾¦¦Î¾fE¿Îû¾¦¦Î¾fE¿Îû¾¦¦Î¾fE¿O¡!¿dòD¿¶ÈÇ=O¡!¿dòD¿¶ÈÇ=O¡!¿dòD¿¶ÈÇ=O¡!¿dòD¿¶ÈÇ=¿h=¾ÒËf¾màt¿¿h=¾ÒËf¾màt¿¿h=¾ÒËf¾màt¿¿h=¾ÒËf¾màt¿zy¿Fr=¿8ø“>zy¿Fr=¿8ø“>zy¿Fr=¿8ø“>zy¿Fr=¿8ø“>z°™¾lE»¾d‡a¿z°™¾lE»¾d‡a¿z°™¾lE»¾d‡a¿z°™¾lE»¾d‡a¿›a¿çµ.¿,sð>›a¿çµ.¿,sð>›a¿çµ.¿,sð>›a¿çµ.¿,sð>¯¦Î¾ Îû¾eE¿¯¦Î¾ Îû¾eE¿¯¦Î¾ Îû¾eE¿¯¦Î¾ Îû¾eE¿\‘û¾ªD¿œï!?\‘û¾ªD¿œï!?\‘û¾ªD¿œï!?\‘û¾ªD¿œï!?]‘û¾ªD¿šï!¿]‘û¾ªD¿šï!¿]‘û¾ªD¿šï!¿]‘û¾ªD¿šï!¿Ÿ¦Î¾ Îû¾jE?Ÿ¦Î¾ Îû¾jE?Ÿ¦Î¾ Îû¾jE?Ÿ¦Î¾ Îû¾jE?˜a¿çµ.¿3sð¾˜a¿çµ.¿3sð¾˜a¿çµ.¿3sð¾˜a¿çµ.¿3sð¾b°™¾rE»¾g‡a?b°™¾rE»¾g‡a?b°™¾rE»¾g‡a?b°™¾rE»¾g‡a?zy¿Fr=¿8ø“¾zy¿Fr=¿8ø“¾zy¿Fr=¿8ø“¾zy¿Fr=¿8ø“¾Äh=¾»Ëf¾màt?Äh=¾»Ëf¾màt?Äh=¾»Ëf¾màt?Äh=¾»Ëf¾màt?O¡!¿dòD¿¶ÈǽO¡!¿dòD¿¶ÈǽO¡!¿dòD¿¶ÈǽO¡!¿dòD¿¶Èǽ/Ž™¾¤¿gE?/Ž™¾¤¿gE?/Ž™¾¤¿gE?/Ž™¾¤¿gE?bÕ¾mSG¿3sð¾bÕ¾mSG¿3sð¾bÕ¾mSG¿3sð¾bÕ¾mSG¿3sð¾gd¾ù§Õ¾d‡a?gd¾ù§Õ¾d‡a?gd¾ù§Õ¾d‡a?gd¾ù§Õ¾d‡a?Sç¾D#X¿7ø“¾Sç¾D#X¿7ø“¾Sç¾D#X¿7ø“¾Sç¾D#X¿7ø“¾y¾ ¾¨ƒ¾màt?y¾ ¾¨ƒ¾màt?y¾ ¾¨ƒ¾màt?y¾ ¾¨ƒ¾màt?/4ð¾ñ±`¿ËÈǽ/4ð¾ñ±`¿ËÈǽ/4ð¾ñ±`¿ËÈǽ/4ð¾ñ±`¿ËÈǽ14ð¾ñ±`¿ËÈÇ=14ð¾ñ±`¿ËÈÇ=14ð¾ñ±`¿ËÈÇ=14ð¾ñ±`¿ËÈÇ=y¾ ¾¨ƒ¾kàt¿y¾ ¾¨ƒ¾kàt¿y¾ ¾¨ƒ¾kàt¿y¾ ¾¨ƒ¾kàt¿Qç¾D#X¿>ø“>Qç¾D#X¿>ø“>Qç¾D#X¿>ø“>Qç¾D#X¿>ø“>Ngd¾î§Õ¾b‡a¿Ngd¾î§Õ¾b‡a¿Ngd¾î§Õ¾b‡a¿Ngd¾î§Õ¾b‡a¿fÕ¾nSG¿+sð>fÕ¾nSG¿+sð>fÕ¾nSG¿+sð>fÕ¾nSG¿+sð>5Ž™¾¤¿gE¿5Ž™¾¤¿gE¿5Ž™¾¤¿gE¿5Ž™¾¤¿gE¿‚ÌÜ.¿™ï!?‚ÌÜ.¿™ï!?‚ÌÜ.¿™ï!?‚ÌÜ.¿™ï!?{ËÜ.¿šï!¿{ËÜ.¿šï!¿{ËÜ.¿šï!¿{ËÜ.¿šï!¿­W­½ێ¾jàt¿­W­½ێ¾jàt¿­W­½ێ¾jàt¿­W­½ێ¾jàt¿˜HŽ¾í…j¿2ø“>˜HŽ¾í…j¿2ø“>˜HŽ¾í…j¿2ø“>˜HŽ¾í…j¿2ø“>^¦ ¾‹Ôç¾f‡a¿^¦ ¾‹Ôç¾f‡a¿^¦ ¾‹Ôç¾f‡a¿^¦ ¾‹Ôç¾f‡a¿V7ƒ¾ùGX¿0sð>V7ƒ¾ùGX¿0sð>V7ƒ¾ùGX¿0sð>V7ƒ¾ùGX¿0sð>:=¾Ü¿cE¿:=¾Ü¿cE¿:=¾Ü¿cE¿:=¾Ü¿cE¿_9f¾ ¼=¿—ï!?_9f¾ ¼=¿—ï!?_9f¾ ¼=¿—ï!?_9f¾ ¼=¿—ï!?_9f¾ ¼=¿—ï!¿_9f¾ ¼=¿—ï!¿_9f¾ ¼=¿—ï!¿_9f¾ ¼=¿—ï!¿0=¾Ü¿iE?0=¾Ü¿iE?0=¾Ü¿iE?0=¾Ü¿iE?U7ƒ¾øGX¿3sð¾U7ƒ¾øGX¿3sð¾U7ƒ¾øGX¿3sð¾U7ƒ¾øGX¿3sð¾_¦ ¾“Ôç¾d‡a?_¦ ¾“Ôç¾d‡a?_¦ ¾“Ôç¾d‡a?_¦ ¾“Ôç¾d‡a?™HŽ¾í…j¿2ø“¾™HŽ¾í…j¿2ø“¾™HŽ¾í…j¿2ø“¾™HŽ¾í…j¿2ø“¾W­½ ێ¾màt?W­½ ێ¾màt?W­½ ێ¾màt?W­½ ێ¾màt?·ê“¾ìÎs¿&Éǽ·ê“¾ìÎs¿&Éǽ·ê“¾ìÎs¿&Éǽ·ê“¾ìÎs¿&Éǽ·ê“¾ìÎs¿&ÉÇ=·ê“¾ìÎs¿&ÉÇ=·ê“¾ìÎs¿&ÉÇ=·ê“¾ìÎs¿&ÉÇ=£9±½Äì`¿-sð¾£9±½Äì`¿-sð¾£9±½Äì`¿-sð¾£9±½Äì`¿-sð¾ó÷=½rñ¾b‡a?ó÷=½rñ¾b‡a?ó÷=½rñ¾b‡a?ó÷=½rñ¾b‡a??,À½Xås¿Bø“¾?,À½Xås¿Bø“¾?,À½Xås¿Bø“¾?,À½Xås¿Bø“¾þ꼟”¾oàt?þ꼟”¾oàt?þ꼟”¾oàt?þ꼟”¾oàt?ãÇǽ]}¿ÇÈǽãÇǽ]}¿ÇÈǽãÇǽ]}¿ÇÈǽãÇǽ]}¿ÇÈǽãÇǽ]}¿ÇÈÇ=ãÇǽ]}¿ÇÈÇ=ãÇǽ]}¿ÇÈÇ=ãÇǽ]}¿ÇÈÇ=ýê¼®”¾kàt¿ýê¼®”¾kàt¿ýê¼®”¾kàt¿ýê¼®”¾kàt¿G,À½Xås¿Bø“>G,À½Xås¿Bø“>G,À½Xås¿Bø“>G,À½Xås¿Bø“>÷=½kñ¾g‡a¿÷=½kñ¾g‡a¿÷=½kñ¾g‡a¿÷=½kñ¾g‡a¿«9±½Çì`¿#sð>«9±½Çì`¿#sð>«9±½Çì`¿#sð>«9±½Çì`¿#sð>úm½±"¿iE¿úm½±"¿iE¿úm½±"¿iE¿úm½±"¿iE¿l,À=Xås¿<ø“>l,À=Xås¿<ø“>l,À=Xås¿<ø“>÷==fñ¾i‡a¿÷==fñ¾i‡a¿÷==fñ¾i‡a¿÷==fñ¾i‡a¿Â9±=Âì`¿4sð>Â9±=Âì`¿4sð>Â9±=Âì`¿4sð>Â9±=Âì`¿4sð>n=¶"¿aE¿n=¶"¿aE¿n=¶"¿aE¿n=¶"¿aE¿ƒy›=ÞQE¿ï!?ƒy›=ÞQE¿ï!?ƒy›=ÞQE¿ï!?ƒy›=ÞQE¿ï!?ƒy›=ÞQE¿ï!¿ƒy›=ÞQE¿ï!¿ƒy›=ÞQE¿ï!¿ƒy›=ÞQE¿ï!¿An=®"¿iE?An=®"¿iE?An=®"¿iE?An=®"¿iE?¾9±=¿ì`¿Asð¾¾9±=¿ì`¿Asð¾¾9±=¿ì`¿Asð¾¾9±=¿ì`¿Asð¾÷==wñ¾b‡a?÷==wñ¾b‡a?÷==wñ¾b‡a?÷==wñ¾b‡a?l,À=Xås¿<ø“¾l,À=Xås¿<ø“¾l,À=Xås¿<ø“¾l,À=Xås¿<ø“¾Óê<”¾oàt?Óê<”¾oàt?Óê<”¾oàt?Óê<”¾oàt?6ÈÇ=[}¿ÕÈǽ6ÈÇ=[}¿ÕÈǽ6ÈÇ=[}¿ÕÈǽ6ÈÇ=[}¿ÕÈǽ4ÈÇ=[}¿ÕÈÇ=4ÈÇ=[}¿ÕÈÇ=4ÈÇ=[}¿ÕÈÇ=4ÈÇ=[}¿ÕÈÇ=Îê<«”¾kàt¿Îê<«”¾kàt¿Îê<«”¾kàt¿Îê<«”¾kàt¿^¦ >ŽÔç¾d‡a?^¦ >ŽÔç¾d‡a?^¦ >ŽÔç¾d‡a?^¦ >ŽÔç¾d‡a?ŸHŽ>ï…j¿#ø“¾ŸHŽ>ï…j¿#ø“¾ŸHŽ>ï…j¿#ø“¾ŸHŽ>ï…j¿#ø“¾W­= ێ¾màt?W­= ێ¾màt?W­= ێ¾màt?W­= ێ¾màt?Âê“>ìÎs¿ ÉǽÂê“>ìÎs¿ ÉǽÂê“>ìÎs¿ ÉǽÂê“>ìÎs¿ ÉǽÂê“>ìÎs¿ ÉÇ=Âê“>ìÎs¿ ÉÇ=Âê“>ìÎs¿ ÉÇ=Âê“>ìÎs¿ ÉÇ=W­=ێ¾kàt¿W­=ێ¾kàt¿W­=ێ¾kàt¿W­=ێ¾kàt¿ŸHŽ>ï…j¿#ø“>ŸHŽ>ï…j¿#ø“>ŸHŽ>ï…j¿#ø“>ŸHŽ>ï…j¿#ø“>\¦ >ŠÔç¾g‡a¿\¦ >ŠÔç¾g‡a¿\¦ >ŠÔç¾g‡a¿\¦ >ŠÔç¾g‡a¿h7ƒ>ôGX¿;sð>h7ƒ>ôGX¿;sð>h7ƒ>ôGX¿;sð>h7ƒ>ôGX¿;sð>:=>Ü¿eE¿:=>Ü¿eE¿:=>Ü¿eE¿:=>Ü¿eE¿u9f> ¼=¿–ï!?u9f> ¼=¿–ï!?u9f> ¼=¿–ï!?u9f> ¼=¿–ï!?u9f> ¼=¿–ï!¿u9f> ¼=¿–ï!¿u9f> ¼=¿–ï!¿u9f> ¼=¿–ï!¿G=>Ü¿gE?G=>Ü¿gE?G=>Ü¿gE?G=>Ü¿gE?e7ƒ>ïGX¿Msð¾e7ƒ>ïGX¿Msð¾e7ƒ>ïGX¿Msð¾e7ƒ>ïGX¿Msð¾Hgd>å§Õ¾g‡a¿Hgd>å§Õ¾g‡a¿Hgd>å§Õ¾g‡a¿Hgd>å§Õ¾g‡a¿rÕ>cSG¿Csð>rÕ>cSG¿Csð>rÕ>cSG¿Csð>rÕ>cSG¿Csð>EŽ™>"¤¿cE¿EŽ™>"¤¿cE¿EŽ™>"¤¿cE¿EŽ™>"¤¿cE¿žîº>ÒÜ.¿‹ï!?žîº>ÒÜ.¿‹ï!?žîº>ÒÜ.¿‹ï!?žîº>ÒÜ.¿‹ï!?žîº>ÒÜ.¿‹ï!¿žîº>ÒÜ.¿‹ï!¿žîº>ÒÜ.¿‹ï!¿žîº>ÒÜ.¿‹ï!¿3Ž™>¤¿iE?3Ž™>¤¿iE?3Ž™>¤¿iE?3Ž™>¤¿iE?lÕ>`SG¿Tsð¾lÕ>`SG¿Tsð¾lÕ>`SG¿Tsð¾lÕ>`SG¿Tsð¾…gd>ï§Õ¾a‡a?…gd>ï§Õ¾a‡a?…gd>ï§Õ¾a‡a?…gd>ï§Õ¾a‡a?bç>D#X¿&ø“¾bç>D#X¿&ø“¾bç>D#X¿&ø“¾bç>D#X¿&ø“¾×¾ > ¨ƒ¾kàt?×¾ > ¨ƒ¾kàt?×¾ > ¨ƒ¾kàt?×¾ > ¨ƒ¾kàt??4ð>ì±`¿ Éǽ?4ð>ì±`¿ Éǽ?4ð>ì±`¿ Éǽ?4ð>ì±`¿ Éǽ?4ð>ì±`¿ ÉÇ=?4ð>ì±`¿ ÉÇ=?4ð>ì±`¿ ÉÇ=?4ð>ì±`¿ ÉÇ=Ö¾ >¨ƒ¾hàt¿Ö¾ >¨ƒ¾hàt¿Ö¾ >¨ƒ¾hàt¿Ö¾ >¨ƒ¾hàt¿]ç>D#X¿$ø“>]ç>D#X¿$ø“>]ç>D#X¿$ø“>]ç>D#X¿$ø“>„y?>r=¿.ø“¾„y?>r=¿.ø“¾„y?>r=¿.ø“¾„y?>r=¿.ø“¾Ëh=>½Ëf¾màt?Ëh=>½Ëf¾màt?Ëh=>½Ëf¾màt?Ëh=>½Ëf¾màt?S¡!?`òD¿ãÈǽS¡!?`òD¿ãÈǽS¡!?`òD¿ãÈǽS¡!?`òD¿ãÈǽS¡!?`òD¿ãÈÇ=S¡!?`òD¿ãÈÇ=S¡!?`òD¿ãÈÇ=S¡!?`òD¿ãÈÇ=Èh=>ØËf¾kàt¿Èh=>ØËf¾kàt¿Èh=>ØËf¾kàt¿Èh=>ØËf¾kàt¿ƒy?=r=¿3ø“>ƒy?=r=¿3ø“>ƒy?=r=¿3ø“>ƒy?=r=¿3ø“>u°™>^E»¾i‡a¿u°™>^E»¾i‡a¿u°™>^E»¾i‡a¿u°™>^E»¾i‡a¿™a?âµ.¿=sð>™a?âµ.¿=sð>™a?âµ.¿=sð>™a?âµ.¿=sð>§¦Î>Îû¾cE¿§¦Î>Îû¾cE¿§¦Î>Îû¾cE¿§¦Î>Îû¾cE¿t‘û>®D¿ï!?t‘û>®D¿ï!?t‘û>®D¿ï!?t‘û>®D¿ï!?t‘û>®D¿ï!¿t‘û>®D¿ï!¿t‘û>®D¿ï!¿t‘û>®D¿ï!¿ ¦Î>Îû¾kE? ¦Î>Îû¾kE? ¦Î>Îû¾kE? ¦Î>Îû¾kE?˜a?àµ.¿Fsð¾˜a?àµ.¿Fsð¾˜a?àµ.¿Fsð¾˜a?àµ.¿Fsð¾o°™>gE»¾g‡a?o°™>gE»¾g‡a?o°™>gE»¾g‡a?o°™>gE»¾g‡a?âµ.?˜a¿Asð>âµ.?˜a¿Asð>âµ.?˜a¿Asð>âµ.?˜a¿Asð>Îû>ž¦Î¾iE¿Îû>ž¦Î¾iE¿Îû>ž¦Î¾iE¿Îû>ž¦Î¾iE¿¯D?n‘û¾’ï!?¯D?n‘û¾’ï!?¯D?n‘û¾’ï!?¯D?n‘û¾’ï!?­D?j‘û¾”ï!¿­D?j‘û¾”ï!¿­D?j‘û¾”ï!¿­D?j‘û¾”ï!¿Îû>—¦Î¾jE?Îû>—¦Î¾jE?Îû>—¦Î¾jE?Îû>—¦Î¾jE?áµ.?‘a¿Ssð¾áµ.?‘a¿Ssð¾áµ.?‘a¿Ssð¾áµ.?‘a¿Ssð¾rE»>€°™¾b‡a?rE»>€°™¾b‡a?rE»>€°™¾b‡a?rE»>€°™¾b‡a?Cr=?y¿$ø“¾Cr=?y¿$ø“¾Cr=?y¿$ø“¾Cr=?y¿$ø“¾´Ëf>Æh=¾oàt?´Ëf>Æh=¾oàt?´Ëf>Æh=¾oàt?´Ëf>Æh=¾oàt?fòD?K¡!¿úÈǽfòD?K¡!¿úÈǽfòD?K¡!¿úÈǽfòD?K¡!¿úÈǽfòD?K¡!¿úÈÇ=fòD?K¡!¿úÈÇ=fòD?K¡!¿úÈÇ=fòD?K¡!¿úÈÇ=µËf>Óh=¾màt¿µËf>Óh=¾màt¿µËf>Óh=¾màt¿µËf>Óh=¾màt¿Er=?€y¿!ø“>Er=?€y¿!ø“>Er=?€y¿!ø“>Er=?€y¿!ø“>kE»>s°™¾f‡a¿kE»>s°™¾f‡a¿kE»>s°™¾f‡a¿kE»>s°™¾f‡a¿ø§ƒ>a¾ ¾qàt?ø§ƒ>a¾ ¾qàt?ø§ƒ>a¾ ¾qàt?ø§ƒ>a¾ ¾qàt?ò±`?'4ð¾ñÈǽò±`?'4ð¾ñÈǽò±`?'4ð¾ñÈǽò±`?'4ð¾ñÈǽò±`?'4ð¾ñÈÇ=ò±`?'4ð¾ñÈÇ=ò±`?'4ð¾ñÈÇ=ò±`?'4ð¾ñÈÇ="¨ƒ>n¾ ¾kàt¿"¨ƒ>n¾ ¾kàt¿"¨ƒ>n¾ ¾kàt¿"¨ƒ>n¾ ¾kàt¿I#X?\ç¾ø“>I#X?\ç¾ø“>I#X?\ç¾ø“>I#X?\ç¾ø“>ñ§Õ>gd¾g‡a¿ñ§Õ>gd¾g‡a¿ñ§Õ>gd¾g‡a¿ñ§Õ>gd¾g‡a¿fSG?eÕ¾Esð>fSG?eÕ¾Esð>fSG?eÕ¾Esð>fSG?eÕ¾Esð>¤?5Ž™¾gE¿¤?5Ž™¾gE¿¤?5Ž™¾gE¿¤?5Ž™¾gE¿ÏÜ.?•îº¾ï!?ÏÜ.?•îº¾ï!?ÏÜ.?•îº¾ï!?ÏÜ.?•îº¾ï!?ÑÜ.?•îº¾ï!¿ÑÜ.?•îº¾ï!¿ÑÜ.?•îº¾ï!¿ÑÜ.?•îº¾ï!¿¤?CŽ™¾fE?¤?CŽ™¾fE?¤?CŽ™¾fE?¤?CŽ™¾fE?bSG?kÕ¾Msð¾bSG?kÕ¾Msð¾bSG?kÕ¾Msð¾bSG?kÕ¾Msð¾ú§Õ>gd¾d‡a?ú§Õ>gd¾d‡a?ú§Õ>gd¾d‡a?ú§Õ>gd¾d‡a?I#X?\ç¾ø“¾I#X?\ç¾ø“¾I#X?\ç¾ø“¾I#X?\ç¾ø“¾ª¼=?Z9f¾Žï!?ª¼=?Z9f¾Žï!?ª¼=?Z9f¾Žï!?ª¼=?Z9f¾Žï!?ª¼=?Z9f¾Žï!¿ª¼=?Z9f¾Žï!¿ª¼=?Z9f¾Žï!¿ª¼=?Z9f¾Žï!¿ Ü?=¾oE? Ü?=¾oE? Ü?=¾oE? Ü?=¾oE?ïGX?U7ƒ¾Tsð¾ïGX?U7ƒ¾Tsð¾ïGX?U7ƒ¾Tsð¾ïGX?U7ƒ¾Tsð¾œÔç>k¦ ¾b‡a?œÔç>k¦ ¾b‡a?œÔç>k¦ ¾b‡a?œÔç>k¦ ¾b‡a?ð…j?•HŽ¾ø“¾ð…j?•HŽ¾ø“¾ð…j?•HŽ¾ø“¾ð…j?•HŽ¾ø“¾ێ>½V­½màt?ێ>½V­½màt?ێ>½V­½màt?ێ>½V­½màt?îÎs?²ê“¾ñÈǽîÎs?²ê“¾ñÈǽîÎs?²ê“¾ñÈǽîÎs?²ê“¾ñÈǽîÎs?²ê“¾îÈÇ=îÎs?²ê“¾îÈÇ=îÎs?²ê“¾îÈÇ=îÎs?²ê“¾îÈÇ=&ێ>çV­½jàt¿&ێ>çV­½jàt¿&ێ>çV­½jàt¿&ێ>çV­½jàt¿ð…j?˜HŽ¾ø“>ð…j?˜HŽ¾ø“>ð…j?˜HŽ¾ø“>ð…j?˜HŽ¾ø“>‹Ôç>[¦ ¾f‡a¿‹Ôç>[¦ ¾f‡a¿‹Ôç>[¦ ¾f‡a¿‹Ôç>[¦ ¾f‡a¿òGX?^7ƒ¾Fsð>òGX?^7ƒ¾Fsð>òGX?^7ƒ¾Fsð>òGX?^7ƒ¾Fsð>Ü?6=¾iE¿Ü?6=¾iE¿Ü?6=¾iE¿Ü?6=¾iE¿]}?öÇǽÝÈÇ=]}?öÇǽÝÈÇ=]}?öÇǽÝÈÇ=]}?öÇǽÝÈÇ=°”>Ýê¼kàt¿°”>Ýê¼kàt¿°”>Ýê¼kàt¿°”>Ýê¼kàt¿]ås?D,À½ø“>]ås?D,À½ø“>]ås?D,À½ø“>]ås?D,À½ø“>hñ>÷=½g‡a¿hñ>÷=½g‡a¿hñ>÷=½g‡a¿hñ>÷=½g‡a¿¿ì`?”9±½Asð>¿ì`?”9±½Asð>¿ì`?”9±½Asð>¿ì`?”9±½Asð>®"?úm½iE¿®"?úm½iE¿®"?úm½iE¿®"?úm½iE¿âQE?Cy›½ï!?âQE?Cy›½ï!?âQE?Cy›½ï!?âQE?Cy›½ï!?âQE?Cy›½ï!¿âQE?Cy›½ï!¿âQE?Cy›½ï!¿âQE?Cy›½ï!¿¬"?žm½lE?¬"?žm½lE?¬"?žm½lE?¬"?žm½lE?¼ì`?ž9±½Msð¾¼ì`?ž9±½Msð¾¼ì`?ž9±½Msð¾¼ì`?ž9±½Msð¾nñ>÷=½f‡a?nñ>÷=½f‡a?nñ>÷=½f‡a?nñ>÷=½f‡a?_ås?C,À½ø“¾_ås?C,À½ø“¾_ås?C,À½ø“¾_ås?C,À½ø“¾ ”>“ê¼màt? ”>“ê¼màt? ”>“ê¼màt? ”>“ê¼màt?]}?ùÇǽáÈǽ]}?ùÇǽáÈǽ]}?ùÇǽáÈǽ]}?ùÇǽáÈǽáQE?Šy›=Žï!¿áQE?Šy›=Žï!¿áQE?Šy›=Žï!¿áQE?Šy›=Žï!¿®"?ëm=iE?®"?ëm=iE?®"?ëm=iE?®"?ëm=iE?¼ì`?ž9±=Msð¾¼ì`?ž9±=Msð¾¼ì`?ž9±=Msð¾¼ì`?ž9±=Msð¾nñ>Q÷==f‡a?nñ>Q÷==f‡a?nñ>Q÷==f‡a?nñ>Q÷==f‡a?]ås?°,À=ø“¾]ås?°,À=ø“¾]ås?°,À=ø“¾]ås?°,À=ø“¾©”>’ê’ê’ê’êáêáêáêáê]ås?°,À=ø“>]ås?°,À=ø“>]ås?°,À=ø“>fñ>P÷==g‡a¿fñ>P÷==g‡a¿fñ>P÷==g‡a¿fñ>P÷==g‡a¿¾ì`?Ò9±=Csð>¾ì`?Ò9±=Csð>¾ì`?Ò9±=Csð>¾ì`?Ò9±=Csð>²"?En=eE¿²"?En=eE¿²"?En=eE¿²"?En=eE¿áQE?Šy›=Žï!?áQE?Šy›=Žï!?áQE?Šy›=Žï!?áQE?Šy›=Žï!?ìÎs?Áê“>ÞÈÇ=ìÎs?Áê“>ÞÈÇ=ìÎs?Áê“>ÞÈÇ=ìÎs?Áê“>ÞÈÇ=ێ>þV­=màt¿ێ>þV­=màt¿ێ>þV­=màt¿ێ>þV­=màt¿ð…j?™HŽ>ø“>ð…j?™HŽ>ø“>ð…j?™HŽ>ø“>ð…j?™HŽ>ø“>ƒÔç>b¦ >i‡a¿ƒÔç>b¦ >i‡a¿ƒÔç>b¦ >i‡a¿ƒÔç>b¦ >i‡a¿ñGX?a7ƒ>Hsð>ñGX?a7ƒ>Hsð>ñGX?a7ƒ>Hsð>ñGX?a7ƒ>Hsð>Ü?E=>iE¿Ü?E=>iE¿Ü?E=>iE¿Ü?E=>iE¿¨¼=?€9f>ï!?¨¼=?€9f>ï!?¨¼=?€9f>ï!?¨¼=?€9f>ï!?¨¼=?€9f>ï!¿¨¼=?€9f>ï!¿¨¼=?€9f>ï!¿¨¼=?€9f>ï!¿ Ü?-=>mE? Ü?-=>mE? Ü?-=>mE? Ü?-=>mE?ïGX?e7ƒ>Osð¾ïGX?e7ƒ>Osð¾ïGX?e7ƒ>Osð¾ïGX?e7ƒ>Osð¾–Ôç>n¦ >b‡a?–Ôç>n¦ >b‡a?–Ôç>n¦ >b‡a?–Ôç>n¦ >b‡a?ð…j?šHŽ>ø“¾ð…j?šHŽ>ø“¾ð…j?šHŽ>ø“¾ð…j?šHŽ>ø“¾ێ>ÔV­=màt?ێ>ÔV­=màt?ێ>ÔV­=màt?ێ>ÔV­=màt?ìÎs?Áê“>âÈǽìÎs?Áê“>âÈǽìÎs?Áê“>âÈǽìÎs?Áê“>âÈǽ¤?AŽ™>jE?¤?AŽ™>jE?¤?AŽ™>jE?¤?AŽ™>jE?`SG?oÕ>Rsð¾`SG?oÕ>Rsð¾`SG?oÕ>Rsð¾`SG?oÕ>Rsð¾ô§Õ>Egd>b‡a?ô§Õ>Egd>b‡a?ô§Õ>Egd>b‡a?ô§Õ>Egd>b‡a?D#X?iç>ø“¾D#X?iç>ø“¾D#X?iç>ø“¾D#X?iç>ø“¾¨ƒ>s¾ >màt?¨ƒ>s¾ >màt?¨ƒ>s¾ >màt?¨ƒ>s¾ >màt?é±`?M4ð>ÑÈǽé±`?M4ð>ÑÈǽé±`?M4ð>ÑÈǽé±`?M4ð>ÑÈǽé±`?K4ð>ÎÈÇ=é±`?K4ð>ÎÈÇ=é±`?K4ð>ÎÈÇ=é±`?K4ð>ÎÈÇ=#¨ƒ>|¾ >kàt¿#¨ƒ>|¾ >kàt¿#¨ƒ>|¾ >kàt¿#¨ƒ>|¾ >kàt¿D#X?kç>ø“>D#X?kç>ø“>D#X?kç>ø“>D#X?kç>ø“>Ó§Õ>?gd>l‡a¿Ó§Õ>?gd>l‡a¿Ó§Õ>?gd>l‡a¿Ó§Õ>?gd>l‡a¿bSG?rÕ>Gsð>bSG?rÕ>Gsð>bSG?rÕ>Gsð>bSG?rÕ>Gsð>¤?3Ž™>gE¿¤?3Ž™>gE¿¤?3Ž™>gE¿¤?3Ž™>gE¿ÒÜ.?îº>Šï!?ÒÜ.?îº>Šï!?ÒÜ.?îº>Šï!?ÒÜ.?îº>Šï!?ÒÜ.?îº>‹ï!¿ÒÜ.?îº>‹ï!¿ÒÜ.?îº>‹ï!¿ÒÜ.?îº>‹ï!¿ºËf>âh=>màt¿ºËf>âh=>màt¿ºËf>âh=>màt¿ºËf>âh=>màt¿Fr=?‚y?ø“>Fr=?‚y?ø“>Fr=?‚y?ø“>Fr=?‚y?ø“>aE»>°™>d‡a¿aE»>°™>d‡a¿aE»>°™>d‡a¿aE»>°™>d‡a¿ßµ.?™a?Csð>ßµ.?™a?Csð>ßµ.?™a?Csð>ßµ.?™a?Csð>ñÍû>¢¦Î>qE¿ñÍû>¢¦Î>qE¿ñÍû>¢¦Î>qE¿ñÍû>¢¦Î>qE¿³D?{‘û>Šï!?³D?{‘û>Šï!?³D?{‘û>Šï!?³D?{‘û>Šï!?³D?{‘û>Šï!¿³D?{‘û>Šï!¿³D?{‘û>Šï!¿³D?{‘û>Šï!¿Îû>›¦Î>oE?Îû>›¦Î>oE?Îû>›¦Î>oE?Îû>›¦Î>oE?ݵ.?–a?Osð¾Ýµ.?–a?Osð¾Ýµ.?–a?Osð¾Ýµ.?–a?Osð¾jE»>‚°™>b‡a?jE»>‚°™>b‡a?jE»>‚°™>b‡a?jE»>‚°™>b‡a?Fr=?‚y?ø“¾Fr=?‚y?ø“¾Fr=?‚y?ø“¾Fr=?‚y?ø“¾ëËf>Âh=>kàt?ëËf>Âh=>kàt?ëËf>Âh=>kàt?ëËf>Âh=>kàt?aòD?R¡!?ÇÈǽaòD?R¡!?ÇÈǽaòD?R¡!?ÇÈǽaòD?R¡!?ÇÈǽaòD?R¡!?ÇÈÇ=aòD?R¡!?ÇÈÇ=aòD?R¡!?ÇÈÇ=aòD?R¡!?ÇÈÇ=a?ãµ.?Osð¾a?ãµ.?Osð¾a?ãµ.?Osð¾a?ãµ.?Osð¾}°™>jE»>b‡a?}°™>jE»>b‡a?}°™>jE»>b‡a?}°™>jE»>b‡a?|y?Nr=?ø“¾|y?Nr=?ø“¾|y?Nr=?ø“¾|y?Nr=?ø“¾Îh=>ÃËf>màt?Îh=>ÃËf>màt?Îh=>ÃËf>màt?Îh=>ÃËf>màt?G¡!?jòD?ÈÈǽG¡!?jòD?ÈÈǽG¡!?jòD?ÈÈǽG¡!?jòD?ÈÈǽG¡!?jòD?ÈÈÇ=G¡!?jòD?ÈÈÇ=G¡!?jòD?ÈÈÇ=G¡!?jòD?ÈÈÇ=Óh=>ÙËf>kàt¿Óh=>ÙËf>kàt¿Óh=>ÙËf>kàt¿Óh=>ÙËf>kàt¿{y?Mr=? ø“>{y?Mr=? ø“>{y?Mr=? ø“>{y?Mr=? ø“>}°™>dE»>f‡a¿}°™>dE»>f‡a¿}°™>dE»>f‡a¿}°™>dE»>f‡a¿’a?æµ.?Bsð>’a?æµ.?Bsð>’a?æµ.?Bsð>’a?æµ.?Bsð>¥¦Î> Îû>gE¿¥¦Î> Îû>gE¿¥¦Î> Îû>gE¿¥¦Î> Îû>gE¿m‘û>µD?Šï!?m‘û>µD?Šï!?m‘û>µD?Šï!?m‘û>µD?Šï!?i‘û>¶D?‹ï!¿i‘û>¶D?‹ï!¿i‘û>¶D?‹ï!¿i‘û>¶D?‹ï!¿™¦Î> Îû>lE?™¦Î> Îû>lE?™¦Î> Îû>lE?™¦Î> Îû>lE?Zç>L#X?ø“>Zç>L#X?ø“>Zç>L#X?ø“>Zç>L#X?ø“>"gd>í§Õ>g‡a¿"gd>í§Õ>g‡a¿"gd>í§Õ>g‡a¿"gd>í§Õ>g‡a¿`Õ>bSG?Ssð>`Õ>bSG?Ssð>`Õ>bSG?Ssð>`Õ>bSG?Ssð>7Ž™>¤?jE¿7Ž™>¤?jE¿7Ž™>¤?jE¿7Ž™>¤?jE¿—îº>ØÜ.?Šï!?—îº>ØÜ.?Šï!?—îº>ØÜ.?Šï!?—îº>ØÜ.?Šï!?•îº>ÖÜ.?‹ï!¿•îº>ÖÜ.?‹ï!¿•îº>ÖÜ.?‹ï!¿•îº>ÖÜ.?‹ï!¿/Ž™>¤?kE?/Ž™>¤?kE?/Ž™>¤?kE?/Ž™>¤?kE?YÕ>cSG?Wsð¾YÕ>cSG?Wsð¾YÕ>cSG?Wsð¾YÕ>cSG?Wsð¾ gd>ú§Õ>d‡a? gd>ú§Õ>d‡a? gd>ú§Õ>d‡a? gd>ú§Õ>d‡a?]ç>L#X?ø“¾]ç>L#X?ø“¾]ç>L#X?ø“¾]ç>L#X?ø“¾‚¾ >¨ƒ>màt?‚¾ >¨ƒ>màt?‚¾ >¨ƒ>màt?‚¾ >¨ƒ>màt?/4ð>ñ±`?»Èǽ/4ð>ñ±`?»Èǽ/4ð>ñ±`?»Èǽ/4ð>ñ±`?»Èǽ/4ð>ñ±`?»ÈÇ=/4ð>ñ±`?»ÈÇ=/4ð>ñ±`?»ÈÇ=/4ð>ñ±`?»ÈÇ=ܾ >#¨ƒ>hàt¿Ü¾ >#¨ƒ>hàt¿Ü¾ >#¨ƒ>hàt¿Ü¾ >#¨ƒ>hàt¿f¦ >œÔç>b‡a?f¦ >œÔç>b‡a?f¦ >œÔç>b‡a?f¦ >œÔç>b‡a?œHŽ>ô…j?ø“¾œHŽ>ô…j?ø“¾œHŽ>ô…j?ø“¾œHŽ>ô…j?ø“¾W­=ێ>màt?W­=ێ>màt?W­=ێ>màt?W­=ێ>màt?­ê“>ðÎs?¶Èǽ­ê“>ðÎs?¶Èǽ­ê“>ðÎs?¶Èǽ­ê“>ðÎs?¶Èǽ®ê“>ðÎs?µÈÇ=®ê“>ðÎs?µÈÇ=®ê“>ðÎs?µÈÇ=®ê“>ðÎs?µÈÇ= W­=ێ>jàt¿ W­=ێ>jàt¿ W­=ێ>jàt¿ W­=ێ>jàt¿œHŽ>ô…j?ø“>œHŽ>ô…j?ø“>œHŽ>ô…j?ø“>œHŽ>ô…j?ø“>,¦ >“Ôç>f‡a¿,¦ >“Ôç>f‡a¿,¦ >“Ôç>f‡a¿,¦ >“Ôç>f‡a¿X7ƒ>ñGX?Jsð>X7ƒ>ñGX?Jsð>X7ƒ>ñGX?Jsð>X7ƒ>ñGX?Jsð>1=> Ü?lE¿1=> Ü?lE¿1=> Ü?lE¿1=> Ü?lE¿e9f>°¼=?†ï!?e9f>°¼=?†ï!?e9f>°¼=?†ï!?e9f>°¼=?†ï!?e9f>°¼=?†ï!¿e9f>°¼=?†ï!¿e9f>°¼=?†ï!¿e9f>°¼=?†ï!¿)=> Ü?oE?)=> Ü?oE?)=> Ü?oE?)=> Ü?oE?W7ƒ>íGX?]sð¾W7ƒ>íGX?]sð¾W7ƒ>íGX?]sð¾W7ƒ>íGX?]sð¾‰9±=¿ì`?Dsð>‰9±=¿ì`?Dsð>‰9±=¿ì`?Dsð>‰9±=¿ì`?Dsð>Nm=ª"?mE¿Nm=ª"?mE¿Nm=ª"?mE¿Nm=ª"?mE¿Hy›=çQE?ˆï!?Hy›=çQE?ˆï!?Hy›=çQE?ˆï!?Hy›=çQE?ˆï!?Hy›=çQE?ˆï!¿Hy›=çQE?ˆï!¿Hy›=çQE?ˆï!¿Hy›=çQE?ˆï!¿šm=©"?oE?šm=©"?oE?šm=©"?oE?šm=©"?oE?9±=¼ì`?Msð¾9±=¼ì`?Msð¾9±=¼ì`?Msð¾9±=¼ì`?Msð¾"÷==}ñ>b‡a?"÷==}ñ>b‡a?"÷==}ñ>b‡a?"÷==}ñ>b‡a?2,À=aås?ø“¾2,À=aås?ø“¾2,À=aås?ø“¾2,À=aås?ø“¾ßê<¢”>màt?ßê<¢”>màt?ßê<¢”>màt?ßê<¢”>màt?ëÇÇ=]}?fÈǽëÇÇ=]}?fÈǽëÇÇ=]}?fÈǽëÇÇ=]}?fÈǽêÇÇ=]}?fÈÇ=êÇÇ=]}?fÈÇ=êÇÇ=]}?fÈÇ=êÇÇ=]}?fÈÇ= +ê<±”>kàt¿ +ê<±”>kàt¿ +ê<±”>kàt¿ +ê<±”>kàt¿=,À=aås?ø“>=,À=aås?ø“>=,À=aås?ø“>=,À=aås?ø“>ý÷==oñ>f‡a¿ý÷==oñ>f‡a¿ý÷==oñ>f‡a¿ý÷==oñ>f‡a¿€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?€?€€?ÑΔ° ¶;]:¼uŽº²;]:¼¶Cºùùu;P^¼²W°ŒËz;P^¼@ ;±T:<› ¶;;ÔºCœ<› ¶;ƒ>캽u<™Ëz;[¼.°K^<™Ëz;u?Ò°a´ç;j´ç»Aдºª@ã;j´ç»uŽº²;]:¼ÑΔ° ¶;]:¼u?Ò°a´ç;j´ç;Aдºª@ã;j´ç;;ÔºCœ<› ¶;@ ;±T:<› ¶;@ ;±T:<› ¶»;ÔºCœ<› ¶»Aдºª@ã;j´ç»u?Ò°a´ç;j´ç»³I©°Ž ¶;]:캽u< Ëz»;ÔºCœ<› ¶»@ ;±T:<› ¶»²W°ŠËz;R^< ¶Cºòùu;R^캽u< Ëz»[¼.°K^< Ëz»Šv&¯Pµÿ:± <›‹Ç¹‹Ëú:± < ¶Cºòùu;R^<²W°ŠËz;R^<@ ;±×#<ì†O°xµÿº± <ì†O°¥Ëúº­šì:± ¼Žº0Ô:± ¼’‹Ç9Ëú:± ¼ +¶C:n>ì:± ¼Pдº4д:± ¼uÍø0N ͱ +×#¼KÔºbŽ:± ¼—>ìºâµC:± ¼¹Ëúº8‹Ç9± ¼uÍø0N ͱ +×#¼‹µÿºfv`±± ¼¸ËúºŒÇ¹± ¼“>ìºP¶Cº± ¼uÍø0N ͱ +×#¼FÔº—Žº± ¼Jдºgдº± ¼yŽºaÔº± ¼uÍø0N ͱ +×#¼¶Cº«>캱 ¼¡‹Ç¹ÎËúº± ¼ +˜ž. µÿº± ¼uÍø0N ͱ +×#¼¥‹Ç9ËËúº± ¼¶C:§>캱 ¼wŽ:\Ôº± ¼uÍø0N ͱ +×#¼Fд:aдº± ¼@Ô:‘Žº± ¼Š>ì:F¶Cº± ¼uÍø0N ͱ +×#¼¬Ëú: +ŒÇ¹± ¼~µÿ:õ8V±± ¼«Ëú:2‹Ç9± ¼uÍø0N ͱ +×#¼‰>ì:صC:± ¼=Ô:YŽ:± ¼Bд:)д:± ¼uÍø0N ͱ +×#¼sŽ:"Ô:± ¼žê_± +×#<›‹Ç¹‹Ëú:± <Šv&¯Pµÿ:± < ¶Cºi>ì:± ì:± <žê_± +×#<@дº&д:± <9ÔºWŽ:± <‚>ìºÕµC:± <žê_± +×#<£Ëúº.‹Ç9± ìº>¶Cº± <7ÔºŒŽº± <=дºYдº± <žê_± +×#캱 <—‹Ç¹¼Ëúº± <žê_± +×#< +U.®Žµÿº± <“‹Ç9»Ëúº± <¶C:—>캱 <žê_± +×#ì:7¶Cº± <™Ëú:ü‹Ç¹± ì:ʵC:± 캽u<™Ëz;¦Ëúº­šì:± ¼ª‹Ç¹ Ëú:± ¼ƒ>캽u<™Ëz;o´g»ŸØ <™Ëz;ýùu»¼u캽u<™Ëz;Aдºª@ã;j´ç»×V1»7Ö;j´ç»¥U » +1¨;]:¼uŽº²;]:¼Aдºª@ã;j´ç;×V1»7Ö;j´ç;b‡P»j·û;› ¶;;ÔºCœ<› ¶;;ÔºCœ<› ¶»b‡P»j·û;› ¶»×V1»7Ö;j´ç»Aдºª@ã;j´ç»tŽº²;]:<¤U » 1¨;]:<×V1»7Ö;j´ç;Aдºª@ã;j´ç;‚>캽u< Ëz»n´g»ŸØ < Ëz»b‡P»j·û;› ¶»;ÔºCœ<› ¶» ¶Cºòùu;R^캽u< Ëz»›‹Ç¹‹Ëú:± < ¶Cºi>ì:± ì:± ì:± ¼o´g»ŸØ <™Ëz;1¨»j·û;™Ëz; ²»AœìºÕµC:± ìºâµC:± ¼KÔºbŽ:± ¼o·û» 1¨;™Ëz;¡Ø ¼d´g;™Ëz;¾u¼éùu;iµÿ:Dœ¼²;iµÿ:¾u¼éùu;uµÿº®š¼€Ëú:uµÿº¿u¼i>ì: Ëz»¡Ø ¼a´g; Ëz»‚>ìºÕµC:± <£Ëúº.‹Ç9± <þùu»×µC:R^ìºâµC:± ¼¡Ø ¼d´g;™Ëz;¿u¼n>ì:™Ëz;®š¼€Ëú:iµÿ:¾u¼éùu;iµÿ:1¨»—U ;]:¼"²»XŽ:]:¼úu»ÙµC:P^¼w´g»Dó¿:P^¼p·û»R‡P;› ¶;Eœ¼Ô:› ¶;¿u¼n>ì:™Ëz;¡Ø ¼d´g;™Ëz;=Ö»ÇV1;j´ç»¯@ã»%д:j´ç»"²»XŽ:]:¼1¨»—U ;]:¼=Ö»ÇV1;j´ç;¯@ã»%д:j´ç;Eœ¼Ô:› ¶;p·û»R‡P;› ¶;p·û»R‡P;› ¶»Eœ¼Ô:› ¶»¯@ã»%д:j´ç»=Ö»ÇV1;j´ç»1¨»”U ;]:ì: Ëz»Eœ¼Ô:› ¶»p·û»R‡P;› ¶»p´g»@ó¿:R^<þùu»×µC:R^ì:™Ëz;¯@ã»%д:j´ç»n´ç»®W[±j´ç»¡ ¶»õ8V±]:¼"²»XŽ:]:¼¯@ã»%д:j´ç;n´ç»®W[±j´ç;_:¼•e±› ¶;Eœ¼Ô:› ¶;Eœ¼Ô:› ¶»_:¼•e±› ¶»n´ç»®W[±j´ç»¯@ã»%д:j´ç»!²»TŽ:]:<ž ¶»×³j±]:ì: Ëz»R^¼\Ÿ<± Ëz»_:¼•e±› ¶»Eœ¼Ô:› ¶»þùu»×µC:R^<¥Ëz»=Q±R^<ž ¶»×³j±]:ì: Ëz»£Ëúº.‹Ç9± ì:™Ëz;R^¼ +ç±™Ëz;± ¼pE‡±iµÿ:®š¼€Ëú:iµÿ:"²»XŽ:]:¼¡ ¶»õ8V±]:¼«Ëz»®W[±P^¼úu»ÙµC:P^¼wµÿº™©S±± <£ËúºŒÇ¹± <ýùu»>¶CºR^<¥Ëz»=Q±R^< ×#¼¸&‚±ì†O° ± ¼—µÿºì†O°­š¼ÁËúºuµÿº± ¼pE‡±uµÿº± ¼pE‡±iµÿ:­š¼ÁËúºiµÿ: ± ¼—µÿºì†O° ×#¼¸&‚±ì†O°«Ëz»®W[±P^¼úu»F¶CºP^¼¸ËúºŒÇ¹± ¼‹µÿºfv`±± ¼R^¼ +ç±™Ëz;¿u¼”>캙Ëz;­š¼ÁËúºiµÿ:± ¼pE‡±iµÿ:¡ ¶»õ8V±]:¼"²»ŽŽº]:¼úu»F¶CºP^¼«Ëz»®W[±P^¼_:¼•e±› ¶;Dœ¼SÔº› ¶;¿u¼”>캙Ëz;R^¼ +ç±™Ëz;n´ç»®W[±j´ç»®@ã»Yдºj´ç»"²»ŽŽº]:¼¡ ¶»õ8V±]:¼n´ç»®W[±j´ç;®@ã»Yдºj´ç;Dœ¼SÔº› ¶;_:¼•e±› ¶;_:¼•e±› ¶»Dœ¼SÔº› ¶»®@ã»Yдºj´ç»n´ç»®W[±j´ç»ž ¶»×³j±]:< ²»Žº]:<®@ã»Yдºj´ç;n´ç»®W[±j´ç;R^¼\Ÿ<± Ëz»¿u¼˜>캠Ëz»Dœ¼SÔº› ¶»_:¼•e±› ¶»¥Ëz»=Q±R^<ýùu»>¶CºR^< ²»Žº]:<ž ¶»×³j±]:<± ¼pE‡±uµÿº­š¼ÁËúºuµÿº¿u¼˜>캠Ëz»R^¼\Ÿ<± Ëz»®@ã»Yдºj´ç»<Ö»áV1»j´ç»1¨»°U »]:¼"²»ŽŽº]:¼®@ã»Yдºj´ç;<Ö»áV1»j´ç;l·û»n‡P»› ¶;Dœ¼SÔº› ¶;Dœ¼SÔº› ¶»l·û»n‡P»› ¶»<Ö»áV1»j´ç»®@ã»Yдºj´ç» ²»Žº]:< 1¨»°U »]:<<Ö»áV1»j´ç;®@ã»Yдºj´ç;¿u¼˜>캠Ëz»¡Ø ¼x´g» Ëz»l·û»n‡P»› ¶»Dœ¼SÔº› ¶»ýùu»>¶CºR^캠Ëz»£ËúºŒÇ¹± <>ìº>¶Cº± ¶CºR^< ± ¼—µÿºì†O°R^¼³Ëz»ì†O°¼u¼úu»uµÿº­š¼ÁËúºuµÿº­š¼ÁËúºiµÿ:¼u¼úu»iµÿ:R^¼³Ëz»ì†O° ± ¼—µÿºì†O°úu»F¶CºP^¼t´g»wó¿ºP^¼“>ìºP¶Cº± ¼¸ËúºŒÇ¹± ¼¿u¼”>캙Ëz;¡Ø ¼u´g»™Ëz;¼u¼úu»iµÿ:­š¼ÁËúºiµÿ:"²»ŽŽº]:¼1¨»°U »]:¼t´g»wó¿ºP^¼úu»F¶CºP^¼Dœ¼SÔº› ¶;l·û»n‡P»› ¶;¡Ø ¼u´g»™Ëz;¿u¼”>캙Ëz;R^¼³Ëz»ì†O°^:¼¥ ¶»ì†O°Bœ¼$²»uµÿº¼u¼úu»uµÿº¼u¼úu»iµÿ:Bœ¼$²»iµÿ:^:¼¥ ¶»ì†O°R^¼³Ëz»ì†O°t´g»wó¿ºP^¼f‡P»²U »P^¼FÔº—Žº± ¼“>ìºP¶Cº± ¼¡Ø ¼u´g»™Ëz;n·û»1¨»™Ëz;Bœ¼$²»iµÿ:¼u¼úu»iµÿ:1¨»°U »]:¼T^—»UHJ»]:¼f‡P»²U »P^¼t´g»wó¿ºP^¼l·û»n‡P»› ¶;ó‰â»Y^—»› ¶;n·û»1¨»™Ëz;¡Ø ¼u´g»™Ëz;<Ö»áV1»j´ç»Ï§À»wº€»j´ç»T^—»UHJ»]:¼1¨»°U »]:¼<Ö»áV1»j´ç;ϧÀ»wº€»j´ç;ó‰â»Y^—»› ¶;l·û»n‡P»› ¶;l·û»n‡P»› ¶»ó‰â»Y^—»› ¶»Ï§À»wº€»j´ç»<Ö»áV1»j´ç» 1¨»°U »]:ìº>¶Cº± <7ÔºŒŽº± <`‡P»¯U »R^캱 캱 ¼yŽºaÔº± ¼1¨»s·û»™Ëz;n´g»£Ø ¼™Ëz;óùu»¿u¼iµÿ:²»Fœ¼iµÿ:GHJ»Y^—»]:¼¢U »1¨»]:¼\ó¿º}´g»P^¼¥U »p‡P»P^¼P^—»ù‰â»› ¶;Y‡P»r·û»› ¶;n´g»£Ø ¼™Ëz;1¨»s·û»™Ëz;pº€»Ô§À»j´ç»ÐV1»@Ö»j´ç»¢U »1¨»]:¼GHJ»Y^—»]:¼pº€»Ô§À»j´ç;ÐV1»@Ö»j´ç;Y‡P»r·û»› ¶;P^—»ù‰â»› ¶;P^—»ù‰â»› ¶»Y‡P»r·û»› ¶»ÐV1»@Ö»j´ç»pº€»Ô§À»j´ç»\ó¿º}´g»P^¼¶Cº úu»P^¼¡‹Ç¹ÎËúº± ¼¶Cº«>캱 ¼n´g»£Ø ¼™Ëz;ƒ>ìºÀu¼™Ëz;—Ëúº¯š¼iµÿ:óùu»¿u¼iµÿ:¢U »1¨»]:¼sŽº&²»]:¼¶Cº úu»P^¼\ó¿º}´g»P^¼Y‡P»r·û»› ¶;+ÔºEœ¼› ¶;ƒ>ìºÀu¼™Ëz;n´g»£Ø ¼™Ëz;ÐV1»@Ö»j´ç»9дº²@ã»j´ç»sŽº&²»]:¼¢U »1¨»]:¼ÐV1»@Ö»j´ç;9дº²@ã»j´ç;+ÔºEœ¼› ¶;Y‡P»r·û»› ¶;Y‡P»r·û»› ¶»+ÔºEœ¼› ¶»9дº²@ã»j´ç»ÐV1»@Ö»j´ç»ŸU »1¨»]:ìºÀu¼ Ëz»+ÔºEœ¼› ¶»Y‡P»r·û»› ¶»Tó¿ºx´g»R^<¶Cºúu»R^ìºÀu¼ Ëz»n´g»£Ø ¼ Ëz» ¶Cº›>캱 <—‹Ç¹¼Ëúº± <¶Cºúu»R^ìºÀu¼ Ëz»[¼.°T^¼ Ëz»>Ýj0^:¼› ¶»+ÔºEœ¼› ¶»¶Cºúu»R^< +U.®¬Ëz»R^<ƒð.¡ ¶»]:Ýj0± ¼uµÿº[¼.°T^¼ Ëz»ƒ>ìºÀu¼ Ëz»—‹Ç¹¼Ëúº± < +U.®Žµÿº± < +U.®¬Ëz»R^<¶Cºúu»R^Ýj0± ¼uµÿº—Ëúº¯š¼uµÿº—Ëúº¯š¼iµÿ:>Ýj0± ¼iµÿ:€é‰0×#¼ì†O°lµÿº"± ¼ì†O°¶Cº úu»P^¼n—⯲Ëz»P^¼ +˜ž. µÿº± ¼¡‹Ç¹ÎËúº± ¼ƒ>ìºÀu¼™Ëz;[¼.°T^¼™Ëz;>Ýj0± ¼iµÿ:—Ëúº¯š¼iµÿ:sŽº&²»]:¼é«¯¥ ¶»]:¼n—⯲Ëz»P^¼¶Cº úu»P^¼+ÔºEœ¼› ¶;>Ýj0^:¼› ¶;[¼.°T^¼™Ëz;ƒ>ìºÀu¼™Ëz;9дº²@ã»j´ç»i Ž/p´ç»j´ç»é«¯¥ ¶»]:¼sŽº&²»]:¼9дº²@ã»j´ç;i Ž/p´ç»j´ç;>Ýj0^:¼› ¶;+ÔºEœ¼› ¶;+ÔºEœ¼› ¶»>Ýj0^:¼› ¶»i Ž/p´ç»j´ç»9дº²@ã»j´ç»mŽº$²»]:<ƒð.¡ ¶»]:ì:Àu¼™Ëz;£Ëú:®š¼iµÿ:>Ýj0± ¼iµÿ:髐¯¥ ¶»]:¼nŽ:&²»]:¼¶C: úu»P^¼n—⯲Ëz»P^¼>Ýj0^:¼› ¶;9Ô:Dœ¼› ¶;y>ì:Àu¼™Ëz;[¼.°T^¼™Ëz;i Ž/p´ç»j´ç»>д:°@ã»j´ç»nŽ:&²»]:¼é«¯¥ ¶»]:¼i Ž/p´ç»j´ç;>д:°@ã»j´ç;9Ô:Dœ¼› ¶;>Ýj0^:¼› ¶;>Ýj0^:¼› ¶»9Ô:Dœ¼› ¶»>д:°@ã»j´ç»i Ž/p´ç»j´ç»ƒð.¡ ¶»]:д:°@ã»j´ç;i Ž/p´ç»j´ç;[¼.°T^¼ Ëz»y>ì:Àu¼ Ëz»9Ô:Dœ¼› ¶»>Ýj0^:¼› ¶» +U.®¬Ëz»R^<¶C:úu»R^Ýj0± ¼uµÿº£Ëú:®š¼uµÿºy>ì:Àu¼ Ëz»[¼.°T^¼ Ëz» +U.®Žµÿº± <“‹Ç9»Ëúº± <¶C:úu»R^< +U.®¬Ëz»R^<€é‰0×#¼ì†O°}µÿ:!± ¼ì†O°£Ëú:®š¼uµÿº>Ýj0± ¼uµÿº>Ýj0± ¼iµÿ:£Ëú:®š¼iµÿ:}µÿ:!± ¼ì†O°€é‰0×#¼ì†O°n—⯲Ëz»P^¼¶C: úu»P^¼¥‹Ç9ËËúº± ¼ +˜ž. µÿº± ¼¶C:úu»R^ì:Àu¼ Ëz»“‹Ç9»Ëúº± <¶C:—>캱 캱 ¼¥‹Ç9ËËúº± ¼y>ì:Àu¼™Ëz;g´g;£Ø ¼™Ëz;øùu;½u¼iµÿ:£Ëú:®š¼iµÿ:nŽ:&²»]:¼ U ;1¨»]:¼Só¿:y´g»P^¼¶C: úu»P^¼9Ô:Dœ¼› ¶;]‡P;k·û»› ¶;g´g;£Ø ¼™Ëz;y>ì:Àu¼™Ëz;>д:°@ã»j´ç»ÒV1;>Ö»j´ç» U ;1¨»]:¼nŽ:&²»]:¼>д:°@ã»j´ç;ÒV1;>Ö»j´ç;]‡P;k·û»› ¶;9Ô:Dœ¼› ¶;9Ô:Dœ¼› ¶»]‡P;k·û»› ¶»ÒV1;>Ö»j´ç»>д:°@ã»j´ç»nŽ:"²»]:<ŸU ;1¨»]:<ÒV1;>Ö»j´ç;>д:°@ã»j´ç;y>ì:Àu¼ Ëz»g´g;£Ø ¼ Ëz»]‡P;k·û»› ¶»9Ô:Dœ¼› ¶» U ;1¨»]:¼EHJ;Y^—»]:¼ŸU ;k‡P»P^¼Só¿:y´g»P^¼]‡P;k·û»› ¶;O^—;ò‰â»› ¶; +1¨;r·û»™Ëz;g´g;£Ø ¼™Ëz;ÒV1;>Ö»j´ç»oº€;Ò§À»j´ç»EHJ;Y^—»]:¼ U ;1¨»]:¼ÒV1;>Ö»j´ç;oº€;Ò§À»j´ç;O^—;ò‰â»› ¶;]‡P;k·û»› ¶;]‡P;k·û»› ¶»O^—;ò‰â»› ¶»oº€;Ò§À»j´ç»ÒV1;>Ö»j´ç»ŸU ;1¨»]:Ö»j´ç;g´g;£Ø ¼ Ëz» +1¨;r·û» Ëz»O^—;ò‰â»› ¶»]‡P;k·û»› ¶»Ró¿:t´g»R^<U ;f‡P»R^캱 캱 ¼g´g;£Ø ¼™Ëz; +1¨;r·û»™Ëz;²;Cœ¼iµÿ:øùu;½u¼iµÿ:²;Cœ¼uµÿº§@ã;ª@ã»uµÿº7Ö;>Ö» Ëz» +1¨;r·û» Ëz»lŽ:LÔº± <8д:Tдº± <ÏV1;ÛV1»R^<U ;f‡P»R^<ž ¶;_:¼ì†O°l´ç;n´ç»ì†O°§@ã;ª@ã»uµÿº²;Cœ¼uµÿº²;Cœ¼iµÿ:§@ã;ª@ã»iµÿ:l´ç;n´ç»ì†O°ž ¶;_:¼ì†O°ŸU ;k‡P»P^¼ÒV1;ÞV1»P^¼Fд:aдº± ¼wŽ:\Ôº± ¼ +1¨;r·û»™Ëz;7Ö;>Ö»™Ëz;§@ã;ª@ã»iµÿ:²;Cœ¼iµÿ:EHJ;Y^—»]:¼pº€;wº€»]:¼ÒV1;ÞV1»P^¼ŸU ;k‡P»P^¼O^—;ò‰â»› ¶;ɧÀ;˧À»› ¶;7Ö;>Ö»™Ëz; +1¨;r·û»™Ëz;oº€;Ò§À»j´ç» +×£;×£»j´ç»pº€;wº€»]:¼EHJ;Y^—»]:¼oº€;Ò§À»j´ç; +×£;×£»j´ç;ɧÀ;˧À»› ¶;O^—;ò‰â»› ¶;O^—;ò‰â»› ¶»É§À;˧À»› ¶» +×£;×£»j´ç»oº€;Ò§À»j´ç»BHJ;V^—»]:Ö» Ëz»É§À;˧À»› ¶»O^—;ò‰â»› ¶»U ;f‡P»R^<ÏV1;ÛV1»R^Ö»™Ëz; +×£;×£»j´ç»Ë§À;tº€»j´ç»Q^—;SHJ»]:¼pº€;wº€»]:¼ +×£;×£»j´ç;˧À;tº€»j´ç;î‰â;Q^—»› ¶;ɧÀ;˧À»› ¶;ɧÀ;˧À»› ¶»î‰â;Q^—»› ¶»Ë§À;tº€»j´ç» +×£;×£»j´ç»nº€;tº€»]:Ö» Ëz»j·û;1¨» Ëz»î‰â;Q^—»› ¶»É§À;˧À»› ¶»ÏV1;ÛV1»R^Ö» Ëz»8д:Tдº± <0Ô:‡Žº± Ö»™Ëz;j·û;1¨»™Ëz;@œ<²»iµÿ:§@ã;ª@ã»iµÿ:pº€;wº€»]:¼Q^—;SHJ»]:¼]‡P;«U »P^¼ÒV1;ÞV1»P^¼0Ô:‡Žº± ì:7¶Cº± ì:F¶Cº± ¼@Ô:‘Žº± ¼j·û;1¨»™Ëz;ŸØ 캠Ëz»?œ<;Ôº› ¶»e·û;^‡P»› ¶»e´g;eó¿ºR^<òùu;-¶CºR^<²;„Žº]:< 1¨;©U »]:<ºu<÷ùu»uµÿº©š<¢Ëúºuµÿº½u<™>캠Ëz»ŸØ ì:7¶Cº± <™Ëú:ü‹Ç¹± <òùu;-¶CºR^ì:F¶Cº± ¼ŸØ 캙Ëz;©š<¢Ëúºiµÿ:ºu<÷ùu»iµÿ: 1¨;­U »]:¼²;‡Žº]:¼õùu;4¶CºP^¼i´g;jó¿ºP^¼e·û;^‡P»› ¶;?œ<;Ôº› ¶;½u<™>캙Ëz;ŸØ 캙Ëz;P^<®W[±™Ëz;± <)|ƒ°iµÿ:©š<¢Ëúºiµÿ:²;‡Žº]:¼› ¶;¾A±]:¼Ëz;¾A±P^¼õùu;4¶CºP^¼?œ<;Ôº› ¶;Y:<ÍìÀ°› ¶;P^<®W[±™Ëz;½u<™>캙Ëz;ª@ã;Mдºj´ç»i´ç;p]þ°j´ç»› ¶;¾A±]:¼²;‡Žº]:¼ª@ã;Mдºj´ç;i´ç;p]þ°j´ç;Y:<ÍìÀ°› ¶;?œ<;Ôº› ¶;?œ<;Ôº› ¶»Y:<ÍìÀ°› ¶»i´ç;p]þ°j´ç»ª@ã;Mдºj´ç»²;„Žº]:<˜ ¶;ëa2±]:캠Ëz»P^<®W[± Ëz»Y:<ÍìÀ°› ¶»?œ<;Ôº› ¶»òùu;-¶CºR^<˜Ëz;3C-±R^<˜ ¶;ëa2±]:<²;„Žº]:<©š<¢Ëúºuµÿº± <)|ƒ°uµÿºP^<®W[± Ëz»½u<™>캠Ëz»™Ëú:ü‹Ç¹± œ<"Ô:› ¶»©@ã;+д:j´ç»i´ç;p]þ°j´ç»˜ ¶;ëa2±]:<²;VŽ:]:<©@ã;+д:j´ç;i´ç;p]þ°j´ç;P^<®W[± Ëz»¼uì: Ëz»>œ<"Ô:› ¶»Y:<ÍìÀ°› ¶»˜Ëz;3C-±R^<ðùu;ÔµC:R^<²;VŽ:]:<˜ ¶;ëa2±]:<± <)|ƒ°uµÿº§š<Ëú:uµÿº¼uì: Ëz»P^<®W[± Ëz»lµÿ:RÈX±± <™Ëú:"‹Ç9± <ðùu;ÔµC:R^<˜Ëz;3C-±R^<×#<ÍìÀ°ì†O°± ì:™Ëz;§š<Ëú:iµÿ:± <)|ƒ°iµÿ:› ¶;¾A±]:¼²;VŽ:]:¼õùu;ÓµC:P^¼Ëz;¾A±P^¼Y:<ÍìÀ°› ¶;>œ<"Ô:› ¶;¼uì:™Ëz;P^<®W[±™Ëz;i´ç;p]þ°j´ç»©@ã;+д:j´ç»²;VŽ:]:¼› ¶;¾A±]:¼i´ç;p]þ°j´ç;©@ã;+д:j´ç;>œ<"Ô:› ¶;Y:<ÍìÀ°› ¶;§š<Ëú:iµÿ:·u<ëùu;iµÿ:M^<—Ëz;ì†O°± ì:صC:± ¼«Ëú:2‹Ç9± ¼¼uì:™Ëz;ŸØ <\´g;™Ëz;·u<ëùu;iµÿ:§š<Ëú:iµÿ:²;VŽ:]:¼ 1¨;“U ;]:¼g´g;9ó¿:P^¼õùu;ÓµC:P^¼>œ<"Ô:› ¶;a·û;P‡P;› ¶;ŸØ <\´g;™Ëz;¼uì:™Ëz;©@ã;+д:j´ç»5Ö;ÉV1;j´ç» 1¨;“U ;]:¼²;VŽ:]:¼©@ã;+д:j´ç;5Ö;ÉV1;j´ç;a·û;P‡P;› ¶;>œ<"Ô:› ¶;>œ<"Ô:› ¶»a·û;P‡P;› ¶»5Ö;ÉV1;j´ç»©@ã;+д:j´ç»²;VŽ:]:<1¨;’U ;]:<5Ö;ÉV1;j´ç;©@ã;+д:j´ç;¼uì: Ëz»ŸØ <\´g; Ëz»a·û;P‡P;› ¶»>œ<"Ô:› ¶»ðùu;ÔµC:R^ì: Ëz»™Ëú:"‹Ç9± ì:ʵC:± ì:ʵC:± ì:صC:± ¼ŸØ <\´g;™Ëz;i·û;1¨;™Ëz;=œ<²;iµÿ:·u<ëùu;iµÿ: 1¨;“U ;]:¼N^—;7HJ;]:¼Y‡P;’U ;P^¼g´g;9ó¿:P^¼a·û;P‡P;› ¶;ç‰â;I^—;› ¶;i·û;1¨;™Ëz;ŸØ <\´g;™Ëz;5Ö;ÉV1;j´ç»É§À;jº€;j´ç»N^—;7HJ;]:¼ 1¨;“U ;]:¼5Ö;ÉV1;j´ç;ɧÀ;jº€;j´ç;ç‰â;I^—;› ¶;a·û;P‡P;› ¶;a·û;P‡P;› ¶»ç‰â;I^—;› ¶»É§À;jº€;j´ç»5Ö;ÉV1;j´ç»Y‡P;’U ;P^¼ÍV1;ÂV1;P^¼Bд:)д:± ¼=Ô:YŽ:± ¼i·û;1¨;™Ëz;7Ö;0Ö;™Ëz;ž@ã;ž@ã;iµÿ:=œ<²;iµÿ:N^—;7HJ;]:¼lº€;hº€;]:¼ÍV1;ÂV1;P^¼Y‡P;’U ;P^¼ç‰â;I^—;› ¶;Á§À;§À;› ¶;7Ö;0Ö;™Ëz;i·û;1¨;™Ëz;ɧÀ;jº€;j´ç»×£;×£;j´ç»lº€;hº€;]:¼N^—;7HJ;]:¼É§À;jº€;j´ç;×£;×£;j´ç;Á§À;§À;› ¶;ç‰â;I^—;› ¶;ç‰â;I^—;› ¶»Á§À;§À;› ¶»×£;×£;j´ç»É§À;jº€;j´ç»K^—;4HJ;]:ì:± ì:± ¼sŽ:"Ô:± ¼Ió¿:W´g;R^<óµC:ãùu;R^<`Ž:²;]:<—U ;1¨;]:<ãùu;´uì:¸u< Ëz»f´g;›Ø < Ëz»þµC:]>ì:± <Š‹Ç9~Ëú:± <óµC:ãùu;R^ì:± ¼f´g;›Ø <™Ëz;w>ì:¸u<™Ëz;€Ëú:¤šì:¸u<™Ëz;f´g;›Ø <™Ëz;ÊV1;2Ö;j´ç».д:¢@ã;j´ç»cŽ:²;]:¼™U ;1¨;]:¼ÊV1;2Ö;j´ç;.д:¢@ã;j´ç;Ô:;œ<› ¶;J‡P;]·û;› ¶;J‡P;]·û;› ¶»Ô:;œ<› ¶».д:¢@ã;j´ç»ÊV1;2Ö;j´ç»—U ;1¨;]:<`Ž:²;]:<.д:¢@ã;j´ç;ÊV1;2Ö;j´ç;f´g;›Ø < Ëz»w>ì:¸u< Ëz»Ô:;œ<› ¶»J‡P;]·û;› ¶»Ô:;œ<› ¶;@ ;±T:<› ¶;[¼.°K^<™Ëz;w>ì:¸u<™Ëz;.д:¢@ã;j´ç»u?Ò°a´ç;j´ç»ÑΔ° ¶;]:¼cŽ:²;]:¼.д:¢@ã;j´ç;u?Ò°a´ç;j´ç;@ ;±T:<› ¶;Ô:;œ<› ¶;Ô:;œ<› ¶»@ ;±T:<› ¶»u?Ò°a´ç;j´ç».д:¢@ã;j´ç»`Ž:²;]:<³I©°Ž ¶;]:ì:¸u< Ëz»[¼.°K^< Ëz»@ ;±T:<› ¶»Ô:;œ<› ¶»óµC:ãùu;R^<²W°ŠËz;R^<³I©°Ž ¶;]:<`Ž:²;]:<€Ëú:¤šì:¸u< Ëz»Š‹Ç9~Ëú:± <Šv&¯Pµÿ:± <²W°ŠËz;R^<óµC:ãùu;R^ì:¸u<™Ëz;[¼.°K^<™Ëz;ÏÍ0±± zκ€š[þ<À 8¸€¾Ný<Xµ€ë<€Ê›;€Èy@;€jº„<€`µÄ<Ö»€çdä<ד”»€8†ë<>zκ€ÍfÖOOOzκ€dÈð<$»€{äÿ<0€ÿ¸€š[þ<À 8¸€Ê›;€à2û9€D"¤»€Èy@;€çdä<ד”»€ž´<ÇÐØ»€dÈð<$»€8†ë<>zκ€`:;€H$·:€à2û9€Ê›;€þ¯<&ü»€þ=;€tp¼wñ:ž´<ÇÐØ»€çdä<ד”»€À­g:€‹•9€H$·:€`:;€>O9O×Ð;¢îº”Û‚:†?v;9Á »z:€€€€t¦ˆº€ ‰9¨•¹ Ñ&9 #:0¯¬¹`¿>9À/5ŒË·ºÀ©4€€€€88Ṁ@èk9»€¹Ð}9 ‰9¨•¹ Ñ&9t¦ˆº€€€€€€€€€ #:0¯¬¹`¿>9Û;(Ê»h!•:ãØý;¦S»Ðêë:O×Ð;¢îº”Û‚:€€€€ ‰9¨•¹ Ñ&9^ó ;$Ž»†Ñ§:Û;(Ê»h!•: #:0¯¬¹`¿>9€€€€@èk9»€¹Ð}9pÕ ; ˻Ҋ¬:^ó ;$Ž»†Ñ§: ‰9¨•¹ Ñ&9€€€€7³8—ø`Z8€Ü:°·ðºÖ(†:pÕ ; ˻Ҋ¬:@èk9»€¹Ð}9€Häh:Ð+~ºZ¨ :€Ü:°·ðºÖ(†:7³8—ø`Z8Oaº<€Oaº<€BKý<€=Ký<€€à‹C9ÀiU¹`âí8Häh:Ð+~ºZ¨ :€ªhU<ãv·€© V<€Oaº<€Oaº<€€€à‹C9ÀiU¹`âí8€O×Ð;¢îº”Û‚:ãØý;¦S»Ðêë:© V<€ªhU<ãv·€Häh:Ð+~ºZ¨ :]JP;pRc»;cý:?£›;¼Û©»»U=;€Ü:°·ðºÖ(†:Oaº<€Raº<€CKý<€BKý<€à‹C9ÀiU¹`âí8€»:´̺œ~c:]JP;pRc»;cý:Häh:Ð+~ºZ¨ :© V<€­ V<€Raº<€Oaº<€€ ¹Y9Àm¹`n9€»:´̺œ~c:à‹C9ÀiU¹`âí8ãØý;¦S»Ðêë: hh:ƒ‹»:‚;­ V<€© V<€€€ ¹Y9Àm¹`n9€Û;(Ê»h!•:4—;'G™»uÚ*; hh:ƒ‹»:‚;ãØý;¦S»Ðêë:€€€€^ó ;$Ž»†Ñ§: ƒ©;%¹»£6N;4—;'G™»uÚ*;Û;(Ê»h!•:€€€€pÕ ; ˻Ҋ¬:÷Ö´;ô\Å»Rþ[; ƒ©;%¹»£6N;^ó ;$Ž»†Ñ§:€€€€€Ü:°·ðºÖ(†:?£›;¼Û©»»U=;÷Ö´;ô\Å»Rþ[;pÕ ; ˻Ҋ¬:€€€€ ƒ©;%¹»£6N;>% <Á +¼z´«;âê;<Ðó»Œâ‡;4—;'G™»uÚ*;€€€€÷Ö´;ô\Å»Rþ[;Ìe<çi'¼!œº;>% <Á +¼z´«; ƒ©;%¹»£6N;€€€€?£›;¼Û©»»U=;°% <Á +¼z´«;Zó:% <Á +¼z´«;€€€€°†9<ÔyJ¼C±á;©øM<Ê`¼ûú;Ìe<çi'¼!œº;óHÄ;:8Ö»bÈn;-<-¼ø—¥;>†9<ÔyJ¼C±á;°†9<ÔyJ¼C±á;<é_¼â•ù;îÙx¼V± +<©øM<Ê`¼ûú;-<-¼ø—¥;pÂ$¼Â¦·;<é_¼â•ù;>†9<ÔyJ¼C±á;Waº<€€f¹¥§8€CKý<€þš;Ž.¨»Ww;;9½»iëR;pÂ$¼Â¦·;-<-¼ø—¥;² V<€ ¯ +»ô•š:€f¹¥§8Waº<€ˆ¥×:°Yëº +ƒ:ü® +»ä•š:9½»iëR;þš;Ž.¨»Ww;;¬ö·:D r»¦æ;9½»iëR; ¯ +»ô•š:² V<€°‡ž8À­¸Ú@8@f¹¥§8ü® +»ä•š:ˆ¥×:°Yëº +ƒ:à]8Ö»bÈn;°¼Z-¼FH¦;B†9¼ÕyJ¼C±á;Vaº¼€Qaº¼€=Ký¼€CKý¼€üš»Ž.¨»Ww;;,ˆQ»T­d»âåþ:öHÄ»>8Ö»bÈn;/¼.¼ø—¥;² V¼€± V¼€Qaº¼€Vaº¼€–¥×º¸Yëº +ƒ:0Ärºly„ºè©:,ˆQ»T­d»âåþ:üš»Ž.¨»Ww;;±ö·ºH r»¦æ;Œl=º(`‘»~ ";± V¼€² V¼€ˆž¸@­¸Ú@8€0Ärºly„ºè©:–¥×º¸Yëº +ƒ:â]¼r¼$ά;äê»CÐó»Œâ‡;Œl=º(`‘»~ ";±ö·ºH r»¦æ;€€€ˆž¸@­¸Ú@8Yó:¼JL¼lmã;<% ¼Á +¼z´«;äê»CÐó»Œâ‡;â]¼r¼$ά;± V¼€« V¼€Qaº¼€Qaº¼€0Ärºly„ºè©:¹Y¹ žm¹`n9p»º¸̺œ~c:,ˆQ»T­d»âåþ:Œl=º(`‘»~ ";hhº +ƒ‹»:‚;« V¼€± V¼€€€¹Y¹ žm¹`n90Ärºly„ºè©:äê»CÐó»Œâ‡;3—».G™»uÚ*;hhº +ƒ‹»:‚;Œl=º(`‘»~ ";€€€€<% ¼Á +¼z´«;ƒ©»&¹»£6N;3—».G™»uÚ*;äê»CÐó»Œâ‡;€€€€Íe¼éi'¼!œº;øÖ´»ú\Å»Rþ[;ƒ©»&¹»£6N;<% ¼Á +¼z´«;€€€€°¼Z-¼FH¦;A£›»ÂÛ©»»U=;øÖ´»ú\Å»Rþ[;Íe¼éi'¼!œº;öHÄ»>8Ö»bÈn;_JP»|Rc»;cý:A£›»ÂÛ©»»U=;°¼Z-¼FH¦;Qaº¼€Qaº¼€BKý¼€=Ký¼€,ˆQ»T­d»âåþ:p»º¸̺œ~c:_JP»|Rc»;cý:öHÄ»>8Ö»bÈn;øÖ´»ú\Å»Rþ[;lÕ »Ë»ÒŠ¬:Tó »(Ž»†Ñ§:ƒ©»&¹»£6N;€€€€A£›»ÂÛ©»»U=;„ÜºÈ·ðºÖ(†:lÕ »Ë»ÒŠ¬:øÖ´»ú\Å»Rþ[;_JP»|Rc»;cý:8ähº,~ºZ¨ :„ÜºÈ·ðºÖ(†:A£›»ÂÛ©»»U=;Qaº¼€Paº¼€AKý¼€BKý¼€p»º¸̺œ~c:@‹C¹jU¹`âí88ähº,~ºZ¨ :_JP»|Rc»;cý:« V¼€§ V¼€Paº¼€Qaº¼€¹Y¹ žm¹`n9€@‹C¹jU¹`âí8p»º¸̺œ~c:hhº +ƒ‹»:‚;äØý»"¦S»Ðêë:§ V¼€« V¼€€€€¹Y¹ žm¹`n93—».G™»uÚ*; Û»:Ê»h!•:äØý»"¦S»Ðêë:hhº +ƒ‹»:‚;€€€€ƒ©»&¹»£6N;Tó »(Ž»†Ñ§: Û»:Ê»h!•:3—».G™»uÚ*;€€€€€€€@‹C¹jU¹`âí8äØý»"¦S»Ðêë:K×л$¢îº”Û‚:¨hU¼åv·€§ V¼€€€€€ Û»:Ê»h!•:à +#º°¯¬¹`¿>9K×л$¢îº”Û‚:äØý»"¦S»Ðêë:€€€€Tó »(Ž»†Ñ§:P ‰¹¨•¹ Ñ&9à +#º°¯¬¹`¿>9 Û»:Ê»h!•:€€€€lÕ »Ë»ÒŠ¬:Àçk¹»€¹Ð}9P ‰¹¨•¹ Ñ&9Tó »(Ž»†Ñ§:€€€€„ÜºÈ·ðºÖ(†:€6³¸À˜Ã¸`Z8Àçk¹»€¹Ð}9lÕ »Ë»ÒŠ¬:8ähº,~ºZ¨ :€€6³¸À˜Ã¸`Z8„ÜºÈ·ðºÖ(†:Paº¼€Naº¼€=Ký¼€AKý¼€@‹C¹jU¹`âí8€€8ähº,~ºZ¨ :§ V¼€¨hU¼åv·€Naº¼€Paº¼€€€€€€6³¸À˜Ã¸`Z8ÙK·€¸8ṀÀçk¹»€¹Ð}9€€ÙK·€€6³¸À˜Ã¸`Z8Naº¼€tœ·¼Ð´6¹€9à.µ¬Ë·ºÀ©4~?v»?Á »z:K×л$¢îº”Û‚:€€€€P ‰¹¨•¹ Ñ&9t¦ˆº€à.µ¬Ë·ºÀ©4à +#º°¯¬¹`¿>9€€€€Àçk¹»€¹Ð}9¸8Ṁt¦ˆº€P ‰¹¨•¹ Ñ&9€€€€à.µ¬Ë·ºÀ©4€õå¸1Ʀ»€á‹8Hn3ºNЋ»€ï8~?v»?Á »z:€€€€t¦ˆº€€m·¡›»{7€õå¸1Ʀ»€á‹8à.µ¬Ë·ºÀ©4€€€€¸8ṀŸ’b»€€m·¡›»{7t¦ˆº€€€€€ÙK·€pߺ€Ÿ’b»€¸8Ṁ€– ¹€pߺ€ÙK·€tœ·¼Ð´6¹€\¬±¼HþGº€ŠJý¼hµ€»€Ì–»€u„»€< º€¦¤7º€8êÓº€ èƒº€ÐÆ,º€ Vº€Hò>»€ØA»€º¹€È˲º€ Vº€ÐÆ,º€žëï» .)¸€ˆŒÿ»àM½·€n„λT`¹€œžÂ»Ò1€¹€í +º€xˆÿº€È˲º€º¹€Þ‘ø»€_1¼€ˆŒÿ»àM½·€žëï» .)¸€8ԇº€ü2*»€xˆÿº€í +º€Û_什 +ð»€_1¼€Þ‘ø»€@²º€Þ58»€ü2*»€8ԇº€ôº»€ZÈ»€ +ð»€Û_什<´°º€.`»€Þ58»€@²º€u„»€Ì–»€ZÈ»€ôº»€ èƒº€8êÓº€.`»€<´°º€ü2*»€-•»€Þۄ»€xˆÿº€ +𻀰Çú»€êý¼€_1¼€Þ58»€]“»€-•»€ü2*»€ZÈ»€<Ø»€°Çú»€ +ð»€.`»€¼¶l»€]“»€Þ58»€Ì–»€4+®»€<Ø»€ZÈ»€8êÓº€?껀¼¶l»€.`»€Hò>»€bx‚»€4+®»€Ì–»€¦¤7º€‚üjº€?껀8êÓº€ Vº€8N[»€bx‚»€Hò>»€È˲º€¼Šh»€8N[»€ Vº€ˆŒÿ»àM½·€ì¼¬©Z·€Ï-Ö»)®L¹€n„λT`¹€xˆÿº€Þۄ»€¼Šh»€È˲º€_1¼€êý¼€ì¼¬©Z·€ˆŒÿ»àM½·€‚üjº€/͊º€Ù|6»€?껀8N[»€²ù°»€ªÞ®»€bx‚»€¼Šh»€¸n·»€²ù°»€8N[»€ì¼¬©Z·€ã>¼@} +·€LóÙ»ô«D¹€Ï-Ö»)®L¹€Þۄ»€HçÅ»€¸n·»€¼Šh»€êý¼€ïS ¼€ã>¼@} +·€ì¼¬©Z·€-•»€úlÕ»€HçÅ»€Þۄ»€°Çú»€Ø*¼€ïS ¼€êý¼€]“»€rjÈ»€úlÕ»€-•»€<Ø»€é绀Ø*¼€°Çú»€¼¶l»€Ö’™»€rjÈ»€]“»€4+®»€šÆ»€é绀<Ø»€?껀Ù|6»€Ö’™»€¼¶l»€bx‚»€ªÞ®»€šÆ»€4+®»€Ø*¼€•¼€ä÷ ¼€ïS ¼€rjÈ»€:âﻀh–¼€úlÕ»€é绀úÍõ»€•¼€Ø*¼€Ö’™»€!w²»€:âﻀrjÈ»€šÆ»€šÛ»€úÍõ»€é绀Ù|6»€ºN»€!w²»€Ö’™»€ªÞ®»€DÚ»€šÛ»€šÆ»€/͊º€䘺€ºN»€Ù|6»€²ù°»€Hù軀DÚ»€ªÞ®»€¸n·»€„?軀Hù軀²ù°»€ã>¼@} +·€6› ¼&ܶ€w'Ú» %G¹€LóÙ»ô«D¹€HçÅ»€juö»€„?軀¸n·»€ïS ¼€ä÷ ¼€6› ¼&ܶ€ã>¼@} +·€úlÕ»€h–¼€juö»€HçÅ»€Hù軀.¼€Pûò»€DÚ»€„?軀î—¼€.¼€Hù軀6› ¼&ܶ€˜ÿ¼’·€€Ö»8+U¹€w'Ú» %G¹€juö»€O ¼€î—¼€„?軀ä÷ ¼€‘Þ¼€˜ÿ¼’·€6› ¼&ܶ€h–¼€ø-¼€O ¼€juö»€•¼€{ +¼€‘Þ¼€ä÷ ¼€:âﻀiÑþ»€ø-¼€h–¼€úÍõ»€°`¼€{ +¼€•¼€!w²»€z~»»€iÑþ»€:âﻀšÛ»€¶ì黀°`¼€úÍõ»€ºN»€*UW»€z~»»€!w²»€DÚ»€Pûò»€¶ì黀šÛ»€䘺€íѝº€*UW»€ºN»€iÑþ»€§ßñ»€š¼€ø-¼€°`¼€æè¼€Z- ¼€{ +¼€z~»»€"w²»€§ßñ»€iÑþ»€¶ì黀¨¡ã»€æè¼€°`¼€*UW»€ºN»€"w²»€z~»»€Pûò»€Ð⻀¨¡ã»€¶ì黀íѝº€䘺€ºN»€*UW»€.¼€†Ñ¼€Ð⻀Pûò»€î—¼€Êí¼€†Ñ¼€.¼€˜ÿ¼’·€–¼¼‚·€âÇλð+p¹€€Ö»8+U¹€O ¼€ö ¼€Êí¼€î—¼€‘Þ¼€k¯¼€–¼¼‚·€˜ÿ¼’·€ø-¼€š¼€ö ¼€O ¼€{ +¼€Z- ¼€k¯¼€‘Þ¼€Êí¼€}2黀YÁ»€†Ñ¼€–¼¼‚·€€Ðû»€ý¸€¤ûL®Œ¹€âÇλð+p¹€ö ¼€»€5Lƒ»€*šÃ»€<껀:êÓº€,`»€½¶l»€‰.»€2Uº€®>»€e1‡»€üjº€¬¤7º€:êÓº€<껀†$4»€ ͹€2Uº€‰.»€®¨†»€ûO•º€ ͹€†$4»€®>»€€€5Lƒ»€:êÓº€€€,`»€2Uº€€€®>»€¬¤7º€€€:êÓº€ ͹€€€2Uº€ûO•º€€€ ͹€`×»»ð6?¹€àº€d”4º€Om¢»]ɹ€Òº»€€€ûO•º€¼òû€Ÿ-¸€ š˜¹€àº€`×»»ð6?¹€T?+»€€€Òº»€D𱻀±ß¸€ š˜¹€¼òû€Ÿ-¸€â58»€€€T?+»€5Lƒ»€€±ß¸€D𱻀,`»€€€â58»€€Öº;€ïO•:€€ š˜¹€¾òÃ;€Ÿ-¸€b×»;7?¹€àº€€L?+;€Öº;€€±ß¸€Bð±;€¾òÃ;€Ÿ-¸€ š˜¹€€ß58;€L?+;€€€2Lƒ;€Bð±;€±ß¸€€+`;€ß58;€€€´>;€2Lƒ;€€€>êÓ:€+`;€€€U:€´>;€€€®¤7:€>êÓ:€€€Ä Í9€U:€€€ïO•:€Ä Í9€€àº€b×»;7?¹€Om¢;]ɹ€d”4º€>êÓ:€=ê;€½¶l;€+`;€U:€„.;€h1‡;€´>;€®¤7:€†üj:€=ê;€>êÓ:€Ä Í9€~$4;€„.;€U:€ïO•:€¬¨†;€~$4;€Ä Í9€b×»;7?¹€7"á;~¼¸€-ʳ;ŒE¨¹€Om¢;]ɹ€Öº;€¸Î£;€¬¨†;€ïO•:€¾òÃ;€Ÿ-¸€÷;€7"á;~¼¸€b×»;7?¹€L?+;€Q§;€¸Î£;€Öº;€Bð±;€ýî;€÷;€¾òÃ;€Ÿ-¸€ß58;€|'•;€Q§;€L?+;€2Lƒ;€(šÃ;€ýî;€Bð±;€+`;€½¶l;€|'•;€ß58;€´>;€h1‡;€(šÃ;€2Lƒ;€÷;€ª^ +<€‚Ðû;Àþ¸€7"á;~¼¸€Q§;€ùIí;€@Võ;€¸Î£;€ýî;€€º<€ª^ +<€÷;€|'•;€bÍ;€ùIí;€Q§;€(šÃ;€aò;€€º<€ýî;€½¶l;€Ò’™;€bÍ;€|'•;€h1‡;€¾ß¿;€aò;€(šÃ;€=ê;€Ý|6;€Ò’™;€½¶l;€„.;€.Q¨;€¾ß¿;€h1‡;€†üj:€8͊:€Ý|6;€=ê;€~$4;€YÁ;€.Q¨;€„.;€¬¨†;€|2é;€YÁ;€~$4;€7"á;~¼¸€‚Ðû;Àþ¸€¤Ã;`®Œ¹€-ʳ;ŒE¨¹€¸Î£;€@Võ;€|2é;€¬¨†;€.Q¨;€ Ðâ;€­¡ã;€¾ß¿;€8͊:€„ä˜:€ºN;€Ý|6;€YÁ;€…Ñ<€ Ðâ;€.Q¨;€|2é;€Êí<€…Ñ<€YÁ;€‚Ðû;Àþ¸€€–<€¿‚·€æÇÎ; ,p¹€¤Ã;`®Œ¹€@Võ;€ø <€Êí<€|2é;€ª^ +<€l¯<€€–<€¿‚·€‚Ðû;Àþ¸€ùIí;€š<€ø <€@Võ;€€º<€[- <€l¯<€ª^ +<€bÍ;€¨ßñ;€š<€ùIí;€aò;€æè<€[- <€€º<€Ò’™;€$w²;€¨ßñ;€bÍ;€¾ß¿;€­¡ã;€æè<€aò;€Ý|6;€ºN;€$w²;€Ò’™;€š<€û-<€Q <€ø <€[- <€{ +<€’Þ<€l¯<€¨ßñ;€mÑþ;€û-<€š<€æè<€²`<€{ +<€[- <€$w²;€}~»;€mÑþ;€¨ßñ;€­¡ã;€ºìé;€²`<€æè<€ºN;€1UW;€}~»;€$w²;€ Ðâ;€Tûò;€ºìé;€­¡ã;€„ä˜:€ôѝ:€1UW;€ºN;€…Ñ<€.<€Tûò;€ Ðâ;€Êí<€ð—<€.<€…Ñ<€€–<€¿‚·€›ÿ<™·€€Ö;h+U¹€æÇÎ; ,p¹€ø <€Q <€ð—<€Êí<€l¯<€’Þ<€›ÿ<™·€€–<€¿‚·€ôѝ:€ˆä˜:€ºN;€1UW;€.<€Lùè;€HÚ;€Tûò;€ð—<€ˆ?è;€Lùè;€.<€›ÿ<™·€9› <3ܶ€z'Ú;4%G¹€€Ö;h+U¹€Q <€nuö;€ˆ?è;€ð—<€’Þ<€æ÷ <€9› <3ܶ€›ÿ<™·€û-<€l–<€nuö;€Q <€{ +<€•<€æ÷ <€’Þ<€mÑþ;€>âï;€l–<€û-<€²`<€Îõ;€•<€{ +<€}~»;€%w²;€>âï;€mÑþ;€ºìé;€”šÛ;€Îõ;€²`<€1UW;€ºN;€%w²;€}~»;€Tûò;€HÚ;€”šÛ;€ºìé;€>âï;€vjÈ;€mÕ;€l–<€Îõ;€éç;€Ú*<€•<€%w²;€Û’™;€vjÈ;€>âï;€”šÛ;€”šÆ;€éç;€Îõ;€ºN;€ä|6;€Û’™;€%w²;€HÚ;€²Þ®;€”šÆ;€”šÛ;€ˆä˜:€9͊:€ä|6;€ºN;€Lùè;€¸ù°;€²Þ®;€HÚ;€ˆ?è;€Àn·;€¸ù°;€Lùè;€9› <3ܶ€ç><À +·€OóÙ;¬D¹€z'Ú;4%G¹€nuö;€LçÅ;€Àn·;€ˆ?è;€æ÷ <€òS <€ç><À +·€9› <3ܶ€l–<€mÕ;€LçÅ;€nuö;€•<€Ú*<€òS <€æ÷ <€Àn·;€ÌŠh;€LN[;€¸ù°;€ç><À +·€ð<À +·€mÕ;€"-•;€âۄ;€LçÅ;€Ú*<€µÇú;€îý<€òS <€vjÈ;€]“;€"-•;€mÕ;€éç;€<Ø;€µÇú;€Ú*<€Û’™;€È¶l;€]“;€vjÈ;€”šÆ;€8+®;€<Ø;€éç;€ä|6;€Lê;€È¶l;€Û’™;€²Þ®;€jx‚;€8+®;€”šÆ;€9͊:€˜üj:€Lê;€ä|6;€¸ù°;€LN[;€jx‚;€²Þ®;€<Ø;€hÈ;€‡ +ð;€µÇú;€È¶l;€>`;€ê58;€]“;€8+®;€Ò–;€hÈ;€<Ø;€Lê;€TêÓ:€>`;€È¶l;€jx‚;€dò>;€Ò–;€8+®;€˜üj:€º¤7:€TêÓ:€Lê;€LN[;€HVÂ:€dò>;€jx‚;€ÌŠh;€Ì²:€HVÂ:€LN[;€ð`;€`´°:€$@²:€ê58;€Ò–;€"u„;€'ôº;€hÈ;€TêÓ:€¼èƒ:€`´°:€>`;€dò>;€ôA;€"u„;€Ò–;€º¤7:€P :€¼èƒ:€TêÓ:€HVÂ:€0Ç,:€ôA;€dò>;€`´°:€ :€PìÄ9€$@²:€"u„;€žëq;€ÿj¯;€'ôº;€¼èƒ:€ 0:€ :€`´°:€ôA;€°äú:€žëq;€"u„;€P :€¤–¡9€ 0:€¼èƒ:€0Ç,:€ð~&:€°äú:€ôA;€À»9€þ@8€ð~&:€0Ç,:€¦ëï;@-)¸€’Ø; Až¸€Â²;"ý–¹€ žÂ;¾1€¹€0í +:€€þ@8€À»9€å‘ø;€àÚá;j³€’Ø; Až¸€¦ëï;@-)¸€tԇ:€À‰9€€0í +:€ã_ä;€w{Ó;€àÚá;j³€å‘ø;€$@²:€PìÄ9€À‰9€tԇ:€'ôº;€ÿj¯;€w{Ó;€ã_ä;€’Ø; Až¸€²·;À÷¹€Œ®Ÿ;$á³¹€Â²;"ý–¹€€€£Õ7€þ@8€àÚá;j³€üa½;¤ƒ·€²·;À÷¹€’Ø; Až¸€À‰9€€€€w{Ó;€—X´;€üa½;¤ƒ·€àÚá;j³€PìÄ9€€€À‰9€ÿj¯;€÷|•;€—X´;€w{Ó;€ :€–8€€PìÄ9€žëq;€)G;€÷|•;€ÿj¯;€ 0:€`~9€–8€ :€°äú:€˜~Ì:€)G;€žëq;€¤–¡9€–#9€`~9€ 0:€ð~&:€Xv:€˜~Ì:€°äú:€þ@8€£Õ7€Xv:€ð~&:€)G;€Î§;€‚_;€÷|•;€`~9€€€–8€˜~Ì:€hږ:€Î§;€)G;€–#9€À”^8€€`~9€Xv:€¬9€hږ:€˜~Ì:€£Õ7€€¬9€Xv:€²·;À÷¹€Ö†‘;Àph¹€ãžŠ;,JÕ¹€Œ®Ÿ;$á³¹€€€€£Õ7€üa½;¤ƒ·€rä;@‹¸€Ö†‘;Àph¹€²·;À÷¹€€€€€—X´;€[›‹; ³€rä;@‹¸€üa½;¤ƒ·€€€€€÷|•;€‚_;€[›‹; ³€—X´;€–8€€€€€€€€rä;@‹¸€ÅYK;àÚ¹€6\V;àù¦¹€Ö†‘;Àph¹€€€€€[›‹; ³€V8?;µ·€ÅYK;àÚ¹€rä;@‹¸€€€€€‚_;€‚[;€V8?;µ·€[›‹; ³€€€€€Î§;€dÙ¿:€‚[;€‚_;€€€€€hږ:€tÂ):€dÙ¿:€Î§;€À”^8€€€€¬9€àKÑ8€tÂ):€hږ:€€€àKÑ8€¬9€Ö†‘;Àph¹€6\V;àù¦¹€~Rj;ø­ø¹€ãžŠ;,JÕ¹€€€€€tÂ):€P^9€& +E:€dÙ¿:€€€€€àKÑ8€€P^9€tÂ):€€€€àKÑ8€6\V;àù¦¹€àô;ÀèÕ¹€©ïA;$† º€~Rj;ø­ø¹€€€€€ÅYK;àÚ¹€Þä;`òb¹€àô;ÀèÕ¹€6\V;àù¦¹€€€€€V8?;µ·€:¸õ:€‰¸€Þä;`òb¹€ÅYK;àÚ¹€€€€€‚[;€[íµ:€©µ€:¸õ:€‰¸€V8?;µ·€€€€€dÙ¿:€& +E:€[íµ:€©µ€‚[;€€€€€:¸õ:€‰¸€À°ß¸€ š˜¹€Þä;`òb¹€€€€€[íµ:€©µ€€À°ß¸€:¸õ:€‰¸€€€€€& +E:€€€[íµ:€©µ€€€€€P^9€€€& +E:€€€€€€€€P^9€€€€€àô;ÀèÕ¹€àº€Z”4º€©ïA;$† º€€€€€Þä;`òb¹€ š˜¹€àº€àô;ÀèÕ¹€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ +  +  "! #" &%$'&$*)(+*(.-,./-.0/.,1.124304534658768978:9<;:<=;<>=@?>@A?@BADCBDECDFEHGFHIGHJILKJLMKLNMPONPQOPRQTSRTUST2UXWVWYVYZV[XV\[VZ^]^_]_`]`babcacdadfefgeghehjijkiklilnmnomopmprqrsqstqtvuvwuwxuxzyz{y{|y|~}~}\}‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|‚€ƒ‚€†…„‡†„Š‰ˆ‹ŠˆŽŒŽŒ’‘“’–•”—–”š™˜›š˜žœŸžœ¢¡ £¢ ¦¥¤§¦¤ª©¨«ª¨®­¬¯®¬²±°³²°¶µ´·¶´º¹¸»º¸¾½¼¿¾¼ÂÁÀÃÂÀÆÅÄÇÆÄÊÉÈËÊÈÎÍÌÏÎÌÒÑÐÓÒÐÖÕÔ×ÖÔÚÙØÛÚØÞÝÜßÞÜâáàãâàæåäçæäêéèëêèîíìïîìòñðóòðöõô÷öôúùøûúøþýüÿþü +   +   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRP‰ˆ=‰ˆˆ=ÎÌÌ=‰ˆ>«ª*>ÍÌL>ïîn>‰ˆˆ>š™™>«ªª>¼»»>ÍÌÌ>ÞÝÝ>ïîî>?‰ˆ??›™?$""?­ª*?633?¿»;?HDD?ÑÌL?ZUU?ãÝ]?lff?õîn?~ww?€?GD„?‹ˆˆ?Ï̌?‘?WU•?›™™?ßݝ?#"¢?gf¦?«ªª?ïî®?33³?ww·?»»»?ÿÿ¿?CDÄ?‡ˆÈ?ËÌÌ?Ñ?SUÕ?—™Ù?ÛÝÝ?"â?cfæ?§ªê?ëîî?/3ó?sw÷?·»û?ûÿÿ? "@BD@df@†ˆ@¨ª +@ÊÌ @ìî@@03@RU@tw@–™@¸»@ÚÝ@üÿ@""@@D$@bf&@„ˆ(@¦ª*@ÈÌ,@êî.@ 1@.33@PU5@rw7@”™9@¶»;@ØÝ=@úÿ?@"B@>DD@`fF@‚ˆH@¤ªJ@ÆÌL@èîN@ +Q@,3S@NUU@pwW@’™Y@´»[@ÖÝ]@øÿ_@"b@D”@OU•@`f–@qw—@‚ˆ˜@“™™@¤ªš@µ»›@Æ̜@×ݝ@èîž@ùÿŸ@ +¡@"¢@,3£@=D¤@NU¥@_f¦@pw§@ˆ¨@’™©@£ªª@´»«@Å̬@ÖÝ­@çî®@øÿ¯@ ±@"²@+3³@ˆ>Z³,>²¼A>™W>Á7n>1Ă>,½Ž>‹þš>€§>_9´>F"Á>}2Î>ºaÛ>¶§è>-üõ>l«?¸W?Ùþ?ªœ? +-?Õ«"?è)? d/?\•5?v¤;?MA?»KG?¡ÛL?Ú8R?D_W?ºJ\?÷`?C`e?‚i?[Xm?ßp?ît?íìv?áky?¦Š{?E}?—~?Š|?;ñ?þ9‘ö?óJ¨:Û«? +Œg;t?3Äà;w>~?±ÿ7< }?}ˆ<,¿{?=¼<z?£%ø<Ó>x?¤Ç=…#v?ŠC=HÎs?Ïìk=3Aq?Ý Œ=d~n?LÀ£=÷‡k?Øÿ¼=`h?¥º×=¬e?Úßó=„a?O¯>-Ô]?>?ûY?ª(>VûU?Í¥8>ÖQ?ýÃI>M?Ñd[>Ì&I?Úm> + D?T€>Öü??h‰>L?;?ó,“>†i6?¼>¡}1?§>¸},?3(±>æk'?rk»>GJ"?ÊÅ>ö?ä?Ð>à?¬ÈÚ>ª›?2`å>çO ?Að>ßþ?£ªú>¯ª?ª?áªú>Àþ?€ð>ÈO ?q`å>Œ›?èÈÚ>ïß?!@Ð>Ø?QÊÅ>*J"?­k»>Ék'?n(±>›},?ʧ>„}1?ø>ji6?,-“>/?;?¡‰>ºü??€>ïŸD?C€m>²&I?8e[>èŽM?aÄI>tÖQ?.¦8>=ûU? +(>(ûY?a>Ô]?¤¯>ñƒa?{àó=—e?H»×=ó_h?f½=æ‡k?ÍÀ£=T~n?\ Œ=$Aq?Ãík=:Îs?fC={#v?RÈ=Ê>x?¸&ø< +z?¸>¼<%¿{?\ˆ<ú}?š8~?fÆà;q?\g;Û«?=J¨:‘ö?Ãõ9vù?‘Å?ò^?ÏÆ~?_þ}?Ú}?tá{?iz?ìy?6jw?}™u?ø s?àq?j=o?ÎÔl?CIj?ÿ›g?;Îd?,áa? +Ö^?®[?ljX?\ U?•Q?ÏN?Á_J?!¤F?(ÔB? +ñ>?ü:?Aö6?á2?€½.?ìŒ*?P&?o "?ö¸?H`??.›?01 ?ÚÃ?dT? +Èý>èçô>Ì +ì>,3ã>ncÚ>žÑ>]åÈ>é;À>¤·>H ¯>ö²¦>’^ž>}%–>3 +Ž>†>Hm|>vm>Ÿî]>Ÿ*O>\¿@>Ÿ±2>R%>HÂ>lê +>ý=%å=…8Î=K¸=šf£=¸”=)¾y=HŸV=×ß5=H“=fš÷<ìAÅ<D˜<®a<Rè<¸¾Ë;= +g;áúÎ:š™Ð9 +×#´ \ No newline at end of file diff --git a/automated-tests/resources/AnimatedMorphSphere.gltf b/automated-tests/resources/AnimatedMorphSphere.gltf new file mode 100644 index 0000000..95c2751 --- /dev/null +++ b/automated-tests/resources/AnimatedMorphSphere.gltf @@ -0,0 +1,276 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 1876, + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 1876, + "type": "VEC4" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.009999998, + 0.009999991, + 0.01 + ], + "min": [ + -0.0100000026, + -0.0100000035, + -0.01 + ] + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Ship" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.0313265175, + 0.0226246975, + 0.008465132 + ], + "min": [ + -0.0313265137, + -0.022857653, + 0.0 + ], + "name": "Ship" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Ship" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Blob" + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "max": [ + 0.008781092, + 0.0, + 0.0 + ], + "min": [ + -0.008781091, + -0.0007655843, + 0.0 + ], + "name": "Blob" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 1876, + "type": "VEC3", + "name": "Blob" + }, + { + "bufferView": 9, + "componentType": 5123, + "count": 2880, + "type": "SCALAR" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 217, + "type": "SCALAR", + "max": [ + 7.19999456 + ], + "min": [ + 0.0 + ] + }, + { + "bufferView": 11, + "componentType": 5126, + "count": 434, + "type": "SCALAR" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "weights" + } + } + ], + "samplers": [ + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + } + ], + "name": "Globe" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 22512, + "byteLength": 30016 + }, + { + "buffer": 0, + "byteOffset": 52528, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 75040, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 97552, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 120064, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 142576, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 165088, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 187600, + "byteLength": 22512 + }, + { + "buffer": 0, + "byteOffset": 210112, + "byteLength": 5760 + }, + { + "buffer": 0, + "byteOffset": 215872, + "byteLength": 868 + }, + { + "buffer": 0, + "byteOffset": 216740, + "byteLength": 1736 + } + ], + "buffers": [ + { + "uri": "AnimatedMorphSphere.bin", + "byteLength": 218476 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 0, + "TANGENT": 1, + "POSITION": 2 + }, + "indices": 9, + "material": 0, + "targets": [ + { + "NORMAL": 3, + "POSITION": 4, + "TANGENT": 5 + }, + { + "NORMAL": 6, + "POSITION": 7, + "TANGENT": 8 + } + ] + } + ], + "weights": [ + 0.0, + 0.0 + ], + "name": "Sphere" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + }, + "name": "No Name" + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0.0, + 0.7071067, + -0.7071068, + 0.0 + ], + "scale": [ + 100.0, + 100.0, + 100.0 + ], + "name": "AnimatedMorphSphere" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/automated-tests/resources/AnimatedTriangle.gltf b/automated-tests/resources/AnimatedTriangle.gltf new file mode 100644 index 0000000..4e4a9cb --- /dev/null +++ b/automated-tests/resources/AnimatedTriangle.gltf @@ -0,0 +1,118 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0 ] + } + ], + + "nodes" : [ + { + "mesh" : 0, + "rotation" : [ 0.0, 0.0, 0.0, 1.0 ] + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 1 + }, + "indices" : 0 + } ] + } + ], + + "animations": [ + { + "samplers" : [ + { + "input" : 2, + "interpolation" : "LINEAR", + "output" : 3 + } + ], + "channels" : [ { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "rotation" + } + } ] + } + ], + + "buffers" : [ + { + "uri" : "simpleTriangle.bin", + "byteLength" : 44 + }, + { + "uri" : "animation.bin", + "byteLength" : 100 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 6, + "target" : 34963 + }, + { + "buffer" : 0, + "byteOffset" : 8, + "byteLength" : 36, + "target" : 34962 + }, + { + "buffer" : 1, + "byteOffset" : 0, + "byteLength" : 100 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 3, + "type" : "SCALAR", + "max" : [ 2 ], + "min" : [ 0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + }, + { + "bufferView" : 2, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 5, + "type" : "SCALAR", + "max" : [ 1.0 ], + "min" : [ 0.0 ] + }, + { + "bufferView" : 2, + "byteOffset" : 20, + "componentType" : 5126, + "count" : 5, + "type" : "VEC4", + "max" : [ 0.0, 0.0, 1.0, 1.0 ], + "min" : [ 0.0, 0.0, 0.0, -0.707 ] + } + ], + + "asset" : { + "version" : "2.0" + } + +} diff --git a/automated-tests/resources/BoxAnimated.gltf b/automated-tests/resources/BoxAnimated.gltf new file mode 100644 index 0000000..afa7afb --- /dev/null +++ b/automated-tests/resources/BoxAnimated.gltf @@ -0,0 +1,327 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 3, + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "rotation": [ + -0.0, + -0.0, + -0.0, + -1.0 + ] + }, + { + "children": [ + 2 + ] + }, + { + "mesh": 0, + "rotation": [ + -0.0, + -0.0, + -0.0, + -1.0 + ] + }, + { + "mesh": 1 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "inner_box" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 4, + "POSITION": 5 + }, + "indices": 3, + "mode": 4, + "material": 1 + } + ], + "name": "outer_box" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 2, + "path": "rotation" + } + }, + { + "sampler": 1, + "target": { + "node": 0, + "path": "translation" + } + } + ], + "samplers": [ + { + "input": 6, + "interpolation": "LINEAR", + "output": 7 + }, + { + "input": 8, + "interpolation": "LINEAR", + "output": 9 + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 186, + "max": [ + 95 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1152, + "componentType": 5126, + "count": 96, + "max": [ + 0.33504000306129458, + 0.5, + 0.33504000306129458 + ], + "min": [ + -0.33504000306129458, + -0.5, + -0.33504000306129458 + ], + "type": "VEC3" + }, + { + "bufferView": 0, + "byteOffset": 372, + "componentType": 5123, + "count": 576, + "max": [ + 223 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 2304, + "componentType": 5126, + "count": 224, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 4992, + "componentType": 5126, + "count": 224, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 2, + "max": [ + 2.5 + ], + "min": [ + 1.25 + ], + "type": "SCALAR" + }, + { + "bufferView": 3, + "byteOffset": 0, + "componentType": 5126, + "count": 2, + "max": [ + 1.0, + 0.0, + 0.0, + 4.4896593387466768e-11 + ], + "min": [ + -0.0, + 0.0, + 0.0, + -1.0 + ], + "type": "VEC4" + }, + { + "bufferView": 2, + "byteOffset": 8, + "componentType": 5126, + "count": 4, + "max": [ + 3.708329916000366 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 2.5199999809265138, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.4159420132637024, + 0.7952920198440552, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "inner" + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.3016040027141571, + 0.5335419774055481, + 0.800000011920929, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "outer" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 7784, + "byteLength": 1524, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 80, + "byteLength": 7680, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 7760, + "byteLength": 24 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 32 + }, + { + "buffer": 0, + "byteOffset": 32, + "byteLength": 48 + } + ], + "buffers": [ + { + "byteLength": 9308, + "uri": "BoxAnimated0.bin" + } + ] +} diff --git a/automated-tests/resources/BoxAnimated0.bin b/automated-tests/resources/BoxAnimated0.bin new file mode 100644 index 0000000..2e4ef6e Binary files /dev/null and b/automated-tests/resources/BoxAnimated0.bin differ diff --git a/automated-tests/resources/CesiumMan.gltf b/automated-tests/resources/CesiumMan.gltf new file mode 100644 index 0000000..e9356ff --- /dev/null +++ b/automated-tests/resources/CesiumMan.gltf @@ -0,0 +1,2715 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "scene": 0, + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Z_UP" + }, + { + "children": [ + 3, + 2 + ], + "matrix": [ + -4.371139894487897e-8, + -1, + 0, + 0, + 1, + -4.371139894487897e-8, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Armature" + }, + { + "mesh": 0, + "skin": 0, + "name": "Cesium_Man" + }, + { + "children": [ + 12, + 8, + 4 + ], + "translation": [ + 1.57554005397742e-8, + 0.004999836906790733, + 0.6789999008178711 + ], + "rotation": [ + 0, + -0.0378035344183445, + 0, + -0.9992852210998536 + ], + "name": "Skeleton_torso_joint_1", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 5 + ], + "translation": [ + 0.02855719067156315, + -0.06803914159536362, + -0.06295864284038544 + ], + "rotation": [ + 0, + -0.6898291707038879, + 0, + -0.7239722013473511 + ], + "name": "leg_joint_R_1", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 6 + ], + "translation": [ + 0.26089081168174744, + -0.009026050567626951, + 0.05167089030146599 + ], + "rotation": [ + 0, + -0.0941137745976448, + 0, + -0.9955614805221558 + ], + "scale": [ + 1.0000001192092896, + 1, + 1.0000001192092896 + ], + "name": "leg_joint_R_2" + }, + { + "children": [ + 7 + ], + "translation": [ + 0.27546030282974243, + -0.0014317259192466736, + -0.014104830101132391 + ], + "rotation": [ + 0, + 0.8666408061981201, + 0, + 0.4989325702190399 + ], + "name": "leg_joint_R_3", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "translation": [ + -0.06681963056325912, + -0.001072264974936843, + 0.026351310312747955 + ], + "rotation": [ + 0, + 0.3269147574901581, + 0, + -0.9450538158416748 + ], + "name": "leg_joint_R_5", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 9 + ], + "translation": [ + 0.028519999235868457, + 0.06803944706916809, + -0.06295935809612274 + ], + "rotation": [ + 0, + -0.32463353872299194, + 0, + -0.9458398818969728 + ], + "name": "leg_joint_L_1", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 10 + ], + "translation": [ + 0.20916390419006348, + 0.009055502712726591, + -0.16426950693130493 + ], + "rotation": [ + 0, + -0.5294369459152222, + 0, + -0.8483493328094482 + ], + "scale": [ + 1.0000001192092896, + 1, + 1.0000001192092896 + ], + "name": "leg_joint_L_2" + }, + { + "children": [ + 11 + ], + "translation": [ + 0.27579009532928467, + 0.0013972519664093852, + 0.004122479818761349 + ], + "rotation": [ + 0, + -0.8377647399902344, + 0, + -0.5460314750671387 + ], + "scale": [ + 1, + 0.9999999403953552, + 1 + ], + "name": "leg_joint_L_3" + }, + { + "translation": [ + -0.06558381021022797, + 0.001090653007850051, + 0.02929146029055119 + ], + "rotation": [ + 0, + 0.3130458891391754, + 0, + -0.9497380256652832 + ], + "name": "leg_joint_L_5", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 13 + ], + "translation": [ + 0.0000133617004394182, + -0.000013373800356930587, + 0.14541690051555634 + ], + "rotation": [ + 0, + -0.6573964357376099, + 0, + -0.7535448670387268 + ], + "name": "Skeleton_torso_joint_2", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 20, + 17, + 14 + ], + "translation": [ + -0.2505168914794922, + 6.072219775887788e-7, + -0.00007290810026461259 + ], + "rotation": [ + 0, + 0.6227028965950012, + 0, + -0.7824583649635315 + ], + "name": "torso_joint_3", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 15 + ], + "translation": [ + -0.00003830249988823198, + -0.09098774939775468, + -0.000062032304413151 + ], + "rotation": [ + 0, + 0.9909319281578064, + 0, + -0.13436488807201385 + ], + "name": "Skeleton_arm_joint_R", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 16 + ], + "translation": [ + -0.03554634004831314, + -0.2154989987611771, + 0.10423289984464645 + ], + "rotation": [ + 0, + 0.8961479663848877, + 0, + 0.4437553286552429 + ], + "scale": [ + 0.9999999403953552, + 1, + 0.9999999403953552 + ], + "name": "Skeleton_arm_joint_R__2_" + }, + { + "translation": [ + 0.03137021884322167, + -0.1430010050535202, + -0.11761169880628586 + ], + "rotation": [ + 0, + 0.3792171180248261, + 0, + -0.9253078103065492 + ], + "scale": [ + 1.0000001192092896, + 1, + 1.0000001192092896 + ], + "name": "Skeleton_arm_joint_R__3_" + }, + { + "children": [ + 18 + ], + "translation": [ + -0.00003837469921563752, + 0.091013602912426, + -0.00006143339851405472 + ], + "rotation": [ + 0, + 0.9959768652915956, + 0, + 0.08961082249879837 + ], + "name": "Skeleton_arm_joint_L__4_", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 19 + ], + "translation": [ + 0.01322161965072155, + 0.21549950540065768, + 0.10933209955692293 + ], + "rotation": [ + 0, + -0.0711694285273552, + 0, + -0.9974642395973206 + ], + "name": "Skeleton_arm_joint_L__3_", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "translation": [ + -0.09332461655139924, + 0.1430000960826874, + 0.07814791053533554 + ], + "rotation": [ + 0, + -0.02254222705960274, + 0, + -0.9997459053993224 + ], + "name": "Skeleton_arm_joint_L__2_", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "children": [ + 21 + ], + "translation": [ + -0.000002366030003031483, + 0.000002413989932392724, + 0.06483621150255203 + ], + "rotation": [ + 0, + -0.660634458065033, + 0, + -0.750707745552063 + ], + "name": "Skeleton_neck_joint_1", + "scale": [ + 1, + 1, + 1 + ] + }, + { + "translation": [ + -0.05204017087817192, + -3.3993298842460724e-8, + -0.0000026607899599184748 + ], + "rotation": [ + 0, + 0.9996904730796814, + 0, + 0.024879230186343193 + ], + "scale": [ + 1.0000001192092896, + 1, + 1.0000001192092896 + ], + "name": "Skeleton_neck_joint_2" + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "JOINTS_0": 1, + "NORMAL": 2, + "POSITION": 3, + "TEXCOORD_0": 4, + "WEIGHTS_0": 5 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Cesium_Man" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 3, + "path": "translation" + } + }, + { + "sampler": 1, + "target": { + "node": 3, + "path": "rotation" + } + }, + { + "sampler": 2, + "target": { + "node": 3, + "path": "scale" + } + }, + { + "sampler": 3, + "target": { + "node": 12, + "path": "translation" + } + }, + { + "sampler": 4, + "target": { + "node": 12, + "path": "rotation" + } + }, + { + "sampler": 5, + "target": { + "node": 12, + "path": "scale" + } + }, + { + "sampler": 6, + "target": { + "node": 13, + "path": "translation" + } + }, + { + "sampler": 7, + "target": { + "node": 13, + "path": "rotation" + } + }, + { + "sampler": 8, + "target": { + "node": 13, + "path": "scale" + } + }, + { + "sampler": 9, + "target": { + "node": 20, + "path": "translation" + } + }, + { + "sampler": 10, + "target": { + "node": 20, + "path": "rotation" + } + }, + { + "sampler": 11, + "target": { + "node": 20, + "path": "scale" + } + }, + { + "sampler": 12, + "target": { + "node": 21, + "path": "translation" + } + }, + { + "sampler": 13, + "target": { + "node": 21, + "path": "rotation" + } + }, + { + "sampler": 14, + "target": { + "node": 21, + "path": "scale" + } + }, + { + "sampler": 15, + "target": { + "node": 17, + "path": "translation" + } + }, + { + "sampler": 16, + "target": { + "node": 17, + "path": "rotation" + } + }, + { + "sampler": 17, + "target": { + "node": 17, + "path": "scale" + } + }, + { + "sampler": 18, + "target": { + "node": 18, + "path": "translation" + } + }, + { + "sampler": 19, + "target": { + "node": 18, + "path": "rotation" + } + }, + { + "sampler": 20, + "target": { + "node": 18, + "path": "scale" + } + }, + { + "sampler": 21, + "target": { + "node": 19, + "path": "translation" + } + }, + { + "sampler": 22, + "target": { + "node": 19, + "path": "rotation" + } + }, + { + "sampler": 23, + "target": { + "node": 19, + "path": "scale" + } + }, + { + "sampler": 24, + "target": { + "node": 14, + "path": "translation" + } + }, + { + "sampler": 25, + "target": { + "node": 14, + "path": "rotation" + } + }, + { + "sampler": 26, + "target": { + "node": 14, + "path": "scale" + } + }, + { + "sampler": 27, + "target": { + "node": 15, + "path": "translation" + } + }, + { + "sampler": 28, + "target": { + "node": 15, + "path": "rotation" + } + }, + { + "sampler": 29, + "target": { + "node": 15, + "path": "scale" + } + }, + { + "sampler": 30, + "target": { + "node": 16, + "path": "translation" + } + }, + { + "sampler": 31, + "target": { + "node": 16, + "path": "rotation" + } + }, + { + "sampler": 32, + "target": { + "node": 16, + "path": "scale" + } + }, + { + "sampler": 33, + "target": { + "node": 8, + "path": "translation" + } + }, + { + "sampler": 34, + "target": { + "node": 8, + "path": "rotation" + } + }, + { + "sampler": 35, + "target": { + "node": 8, + "path": "scale" + } + }, + { + "sampler": 36, + "target": { + "node": 9, + "path": "translation" + } + }, + { + "sampler": 37, + "target": { + "node": 9, + "path": "rotation" + } + }, + { + "sampler": 38, + "target": { + "node": 9, + "path": "scale" + } + }, + { + "sampler": 39, + "target": { + "node": 10, + "path": "translation" + } + }, + { + "sampler": 40, + "target": { + "node": 10, + "path": "rotation" + } + }, + { + "sampler": 41, + "target": { + "node": 10, + "path": "scale" + } + }, + { + "sampler": 42, + "target": { + "node": 11, + "path": "translation" + } + }, + { + "sampler": 43, + "target": { + "node": 11, + "path": "rotation" + } + }, + { + "sampler": 44, + "target": { + "node": 11, + "path": "scale" + } + }, + { + "sampler": 45, + "target": { + "node": 4, + "path": "translation" + } + }, + { + "sampler": 46, + "target": { + "node": 4, + "path": "rotation" + } + }, + { + "sampler": 47, + "target": { + "node": 4, + "path": "scale" + } + }, + { + "sampler": 48, + "target": { + "node": 5, + "path": "translation" + } + }, + { + "sampler": 49, + "target": { + "node": 5, + "path": "rotation" + } + }, + { + "sampler": 50, + "target": { + "node": 5, + "path": "scale" + } + }, + { + "sampler": 51, + "target": { + "node": 6, + "path": "translation" + } + }, + { + "sampler": 52, + "target": { + "node": 6, + "path": "rotation" + } + }, + { + "sampler": 53, + "target": { + "node": 6, + "path": "scale" + } + }, + { + "sampler": 54, + "target": { + "node": 7, + "path": "translation" + } + }, + { + "sampler": 55, + "target": { + "node": 7, + "path": "rotation" + } + }, + { + "sampler": 56, + "target": { + "node": 7, + "path": "scale" + } + } + ], + "samplers": [ + { + "input": 6, + "interpolation": "LINEAR", + "output": 7 + }, + { + "input": 6, + "interpolation": "LINEAR", + "output": 8 + }, + { + "input": 6, + "interpolation": "LINEAR", + "output": 9 + }, + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + }, + { + "input": 10, + "interpolation": "LINEAR", + "output": 12 + }, + { + "input": 10, + "interpolation": "LINEAR", + "output": 13 + }, + { + "input": 14, + "interpolation": "LINEAR", + "output": 15 + }, + { + "input": 14, + "interpolation": "LINEAR", + "output": 16 + }, + { + "input": 14, + "interpolation": "LINEAR", + "output": 17 + }, + { + "input": 18, + "interpolation": "LINEAR", + "output": 19 + }, + { + "input": 18, + "interpolation": "LINEAR", + "output": 20 + }, + { + "input": 18, + "interpolation": "LINEAR", + "output": 21 + }, + { + "input": 22, + "interpolation": "LINEAR", + "output": 23 + }, + { + "input": 22, + "interpolation": "LINEAR", + "output": 24 + }, + { + "input": 22, + "interpolation": "LINEAR", + "output": 25 + }, + { + "input": 26, + "interpolation": "LINEAR", + "output": 27 + }, + { + "input": 26, + "interpolation": "LINEAR", + "output": 28 + }, + { + "input": 26, + "interpolation": "LINEAR", + "output": 29 + }, + { + "input": 30, + "interpolation": "LINEAR", + "output": 31 + }, + { + "input": 30, + "interpolation": "LINEAR", + "output": 32 + }, + { + "input": 30, + "interpolation": "LINEAR", + "output": 33 + }, + { + "input": 34, + "interpolation": "LINEAR", + "output": 35 + }, + { + "input": 34, + "interpolation": "LINEAR", + "output": 36 + }, + { + "input": 34, + "interpolation": "LINEAR", + "output": 37 + }, + { + "input": 38, + "interpolation": "LINEAR", + "output": 39 + }, + { + "input": 38, + "interpolation": "LINEAR", + "output": 40 + }, + { + "input": 38, + "interpolation": "LINEAR", + "output": 41 + }, + { + "input": 42, + "interpolation": "LINEAR", + "output": 43 + }, + { + "input": 42, + "interpolation": "LINEAR", + "output": 44 + }, + { + "input": 42, + "interpolation": "LINEAR", + "output": 45 + }, + { + "input": 46, + "interpolation": "LINEAR", + "output": 47 + }, + { + "input": 46, + "interpolation": "LINEAR", + "output": 48 + }, + { + "input": 46, + "interpolation": "LINEAR", + "output": 49 + }, + { + "input": 50, + "interpolation": "LINEAR", + "output": 51 + }, + { + "input": 50, + "interpolation": "LINEAR", + "output": 52 + }, + { + "input": 50, + "interpolation": "LINEAR", + "output": 53 + }, + { + "input": 54, + "interpolation": "LINEAR", + "output": 55 + }, + { + "input": 54, + "interpolation": "LINEAR", + "output": 56 + }, + { + "input": 54, + "interpolation": "LINEAR", + "output": 57 + }, + { + "input": 58, + "interpolation": "LINEAR", + "output": 59 + }, + { + "input": 58, + "interpolation": "LINEAR", + "output": 60 + }, + { + "input": 58, + "interpolation": "LINEAR", + "output": 61 + }, + { + "input": 62, + "interpolation": "LINEAR", + "output": 63 + }, + { + "input": 62, + "interpolation": "LINEAR", + "output": 64 + }, + { + "input": 62, + "interpolation": "LINEAR", + "output": 65 + }, + { + "input": 66, + "interpolation": "LINEAR", + "output": 67 + }, + { + "input": 66, + "interpolation": "LINEAR", + "output": 68 + }, + { + "input": 66, + "interpolation": "LINEAR", + "output": 69 + }, + { + "input": 70, + "interpolation": "LINEAR", + "output": 71 + }, + { + "input": 70, + "interpolation": "LINEAR", + "output": 72 + }, + { + "input": 70, + "interpolation": "LINEAR", + "output": 73 + }, + { + "input": 74, + "interpolation": "LINEAR", + "output": 75 + }, + { + "input": 74, + "interpolation": "LINEAR", + "output": 76 + }, + { + "input": 74, + "interpolation": "LINEAR", + "output": 77 + }, + { + "input": 78, + "interpolation": "LINEAR", + "output": 79 + }, + { + "input": 78, + "interpolation": "LINEAR", + "output": 80 + }, + { + "input": 78, + "interpolation": "LINEAR", + "output": 81 + } + ] + } + ], + "skins": [ + { + "inverseBindMatrices": 82, + "skeleton": 3, + "joints": [ + 3, + 12, + 13, + 20, + 21, + 17, + 14, + 18, + 15, + 19, + 16, + 8, + 4, + 9, + 5, + 10, + 6, + 11, + 7 + ], + "name": "Armature" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 14016, + "max": [ + 3272 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5123, + "count": 3273, + "max": [ + 18, + 18, + 18, + 18 + ], + "min": [ + 0, + 0, + 0, + 0 + ], + "type": "VEC4" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 3273, + "max": [ + 1, + 0.9999808073043824, + 0.9944415092468262 + ], + "min": [ + -1, + -0.9999808073043824, + -1 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 39276, + "componentType": 5126, + "count": 3273, + "max": [ + 0.1809539943933487, + 0.569136917591095, + 1.5065499544143677 + ], + "min": [ + -0.13100001215934753, + -0.5691370964050293, + 0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 26184, + "componentType": 5126, + "count": 3273, + "max": [ + 0.990805983543396, + 0.9880298972129822 + ], + "min": [ + 0.014079390093684196, + 0.008445978164672852 + ], + "type": "VEC2" + }, + { + "bufferView": 3, + "byteOffset": 0, + "componentType": 5126, + "count": 3273, + "max": [ + 1, + 0.989919900894165, + 0.9510763883590698, + 0.9196179509162904 + ], + "min": [ + 0.010080089792609217, + 0, + 0, + 0 + ], + "type": "VEC4" + }, + { + "bufferView": 4, + "byteOffset": 0, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 0, + "componentType": 5126, + "count": 48, + "max": [ + 3.880559873437051e-8, + -0.02000010944902897, + 0.7110069990158081 + ], + "min": [ + 2.716890046272624e-9, + -0.030000129714608192, + 0.6399999856948853 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 0, + "componentType": 5126, + "count": 48, + "max": [ + 0.0001435002632206306, + -0.02146764844655991, + -0.000009948204024112783, + -0.9980905055999756 + ], + "min": [ + -0.012384946458041668, + -0.06042621284723282, + -0.0041049933061003685, + -0.9997026920318604 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 576, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000004768371584, + 1.0000001192092896, + 1.000000238418579 + ], + "min": [ + 0.9999999403953552, + 0.9999998211860656, + 0.9999997615814208 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 192, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 1152, + "componentType": 5126, + "count": 48, + "max": [ + 0.000013520900211005937, + 0.0009866129839792848, + 0.1454171985387802 + ], + "min": [ + 0.000013436199878924528, + 0.0009865909814834597, + 0.145416796207428 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 768, + "componentType": 5126, + "count": 48, + "max": [ + 0.011148878373205662, + -0.7106494903564453, + 0.0006393495132215321, + -0.6787928938865662 + ], + "min": [ + -0.008564536459743977, + -0.7339289784431458, + -0.025856714695692062, + -0.7034341096878052 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 1728, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000004768371584, + 1.000000238418579, + 0.9999998211860656 + ], + "min": [ + 0.9999999403953552, + 0.9999998807907104, + 0.9999989867210388 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 384, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 2304, + "componentType": 5126, + "count": 48, + "max": [ + -0.25051650404930115, + 5.923209869251878e-7, + -0.00007277730037458241 + ], + "min": [ + -0.25051701068878174, + 5.58793999516638e-7, + -0.00007287789776455611 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 1536, + "componentType": 5126, + "count": 48, + "max": [ + 0.13804565370082855, + 0.6359269618988037, + -0.003375347936525941, + -0.7641801238059998 + ], + "min": [ + -0.06163197010755539, + 0.6225405335426331, + -0.0653248131275177, + -0.7825579643249512 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 2880, + "componentType": 5126, + "count": 48, + "max": [ + 1.000001072883606, + 1.0000003576278689, + 1 + ], + "min": [ + 1.0000004768371584, + 0.9999999403953552, + 0.999999463558197 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 576, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 3456, + "componentType": 5126, + "count": 48, + "max": [ + -0.000002384189883741783, + 0.000002458690005369135, + 0.06483876705169678 + ], + "min": [ + -0.000002536919964768458, + 0.000002384189883741783, + 0.06483828276395798 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 2304, + "componentType": 5126, + "count": 48, + "max": [ + 0.0364987850189209, + -0.6325404644012451, + 0.04193282127380371, + -0.749859094619751 + ], + "min": [ + -0.02474863827228546, + -0.6592763066291809, + -0.03008362464606762, + -0.7735469341278076 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 4032, + "componentType": 5126, + "count": 48, + "max": [ + 1, + 1.000000238418579, + 1.000000238418579 + ], + "min": [ + 0.9999996423721313, + 0.9999995231628418, + 0.9999995827674866 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 768, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 4608, + "componentType": 5126, + "count": 48, + "max": [ + -0.0520395003259182, + 7.450579708745408e-9, + -0.000002585350102890516 + ], + "min": [ + -0.05204005911946297, + -5.96045985901128e-8, + -0.0000026747600259113824 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 3072, + "componentType": 5126, + "count": 48, + "max": [ + 0.04680187255144119, + 0.999507486820221, + 0.002036086050793529, + 0.09058715403079988 + ], + "min": [ + -0.093629889190197, + 0.9950671792030336, + -0.00258980062790215, + 0.0184526015073061 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 5184, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000003576278689, + 1.000000238418579, + 1.0000009536743164 + ], + "min": [ + 0.9999998807907104, + 0.9999996423721313, + 1.000000238418579 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 960, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 5760, + "componentType": 5126, + "count": 48, + "max": [ + -0.00003742050103028305, + 0.08800023794174194, + -0.00005880460230400786 + ], + "min": [ + -0.000037621699448209256, + 0.08799994736909866, + -0.000059304802562110126 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 3840, + "componentType": 5126, + "count": 48, + "max": [ + 0.2951536476612091, + 0.9301012754440308, + -0.2815393805503845, + 0.3835828900337219 + ], + "min": [ + -0.13552021980285645, + 0.8065234422683716, + -0.4443180561065674, + -0.17752912640571597 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 6336, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000005960464478, + 1.0000001192092896, + 1.0000003576278689 + ], + "min": [ + 0.9999999403953552, + 0.9999996423721313, + 0.9999998211860656 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 1152, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 6912, + "componentType": 5126, + "count": 48, + "max": [ + 0.013221889734268188, + 0.215499609708786, + 0.10933230072259904 + ], + "min": [ + 0.01322161965072155, + 0.2154994010925293, + 0.10933209955692293 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 4608, + "componentType": 5126, + "count": 48, + "max": [ + 0.023567700758576393, + 0.02101488783955574, + 0.176296666264534, + -0.971515953540802 + ], + "min": [ + -0.0574759915471077, + -0.18002526462078097, + -0.15063291788101196, + -0.998132348060608 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 7488, + "componentType": 5126, + "count": 48, + "max": [ + 0.9999998211860656, + 0.9999998211860656, + 0.9999999403953552 + ], + "min": [ + 0.9999991059303284, + 0.9999993443489076, + 0.9999994039535524 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 1344, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 8064, + "componentType": 5126, + "count": 48, + "max": [ + -0.09332455694675446, + 0.1430000960826874, + 0.07814794778823853 + ], + "min": [ + -0.09332473576068878, + 0.14299990236759189, + 0.07814773917198181 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 5376, + "componentType": 5126, + "count": 48, + "max": [ + 0.03372078761458397, + 0.0026474546175450087, + 0.207317128777504, + -0.9705979824066162 + ], + "min": [ + 0.006105833686888218, + -0.12215615808963776, + 0.003784916130825877, + -0.9994208216667176 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 8640, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000007152557373, + 1.0000003576278689, + 1.0000008344650269 + ], + "min": [ + 1.0000001192092896, + 0.9999998211860656, + 1.000000238418579 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 1536, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 9216, + "componentType": 5126, + "count": 48, + "max": [ + -0.00003894419933203608, + -0.0879998430609703, + -0.00005919210161664523 + ], + "min": [ + -0.0000392795009247493, + -0.08800008893013, + -0.00005960090129519813 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 6144, + "componentType": 5126, + "count": 48, + "max": [ + 0.2377220243215561, + 0.942186713218689, + 0.37760788202285767, + 0.2007839232683182 + ], + "min": [ + -0.2700891792774201, + 0.8732703924179077, + 0.2710656225681305, + -0.2673804461956024 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 9792, + "componentType": 5126, + "count": 48, + "max": [ + 1.000000238418579, + 1.0000003576278689, + 1.0000001192092896 + ], + "min": [ + 0.999999701976776, + 0.9999997615814208, + 0.9999997615814208 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 1728, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 10368, + "componentType": 5126, + "count": 48, + "max": [ + -0.035546209663152695, + -0.21549880504608157, + 0.10423330217599867 + ], + "min": [ + -0.03554638102650643, + -0.21549910306930545, + 0.10423299670219421 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 6912, + "componentType": 5126, + "count": 48, + "max": [ + -0.00792065542191267, + 0.9315358996391296, + 0.0024673622101545334, + 0.41479358077049255 + ], + "min": [ + -0.15234939754009247, + 0.9063802361488342, + -0.08167753368616104, + 0.3280625641345978 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 10944, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000005960464478, + 1.0000001192092896, + 1.000000238418579 + ], + "min": [ + 1, + 0.9999996423721313, + 0.9999996423721313 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 1920, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 11520, + "componentType": 5126, + "count": 48, + "max": [ + 0.03137049078941345, + -0.1430007964372635, + -0.11761150509119034 + ], + "min": [ + 0.03137030825018883, + -0.1430010050535202, + -0.11761169880628586 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 7680, + "componentType": 5126, + "count": 48, + "max": [ + 0.22148266434669495, + 0.3926030695438385, + 0.08952529728412628, + -0.9178923964500428 + ], + "min": [ + 0.055695075541734695, + 0.277910977602005, + -0.015314305201172829, + -0.9438881278038024 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 12096, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000004768371584, + 1.0000004768371584, + 1.0000004768371584 + ], + "min": [ + 0.9999997615814208, + 0.9999997615814208, + 0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 2112, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 12672, + "componentType": 5126, + "count": 48, + "max": [ + 0.028520189225673676, + 0.06762184202671051, + -0.06295985728502274 + ], + "min": [ + 0.028520019724965096, + 0.06762173771858215, + -0.06296010315418243 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 8448, + "componentType": 5126, + "count": 48, + "max": [ + 0.013129070401191711, + 0.10440785437822342, + 0.004284336231648922, + -0.7728573679924011 + ], + "min": [ + -0.013805897906422617, + -0.6344362497329712, + -0.03212129324674606, + -0.9994977116584778 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 13248, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000001192092896, + 1.0000004768371584, + 1.000000238418579 + ], + "min": [ + 0.9999995231628418, + 1, + 0.9999995827674866 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 2304, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 13824, + "componentType": 5126, + "count": 48, + "max": [ + 0.209164097905159, + 0.009055494330823421, + -0.16426970064640045 + ], + "min": [ + 0.20916390419006348, + 0.009055464528501034, + -0.1642698049545288 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 9216, + "componentType": 5126, + "count": 48, + "max": [ + 0.009955321438610554, + -0.2965533435344696, + 0.003957682754844427, + -0.1911347657442093 + ], + "min": [ + -0.00983923487365246, + -0.9813112020492554, + -0.02193812094628811, + -0.9549583792686462 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 14400, + "componentType": 5126, + "count": 48, + "max": [ + 1.000000238418579, + 0.999999463558197, + 1.0000001192092896 + ], + "min": [ + 0.999999463558197, + 0.999998927116394, + 0.9999993443489076 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 2496, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 14976, + "componentType": 5126, + "count": 48, + "max": [ + 0.2757900059223175, + 0.0013972820015624166, + 0.004122554790228605 + ], + "min": [ + 0.27578991651535034, + 0.0013972449814900756, + 0.004122436046600342 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 9984, + "componentType": 5126, + "count": 48, + "max": [ + 0.01264618057757616, + -0.8448027968406677, + 0.03285584971308708, + -0.15347692370414737 + ], + "min": [ + -0.045710742473602295, + -0.9879721403121948, + 0.007757793180644512, + -0.5345877408981323 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 15552, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000008344650269, + 1.0000009536743164, + 1.0000004768371584 + ], + "min": [ + 1.000000238418579, + 1.0000003576278689, + 0.9999997615814208 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 2688, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 16128, + "componentType": 5126, + "count": 48, + "max": [ + -0.06558377295732498, + 0.00109061598777771, + 0.029291389510035515 + ], + "min": [ + -0.06558384746313095, + 0.001090570935048163, + 0.029291240498423576 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 10752, + "componentType": 5126, + "count": 48, + "max": [ + 0.022798636928200725, + 0.5332140922546387, + -0.003377946326509118, + -0.844382643699646 + ], + "min": [ + 0.007516560610383749, + 0.22626954317092896, + -0.04913739487528801, + -0.972984254360199 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 16704, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000008344650269, + 1.0000003576278689, + 1.0000003576278689 + ], + "min": [ + 0.9999998211860656, + 0.999999701976776, + 0.9999995231628418 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 2880, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 17280, + "componentType": 5126, + "count": 48, + "max": [ + 0.028557300567626953, + -0.0684543326497078, + -0.06295845657587051 + ], + "min": [ + 0.028557060286402702, + -0.06845436990261078, + -0.0629587471485138 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 11520, + "componentType": 5126, + "count": 48, + "max": [ + 0.04037770628929138, + -0.2803998589515686, + 0.02151232957839966, + -0.32386553287506104 + ], + "min": [ + -0.009615562856197357, + -0.9458208084106444, + -0.006491139996796846, + -0.9590301513671876 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 17856, + "componentType": 5126, + "count": 48, + "max": [ + 1.000000238418579, + 1.0000005960464478, + 1.0000005960464478 + ], + "min": [ + 0.9999994039535524, + 0.9999999403953552, + 0.9999998211860656 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 3072, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 18432, + "componentType": 5126, + "count": 48, + "max": [ + 0.2608909010887146, + -0.00902603566646576, + 0.05167100951075554 + ], + "min": [ + 0.2608906924724579, + -0.009026064537465572, + 0.05167080089449883 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 12288, + "componentType": 5126, + "count": 48, + "max": [ + 0.02468797937035561, + 0.19154119491577148, + 0.017835097387433052, + -0.6250466108322144 + ], + "min": [ + -0.013421673327684404, + -0.7804162502288818, + -0.031287722289562225, + -0.9999792575836182 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 19008, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000003576278689, + 1.0000007152557373, + 1.000001072883606 + ], + "min": [ + 0.999999463558197, + 1, + 0.999999701976776 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 3264, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 19584, + "componentType": 5126, + "count": 48, + "max": [ + 0.2754603922367096, + -0.0014316890155896544, + -0.014104750007390976 + ], + "min": [ + 0.27546021342277527, + -0.0014317409368231893, + -0.014104840345680714 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 13056, + "componentType": 5126, + "count": 48, + "max": [ + 0.022092316299676895, + 0.9990847110748292, + 0.04779285565018654, + 0.4428757429122925 + ], + "min": [ + -0.001671039150096476, + 0.8965795040130615, + 0.002310338197275996, + 0.0384783074259758 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 20160, + "componentType": 5126, + "count": 48, + "max": [ + 0.9999999403953552, + 0.9999996423721313, + 1.000000238418579 + ], + "min": [ + 0.9999994039535524, + 0.9999991655349731, + 0.9999996423721313 + ], + "type": "VEC3" + }, + { + "bufferView": 4, + "byteOffset": 3456, + "componentType": 5126, + "count": 48, + "max": [ + 2 + ], + "min": [ + 0.04166661947965622 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 20736, + "componentType": 5126, + "count": 48, + "max": [ + -0.06681966781616211, + -0.0010721459984779358, + 0.026351390406489372 + ], + "min": [ + -0.06681978702545166, + -0.001072190934792161, + 0.02635126002132893 + ], + "type": "VEC3" + }, + { + "bufferView": 6, + "byteOffset": 13824, + "componentType": 5126, + "count": 48, + "max": [ + 0.003402489935979247, + 0.4966025054454804, + 0.1101396307349205, + -0.8675833940505981 + ], + "min": [ + -0.027623889967799187, + 0.26874634623527527, + -0.02591408602893353, + -0.9565747380256652 + ], + "type": "VEC4" + }, + { + "bufferView": 5, + "byteOffset": 21312, + "componentType": 5126, + "count": 48, + "max": [ + 1.0000004768371584, + 0.9999998211860656, + 0.9999994039535524 + ], + "min": [ + 0.9999995231628418, + 0.999999225139618, + 0.9999986886978148 + ], + "type": "VEC3" + }, + { + "bufferView": 7, + "byteOffset": 0, + "componentType": 5126, + "count": 19, + "max": [ + 0.9971418380737304, + -4.371139894487897e-8, + 0.9996265172958374, + 0, + 4.3586464215650273e-8, + 1, + 4.3695074225524884e-8, + 0, + 0.9999366402626038, + 0, + 0.9971418380737304, + 0, + 1.1374080181121828, + 0.44450080394744873, + 1.0739599466323853, + 1 + ], + "min": [ + -0.9999089241027832, + -4.371139894487897e-8, + -0.9999366402626038, + 0, + -4.3707416352845037e-8, + 1, + -4.37086278282095e-8, + 0, + -0.9996265172958374, + 0, + -0.9999089241027832, + 0, + -1.189831018447876, + -0.45450031757354736, + -1.058603048324585, + 1 + ], + "type": "MAT4" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "baseColorFactor": [ + 1, + 1, + 1, + 1 + ], + "roughnessFactor": 1 + }, + "emissiveFactor": [ + 0, + 0, + 0 + ], + "name": "Cesium_Man-effect", + "alphaMode": "OPAQUE", + "doubleSided": false + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "images": [ + { + "uri": "CesiumMan_img0.jpg" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9986, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 28032, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 28032, + "byteLength": 52368, + "byteStride": 8, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 80400, + "byteLength": 78552, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 158952, + "byteLength": 52368, + "byteStride": 16, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 211320, + "byteLength": 3648 + }, + { + "buffer": 0, + "byteOffset": 214968, + "byteLength": 21888 + }, + { + "buffer": 0, + "byteOffset": 236856, + "byteLength": 14592 + }, + { + "buffer": 0, + "byteOffset": 251448, + "byteLength": 1216 + } + ], + "buffers": [ + { + "uri": "CesiumMan_data.bin", + "byteLength": 252664 + } + ] +} \ No newline at end of file diff --git a/automated-tests/resources/CesiumMan_data.bin b/automated-tests/resources/CesiumMan_data.bin new file mode 100644 index 0000000..d78b75c Binary files /dev/null and b/automated-tests/resources/CesiumMan_data.bin differ diff --git a/automated-tests/resources/CesiumMilkTruck.gltf b/automated-tests/resources/CesiumMilkTruck.gltf new file mode 100644 index 0000000..c9a24e3 --- /dev/null +++ b/automated-tests/resources/CesiumMilkTruck.gltf @@ -0,0 +1,489 @@ +{ + "asset": { + "generator": "Khronos glTF Blender I/O v1.0.5", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "name": "Scene", + "nodes": [ + 5 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "name": "Wheels", + "rotation": [ + 0, + 0.08848588913679123, + 0, + -0.9960774183273315 + ] + }, + { + "children": [ + 0 + ], + "name": "Node", + "translation": [ + 1.432669997215271, + 0, + -0.4277220070362091 + ] + }, + { + "mesh": 0, + "name": "Wheels.001", + "rotation": [ + 0, + 0.08848588913679123, + 0, + -0.9960774183273315 + ] + }, + { + "children": [ + 2 + ], + "name": "Node.001", + "translation": [ + -1.352329969406128, + 0, + -0.4277220070362091 + ] + }, + { + "children": [ + 1, + 3 + ], + "mesh": 1, + "name": "Cesium_Milk_Truck" + }, + { + "children": [ + 4 + ], + "name": "Yup2Zup", + "rotation": [ + 0.4999999701976776, + -0.5, + 0.5, + 0.4999999701976776 + ] + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "rotation" + } + }, + { + "sampler": 1, + "target": { + "node": 2, + "path": "rotation" + } + } + ], + "name": "Wheels", + "samplers": [ + { + "input": 16, + "interpolation": "LINEAR", + "output": 17 + }, + { + "input": 16, + "interpolation": "LINEAR", + "output": 18 + } + ] + } + ], + "materials": [ + { + "name": "wheels", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + } + }, + { + "name": "truck", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 1, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + } + }, + { + "name": "glass", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0, + 0.04050629958510399, + 0.021240700036287308, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 1 + } + }, + { + "name": "window_trim", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.06400000303983688, + 0.06400000303983688, + 0.06400000303983688, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 1 + } + } + ], + "meshes": [ + { + "name": "Wheels", + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0 + } + ] + }, + { + "name": "Cesium_Milk_Truck", + "primitives": [ + { + "attributes": { + "POSITION": 4, + "NORMAL": 5, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1 + }, + { + "attributes": { + "POSITION": 8, + "NORMAL": 9, + "TEXCOORD_0": 10 + }, + "indices": 11, + "material": 2 + }, + { + "attributes": { + "POSITION": 12, + "NORMAL": 13, + "TEXCOORD_0": 14 + }, + "indices": 15, + "material": 3 + } + ] + } + ], + "textures": [ + { + "source": 0 + }, + { + "source": 0 + } + ], + "images": [ + { + "name": "CesiumMilkTruck.jpg", + "uri": "CesiumMilkTruck.jpg" + } + ], + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 828, + "max": [ + 0.4277999997138977, + 1.0579999685287476, + 0.4277999997138977 + ], + "min": [ + -0.4277999997138977, + -1.0579999685287476, + -0.4277999997138977 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 828, + "type": "VEC3" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 828, + "type": "VEC2" + }, + { + "bufferView": 3, + "componentType": 5123, + "count": 2304, + "type": "SCALAR" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 2366, + "max": [ + 2.437999963760376, + 1.3960000276565552, + -0.2667999863624573 + ], + "min": [ + -2.430910110473633, + -1.3960000276565552, + -2.5843698978424072 + ], + "type": "VEC3" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 2366, + "type": "VEC3" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 2366, + "type": "VEC2" + }, + { + "bufferView": 7, + "componentType": 5123, + "count": 5232, + "type": "SCALAR" + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 151, + "max": [ + 1.6011799573898315, + 1.3960000276565552, + -1.631850004196167 + ], + "min": [ + 0.22885000705718994, + -1.3960000276565552, + -2.3545401096343994 + ], + "type": "VEC3" + }, + { + "bufferView": 9, + "componentType": 5126, + "count": 151, + "type": "VEC3" + }, + { + "bufferView": 10, + "componentType": 5126, + "count": 151, + "type": "VEC2" + }, + { + "bufferView": 11, + "componentType": 5123, + "count": 168, + "type": "SCALAR" + }, + { + "bufferView": 12, + "componentType": 5126, + "count": 650, + "max": [ + 1.62267005443573, + 1.100000023841858, + -1.5961999893188477 + ], + "min": [ + 0.1932000070810318, + -1.1100000143051147, + -2.3919999599456787 + ], + "type": "VEC3" + }, + { + "bufferView": 13, + "componentType": 5126, + "count": 650, + "type": "VEC3" + }, + { + "bufferView": 14, + "componentType": 5126, + "count": 650, + "type": "VEC2" + }, + { + "bufferView": 15, + "componentType": 5123, + "count": 864, + "type": "SCALAR" + }, + { + "bufferView": 16, + "componentType": 5126, + "count": 31, + "max": [ + 1.25 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 17, + "componentType": 5126, + "count": 31, + "type": "VEC4" + }, + { + "bufferView": 18, + "componentType": 5126, + "count": 31, + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 9936, + "byteOffset": 0 + }, + { + "buffer": 0, + "byteLength": 9936, + "byteOffset": 9936 + }, + { + "buffer": 0, + "byteLength": 6624, + "byteOffset": 19872 + }, + { + "buffer": 0, + "byteLength": 4608, + "byteOffset": 26496 + }, + { + "buffer": 0, + "byteLength": 28392, + "byteOffset": 31104 + }, + { + "buffer": 0, + "byteLength": 28392, + "byteOffset": 59496 + }, + { + "buffer": 0, + "byteLength": 18928, + "byteOffset": 87888 + }, + { + "buffer": 0, + "byteLength": 10464, + "byteOffset": 106816 + }, + { + "buffer": 0, + "byteLength": 1812, + "byteOffset": 117280 + }, + { + "buffer": 0, + "byteLength": 1812, + "byteOffset": 119092 + }, + { + "buffer": 0, + "byteLength": 1208, + "byteOffset": 120904 + }, + { + "buffer": 0, + "byteLength": 336, + "byteOffset": 122112 + }, + { + "buffer": 0, + "byteLength": 7800, + "byteOffset": 122448 + }, + { + "buffer": 0, + "byteLength": 7800, + "byteOffset": 130248 + }, + { + "buffer": 0, + "byteLength": 5200, + "byteOffset": 138048 + }, + { + "buffer": 0, + "byteLength": 1728, + "byteOffset": 143248 + }, + { + "buffer": 0, + "byteLength": 124, + "byteOffset": 144976 + }, + { + "buffer": 0, + "byteLength": 496, + "byteOffset": 145100 + }, + { + "buffer": 0, + "byteLength": 496, + "byteOffset": 145596 + } + ], + "buffers": [ + { + "uri": "CesiumMilkTruck_data.bin", + "byteLength": 146092 + } + ] +} diff --git a/automated-tests/resources/CesiumMilkTruck_data.bin b/automated-tests/resources/CesiumMilkTruck_data.bin new file mode 100644 index 0000000..51e3646 Binary files /dev/null and b/automated-tests/resources/CesiumMilkTruck_data.bin differ diff --git a/automated-tests/resources/EnvironmentTest.gltf b/automated-tests/resources/EnvironmentTest.gltf new file mode 100644 index 0000000..962e475 --- /dev/null +++ b/automated-tests/resources/EnvironmentTest.gltf @@ -0,0 +1,328 @@ +{ + "asset": { + "copyright": "2018 (c) Adobe Systems Inc.", + "generator": "Adobe Dimension - b417c10282aa66313155856d4a54e84f3f388647", + "version": "2.0" + }, + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4598, + "type": "VEC3", + "max": [ + 10.647041320800782, + 1.6470409631729127, + 0.6470409631729126 + ], + "min": [ + -10.647041320800782, + 0.3529590368270874, + -0.6470409631729126 + ] + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 4598, + "type": "VEC3" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 4598, + "type": "VEC2" + }, + { + "bufferView": 3, + "componentType": 5125, + "count": 25344, + "type": "SCALAR", + "max": [ + 4597.0 + ], + "min": [ + 0.0 + ] + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 4598, + "type": "VEC3", + "max": [ + 10.647041320800782, + -0.3529590368270874, + 0.6470409631729126 + ], + "min": [ + -10.647041320800782, + -1.6470409631729127, + -0.6470409631729126 + ] + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 4598, + "type": "VEC2" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 55176, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 55176, + "byteLength": 55176, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 110352, + "byteLength": 36784, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 147136, + "byteLength": 101376, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 248512, + "byteLength": 55176, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 303688, + "byteLength": 36784, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 340472, + "uri": "EnvironmentTest_binary.bin" + } + ], + "cameras": [ + { + "perspective": { + "znear": 0.0010000000474974514, + "yfov": 0.6024156808853149, + "zfar": 200.0, + "aspectRatio": 1.3333333730697632 + }, + "type": "perspective", + "name": "render_camera" + } + ], + "images": [ + { + "name": "tmp_image_pie_dc1e_1a22_fbf9roughness_map_roughness_tmp_image_pie_dc1e_1a22_fbf9metal_map_metallic_0", + "uri": "EnvironmentTest_images/roughness_metallic_0.jpg", + "mimeType": "image/jpeg" + }, + { + "name": "tmp_image_pie_b20b_ebb4_317droughness_map2_roughness_tmp_image_pie_b20b_ebb4_317dmetal_map2_metallic_1", + "uri": "EnvironmentTest_images/roughness_metallic_1.jpg", + "mimeType": "image/jpeg" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicRoughnessTexture": { + "index": 0 + } + }, + "name": "MetallicSpheresMat", + "doubleSided": true + }, + { + "pbrMetallicRoughness": { + "metallicRoughnessTexture": { + "index": 1 + } + }, + "name": "DielectricSpheresMat", + "doubleSided": true + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "metallicRoughnessTexture": { + "index": 1 + } + }, + "name": "DielectricSpheresMat", + "doubleSided": true + } + ], + "meshes": [ + { + "name": "Metallic0_N3D", + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0 + } + ] + }, + { + "name": "Dielectric0_N3D2", + "primitives": [ + { + "attributes": { + "TEXCOORD_0": 5, + "NORMAL": 1, + "POSITION": 4 + }, + "indices": 3, + "material": 1 + } + ] + }, + { + "name": "Dielectric0_N3D", + "primitives": [ + { + "attributes": { + "POSITION": 4, + "NORMAL": 1, + "TEXCOORD_0": 5 + }, + "indices": 3, + "material": 2 + } + ] + } + ], + "nodes": [ + { + "matrix": [ + 0.9999533295631409, + 3.16067598760128e-8, + 0.009662099182605744, + 0.0, + 0.0014864075928926468, + 0.9880954027175903, + -0.15383504331111909, + 0.0, + -0.009547080844640732, + 0.15384222567081452, + 0.988049328327179, + 0.0, + -0.7599077224731445, + 7.708760738372803, + 27.743375778198243, + 1.0 + ], + "camera": 0, + "name": "render_camera_n3d" + }, + { + "name": "ground_plane_n3d" + }, + { + "children": [ + 3, + 4, + 5 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -0.5564079284667969, + 4.774584770202637, + -1.0962677001953126, + 1.0 + ], + "name": "ENV_Spheres" + }, + { + "mesh": 0, + "name": "Metallic0" + }, + { + "mesh": 1, + "name": "Dielectric0" + }, + { + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + -1.985867977142334, + 0.0, + 1.0 + ], + "mesh": 2, + "name": "Dielectric0-Black" + } + ], + "samplers": [ + {}, + {} + ], + "scenes": [ + { + "nodes": [ + 0, + 1, + 2 + ], + "name": "scene" + } + ], + "textures": [ + { + "name": "tmp_image_pie_dc1e_1a22_fbf9roughness_map_roughness_tmp_image_pie_dc1e_1a22_fbf9metal_map_metallic_0_texture", + "sampler": 0, + "source": 0 + }, + { + "name": "tmp_image_pie_b20b_ebb4_317droughness_map2_roughness_tmp_image_pie_b20b_ebb4_317dmetal_map2_metallic_1_texture", + "sampler": 1, + "source": 1 + } + ], + "scene": 0 +} \ No newline at end of file diff --git a/automated-tests/resources/EnvironmentTest_binary.bin b/automated-tests/resources/EnvironmentTest_binary.bin new file mode 100644 index 0000000..4473a85 Binary files /dev/null and b/automated-tests/resources/EnvironmentTest_binary.bin differ diff --git a/automated-tests/resources/MetalRoughSpheres.gltf b/automated-tests/resources/MetalRoughSpheres.gltf new file mode 100644 index 0000000..7ea5ba0 --- /dev/null +++ b/automated-tests/resources/MetalRoughSpheres.gltf @@ -0,0 +1,507 @@ +{ + "asset": { + "copyright": "Copyright 2017 Analytical Graphics, Inc, CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Model and textures by Ed Mackey.", + "generator": "COLLADA2GLTF with hand-edits", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 5, + 4, + 3, + 2, + 1 + ], + "matrix": [ + 0.4, 0.0, 0.0, 0.0, + 0.0, 0.0, -0.4, 0.0, + 0.0, 0.4, 0.0, 0.0, + 0.0, 0.0, 0.0, 1.0 + ] + }, + { + "mesh": 0 + }, + { + "mesh": 1 + }, + { + "mesh": 2 + }, + { + "mesh": 3 + }, + { + "mesh": 4 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2, + "TEXCOORD_0": 3 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Spheres.004" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 5, + "POSITION": 6, + "TEXCOORD_0": 7 + }, + "indices": 4, + "mode": 4, + "material": 0 + } + ], + "name": "Spheres.003" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 9, + "POSITION": 10, + "TEXCOORD_0": 11 + }, + "indices": 8, + "mode": 4, + "material": 0 + } + ], + "name": "Spheres.002" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 13, + "POSITION": 14, + "TEXCOORD_0": 15 + }, + "indices": 12, + "mode": 4, + "material": 0 + } + ], + "name": "Spheres.001" + }, + { + "primitives": [ + { + "attributes": { + "NORMAL": 17, + "POSITION": 18, + "TEXCOORD_0": 19 + }, + "indices": 16, + "mode": 4, + "material": 0 + } + ], + "name": "Spheres" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 2642016, + "componentType": 5123, + "count": 184320, + "max": [ + 31331 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 5389968, + "componentType": 5126, + "count": 31332, + "max": [ + 0.9999999403953552, + 1.0, + 1.0 + ], + "min": [ + -0.9999999403953552, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 5765952, + "componentType": 5126, + "count": 31332, + "max": [ + -8.0, + 9.0, + 10.0 + ], + "min": [ + -10.0, + -1.0, + -7.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1796656, + "componentType": 5126, + "count": 31332, + "max": [ + 0.1278132051229477, + 0.7597609758377075 + ], + "min": [ + 0.03436123952269554, + 0.013921022415161133 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 368640, + "max": [ + 62663 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 62664, + "max": [ + 0.9999999403953552, + 1.0, + 1.0 + ], + "min": [ + -0.9999999403953552, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 751968, + "componentType": 5126, + "count": 62664, + "max": [ + -2.0, + 9.0, + 10.0 + ], + "min": [ + -7.0, + -1.0, + -7.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 62664, + "max": [ + 0.4161497056484223, + 0.7597609758377075 + ], + "min": [ + 0.15740810334682465, + 0.012456059455871582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1904736, + "componentType": 5123, + "count": 368640, + "max": [ + 62663 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 3886032, + "componentType": 5126, + "count": 62664, + "max": [ + 0.9999999403953552, + 1.0, + 1.0 + ], + "min": [ + -0.9999999403953552, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 4638000, + "componentType": 5126, + "count": 62664, + "max": [ + 4.0, + 9.0, + 10.0 + ], + "min": [ + -1.0, + -1.0, + -7.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1295344, + "componentType": 5126, + "count": 62664, + "max": [ + 0.7028239369392395, + 0.7636672854423523 + ], + "min": [ + 0.4482637047767639, + 0.015471160411834717 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1167456, + "componentType": 5123, + "count": 368640, + "max": [ + 62663 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 2382096, + "componentType": 5126, + "count": 62664, + "max": [ + 0.9999999403953552, + 1.0, + 1.0 + ], + "min": [ + -0.9999999403953552, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 3134064, + "componentType": 5126, + "count": 62664, + "max": [ + 10.0, + 9.0, + 10.0 + ], + "min": [ + 5.0, + -1.0, + -7.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 794032, + "componentType": 5126, + "count": 62664, + "max": [ + 0.9852716326713562, + 0.7671433687210083 + ], + "min": [ + 0.7233805060386658, + 0.016381680965423585 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 737280, + "componentType": 5123, + "count": 215088, + "max": [ + 36589 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 1503936, + "componentType": 5126, + "count": 36590, + "max": [ + 0.9999999403953552, + 1.0, + 1.0 + ], + "min": [ + -0.9999999403953552, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1943016, + "componentType": 5126, + "count": 36590, + "max": [ + 11.874730110168456, + 9.0, + 10.969940185546877 + ], + "min": [ + -12.186589241027832, + -1.0, + -12.35944938659668 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 501312, + "componentType": 5126, + "count": 36590, + "max": [ + 0.9869875311851502, + 0.9988328814506532 + ], + "min": [ + 0.0013856289442628625, + 0.016568005084991456 + ], + "type": "VEC2" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicRoughnessTexture": { + "index": 1 + } + }, + "emissiveFactor": [ + 0.0, + 0.0, + 0.0 + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + }, + { + "sampler": 0, + "source": 1 + } + ], + "images": [ + { + "uri": "Spheres_BaseColor.png" + }, + { + "uri": "Spheres_MetalRough.png" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9986, + "wrapS": 33071, + "wrapT": 33071 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 8189248, + "byteLength": 3010656, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 6141936, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 6141936, + "byteLength": 2047312, + "byteStride": 8, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 11199904, + "uri": "MetalRoughSpheres0.bin" + } + ] +} diff --git a/automated-tests/resources/MetalRoughSpheres0.bin b/automated-tests/resources/MetalRoughSpheres0.bin new file mode 100644 index 0000000..2823ba4 Binary files /dev/null and b/automated-tests/resources/MetalRoughSpheres0.bin differ diff --git a/automated-tests/resources/MorphPrimitivesTest.bin b/automated-tests/resources/MorphPrimitivesTest.bin new file mode 100644 index 0000000..7f269e1 Binary files /dev/null and b/automated-tests/resources/MorphPrimitivesTest.bin differ diff --git a/automated-tests/resources/MorphPrimitivesTest.gltf b/automated-tests/resources/MorphPrimitivesTest.gltf new file mode 100644 index 0000000..a987f2d --- /dev/null +++ b/automated-tests/resources/MorphPrimitivesTest.gltf @@ -0,0 +1,331 @@ +{ + "asset": { + "generator": "glTF Converter for Shade3D", + "version": "2.0", + "extras": { + "title": "multiple_primitives", + "author": "ft-lab", + "license": "CC BY-4.0 (https://creativecommons.org/licenses/by/4.0/)" + } + }, + "accessors": [ + { + "bufferView": 0, + "componentType": 5123, + "count": 72, + "type": "SCALAR", + "byteOffset": 0 + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "byteOffset": 0 + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "max": [ + 0.5, + 0, + 0.5 + ], + "min": [ + -0.5, + 0, + -0.5 + ], + "byteOffset": 0 + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 21, + "type": "VEC2", + "byteOffset": 0 + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 21, + "type": "VEC3", + "max": [ + 0, + 0.20000000298023224, + 0 + ], + "min": [ + 0, + 0, + 0 + ], + "byteOffset": 0 + }, + { + "bufferView": 5, + "componentType": 5123, + "count": 24, + "type": "SCALAR", + "byteOffset": 0 + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "byteOffset": 0 + }, + { + "bufferView": 7, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "max": [ + 0.5, + 0, + 0 + ], + "min": [ + 0, + 0, + -0.5 + ], + "byteOffset": 0 + }, + { + "bufferView": 8, + "componentType": 5126, + "count": 9, + "type": "VEC2", + "byteOffset": 0 + }, + { + "bufferView": 9, + "componentType": 5126, + "count": 9, + "type": "VEC3", + "max": [ + 0, + 0.20000000298023224, + 0 + ], + "min": [ + 0, + 0, + 0 + ], + "byteOffset": 0 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 144, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 144, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 396, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 648, + "byteLength": 168, + "target": 34962, + "byteStride": 8 + }, + { + "buffer": 0, + "byteOffset": 816, + "byteLength": 252, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1068, + "byteLength": 48, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 1116, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1224, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + }, + { + "buffer": 0, + "byteOffset": 1332, + "byteLength": 72, + "target": 34962, + "byteStride": 8 + }, + { + "buffer": 0, + "byteOffset": 1404, + "byteLength": 108, + "target": 34962, + "byteStride": 12 + } + ], + "buffers": [ + { + "name": "MorphPrimitivesTest", + "byteLength": 1512, + "uri": "MorphPrimitivesTest.bin" + } + ], + "images": [ + { + "name": "uv_texture.jpg", + "mimeType": "image/jpeg", + "uri": "uv_texture.jpg" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 1, + 0, + 0, + 1 + ], + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + }, + "name": "red", + "emissiveFactor": [ + 0, + 0, + 0 + ], + "alphaMode": "OPAQUE", + "doubleSided": false + }, + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0, + 1, + 0, + 1 + ], + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + }, + "name": "green", + "emissiveFactor": [ + 0, + 0, + 0 + ], + "alphaMode": "OPAQUE", + "doubleSided": false + } + ], + "meshes": [ + { + "weights": [ + 0.5 + ], + "name": "mesh", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2, + "TEXCOORD_0": 3 + }, + "indices": 0, + "material": 0, + "targets": [ + { + "POSITION": 4 + } + ], + "mode": 4 + }, + { + "attributes": { + "POSITION": 7, + "NORMAL": 6, + "TEXCOORD_0": 8 + }, + "indices": 5, + "material": 1, + "targets": [ + { + "POSITION": 9 + } + ], + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "name": "ルートパート" + }, + { + "mesh": 0, + "name": "mesh" + } + ], + "samplers": [ + { + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "scenes": [ + { + "nodes": [ + 0 + ], + "name": "Scene" + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "scene": 0 +} diff --git a/automated-tests/resources/RGB16F.ktx b/automated-tests/resources/RGB16F.ktx new file mode 100644 index 0000000..9e9714b Binary files /dev/null and b/automated-tests/resources/RGB16F.ktx differ diff --git a/automated-tests/resources/RGB32F.ktx b/automated-tests/resources/RGB32F.ktx new file mode 100644 index 0000000..99f5e7f Binary files /dev/null and b/automated-tests/resources/RGB32F.ktx differ diff --git a/automated-tests/resources/RGBA8888.ktx b/automated-tests/resources/RGBA8888.ktx new file mode 100644 index 0000000..48afa5d Binary files /dev/null and b/automated-tests/resources/RGBA8888.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_10x10.ktx b/automated-tests/resources/RGBA_ASTC_10x10.ktx new file mode 100644 index 0000000..94dde71 Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_10x10.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_10x5.ktx b/automated-tests/resources/RGBA_ASTC_10x5.ktx new file mode 100644 index 0000000..315674e Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_10x5.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_10x6.ktx b/automated-tests/resources/RGBA_ASTC_10x6.ktx new file mode 100644 index 0000000..b5f1cbb Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_10x6.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_12x10.ktx b/automated-tests/resources/RGBA_ASTC_12x10.ktx new file mode 100644 index 0000000..c3c04fa Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_12x10.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_12x12.ktx b/automated-tests/resources/RGBA_ASTC_12x12.ktx new file mode 100644 index 0000000..c1e5e0d Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_12x12.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_4x4.ktx b/automated-tests/resources/RGBA_ASTC_4x4.ktx new file mode 100644 index 0000000..fa7fe6b Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_4x4.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_5x4.ktx b/automated-tests/resources/RGBA_ASTC_5x4.ktx new file mode 100644 index 0000000..9a4372c Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_5x4.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_5x5.ktx b/automated-tests/resources/RGBA_ASTC_5x5.ktx new file mode 100644 index 0000000..776175b Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_5x5.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_6x5.ktx b/automated-tests/resources/RGBA_ASTC_6x5.ktx new file mode 100644 index 0000000..2b10f9d Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_6x5.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_6x6.ktx b/automated-tests/resources/RGBA_ASTC_6x6.ktx new file mode 100644 index 0000000..27f511a Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_6x6.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_8x5.ktx b/automated-tests/resources/RGBA_ASTC_8x5.ktx new file mode 100644 index 0000000..7bbb4e0 Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_8x5.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_8x6.ktx b/automated-tests/resources/RGBA_ASTC_8x6.ktx new file mode 100644 index 0000000..2836beb Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_8x6.ktx differ diff --git a/automated-tests/resources/RGBA_ASTC_8x8.ktx b/automated-tests/resources/RGBA_ASTC_8x8.ktx new file mode 100644 index 0000000..c1bc85a Binary files /dev/null and b/automated-tests/resources/RGBA_ASTC_8x8.ktx differ diff --git a/automated-tests/resources/SimpleSparseAccessor.bin b/automated-tests/resources/SimpleSparseAccessor.bin new file mode 100644 index 0000000..99eaf33 Binary files /dev/null and b/automated-tests/resources/SimpleSparseAccessor.bin differ diff --git a/automated-tests/resources/SimpleSparseAccessor.gltf b/automated-tests/resources/SimpleSparseAccessor.gltf new file mode 100644 index 0000000..918cd48 --- /dev/null +++ b/automated-tests/resources/SimpleSparseAccessor.gltf @@ -0,0 +1,106 @@ +{ + "scene" : 0, + "scenes":[ + { + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0 + } + ], + "meshes":[ + { + "primitives":[ + { + "attributes":{ + "POSITION":1 + }, + "indices":0 + } + ] + } + ], + "buffers":[ + { + "uri":"SimpleSparseAccessor.bin", + "byteLength":284 + } + ], + "bufferViews":[ + { + "buffer":0, + "byteOffset":0, + "byteLength":72, + "target":34963 + }, + { + "buffer":0, + "byteOffset":72, + "byteLength":168 + }, + { + "buffer":0, + "byteOffset":240, + "byteLength":6 + }, + { + "buffer":0, + "byteOffset":248, + "byteLength":36 + } + ], + "accessors":[ + { + "bufferView":0, + "byteOffset":0, + "componentType":5123, + "count":36, + "type":"SCALAR", + "max":[ + 13 + ], + "min":[ + 0 + ] + }, + { + "bufferView":1, + "byteOffset":0, + "componentType":5126, + "count":14, + "type":"VEC3", + "sparse":{ + "count":3, + "indices":{ + "bufferView":2, + "byteOffset":0, + "componentType":5123 + }, + "values":{ + "bufferView":3, + "byteOffset":0 + } + }, + "max":[ + 6.0, + 4.0, + 0.0 + ], + "min":[ + 0.0, + 0.0, + 0.0 + ] + } + ], + "asset":{ + "version":"2.0" + } +} + + + diff --git a/automated-tests/resources/Studio/Irradiance.ktx b/automated-tests/resources/Studio/Irradiance.ktx new file mode 100644 index 0000000..df24c05 Binary files /dev/null and b/automated-tests/resources/Studio/Irradiance.ktx differ diff --git a/automated-tests/resources/Studio/Radiance.ktx b/automated-tests/resources/Studio/Radiance.ktx new file mode 100644 index 0000000..51aa681 Binary files /dev/null and b/automated-tests/resources/Studio/Radiance.ktx differ diff --git a/automated-tests/resources/animation.bin b/automated-tests/resources/animation.bin new file mode 100644 index 0000000..fa20e9f Binary files /dev/null and b/automated-tests/resources/animation.bin differ diff --git a/automated-tests/resources/arc.dli b/automated-tests/resources/arc.dli new file mode 100644 index 0000000..4d0c6b5 --- /dev/null +++ b/automated-tests/resources/arc.dli @@ -0,0 +1,35 @@ +{ + "scene": 0, + "scenes": [ { "nodes": [ 0 ] } ], + "nodes": [ { + "name": "root", + "children": [ 1 ] + }, { + "name": "arc", + "size": [ 2.0, 2.0 ], + "color": [ 0.5, 1.0, 0.5, 0.5 ], + "arc": { + "shader": 0, + "mesh": 0, + "startAngle" : -45.0, + "endAngle" : 135.0, + "radius" : -0.75, + "arcCaps": 3 + } + } ], + "environment": [ { + } ], + "meshes": [ { + "uri": "quad", + "attributes": 0 + } ], + "materials": [ { + } ], + "shaders": [ { + "vertex": "dli_arc.vsh", + "fragment": "dli_arc.fsh", + "rendererState" : "ALPHA_BLEND", + "startAngle": [ -1.0, 0.0 ], + "endAngle": [ 1.0, 0.0 ] + } ] +} diff --git a/automated-tests/resources/dli/animation-failed-to-open.dli b/automated-tests/resources/dli/animation-failed-to-open.dli new file mode 100644 index 0000000..9cd0602 --- /dev/null +++ b/automated-tests/resources/dli/animation-failed-to-open.dli @@ -0,0 +1,13 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root" + } ], + "animations": [ { + "properties": [ { + "node": "root", + "property": "position", + "keyFramesBin": { "url": "doesntexist.bin" } + } ] + } ] +} diff --git a/automated-tests/resources/dli/constraints.dli b/automated-tests/resources/dli/constraints.dli new file mode 100644 index 0000000..200bd88 --- /dev/null +++ b/automated-tests/resources/dli/constraints.dli @@ -0,0 +1,32 @@ +{ + "scene": 0, + "scenes": [ { "nodes": [ 0 ] } ], + "nodes": [ { + "name": "root", + "children": [ 1, 2, 3 ] + }, { + "name": "Alice", + "angle": [ 0.0, -45.0, 10.0 ], + "position": [ 500.0, -50.0, 0.0 ] + }, { + "name": "Bob", + "position": [ 1000.0, 1.0, -400.0 ], + "angle": [ 10.0, 0.0, -90.0 ], + "extras": { + "angularVelocity": [ -0.5, 0.0004 ] + } + }, { + "name": "Charlie", + "position": [ -400.0, 0.0, 100.0 ], + "constraints": { + "orientation": 1, + "position": 2, + "angularVelocity": 2, + "invalid": "zero" + }, + "extras": { + "angularVelocity": [ 0.0, 0.0 ] + } + } ] +} + diff --git a/automated-tests/resources/dli/extras.dli b/automated-tests/resources/dli/extras.dli new file mode 100644 index 0000000..4f5edab --- /dev/null +++ b/automated-tests/resources/dli/extras.dli @@ -0,0 +1,19 @@ +{ + "scene": 0, + "scenes": [ { "nodes": [ 0 ] } ], + "nodes": [ { + "name": "root", + "extras": { + "fudgeFactor": 9000.1, + "fudgeVector": [ 8, 7.0 ], + "fudgeVector": [ -0.25, 17.0 ], + "isThisTheRealLife": true, + "isThisJustFantasy": false, + "": 16384, + "velocity": [ 0.1, 58.0, -0.2 ], + "not a great extra": "this one", + "frameOfReference": [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] + } + } ] +} + diff --git a/automated-tests/resources/dli/material-environment-out-of-bounds.dli b/automated-tests/resources/dli/material-environment-out-of-bounds.dli new file mode 100644 index 0000000..effdcf2 --- /dev/null +++ b/automated-tests/resources/dli/material-environment-out-of-bounds.dli @@ -0,0 +1,7 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { "name": "root" } ], + "materials": [ { + "environment": 0 + } ] +} diff --git a/automated-tests/resources/dli/mesh-indices-read-fail.dli b/automated-tests/resources/dli/mesh-indices-read-fail.dli new file mode 100644 index 0000000..b911f0f --- /dev/null +++ b/automated-tests/resources/dli/mesh-indices-read-fail.dli @@ -0,0 +1,9 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ {} ], + "meshes": [ { + "uri": "mesh.bin", + "attributes": 1 + } ] +} + diff --git a/automated-tests/resources/dli/mesh-positions-read-fail.dli b/automated-tests/resources/dli/mesh-positions-read-fail.dli new file mode 100644 index 0000000..1e98fda --- /dev/null +++ b/automated-tests/resources/dli/mesh-positions-read-fail.dli @@ -0,0 +1,8 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ {} ], + "meshes": [ { + "uri": "mesh.bin", + "attributes": 2 + } ] +} diff --git a/automated-tests/resources/dli/mesh-uri-missing.dli b/automated-tests/resources/dli/mesh-uri-missing.dli new file mode 100644 index 0000000..26af1e4 --- /dev/null +++ b/automated-tests/resources/dli/mesh-uri-missing.dli @@ -0,0 +1,6 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ {} ], + "meshes": [ { + } ] +} diff --git a/automated-tests/resources/dli/node-animated-image-mesh-missing.dli b/automated-tests/resources/dli/node-animated-image-mesh-missing.dli new file mode 100644 index 0000000..85c3edf --- /dev/null +++ b/automated-tests/resources/dli/node-animated-image-mesh-missing.dli @@ -0,0 +1,7 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "model": { } + } ] +} diff --git a/automated-tests/resources/dli/node-arc-mesh-missing.dli b/automated-tests/resources/dli/node-arc-mesh-missing.dli new file mode 100644 index 0000000..69b8ed4 --- /dev/null +++ b/automated-tests/resources/dli/node-arc-mesh-missing.dli @@ -0,0 +1,7 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "arc": { } + } ] +} diff --git a/automated-tests/resources/dli/node-child-invalid-type.dli b/automated-tests/resources/dli/node-child-invalid-type.dli new file mode 100644 index 0000000..49a719f --- /dev/null +++ b/automated-tests/resources/dli/node-child-invalid-type.dli @@ -0,0 +1,9 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "children": [ + "what?" + ] + } ] +} diff --git a/automated-tests/resources/dli/node-model-mesh-missing.dli b/automated-tests/resources/dli/node-model-mesh-missing.dli new file mode 100644 index 0000000..85c3edf --- /dev/null +++ b/automated-tests/resources/dli/node-model-mesh-missing.dli @@ -0,0 +1,7 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "model": { } + } ] +} diff --git a/automated-tests/resources/dli/node-name-already-used.dli b/automated-tests/resources/dli/node-name-already-used.dli new file mode 100644 index 0000000..f176e3a --- /dev/null +++ b/automated-tests/resources/dli/node-name-already-used.dli @@ -0,0 +1,9 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "children" : [ 1 ] + }, { + "name": "root" + } ] +} diff --git a/automated-tests/resources/dli/node-processor.dli b/automated-tests/resources/dli/node-processor.dli new file mode 100644 index 0000000..2b069ad --- /dev/null +++ b/automated-tests/resources/dli/node-processor.dli @@ -0,0 +1,21 @@ +{ + "scene": 0, + "scenes": [ { "nodes": [ 0 ] }, { "nodes": [ 1 ] } ], + "nodes": [ { + "name": "rootA", + "array": [ 1, 2, 4, 8, -500 ], + "object": { + "physics": true, + "elasticity": 0.27, + "drag": 0.91, + "inner array": [ "why", "not", false ], + "inner object": { + "supported": true + } + }, + "nickname": "same as name", + "favourite number": 63478 + }, { + "name": "rootB" + } ] +} diff --git a/automated-tests/resources/dli/node-renderable-mesh-invalid-type.dli b/automated-tests/resources/dli/node-renderable-mesh-invalid-type.dli new file mode 100644 index 0000000..96cb99c --- /dev/null +++ b/automated-tests/resources/dli/node-renderable-mesh-invalid-type.dli @@ -0,0 +1,9 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "model": { + "mesh": 0.5 + } + } ] +} diff --git a/automated-tests/resources/dli/node-renderable-mesh-out-of-bounds.dli b/automated-tests/resources/dli/node-renderable-mesh-out-of-bounds.dli new file mode 100644 index 0000000..0b48607 --- /dev/null +++ b/automated-tests/resources/dli/node-renderable-mesh-out-of-bounds.dli @@ -0,0 +1,9 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { + "name": "root", + "model": { + "mesh": 0 + } + } ] +} diff --git a/automated-tests/resources/dli/nodes-array-empty.dli b/automated-tests/resources/dli/nodes-array-empty.dli new file mode 100644 index 0000000..9a8674d --- /dev/null +++ b/automated-tests/resources/dli/nodes-array-empty.dli @@ -0,0 +1,4 @@ +{ + "scenes": [ { "nodes" : [] } ], + "nodes": [] +} diff --git a/automated-tests/resources/dli/nodes-invalid-type.dli b/automated-tests/resources/dli/nodes-invalid-type.dli new file mode 100644 index 0000000..97fe920 --- /dev/null +++ b/automated-tests/resources/dli/nodes-invalid-type.dli @@ -0,0 +1,4 @@ +{ + "scenes": [ { "nodes" : 0 } ], + "nodes": [] +} diff --git a/automated-tests/resources/dli/nodes-missing.dli b/automated-tests/resources/dli/nodes-missing.dli new file mode 100644 index 0000000..27504c8 --- /dev/null +++ b/automated-tests/resources/dli/nodes-missing.dli @@ -0,0 +1,3 @@ +{ + "scenes": [] +} diff --git a/automated-tests/resources/dli/root-id-invalid.dli b/automated-tests/resources/dli/root-id-invalid.dli new file mode 100644 index 0000000..e6a8608 --- /dev/null +++ b/automated-tests/resources/dli/root-id-invalid.dli @@ -0,0 +1,4 @@ +{ + "scenes": [ { "nodes" : [ "0" ] } ], + "nodes": [] +} diff --git a/automated-tests/resources/dli/root-id-out-of-bounds.dli b/automated-tests/resources/dli/root-id-out-of-bounds.dli new file mode 100644 index 0000000..0549b0b --- /dev/null +++ b/automated-tests/resources/dli/root-id-out-of-bounds.dli @@ -0,0 +1,4 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [] +} diff --git a/automated-tests/resources/dli/root-node-invalid-type.dli b/automated-tests/resources/dli/root-node-invalid-type.dli new file mode 100644 index 0000000..e43c9ea --- /dev/null +++ b/automated-tests/resources/dli/root-node-invalid-type.dli @@ -0,0 +1,4 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ "helloo" ] +} diff --git a/automated-tests/resources/dli/scene-out-of-bounds.dli b/automated-tests/resources/dli/scene-out-of-bounds.dli new file mode 100644 index 0000000..40189a0 --- /dev/null +++ b/automated-tests/resources/dli/scene-out-of-bounds.dli @@ -0,0 +1,4 @@ +{ + "scenes": [], + "nodes": [] +} diff --git a/automated-tests/resources/dli/scenes-missing.dli b/automated-tests/resources/dli/scenes-missing.dli new file mode 100644 index 0000000..1b74fa4 --- /dev/null +++ b/automated-tests/resources/dli/scenes-missing.dli @@ -0,0 +1,3 @@ +{ + "": {} +} diff --git a/automated-tests/resources/dli/scenes-nodes-missing.dli b/automated-tests/resources/dli/scenes-nodes-missing.dli new file mode 100644 index 0000000..e7738fb --- /dev/null +++ b/automated-tests/resources/dli/scenes-nodes-missing.dli @@ -0,0 +1,3 @@ +{ + "scenes": [ { } ] +} diff --git a/automated-tests/resources/dli/shader-fragment-missing.dli b/automated-tests/resources/dli/shader-fragment-missing.dli new file mode 100644 index 0000000..9e7a9e4 --- /dev/null +++ b/automated-tests/resources/dli/shader-fragment-missing.dli @@ -0,0 +1,7 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ {} ], + "shaders": [ { + "vertex": "some.vsh" + } ] +} diff --git a/automated-tests/resources/dli/shader-uniforms.dli b/automated-tests/resources/dli/shader-uniforms.dli new file mode 100644 index 0000000..1573fe2 --- /dev/null +++ b/automated-tests/resources/dli/shader-uniforms.dli @@ -0,0 +1,20 @@ +{ + "scene": 0, + "scenes": [ { "nodes": [ 0 ] } ], + "nodes": [ { + "name": "root" + } ], + "shaders": [ { + "vertex": "dli_pbr.vsh", + "fragment": "dli_pbr.fsh", + "uBool": true, + "uInt": 255, + "uFloat": -0.5, + "uVec2": [ 100.0, -100.0 ], + "uVec3": [ 50.0, 0.0, -200.0 ], + "uVec4": [ 0.1774, 1.0, 0.5333, 0.7997 ], + "uMat3": [ 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 ], + "uMat4": [ 8.0, 0.0, 0.0, 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "invalid": "Hello, I'm a string" + } ] +} diff --git a/automated-tests/resources/dli/shader-vertex-missing.dli b/automated-tests/resources/dli/shader-vertex-missing.dli new file mode 100644 index 0000000..4f28012 --- /dev/null +++ b/automated-tests/resources/dli/shader-vertex-missing.dli @@ -0,0 +1,5 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { "name": "root" } ], + "shaders": [ {} ] +} diff --git a/automated-tests/resources/dli/skeleton-node-missing.dli b/automated-tests/resources/dli/skeleton-node-missing.dli new file mode 100644 index 0000000..8940f5f --- /dev/null +++ b/automated-tests/resources/dli/skeleton-node-missing.dli @@ -0,0 +1,5 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ {} ], + "skeletons": [ {} ] +} diff --git a/automated-tests/resources/dli/skeleton-root-not-found.dli b/automated-tests/resources/dli/skeleton-root-not-found.dli new file mode 100644 index 0000000..2b6ec8a --- /dev/null +++ b/automated-tests/resources/dli/skeleton-root-not-found.dli @@ -0,0 +1,5 @@ +{ + "scenes": [ { "nodes" : [ 0 ] } ], + "nodes": [ { "name": "1" } ], + "skeletons": [ { "node": "some-other" } ] +} diff --git a/automated-tests/resources/dli_arc.fsh b/automated-tests/resources/dli_arc.fsh new file mode 100644 index 0000000..7eb83af --- /dev/null +++ b/automated-tests/resources/dli_arc.fsh @@ -0,0 +1,112 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +#define ROUND_STARTCAP 0x1 +#define ROUND_ENDCAP 0x2 +#define SQUARE_STARTCAP 0x4 +#define SQUARE_ENDCAP 0x8 +precision mediump float; + +in vec2 vUV; + +uniform vec4 uColor; +uniform int antiAliasing; +uniform float radius; +uniform vec2 startAngle; +uniform vec2 endAngle; +uniform int arcCaps; + +out vec4 FragColor; + + +void main() +{ +//////////////////// +//Inputs + float radius1 = 1.0; + float uvPixel = length( dFdx( vUV ) ) * 2.0; + float dx = mix( 0.0001, uvPixel, antiAliasing > 0 ); + float radius2 = mix( 1.0 - radius * uvPixel - dx , -radius , step( 0.0, -radius ) ); +//////////////////// + float alpha = 0.0; + float circle = 0.0; + + vec2 uv = fract(vUV) * 2.0 - 1.0; + + float ang_img = endAngle.y * startAngle.x - endAngle.x * startAngle.y; + float half1 = uv.x * startAngle.x - uv.y * startAngle.y; + float half2 = uv.y * endAngle.y - uv.x * endAngle.x; + float len = length(uv); + float equalAngles = step(0.99999, dot(endAngle, startAngle)); + float right_side = step(0.0, ang_img); + vec2 uv_norm = normalize(uv); + float cap_radius = -0.5 + radius2 / 2.0; + float square_cap; + float sq_plane; + + /****************************************** + * Equivalent to: + * if( len > radius1 || len < radius2 ) + */ + circle = alpha = smoothstep( len, len + dx, radius1 ) * smoothstep( -len, -len + dx, -radius2 ); + float half1_step = smoothstep( -dx, 0.0, half1 ); + float half2_step = smoothstep( -dx, 0.0, half2 ); + + float neg_angimg = max( half1_step, half2_step ); + float pos_angimg = min( half1_step, half2_step ); + /****************************************** + * Equivalent to: + if(ang_img < 0.0) + { + alpha *= max(smoothstep( 0.0, dx, half1 ), smoothstep( 0.0, dx, half2)); + } + else + { + alpha *= min(smoothstep( 0.0, dx, half1 ) , smoothstep( 0.0, dx, half2 )); + } + */ + alpha *= mix( neg_angimg, pos_angimg, step(0.0, ang_img) ); + + alpha = mix( alpha, mix( circle, 0.0, right_side ), equalAngles ); + + if((arcCaps & ROUND_STARTCAP) > 0) + { + len = length(uv - normalize( vec2( startAngle.y, startAngle.x )) * (1.0 + cap_radius)); + alpha = max(alpha, smoothstep(cap_radius, cap_radius + dx, -len) ); + } + if((arcCaps & ROUND_ENDCAP) > 0) + { + len = length(uv - normalize( vec2( endAngle.y, endAngle.x )) * (1.0 + cap_radius)); + alpha = max(alpha, smoothstep(cap_radius, cap_radius + dx, -len) ); + } + + if((arcCaps & SQUARE_STARTCAP) > 0) + { + sq_plane = -uv.x * startAngle.y - uv.y * startAngle.x; + square_cap = min(step( 0.0, -half1 ), smoothstep( cap_radius, cap_radius + dx, half1 )); + square_cap = min(square_cap, smoothstep( radius2, radius2 + dx, -sq_plane )); + square_cap = min(square_cap, smoothstep( -1.0, -1.0 + dx, sq_plane )); + alpha = max(square_cap, alpha); + } + + if((arcCaps & SQUARE_ENDCAP) > 0) + { + sq_plane = -uv.x * endAngle.y - uv.y * endAngle.x; + square_cap = min(step( 0.0, -half2 ), smoothstep( cap_radius, cap_radius + dx, half2 )); + square_cap = min(square_cap, smoothstep( radius2, radius2 + dx, -sq_plane )); + square_cap = min(square_cap, smoothstep( -1.0, -1.0 + dx, sq_plane )); + alpha = max(square_cap, alpha); + } + + if( alpha == 0.0 ) + { + discard; + } + + FragColor = vec4(vec3(uColor), uColor.a * alpha); +} diff --git a/automated-tests/resources/dli_arc.vsh b/automated-tests/resources/dli_arc.vsh new file mode 100644 index 0000000..7b38dea --- /dev/null +++ b/automated-tests/resources/dli_arc.vsh @@ -0,0 +1,36 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +in vec3 aPosition; +in vec2 aTexCoord; + +out vec2 vUV; + +uniform vec3 uSize; + +uniform mat4 uProjection; +uniform mat4 uModelMatrix; +uniform mat4 uViewMatrix; + +uniform vec2 uTilt; + +void main() +{ + vec4 vPosition = vec4( aPosition * uSize, 1.0); + vec4 mPosition = uModelMatrix * vPosition; + + mPosition.xy += 0.3 * uTilt * mPosition.z; + gl_Position = uProjection * uViewMatrix * mPosition; + +#ifdef FLIP_V + vUV = vec2(aTexCoord.x, 1.0 - aTexCoord.y); +#else + vUV = aTexCoord; +#endif + +} diff --git a/automated-tests/resources/dli_images.fsh b/automated-tests/resources/dli_images.fsh new file mode 100644 index 0000000..72a88b3 --- /dev/null +++ b/automated-tests/resources/dli_images.fsh @@ -0,0 +1,31 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +uniform sampler2D sAlbedo; + +uniform vec4 uColor; + +#ifdef ALPHA_TEST + uniform float uAlphaThreshold; +#endif //ALPHA_TEST + +in vec2 vUV; + +out vec4 FragColor; + +void main() +{ + vec4 color = texture(sAlbedo, vUV.st); +#ifdef ALPHA_TEST + if (color.a <= uAlphaThreshold) + { + discard; + } +#endif + FragColor = color * uColor; +} diff --git a/automated-tests/resources/dli_images.vsh b/automated-tests/resources/dli_images.vsh new file mode 100644 index 0000000..9698937 --- /dev/null +++ b/automated-tests/resources/dli_images.vsh @@ -0,0 +1,37 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +in vec3 aPosition; +in vec2 aTexCoord; + +out vec2 vUV; + +uniform vec3 uSize; + +uniform mat4 uCubeMatrix; + +uniform mat4 uProjection; +uniform mat4 uModelMatrix; +uniform mat4 uViewMatrix; + +uniform vec2 uTilt; + +void main() +{ + vec4 vPosition = vec4( aPosition * uSize, 1.0); + vec4 mPosition = uModelMatrix * vPosition; + + mPosition.xy += 0.3 * uTilt * mPosition.z; + gl_Position = uProjection * uViewMatrix * mPosition; + +#ifdef FLIP_V + vUV = vec2(aTexCoord.x, 1.0 - aTexCoord.y); +#else + vUV = aTexCoord; +#endif +} diff --git a/automated-tests/resources/dli_pbr.fsh b/automated-tests/resources/dli_pbr.fsh new file mode 100644 index 0000000..72a0d31 --- /dev/null +++ b/automated-tests/resources/dli_pbr.fsh @@ -0,0 +1,160 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +#ifdef THREE_TEX +#ifdef GLTF_CHANNELS +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#pbrmetallicroughnessmetallicroughnesstexture +#define METALLIC b +#define ROUGHNESS g +#else //GLTF_CHANNELS +#define METALLIC r +#define ROUGHNESS a +#endif //GLTF_CHANNELS +#endif //THREE_TEX + +#ifdef THREE_TEX + uniform sampler2D sAlbedoAlpha; + uniform sampler2D sMetalRoughness; + uniform sampler2D sNormal; + +#ifdef ALPHA_TEST + uniform float uAlphaThreshold; +#endif //ALPHA_TEST + +#else + uniform sampler2D sAlbedoMetal; + uniform sampler2D sNormalRoughness; +#endif + +uniform samplerCube sDiffuse; +uniform samplerCube sSpecular; + +// Number of mip map levels in the texture +uniform float uMaxLOD; + +// Transformation matrix of the cubemap texture +uniform mat4 uCubeMatrix; + +uniform vec4 uColor; +uniform float uMetallicFactor; +uniform float uRoughnessFactor; + +//IBL Light intensity +uniform float uIblIntensity; + +in vec2 vUV; +in vec3 vNormal; +in vec3 vTangent; +in vec3 vViewVec; + +out vec4 FragColor; + +// Functions for BRDF calculation come from +// https://www.unrealengine.com/blog/physically-based-shading-on-mobile +// Based on the paper by Dimitar Lazarov +// http://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf +vec3 EnvBRDFApprox( vec3 SpecularColor, float Roughness, float NoV ) +{ + const vec4 c0 = vec4( -1.0, -0.0275, -0.572, 0.022 ); + const vec4 c1 = vec4( 1.0, 0.0425, 1.04, -0.04 ); + vec4 r = Roughness * c0 + c1; + float a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y; + vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw; + + return SpecularColor * AB.x + AB.y; +} + +void main() +{ + // We get information from the maps (albedo, normal map, roughness, metalness + // I access the maps in the order they will be used +#ifdef THREE_TEX + vec4 albedoAlpha = texture(sAlbedoAlpha, vUV.st); + float alpha = albedoAlpha.a; +#ifdef ALPHA_TEST + if (alpha <= uAlphaThreshold) + { + discard; + } +#endif //ALPHA_TEST + vec3 albedoColor = albedoAlpha.rgb * uColor.rgb; + + vec4 metalRoughness = texture(sMetalRoughness, vUV.st); + float metallic = metalRoughness.METALLIC * uMetallicFactor; + float roughness = metalRoughness.ROUGHNESS * uRoughnessFactor; + + vec3 normalMap = texture(sNormal, vUV.st).rgb; +#else //THREE_TEX + vec4 albedoMetal = texture(sAlbedoMetal, vUV.st); + vec3 albedoColor = albedoMetal.rgb * uColor.rgb; + float metallic = albedoMetal.a * uMetallicFactor; + + vec4 normalRoughness = texture(sNormalRoughness, vUV.st); + vec3 normalMap = normalRoughness.rgb; + float roughness = normalRoughness.a * uRoughnessFactor; +#endif + //Normalize vectors + vec3 normal = normalize(vNormal); + vec3 tangent = normalize(vTangent); + + // NOTE: normal and tangent have to be orthogonal for the result of the cross() + // product to be a unit vector. We might find that we need to normalize(). + vec3 bitangent = cross(normal, tangent); + + vec3 viewVec = normalize(vViewVec); + + // Create Inverse Local to world matrix + mat3 vInvTBN = mat3(tangent, bitangent, normal); + + // Get normal map info in world space + normalMap = normalize(normalMap - 0.5); + vec3 newNormal = vInvTBN * normalMap.rgb; + + // Calculate normal dot view vector + float NoV = max(dot(newNormal, -viewVec), 0.0); + + // Reflect vector + vec3 reflectionVec = reflect(viewVec, newNormal); + + //transform it now to environment coordinates (used when the environment rotates) + vec3 reflecCube = (uCubeMatrix * vec4( reflectionVec, 0.0 ) ).xyz; + reflecCube = normalize( reflecCube ); + + //transform it now to environment coordinates + vec3 normalCube = ( uCubeMatrix * vec4( newNormal, 0.0 ) ).xyz; + normalCube = normalize( normalCube ); + + // Get irradiance from diffuse cubemap + vec3 irradiance = texture( sDiffuse, normalCube ).rgb; + + // Access reflection color using roughness value + float finalLod = mix( 0.0, uMaxLOD - 2.0, roughness); + vec3 reflectionColor = textureLod(sSpecular, reflecCube, finalLod).rgb; + + // We are supposed to be using DielectricColor (0.04) of a plastic (almost everything) + // http://blog.selfshadow.com/publications/s2014-shading-course/hoffman/s2014_pbs_physics_math_slides.pdf + // however that seems to prevent achieving very dark tones (i.e. get dark gray blacks). + vec3 DiffuseColor = albedoColor - albedoColor * metallic; // 1 mad + vec3 SpecularColor = mix( vec3(0.04), albedoColor, metallic); // 2 mad + + // Calculate specular color using Magic Function (takes original roughness and normal dot view). + vec3 specColor = reflectionColor.rgb * EnvBRDFApprox(SpecularColor, roughness, NoV ); + + // Multiply the result by albedo texture and do energy conservation + vec3 diffuseColor = irradiance * DiffuseColor; + + // Final color is the sum of the diffuse and specular term + vec3 finalColor = diffuseColor + specColor; + + finalColor = sqrt( finalColor ) * uIblIntensity; +#ifdef THREE_TEX + FragColor = vec4( finalColor, alpha ); +#else //THREE_TEX + FragColor = vec4( finalColor, 1.0 ); +#endif //THREE_TEX +} diff --git a/automated-tests/resources/dli_pbr.vsh b/automated-tests/resources/dli_pbr.vsh new file mode 100644 index 0000000..d1be304 --- /dev/null +++ b/automated-tests/resources/dli_pbr.vsh @@ -0,0 +1,150 @@ +#version 300 es + +#ifdef HIGHP + precision highp float; +#else + precision mediump float; +#endif + +in vec3 aPosition; +in vec2 aTexCoord; +in vec3 aNormal; +in vec3 aTangent; + +#ifdef MORPH + uniform sampler2D sBlendShapeGeometry; +#endif + +out vec2 vUV; +out vec3 vNormal; +out vec3 vTangent; +out vec3 vViewVec; + + +uniform highp mat4 uMvpMatrix; +uniform highp mat4 uViewMatrix; +uniform mat3 uNormalMatrix; +uniform mat4 uModelMatrix; +uniform mat4 uModelView; +uniform mat4 uProjection; + +#ifdef SKINNING + in vec4 aJoints; + in vec4 aWeights; + #define MAX_BONES 64 + uniform mat4 uBone[MAX_BONES]; +#endif + +#ifdef MORPH +#define MAX_BLEND_SHAPE_NUMBER 128 +uniform int uNumberOfBlendShapes; ///< Total number of blend shapes loaded. +uniform float uBlendShapeWeight[MAX_BLEND_SHAPE_NUMBER]; ///< The weight of each blend shape. +#ifdef MORPH_VERSION_2_0 +uniform float uBlendShapeUnnormalizeFactor; ///< Factor used to unnormalize the geometry of the blend shape. +#else +uniform float uBlendShapeUnnormalizeFactor[MAX_BLEND_SHAPE_NUMBER]; ///< Factor used to unnormalize the geometry of the blend shape. +#endif +uniform int uBlendShapeComponentSize; ///< The size in the texture of either the vertices, normals or tangents. Used to calculate the offset to address them. +#endif + +void main() +{ + vec4 position = vec4(aPosition, 1.0); + vec3 normal = aNormal; + vec3 tangent = aTangent; + +#ifdef MORPH + int width = textureSize( sBlendShapeGeometry, 0 ).x; + + int blendShapeBufferOffset = 0; + for( int index = 0; index < uNumberOfBlendShapes; ++index ) + { +#ifdef MORPH_POSITION + // Calculate the index to retrieve the geometry from the texture. + int vertexId = gl_VertexID + blendShapeBufferOffset; + int x = vertexId % width; + int y = vertexId / width; + + vec3 diff = vec3(0.0); + // Retrieves the blend shape geometry from the texture, unnormalizes it and multiply by the weight. + if( 0.0 != uBlendShapeWeight[index] ) + { +#ifdef MORPH_VERSION_2_0 + float unnormalizeFactor = uBlendShapeUnnormalizeFactor; +#else + float unnormalizeFactor = uBlendShapeUnnormalizeFactor[index]; +#endif + + diff = uBlendShapeWeight[index] * unnormalizeFactor * ( texelFetch( sBlendShapeGeometry, ivec2(x, y), 0 ).xyz - 0.5 ); + } + + position.xyz += diff; + + blendShapeBufferOffset += uBlendShapeComponentSize; +#endif + +#ifdef MORPH_NORMAL + // Calculate the index to retrieve the normal from the texture. + vertexId = gl_VertexID + blendShapeBufferOffset; + x = vertexId % width; + y = vertexId / width; + + // Retrieves the blend shape normal from the texture, unnormalizes it and multiply by the weight. + if( 0.0 != uBlendShapeWeight[index] ) + { + diff = uBlendShapeWeight[index] * 2.0 * ( texelFetch( sBlendShapeGeometry, ivec2(x, y), 0 ).xyz - 0.5 ); + } + + normal += diff.xyz; + + blendShapeBufferOffset += uBlendShapeComponentSize; +#endif + +#ifdef MORPH_TANGENT + // Calculate the index to retrieve the tangent from the texture. + vertexId = gl_VertexID + blendShapeBufferOffset; + x = vertexId % width; + y = vertexId / width; + + // Retrieves the blend shape tangent from the texture, unnormalizes it and multiply by the weight. + if( 0.0 != uBlendShapeWeight[index] ) + { + diff = uBlendShapeWeight[index] * 2.0 * ( texelFetch( sBlendShapeGeometry, ivec2(x, y), 0 ).xyz - 0.5 ); + } + + tangent += diff.xyz; + + blendShapeBufferOffset += uBlendShapeComponentSize; +#endif + } + +#endif + +#ifdef SKINNING + mat4 bone = uBone[int(aJoints.x)] * aWeights.x + + uBone[int(aJoints.y)] * aWeights.y + + uBone[int(aJoints.z)] * aWeights.z + + uBone[int(aJoints.w)] * aWeights.w; + position = bone * position; + normal = (bone * vec4(normal, 0.0)).xyz; + tangent = (bone * vec4(tangent, 0.0)).xyz; +#endif + + vec4 vPosition = uModelMatrix * position; + + vNormal = normalize(uNormalMatrix * normal); + + vTangent = normalize(uNormalMatrix * tangent); + + + vec4 viewPosition = uViewMatrix * vPosition; + gl_Position = uProjection * viewPosition; + +#ifdef FLIP_V + vUV = vec2(aTexCoord.x, 1.0 - aTexCoord.y); +#else + vUV = aTexCoord; +#endif + + vViewVec = viewPosition.xyz; +} diff --git a/automated-tests/resources/exercise.dli b/automated-tests/resources/exercise.dli new file mode 100644 index 0000000..7d9c6b4 --- /dev/null +++ b/automated-tests/resources/exercise.dli @@ -0,0 +1,11634 @@ +{ + "asset" : { + "version" : "1.0" + }, + "scene" : 1, + "scenes" : [ { + "nodes" : [ 0 ] + }, { + "nodes" : [ 95 ] + } ], + "nodes" : [ { + "name" : "ExerciseDemo", + "matrix" : [ 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "children" : [ 1, 79, 88, 91, 92, 93, 94 ], + "behavior" : [ 4 ], + "visible" : true, + "lightingMode" : "lit" + }, { + "name" : "ReferenceShape_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "children" : [ 2 ], + "visible" : true + }, { + "name" : "hips_JNT", + "matrix" : [ 0.984536, 0.175182, 0.0, 0.0, -0.175122, 0.984198, 0.026198, 0.0, 0.004589, -0.025793, 0.999657, 0.0, 5.27538, 78.6471, -1.41421, 1.0 ], + "children" : [ 3, 69, 74 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.013219, -80.0521, 1.41421, 1.0 ] + }, { + "name" : "spine_JNT", + "matrix" : [ 0.984536, -0.175122, 0.004589, 0.0, 0.174502, 0.982682, 0.062338, 0.0, -0.015426, -0.060573, 0.998044, 0.0, 0.015846, 4.13037, 0.166239, 1.0 ], + "children" : [ 4 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.002627, -84.1824, 1.24797, 1.0 ] + }, { + "name" : "spine1_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.998172, -0.06044, 0.0, 0.0, 0.06044, 0.998172, 0.0, 0.005973, 10.694, 0.968772, 1.0 ], + "children" : [ 5 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.0086, -94.8764, 0.279197, 1.0 ] + }, { + "name" : "spine2_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.998172, -0.06044, 0.0, 0.0, 0.06044, 0.998172, 0.0, 0.0, 10.1532, -0.580362, 1.0 ], + "children" : [ 6, 30, 54 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.008557, -105.03, 0.859559, 1.0 ] + }, { + "name" : "l_shoulder_JNT", + "matrix" : [ 0.949195, 0.273744, -0.155217, 0.0, -0.201691, 0.907824, 0.367663, 0.0, 0.241555, -0.317678, 0.916914, 0.0, 2.88666, 12.5391, -0.534974, 1.0 ], + "children" : [ 7 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.89521, -117.569, 1.39453, 1.0 ] + }, { + "name" : "l_arm_JNT", + "matrix" : [ 0.421571, -0.904401, -0.065849, 0.0, 0.517137, 0.180132, 0.836733, 0.0, -0.744881, -0.386795, 0.543638, 0.0, 10.2653, 0.0, 0.0, 1.0 ], + "children" : [ 8 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -13.1738, -116.164, 1.39451, 1.0 ] + }, { + "name" : "l_forearm_JNT", + "matrix" : [ -0.073871, 0.0, 0.997268, 0.0, -3.91E-4, 1.0, 0.0, 0.0, -0.997268, -3.93E-4, -0.073871, 0.0, 25.5729, 0.0, 0.0, 1.0 ], + "children" : [ 9 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -38.7466, -116.164, 1.39451, 1.0 ] + }, { + "name" : "l_hand_JNT", + "matrix" : [ 0.738915, 0.444766, -0.506149, 0.0, -0.59918, 0.777334, -0.191665, 0.0, 0.308201, 0.444898, 0.840879, 0.0, 19.8068, -0.345714, 1.00359, 1.0 ], + "children" : [ 10, 14, 18, 22, 26 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -58.5534, -115.818, 0.390923, 1.0 ] + }, { + "name" : "l_handThumb1_JNT", + "matrix" : [ 0.782913, -0.117863, 0.610865, 0.0, 0.011962, 0.984561, 0.174635, 0.0, -0.622017, -0.129417, 0.772235, 0.0, 2.27648, -1.65194, 3.31969, 1.0 ], + "children" : [ 11 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707107, 0.0, -0.707107, 0.0, 0.0, 1.0, 0.0, 0.0, 0.707107, 0.0, 0.707107, 0.0, -45.0842, -114.166, 40.9423, 1.0 ] + }, { + "name" : "l_handThumb2_JNT", + "matrix" : [ 0.830425, -0.487404, -0.269872, 0.0, 0.464771, 0.873169, -0.146844, 0.0, 0.307216, -0.003486, 0.951633, 0.0, 3.0735, 0.0, 0.0, 1.0 ], + "children" : [ 12 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707107, 0.0, -0.707108, 0.0, 0.0, 1.0, 0.0, 0.0, 0.707108, 0.0, 0.707107, 0.0, -48.1577, -114.166, 40.9423, 1.0 ] + }, { + "name" : "l_handThumb3_JNT", + "matrix" : [ 0.98882, -0.149117, 0.0, 0.0, 0.149117, 0.98882, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.37693, 0.0, 0.0, 1.0 ], + "children" : [ 13 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707107, 0.0, -0.707108, 0.0, 0.0, 1.0, 0.0, 0.0, 0.707107, 0.0, 0.707107, 0.0, -51.5344, -114.166, 40.9423, 1.0 ] + }, { + "name" : "l_handThumb4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.92326, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_handIndex1_JNT", + "matrix" : [ 0.904938, -0.425377, 0.011949, 0.0, 0.425382, 0.905011, 0.002209, 0.0, -0.011754, 0.003084, 1.0, 0.0, 9.34022, -0.291901, 4.04881, 1.0 ], + "children" : [ 15 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -67.8936, -115.526, -3.65789, 1.0 ] + }, { + "name" : "l_handIndex2_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.09938, 0.0, 0.0, 1.0 ], + "children" : [ 16 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -71.993, -115.526, -3.65788, 1.0 ] + }, { + "name" : "l_handIndex3_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.57415, 0.0, 0.0, 1.0 ], + "children" : [ 17 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -74.5672, -115.526, -3.65788, 1.0 ] + }, { + "name" : "l_handIndex4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.56603, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_handPinky1_JNT", + "matrix" : [ 0.996226, -0.081261, -0.030513, 0.0, 0.081431, 0.996669, 0.004384, 0.0, 0.030055, -0.006852, 0.999525, 0.0, 8.45263, -1.52385, -3.88068, 1.0 ], + "children" : [ 19 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -67.0061, -114.294, 4.2716, 1.0 ] + }, { + "name" : "l_handPinky2_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.07304, 0.0, 0.0, 1.0 ], + "children" : [ 20 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -70.0791, -114.294, 4.2716, 1.0 ] + }, { + "name" : "l_handPinky3_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.96712, 0.0, 0.0, 1.0 ], + "children" : [ 21 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -72.0462, -114.294, 4.27159, 1.0 ] + }, { + "name" : "l_handPinky4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.8257, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_handRing1_JNT", + "matrix" : [ 0.980994, -0.191551, 0.030976, 0.0, 0.19168, 0.981457, -0.001225, 0.0, -0.030167, 0.007139, 0.999519, 0.0, 9.86254, -0.583908, -1.401, 1.0 ], + "children" : [ 23 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -68.416, -115.234, 1.79193, 1.0 ] + }, { + "name" : "l_handRing2_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.90873, 0.0, 0.0, 1.0 ], + "children" : [ 24 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -72.3247, -115.234, 1.79192, 1.0 ] + }, { + "name" : "l_handRing3_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.36478, 0.0, 0.0, 1.0 ], + "children" : [ 25 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -74.6895, -115.234, 1.79192, 1.0 ] + }, { + "name" : "l_handRing4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.88243, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_handMiddle1_JNT", + "matrix" : [ 0.953413, -0.301668, 0.0, 0.0, 0.301668, 0.953413, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 10.0737, -0.408325, 1.31404, 1.0 ], + "children" : [ 27 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -68.6272, -115.41, -0.923121, 1.0 ] + }, { + "name" : "l_handMiddle2_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973047, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.2249, 0.0, 0.0, 1.0 ], + "children" : [ 28 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -72.8521, -115.41, -0.923118, 1.0 ] + }, { + "name" : "l_handMiddle3_JNT", + "matrix" : [ 0.973047, -0.230606, 0.0, 0.0, 0.230606, 0.973048, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.46916, 0.0, 0.0, 1.0 ], + "children" : [ 29 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -75.3213, -115.41, -0.923117, 1.0 ] + }, { + "name" : "l_handMiddle4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.28131, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "r_shoulder_JNT", + "matrix" : [ 0.999696, 0.01745, -0.017452, 0.0, -0.017145, 0.999701, 0.01745, 0.0, 0.017751, -0.017145, 0.999696, 0.0, -2.88677, 12.5391, -0.53497, 1.0 ], + "children" : [ 31 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.87821, -117.569, 1.39453, 1.0 ] + }, { + "name" : "r_arm_JNT", + "matrix" : [ 0.148671, 0.988778, -0.014664, 0.0, -0.988733, 0.14837, -0.019851, 0.0, -0.017453, 0.01745, 0.999695, 0.0, -10.2653, 0.0, 0.0, 1.0 ], + "children" : [ 32 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 13.1303, -116.164, 1.39455, 1.0 ] + }, { + "name" : "r_forearm_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 4.01E-4, 0.0, 0.0, -4.01E-4, 1.0, 0.0, -25.5729, 0.0, 0.0, 1.0 ], + "children" : [ 33 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 38.7032, -116.164, 1.39456, 1.0 ] + }, { + "name" : "r_hand_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, -4.01E-4, 0.0, 0.0, 4.01E-4, 1.0, 0.0, -19.807, -0.346, 1.00358, 1.0 ], + "children" : [ 34, 38, 42, 46, 50 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 58.5102, -115.818, 0.390979, 1.0 ] + }, { + "name" : "r_handThumb1_JNT", + "matrix" : [ 0.653433, 0.24549, -0.716073, 0.0, -0.244838, 0.963648, 0.106945, 0.0, 0.716296, 0.105441, 0.689785, 0.0, -2.27647, -1.65195, 3.31969, 1.0 ], + "children" : [ 35 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707106, 0.0, 0.707106, 0.0, 0.0, 1.0, 0.0, 0.0, -0.707106, 0.0, 0.707106, 0.0, 45.0536, -114.166, 40.9117, 1.0 ] + }, { + "name" : "r_handThumb2_JNT", + "matrix" : [ 0.867302, 0.0, 0.497783, 0.0, 0.0, 1.0, 0.0, 0.0, -0.497783, 0.0, 0.867301, 0.0, -3.0735, 0.0, 0.0, 1.0 ], + "children" : [ 36 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707106, 0.0, 0.707106, 0.0, 0.0, 1.0, 0.0, 0.0, -0.707106, 0.0, 0.707106, 0.0, 48.127, -114.166, 40.9117, 1.0 ] + }, { + "name" : "r_handThumb3_JNT", + "matrix" : [ 0.996311, 0.0, 0.085813, 0.0, 0.0, 1.0, 0.0, 0.0, -0.085813, 0.0, 0.996311, 0.0, -3.37693, 0.0, 0.0, 1.0 ], + "children" : [ 37 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.707106, 0.0, 0.707107, 0.0, 0.0, 1.0, 0.0, 0.0, -0.707106, 0.0, 0.707107, 0.0, 51.504, -114.166, 40.9117, 1.0 ] + }, { + "name" : "r_handThumb4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -3.923, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "r_handRing1_JNT", + "matrix" : [ 0.915131, 0.400047, -0.049976, 0.0, -0.400717, 0.916194, -0.003754, 0.0, 0.044286, 0.023462, 0.998743, 0.0, -9.86253, -0.583984, -1.40101, 1.0 ], + "children" : [ 39 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 68.3727, -115.234, 1.79199, 1.0 ] + }, { + "name" : "r_handRing2_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -3.90872, 0.0, 0.0, 1.0 ], + "children" : [ 40 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.2814, -115.234, 1.79199, 1.0 ] + }, { + "name" : "r_handRing3_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.36478, 0.0, 0.0, 1.0 ], + "children" : [ 41 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 74.6462, -115.234, 1.792, 1.0 ] + }, { + "name" : "r_handRing4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.882, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "r_handPinky1_JNT", + "matrix" : [ 0.863063, 0.499949, -0.071924, 0.0, -0.501878, 0.864874, -0.010555, 0.0, 0.056928, 0.045207, 0.997354, 0.0, -8.45262, -1.52391, -3.88068, 1.0 ], + "children" : [ 43 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 66.9628, -114.294, 4.27166, 1.0 ] + }, { + "name" : "r_handPinky2_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -3.07304, 0.0, 0.0, 1.0 ], + "children" : [ 44 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 70.0358, -114.294, 4.27167, 1.0 ] + }, { + "name" : "r_handPinky3_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.96712, 0.0, 0.0, 1.0 ], + "children" : [ 45 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0029, -114.294, 4.27168, 1.0 ] + }, { + "name" : "r_handPinky4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.826, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "r_handMiddle1_JNT", + "matrix" : [ 0.944916, 0.327312, 0.0, 0.0, -0.327312, 0.944916, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -10.0737, -0.408401, 1.31403, 1.0 ], + "children" : [ 47 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 68.5839, -115.409, -0.923056, 1.0 ] + }, { + "name" : "r_handMiddle2_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -4.2249, 0.0, 0.0, 1.0 ], + "children" : [ 48 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.8088, -115.409, -0.923044, 1.0 ] + }, { + "name" : "r_handMiddle3_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.46917, 0.0, 0.0, 1.0 ], + "children" : [ 49 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 75.278, -115.409, -0.92304, 1.0 ] + }, { + "name" : "r_handMiddle4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -3.281, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "r_handIndex1_JNT", + "matrix" : [ 0.980248, 0.186022, 0.067154, 0.0, -0.186597, 0.982434, 0.002344, 0.0, -0.065538, -0.014828, 0.99774, 0.0, -9.34022, -0.291962, 4.0488, 1.0 ], + "children" : [ 51 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 67.8504, -115.526, -3.65782, 1.0 ] + }, { + "name" : "r_handIndex2_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -4.09938, 0.0, 0.0, 1.0 ], + "children" : [ 52 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 71.9498, -115.526, -3.65782, 1.0 ] + }, { + "name" : "r_handIndex3_JNT", + "matrix" : [ 0.94204, 0.335501, 0.0, 0.0, -0.335501, 0.94204, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.57415, 0.0, 0.0, 1.0 ], + "children" : [ 53 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 74.5239, -115.526, -3.65782, 1.0 ] + }, { + "name" : "r_handIndex4_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.566, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "neck_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.998172, -0.06044, 0.0, 0.0, 0.06044, 0.998172, 0.0, 0.0, 17.0656, -0.695395, 1.0 ], + "children" : [ 55 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.008488, -122.095, 1.55495, 1.0 ] + }, { + "name" : "head_JNT", + "matrix" : [ 0.995828, 0.087837, -0.024703, 0.0, -0.081637, 0.978626, 0.188753, 0.0, 0.040755, -0.185949, 0.981714, 0.0, 0.0, 8.13757, 2.14518, 1.0 ], + "children" : [ 56, 59, 62, 65, 66, 67, 68 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.021705, -128.828, -2.00444, 1.0 ] + }, { + "name" : "hair_01_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 11.442, 24.1427, -1.69867, 1.0 ], + "children" : [ 57 ], + "visible" : true + }, { + "name" : "hair_01_01_JNT", + "matrix" : [ 0.0, 0.0, -1.0, 0.0, -0.093641, 0.995606, 0.0, 0.0, 0.995606, 0.093641, 0.0, 0.0, 0.0, -9.01569, 0.0, 1.0 ], + "children" : [ 58 ], + "visible" : true + }, { + "name" : "hair_01_02_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -11.0805, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "hair_02_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -13.1304, 24.2143, -1.69866, 1.0 ], + "children" : [ 60 ], + "visible" : true + }, { + "name" : "hair_02_01_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -9.01563, 0.0, 1.0 ], + "children" : [ 61 ], + "visible" : true + }, { + "name" : "hair_02_02_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -11.0805, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "hair_03_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 24.2142, -13.2264, 1.0 ], + "children" : [ 63 ], + "visible" : true + }, { + "name" : "hair_03_01_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -9.01563, 0.0, 1.0 ], + "children" : [ 64 ], + "visible" : true + }, { + "name" : "hair_03_02_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -11.0805, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_earring_accessory_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 10.936, 6.972, 0.888, 1.0 ], + "visible" : true + }, { + "name" : "r_earring_accessory_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -11.0026, 6.74516, 0.187242, 1.0 ], + "visible" : true + }, { + "name" : "l_eye_JNT", + "matrix" : [ 0.997963, -0.003027, 0.063724, 0.0, -0.003026, 0.995503, 0.094684, 0.0, -0.063724, -0.094684, 0.993466, 0.0, 4.68487, 12.7498, 9.96268, 1.0 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -4.74966, -141.45, -10.6596, 1.0 ] + }, { + "name" : "r_eye_JNT", + "matrix" : [ 0.997966, -0.002933, 0.063684, 0.0, -0.002932, 0.995772, 0.091809, 0.0, -0.063684, -0.091809, 0.993738, 0.0, -4.77108, 12.7498, 9.96268, 1.0 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.70629, -141.45, -10.6596, 1.0 ] + }, { + "name" : "r_upleg_JNT", + "matrix" : [ 0.927337, -0.198173, 0.317448, 0.0, 0.278028, 0.93264, -0.229963, 0.0, -0.250492, 0.301512, 0.919969, 0.0, -7.5159, 0.0, 0.0, 1.0 ], + "children" : [ 70 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, -0.002495, -1.16E-4, 0.0, 0.002493, 0.999837, -0.017917, 0.0, 1.61E-4, 0.017917, 0.99984, 0.0, 7.32992, -80.0324, 2.84741, 1.0 ] + }, { + "name" : "r_leg_JNT", + "matrix" : [ 0.997732, 0.060039, 0.030441, 0.0, -0.067243, 0.9099, 0.409341, 0.0, -0.003122, -0.41046, 0.911874, 0.0, -0.724057, -37.7363, 2.80023, 1.0 ], + "children" : [ 71 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.002998, 0.0, 0.0, -0.002998, 0.999857, 0.016638, 0.0, 0.0, -0.016638, 0.999862, 0.0, 8.28614, -42.2277, -1.41208, 1.0 ] + }, { + "name" : "r_foot_JNT", + "matrix" : [ 0.964557, 0.026598, 0.262529, 0.0, 0.024923, 0.981276, -0.190988, 0.0, -0.262693, 0.190762, 0.945834, 0.0, 1.26E-4, -34.5752, -1.6048, 1.0 ], + "children" : [ 72 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 9.09E-4, 0.0, 0.0, -9.09E-4, 1.0, 0.0, 8.26299, -7.67328, 0.312986, 1.0 ] + }, { + "name" : "r_toebase_JNT", + "matrix" : [ 0.0, -0.103501, 0.994629, 0.0, 0.0, 0.994629, 0.103501, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, -6.10491, 11.1619, 1.0 ], + "children" : [ 73 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.0, 0.0, -1.0, 0.0, -0.102591, 0.994724, 0.0, 0.0, 0.994724, 0.102591, 0.0, 0.0, -10.6284, -2.68276, -8.26298, 1.0 ] + }, { + "name" : "joint1", + "matrix" : [ 0.0, 0.0, -1.0, 0.0, -0.108623, 0.994083, 0.0, 0.0, 0.994083, 0.108623, 0.0, 0.0, 5.7477, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "l_upleg_JNT", + "matrix" : [ 0.969105, -0.243372, 0.040065, 0.0, 0.242338, 0.969759, 0.028984, 0.0, -0.045907, -0.018379, 0.998777, 0.0, 7.51591, 0.0, 0.0, 1.0 ], + "children" : [ 75 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.999881, -0.015441, 0.0, 0.0, 0.015441, 0.999881, 0.0, -7.50515, -80.0204, 2.6501, 1.0 ] + }, { + "name" : "l_leg_JNT", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.993288, -0.115665, 0.0, 0.0, 0.115665, 0.993288, 0.0, 2.16E-4, -37.7436, 2.62906, 1.0 ], + "children" : [ 76 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.999822, 0.018881, 0.0, 0.0, -0.018881, 0.999822, 0.0, -7.50542, -42.2526, -1.42976, 1.0 ] + }, { + "name" : "l_foot_JNT", + "matrix" : [ 0.996936, 0.072648, -0.029003, 0.0, -0.070636, 0.995367, 0.065233, 0.0, 0.033608, -0.062984, 0.997448, 0.0, 0.0, -34.5752, -1.6048, 1.0 ], + "children" : [ 77 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 9.11E-4, 0.0, 0.0, -9.11E-4, 1.0, 0.0, -7.50523, -7.67329, 0.31298, 1.0 ] + }, { + "name" : "l_toebase_JNT", + "matrix" : [ 1.9E-4, -0.10218, 0.994766, 0.0, 0.0, 0.994766, 0.10218, 0.0, -1.0, 0.0, 1.81E-4, 0.0, 0.0, -6.10494, 11.1619, 1.0 ], + "children" : [ 78 ], + "visible" : true, + "inverseBindPoseMatrix" : [ 0.0, 0.0, -1.0, 0.0, -0.102591, 0.994724, 0.0, 0.0, 0.994724, 0.102591, 0.0, 0.0, -10.6284, -2.68276, 7.50523, 1.0 ] + }, { + "name" : "joint2", + "matrix" : [ 0.0, 0.0, -1.0, 0.0, -0.104271, 0.994549, 0.0, 0.0, 0.994549, 0.104271, 0.0, 0.0, 5.91715, 0.0, 0.0, 1.0 ], + "visible" : true + }, { + "name" : "Model", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "children" : [ 80, 81, 82, 83, 84, 85, 86, 87 ], + "visible" : true, + "lightingMode" : "lit-solid" + }, { + "name" : "R_New_Eye", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 8, + "mesh" : 0, + "shader" : 1 + } + }, { + "name" : "L_New_Eye", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 8, + "mesh" : 1, + "shader" : 1 + } + }, { + "name" : "newhair", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 9, + "mesh" : 2, + "shader" : 1 + } + }, { + "name" : "OutFit_Bottom", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 10, + "mesh" : 3, + "shader" : 1 + } + }, { + "name" : "OutFit_Top", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 11, + "mesh" : 4, + "shader" : 1 + } + }, { + "name" : "Shoes_Shoes01_Female_Adult_Thumbnail_GEO", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 12, + "mesh" : 5, + "shader" : 1 + } + }, { + "name" : "Head_GEO", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 7, + "mesh" : 6, + "shader" : 2 + } + }, { + "name" : "Body_GEO", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 6, + "mesh" : 9, + "shader" : 2 + } + }, { + "name" : "directionalLight1", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 91.3751, 284.323, 1.0 ], + "visible" : true + }, { + "name" : "BackGround", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 5, + "mesh" : 7, + "shader" : 4 + } + }, { + "name" : "Ground", + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 5, + "mesh" : 8, + "shader" : 4 + } + }, { + "name" : "Idle", + "size" : [ 30.0, 30.0 ], + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -82.0, 64.0, -1.0, 1.0 ], + "behavior" : [ 0 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 1, + "mesh" : 10, + "shader" : 3 + } + }, { + "name" : "Squat", + "size" : [ 30.0, 30.0 ], + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -85.0, 94.0, 1.0, 1.0 ], + "behavior" : [ 1 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 2, + "mesh" : 10, + "shader" : 3 + } + }, { + "name" : "JumpingJack", + "size" : [ 30.0, 30.0 ], + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -75.0, 124.0, 0.0, 1.0 ], + "behavior" : [ 2 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 3, + "mesh" : 10, + "shader" : 3 + } + }, { + "name" : "Lunge", + "size" : [ 30.0, 30.0 ], + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -55.0, 154.0, 0.0, 1.0 ], + "behavior" : [ 3 ], + "visible" : true, + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 4, + "mesh" : 10, + "shader" : 3 + } + }, { + "name" : "Backdrop", + "matrix" : [ 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "children" : [ 89, 90 ], + "visible" : true, + "lightingMode" : "lit" + } ], + "meshes" : [ { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 0, + "byteLength" : 2520 + }, + "positions" : { + "byteOffset" : 2520, + "byteLength" : 3168 + }, + "normals" : { + "byteOffset" : 5688, + "byteLength" : 3168 + }, + "textures" : { + "byteOffset" : 8856, + "byteLength" : 2112 + }, + "tangents" : { + "byteOffset" : 10968, + "byteLength" : 3168 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 14136, + "byteLength" : 4224 + }, + "weights0" : { + "byteOffset" : 18360, + "byteLength" : 4224 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 22584, + "byteLength" : 2520 + }, + "positions" : { + "byteOffset" : 25104, + "byteLength" : 3180 + }, + "normals" : { + "byteOffset" : 28284, + "byteLength" : 3180 + }, + "textures" : { + "byteOffset" : 31464, + "byteLength" : 2120 + }, + "tangents" : { + "byteOffset" : 33584, + "byteLength" : 3180 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 36764, + "byteLength" : 4240 + }, + "weights0" : { + "byteOffset" : 41004, + "byteLength" : 4240 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 45244, + "byteLength" : 25938 + }, + "positions" : { + "byteOffset" : 71182, + "byteLength" : 34092 + }, + "normals" : { + "byteOffset" : 105274, + "byteLength" : 34092 + }, + "textures" : { + "byteOffset" : 139366, + "byteLength" : 22728 + }, + "tangents" : { + "byteOffset" : 162094, + "byteLength" : 34092 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 196186, + "byteLength" : 45456 + }, + "weights0" : { + "byteOffset" : 241642, + "byteLength" : 45456 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 287098, + "byteLength" : 5988 + }, + "positions" : { + "byteOffset" : 293086, + "byteLength" : 8412 + }, + "normals" : { + "byteOffset" : 301498, + "byteLength" : 8412 + }, + "textures" : { + "byteOffset" : 309910, + "byteLength" : 5608 + }, + "tangents" : { + "byteOffset" : 315518, + "byteLength" : 8412 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 323930, + "byteLength" : 11216 + }, + "weights0" : { + "byteOffset" : 335146, + "byteLength" : 11216 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 346362, + "byteLength" : 3720 + }, + "positions" : { + "byteOffset" : 350082, + "byteLength" : 5004 + }, + "normals" : { + "byteOffset" : 355086, + "byteLength" : 5004 + }, + "textures" : { + "byteOffset" : 360090, + "byteLength" : 3336 + }, + "tangents" : { + "byteOffset" : 363426, + "byteLength" : 5004 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 368430, + "byteLength" : 6672 + }, + "weights0" : { + "byteOffset" : 375102, + "byteLength" : 6672 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 381774, + "byteLength" : 5520 + }, + "positions" : { + "byteOffset" : 387294, + "byteLength" : 7284 + }, + "normals" : { + "byteOffset" : 394578, + "byteLength" : 7284 + }, + "textures" : { + "byteOffset" : 401862, + "byteLength" : 4856 + }, + "tangents" : { + "byteOffset" : 406718, + "byteLength" : 7284 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 414002, + "byteLength" : 9712 + }, + "weights0" : { + "byteOffset" : 423714, + "byteLength" : 9712 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 433426, + "byteLength" : 34524 + }, + "positions" : { + "byteOffset" : 467950, + "byteLength" : 37824 + }, + "normals" : { + "byteOffset" : 505774, + "byteLength" : 37824 + }, + "textures" : { + "byteOffset" : 543598, + "byteLength" : 25216 + }, + "tangents" : { + "byteOffset" : 568814, + "byteLength" : 37824 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 606638, + "byteLength" : 50432 + }, + "weights0" : { + "byteOffset" : 657070, + "byteLength" : 50432 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 31, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 707502, + "byteLength" : 360 + }, + "positions" : { + "byteOffset" : 707862, + "byteLength" : 732 + }, + "normals" : { + "byteOffset" : 708594, + "byteLength" : 732 + }, + "textures" : { + "byteOffset" : 709326, + "byteLength" : 488 + }, + "tangents" : { + "byteOffset" : 709814, + "byteLength" : 732 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 31, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 710546, + "byteLength" : 12 + }, + "positions" : { + "byteOffset" : 710558, + "byteLength" : 48 + }, + "normals" : { + "byteOffset" : 710606, + "byteLength" : 48 + }, + "textures" : { + "byteOffset" : 710654, + "byteLength" : 32 + }, + "tangents" : { + "byteOffset" : 710686, + "byteLength" : 48 + } + }, { + "uri" : "exercise/model.dae.bin", + "attributes" : 223, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 710734, + "byteLength" : 24312 + }, + "positions" : { + "byteOffset" : 735046, + "byteLength" : 33000 + }, + "normals" : { + "byteOffset" : 768046, + "byteLength" : 33000 + }, + "textures" : { + "byteOffset" : 801046, + "byteLength" : 22000 + }, + "tangents" : { + "byteOffset" : 823046, + "byteLength" : 33000 + }, + "skeleton" : 0, + "joints0" : { + "byteOffset" : 856046, + "byteLength" : 44000 + }, + "weights0" : { + "byteOffset" : 900046, + "byteLength" : 44000 + } + }, { + "uri" : "quad", + "attributes" : 0, + "primitive" : "TRIANGLES" + } ], + "cameras" : [ { + "near" : 2.5, + "far" : 1000.0, + "matrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.9138, 5.0, 1.0 ], + "fov" : 37.8492 + } ], + "lights" : [ { + "matrix" : [ 0.8950600624084473, 0.0914330929517746, 0.4364715814590454, 0.0, 0.3676385283470154, 0.4026888310909271, -0.8382623195648193, 0.0, -0.25240713357925415, 0.9107588529586792, 0.3268163800239563, 0.0, 0.0, 0.0, -1.0, 1.0 ], + "color" : [ 1.0, 1.0, 1.0 ], + "intensity" : 1.0, + "shadowMapSize" : 256, + "orthographicSize" : 4.2760005, + "shadowIntensity" : 1.0 + } ], + "materials" : [ { + "name" : "No name", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Icons\\Icon_Idle.png", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : false, + "albedoMap" : "exercise/Icons/Icon_Idle.png" + }, { + "name" : "Icons\\Icon_Squat.png", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : false, + "albedoMap" : "exercise/Icons/Icon_Squat.png" + }, { + "name" : "Icons\\Icon_JJ.png", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : false, + "albedoMap" : "exercise/Icons/Icon_JJ.png" + }, { + "name" : "Icons\\Icon_Lunge.png", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : false, + "albedoMap" : "exercise/Icons/Icon_Lunge.png" + }, { + "name" : "Background", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/BG_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/BG_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Body", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/Body_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/Body_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "subsurfaceMap" : "exercise/Textures/Body_Female_Asian_Adult_SubsurfaceColor.png", + "environment" : 1 + }, { + "name" : "Head", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/Head_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/Head_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "subsurfaceMap" : "exercise/Textures/Head_Female_SubsurfaceColor.png", + "environment" : 1 + }, { + "name" : "Eye", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/Eye_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/Eye_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Hair", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/Hair_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/Hair_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Bottom outfit", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/FitBot_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/FitBot_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Top outfit", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/FitTop_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/FitTop_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + }, { + "name" : "Shoe", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "normalRoughnessMap" : "exercise/Textures/Shoe_NormalRoughness.png", + "albedoMetallicMap" : "exercise/Textures/Shoe_AlbedoMetallic.png", + "roughness" : 1.0, + "metallic" : 1.0, + "mipmap" : true, + "environment" : 1 + } ], + "environment" : [ { + "cubeInitialOrientation" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "iblIntensity" : 1.0 + }, { + "cubeSpecular" : "Studio/Radiance.ktx", + "cubeDiffuse" : "Studio/Irradiance.ktx", + "cubeInitialOrientation" : [ 0.6716271638870239, 0.07979151606559753, -0.7365801334381104, 0.0, 0.07979151606559753, 0.9806114435195923, 0.17898204922676086, 0.0, 0.7365801334381104, -0.17898204922676086, 0.6522386074066162, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "iblIntensity" : 0.75 + } ], + "shaders" : [ { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], + "uMaxLOD" : 8 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "hints": [ "MODIFIES_GEOMETRY" ], + "defines" : [ "LIT", "SKINNING" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "hints": [ "MODIFIES_GEOMETRY" ], + "defines" : [ "LIT", "SKINNING", "SSS" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "rendererState" : "DEPTH_TEST|ALPHA_BLEND", + "uCubeMatrix" : [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], + "uTilt" : [ 0.0, 0.0 ] + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "defines" : [ "LIT", "SHADOW" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "uMaxLOD" : 6 + } ], + "animations" : [ { + "name" : "idleClip", + "loopCount" : 0, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 0, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 3024, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 6048, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 9072, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 12096, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 15120, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 18144, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 20592, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 23616, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 26640, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 29664, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 32688, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 35712, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 38736, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 41760, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 44784, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 47808, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 50832, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-animation.ani", + "byteOffset" : 53856, + "numKeys" : 144 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 6.0 + }, + "relative" : false + } ] + }, { + "name" : "squatClip_0", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 0, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 1764, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 3192, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 4956, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 6720, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 8484, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 10248, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "hair_02_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 12012, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "hair_03_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-0.ani", + "byteOffset" : 13776, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + } ], + "finishedActions" : [ 1 ] + }, { + "name" : "squatClip_1", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 0, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 1596, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 3192, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 4788, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 6384, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 7980, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 9576, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 11172, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 12768, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 14364, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 15656, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 17252, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 18848, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 20444, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 22040, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 23636, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 25232, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 26828, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 28424, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 30020, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 31616, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 33212, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 34808, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 36404, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 38000, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 39596, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 41192, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 42788, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-animation-1.ani", + "byteOffset" : 44384, + "numKeys" : 76 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.16667 + }, + "relative" : false + } ] + }, { + "name" : "jumpingJackClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 0, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 630, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 1140, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 1770, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 2400, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 3030, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 3660, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 4290, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 4920, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 5550, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 6180, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 6810, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 7440, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 8070, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 8700, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 9330, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 9960, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 10590, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 11220, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 11850, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 12480, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 13110, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 13740, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 14370, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 15000, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 15630, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 16260, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 16890, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 17520, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 18150, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 18780, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 19410, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 20040, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 20670, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 21300, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 21930, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 22560, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 23190, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 23820, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 24450, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 25080, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 25710, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 26340, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 26970, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 27600, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 28230, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 28860, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 29490, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 30120, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 30750, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 31380, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-animation.ani", + "byteOffset" : 32010, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + } ], + "finishedActions" : [ 4 ] + }, { + "name" : "lungeClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 0, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 1649, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 3686, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 5723, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 7760, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 9797, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 11834, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 13871, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 15908, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 17945, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 19982, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 22019, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 24056, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 26093, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 28130, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 30167, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 32204, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 34241, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 36278, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 38315, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 40352, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 42389, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 44426, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 46075, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 48112, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 50149, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 52186, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 54223, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 56260, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 58297, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 60334, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 62371, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 64408, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 66445, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-animation.ani", + "byteOffset" : 68482, + "numKeys" : 97 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 4.04167 + }, + "relative" : false + } ], + "finishedActions" : [ 7 ] + }, { + "name" : "idleToSquatClip_0", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 0, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 1932, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 3496, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 5428, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 6992, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 8924, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 10856, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 12788, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 14720, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 16652, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 18584, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 20516, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 22448, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 24380, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 26312, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 28244, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 30176, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 32108, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 34040, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 35972, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 37904, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 39836, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 41768, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 43700, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 45632, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 47564, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 49496, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 51060, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 52992, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 54924, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 56856, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 58788, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 60720, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 62652, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 64584, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 66516, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 68448, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 70380, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 72312, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 74244, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 76176, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 78108, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 80040, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 81972, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 83904, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 85836, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 87768, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 89700, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 91632, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 93564, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 95496, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 97428, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 99360, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 101292, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 103224, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 105156, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-0.ani", + "byteOffset" : 107088, + "numKeys" : 92 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.83333 + }, + "relative" : false + } ], + "finishedActions" : [ 0 ] + }, { + "name" : "idleToSquatClip_1", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hair_02_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-1.ani", + "byteOffset" : 0, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "hair_03_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-squat-animation-1.ani", + "byteOffset" : 1764, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + } ] + }, { + "name" : "squatToIdleClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 0, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 1806, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 3268, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 5074, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 6880, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 8686, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 10492, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 12298, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 14104, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 15910, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 17716, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 19522, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 21328, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 23134, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 24940, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 26746, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 28552, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 30358, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 32164, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 33970, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 35776, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 37582, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 39388, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 41194, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 43000, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 44462, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 46268, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 48074, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 49880, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 51686, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 53492, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 55298, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 57104, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 58910, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 60716, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 62522, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 64328, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 66134, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 67940, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 69746, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 71552, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 73358, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 75164, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 76970, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 78776, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "hair_02_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 80582, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "hair_03_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 82388, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 84194, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 86000, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 87806, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 89612, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 91418, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 93224, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 95030, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 96836, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 98642, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-idle-animation.ani", + "byteOffset" : 100448, + "numKeys" : 86 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.58333 + }, + "relative" : false + } ], + "finishedActions" : [ 2 ] + }, { + "name" : "idleToJumpingJackClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 0, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 1365, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 2470, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 3835, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 5200, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 6565, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 7930, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 9295, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 10660, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 12025, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 13390, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 14755, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 16120, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 17485, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 18850, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 20215, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 21580, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 22945, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 24310, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 25675, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 27040, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 28405, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 29770, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 31135, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 32500, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 33865, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 34970, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 36335, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 37700, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 39065, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 40430, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 41795, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 43160, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 44525, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 45890, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 47255, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 48620, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 49985, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 51350, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 52715, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 54080, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 55445, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 56810, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 58175, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 59540, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 60905, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 62270, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 63635, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 65000, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 66365, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 67730, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 69095, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 70460, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 71825, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 73190, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-jumping-jack-animation.ani", + "byteOffset" : 74555, + "numKeys" : 65 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.70833 + }, + "relative" : false + } ], + "finishedActions" : [ 3 ] + }, { + "name" : "jumpingJackToIdleClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 0, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 1491, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 2698, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 4189, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 5680, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 7171, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 8662, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 10153, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 11644, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 13135, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 14626, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 16117, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 17608, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 19099, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 20590, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 22081, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 23572, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 25063, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 26554, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 28045, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 29536, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 31027, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 32518, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 34009, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 35500, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 36707, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 38198, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 39689, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 41180, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 42671, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 44162, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 45653, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 47144, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 48635, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 50126, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 51617, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 53108, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 54599, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 56090, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 57581, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 59072, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 60563, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 62054, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 63545, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 65036, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 66527, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 68018, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 69509, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 71000, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 72491, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 73982, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 75473, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 76964, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 78455, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-idle-animation.ani", + "byteOffset" : 79946, + "numKeys" : 71 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 2.95833 + }, + "relative" : false + } ], + "finishedActions" : [ 5 ] + }, { + "name" : "idleToLungeClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 0, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 1764, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 3192, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 4956, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 6384, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 8148, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 9912, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 11676, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 13440, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 15204, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 16968, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 18732, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 20496, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 22260, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 24024, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 25788, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 27552, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 29316, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 31080, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 32844, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 34608, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 36372, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 38136, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 39900, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 41664, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 43428, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 45192, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 46620, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 48384, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 50148, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 51912, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 53676, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 55440, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 57204, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 58968, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 60732, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 62496, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 64260, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 66024, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 67788, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 69552, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 71316, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 73080, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 74844, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 76608, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 78372, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 80136, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 81900, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 83664, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 85428, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 87192, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 88956, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 90720, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 92484, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 94248, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/idle-to-lunge-animation.ani", + "byteOffset" : 96012, + "numKeys" : 84 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.5 + }, + "relative" : false + } ], + "finishedActions" : [ 6 ] + }, { + "name" : "lungeToIdleClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 0, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 1701, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 3078, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 4779, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 6480, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_shoulder_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 8181, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 9882, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 11583, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 13284, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 14985, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 16686, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 18387, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 20088, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 21789, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 23490, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 25191, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 26892, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 28593, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 30294, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 31995, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 33696, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 35397, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 37098, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 38799, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 40500, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 41877, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 43578, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 45279, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 46980, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 48681, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 50382, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 52083, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 53784, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 55485, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 57186, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 58887, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 60588, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 62289, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 63990, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 65691, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 67392, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 69093, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 70794, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 72495, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 74196, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_eye_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 75897, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 77598, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 79299, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 81000, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 82701, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 84402, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 86103, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 87804, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-idle-animation.ani", + "byteOffset" : 89505, + "numKeys" : 81 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 3.375 + }, + "relative" : false + } ], + "finishedActions" : [ 8 ] + }, { + "name" : "jumpingJackToLungeClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 0, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 756, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 1368, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 2124, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 2736, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 3492, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 4248, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 5004, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 5760, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 6516, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 7272, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 8028, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 8784, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 9540, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 10296, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 11052, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 11808, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 12564, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 13320, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 14076, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 14832, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 15588, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 16344, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 17100, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 17856, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 18468, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 19224, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 19980, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 20736, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 21492, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 22248, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 23004, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 23760, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 24516, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 25272, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 26028, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 26784, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 27540, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 28296, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 29052, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 29808, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 30564, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 31320, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 32076, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 32832, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 33588, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 34344, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 35100, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 35856, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 36612, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 37368, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-lunge-animation.ani", + "byteOffset" : 38124, + "numKeys" : 36 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.5 + }, + "relative" : false + } ], + "finishedActions" : [ 9 ] + }, { + "name" : "jumpingJackToSquatClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 0, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 525, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 950, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 1475, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 2000, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 2525, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 3050, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 3575, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 4100, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 4625, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 5150, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 5675, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 6200, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 6725, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 7250, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 7775, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 8300, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 8825, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 9350, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 9875, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 10400, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 10925, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 11450, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 11975, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/jumping-jack-to-squat-animation.ani", + "byteOffset" : 12500, + "numKeys" : 25 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.04167 + }, + "relative" : false + } ], + "finishedActions" : [ 10 ] + }, { + "name" : "lungeToJumpingJackClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 0, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 861, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 1558, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 2419, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 3116, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 3977, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 4838, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 5699, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 6560, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 7421, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 8282, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 9143, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 10004, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 10865, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 11726, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 12587, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 13448, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 14309, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 15170, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 16031, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 16892, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 17753, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 18614, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 19475, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 20336, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 21033, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 21894, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 22755, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 23616, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 24477, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 25338, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 26199, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 27060, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 27921, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 28782, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 29643, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 30504, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 31365, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 32226, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 33087, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 33948, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 34809, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 35670, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 36531, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 37392, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 38253, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 39114, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 39975, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 40836, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 41697, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 42558, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-jumping-jack-animation.ani", + "byteOffset" : 43419, + "numKeys" : 41 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.70833 + }, + "relative" : false + } ], + "finishedActions" : [ 11 ] + }, { + "name" : "lungeToSquatClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 0, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 546, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 988, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 1534, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 1976, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 2522, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 3068, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 3614, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 4160, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 4706, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 5252, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 5798, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 6344, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 6890, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 7436, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 7982, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 8528, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 9074, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 9620, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 10166, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 10712, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 11258, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 11804, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 12350, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 12896, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 13338, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 13884, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 14430, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 14976, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 15522, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 16068, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 16614, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 17160, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 17706, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 18252, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 18798, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 19344, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 19890, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 20436, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 20982, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 21528, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 22074, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 22620, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 23166, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 23712, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 24258, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 24804, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 25350, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 25896, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 26442, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 26988, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/lunge-to-squat-animation.ani", + "byteOffset" : 27534, + "numKeys" : 26 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.08333 + }, + "relative" : false + } ], + "finishedActions" : [ 12 ] + }, { + "name" : "squatToJumpingJackClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 0, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 630, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 1140, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 1770, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 2400, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 3030, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 3660, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 4290, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 4920, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 5550, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_shoulder_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 6180, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 6690, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 7320, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 7950, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 8580, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 9210, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 9840, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 10470, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 11100, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 11730, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 12360, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 12990, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 13620, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 14250, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 14880, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 15510, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + }, { + "node" : "l_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-jumping-jack-animation.ani", + "byteOffset" : 16140, + "numKeys" : 30 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.25 + }, + "relative" : false + } ], + "finishedActions" : [ 13 ] + }, { + "name" : "squatToLungeClip", + "loopCount" : 1, + "duration" : 0.0, + "endAction" : "BAKE", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "hips_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 0, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "hips_JNT", + "property" : "position", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 504, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "spine_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 912, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "spine1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 1416, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "spine2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 1920, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 2424, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 2928, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 3432, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 3936, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 4440, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 4944, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 5448, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 5952, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 6456, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 6960, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 7464, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 7968, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 8472, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 8976, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 9480, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 9984, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 10488, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 10992, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_arm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 11496, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_forearm_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 12000, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_hand_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 12504, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handThumb1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 13008, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handThumb2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 13512, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handThumb3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 14016, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handRing1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 14520, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handRing2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 15024, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handRing3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 15528, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handPinky1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 16032, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handPinky2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 16536, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handPinky3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 17040, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handMiddle1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 17544, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handMiddle2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 18048, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handMiddle3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 18552, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handIndex1_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 19056, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handIndex2_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 19560, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_handIndex3_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 20064, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "neck_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 20568, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "head_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 21072, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 21576, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 22080, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 22584, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "r_toebase_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 23088, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_upleg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 23592, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_leg_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 24096, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + }, { + "node" : "l_foot_JNT", + "property" : "orientation", + "keyFramesBin" : { + "url" : "exercise/squat-to-lunge-animation.ani", + "byteOffset" : 24600, + "numKeys" : 24 + }, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 1.0 + }, + "relative" : false + } ], + "finishedActions" : [ 14 ] + } ], + "animationGroups" : [ { + "name" : "Idle", + "animations" : [ "idleClip" ] + }, { + "name" : "Squat", + "animations" : [ "squatClip_0", "squatClip_1" ] + }, { + "name" : "JumpingJack", + "animations" : [ "jumpingJackClip" ] + }, { + "name" : "Lunge", + "animations" : [ "lungeClip" ] + }, { + "name" : "IdleToSquat", + "animations" : [ "idleToSquatClip_0", "idleToSquatClip_1" ] + }, { + "name" : "SquatToIdle", + "animations" : [ "squatToIdleClip" ] + }, { + "name" : "IdleToJumpingJack", + "animations" : [ "idleToJumpingJackClip" ] + }, { + "name" : "JumpingJackToIdle", + "animations" : [ "jumpingJackToIdleClip" ] + }, { + "name" : "IdleToLunge", + "animations" : [ "idleToLungeClip" ] + }, { + "name" : "LungeToIdle", + "animations" : [ "lungeToIdleClip" ] + }, { + "name" : "JumpingJackToLunge", + "animations" : [ "jumpingJackToLungeClip" ] + }, { + "name" : "JumpingJackToSquat", + "animations" : [ "jumpingJackToSquatClip" ] + }, { + "name" : "LungeToJumpingJack", + "animations" : [ "lungeToJumpingJackClip" ] + }, { + "name" : "LungeToSquat", + "animations" : [ "lungeToSquatClip" ] + }, { + "name" : "SquatToJumpingJack", + "animations" : [ "squatToJumpingJackClip" ] + }, { + "name" : "SquatToLunge", + "animations" : [ "squatToLungeClip" ] + } ], + "skeletons" : [ { + "node" : "hips_JNT" + } ] +} diff --git a/automated-tests/resources/exercise/Icons/Icon_Idle.png b/automated-tests/resources/exercise/Icons/Icon_Idle.png new file mode 100644 index 0000000..ee10734 Binary files /dev/null and b/automated-tests/resources/exercise/Icons/Icon_Idle.png differ diff --git a/automated-tests/resources/exercise/Icons/Icon_JJ.png b/automated-tests/resources/exercise/Icons/Icon_JJ.png new file mode 100644 index 0000000..1c690f5 Binary files /dev/null and b/automated-tests/resources/exercise/Icons/Icon_JJ.png differ diff --git a/automated-tests/resources/exercise/Icons/Icon_Lunge.png b/automated-tests/resources/exercise/Icons/Icon_Lunge.png new file mode 100644 index 0000000..8853b14 Binary files /dev/null and b/automated-tests/resources/exercise/Icons/Icon_Lunge.png differ diff --git a/automated-tests/resources/exercise/Icons/Icon_Squat.png b/automated-tests/resources/exercise/Icons/Icon_Squat.png new file mode 100644 index 0000000..f4f8ce3 Binary files /dev/null and b/automated-tests/resources/exercise/Icons/Icon_Squat.png differ diff --git a/automated-tests/resources/exercise/Textures/BG_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/BG_AlbedoMetallic.png new file mode 100644 index 0000000..45489d2 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/BG_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/BG_NormalRoughness.png b/automated-tests/resources/exercise/Textures/BG_NormalRoughness.png new file mode 100644 index 0000000..52cb66d Binary files /dev/null and b/automated-tests/resources/exercise/Textures/BG_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/Body_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/Body_AlbedoMetallic.png new file mode 100644 index 0000000..d8211a6 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Body_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/Body_Female_Asian_Adult_SubsurfaceColor.png b/automated-tests/resources/exercise/Textures/Body_Female_Asian_Adult_SubsurfaceColor.png new file mode 100644 index 0000000..8df1878 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Body_Female_Asian_Adult_SubsurfaceColor.png differ diff --git a/automated-tests/resources/exercise/Textures/Body_NormalRoughness.png b/automated-tests/resources/exercise/Textures/Body_NormalRoughness.png new file mode 100644 index 0000000..91d02cb Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Body_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/Eye_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/Eye_AlbedoMetallic.png new file mode 100644 index 0000000..0137f24 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Eye_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/Eye_NormalRoughness.png b/automated-tests/resources/exercise/Textures/Eye_NormalRoughness.png new file mode 100644 index 0000000..9d5971b Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Eye_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/FitBot_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/FitBot_AlbedoMetallic.png new file mode 100644 index 0000000..d70a3de Binary files /dev/null and b/automated-tests/resources/exercise/Textures/FitBot_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/FitBot_NormalRoughness.png b/automated-tests/resources/exercise/Textures/FitBot_NormalRoughness.png new file mode 100644 index 0000000..fd47924 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/FitBot_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/FitTop_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/FitTop_AlbedoMetallic.png new file mode 100644 index 0000000..f19e93c Binary files /dev/null and b/automated-tests/resources/exercise/Textures/FitTop_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/FitTop_NormalRoughness.png b/automated-tests/resources/exercise/Textures/FitTop_NormalRoughness.png new file mode 100644 index 0000000..6c3e743 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/FitTop_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/Hair_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/Hair_AlbedoMetallic.png new file mode 100644 index 0000000..8b96834 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Hair_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/Hair_NormalRoughness.png b/automated-tests/resources/exercise/Textures/Hair_NormalRoughness.png new file mode 100644 index 0000000..9d643ab Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Hair_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/Head_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/Head_AlbedoMetallic.png new file mode 100644 index 0000000..568a115 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Head_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/Head_Female_SubsurfaceColor.png b/automated-tests/resources/exercise/Textures/Head_Female_SubsurfaceColor.png new file mode 100644 index 0000000..609ce5b Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Head_Female_SubsurfaceColor.png differ diff --git a/automated-tests/resources/exercise/Textures/Head_NormalRoughness.png b/automated-tests/resources/exercise/Textures/Head_NormalRoughness.png new file mode 100644 index 0000000..b2eb952 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Head_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/Textures/Shoe_AlbedoMetallic.png b/automated-tests/resources/exercise/Textures/Shoe_AlbedoMetallic.png new file mode 100644 index 0000000..6bf07f9 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Shoe_AlbedoMetallic.png differ diff --git a/automated-tests/resources/exercise/Textures/Shoe_NormalRoughness.png b/automated-tests/resources/exercise/Textures/Shoe_NormalRoughness.png new file mode 100644 index 0000000..f953ec0 Binary files /dev/null and b/automated-tests/resources/exercise/Textures/Shoe_NormalRoughness.png differ diff --git a/automated-tests/resources/exercise/idle-animation.ani b/automated-tests/resources/exercise/idle-animation.ani new file mode 100644 index 0000000..02f76fd Binary files /dev/null and b/automated-tests/resources/exercise/idle-animation.ani differ diff --git a/automated-tests/resources/exercise/idle-to-jumping-jack-animation.ani b/automated-tests/resources/exercise/idle-to-jumping-jack-animation.ani new file mode 100644 index 0000000..74b8647 Binary files /dev/null and b/automated-tests/resources/exercise/idle-to-jumping-jack-animation.ani differ diff --git a/automated-tests/resources/exercise/idle-to-lunge-animation.ani b/automated-tests/resources/exercise/idle-to-lunge-animation.ani new file mode 100644 index 0000000..81743dd Binary files /dev/null and b/automated-tests/resources/exercise/idle-to-lunge-animation.ani differ diff --git a/automated-tests/resources/exercise/idle-to-squat-animation-0.ani b/automated-tests/resources/exercise/idle-to-squat-animation-0.ani new file mode 100644 index 0000000..f7d792c Binary files /dev/null and b/automated-tests/resources/exercise/idle-to-squat-animation-0.ani differ diff --git a/automated-tests/resources/exercise/idle-to-squat-animation-1.ani b/automated-tests/resources/exercise/idle-to-squat-animation-1.ani new file mode 100644 index 0000000..e0ec040 Binary files /dev/null and b/automated-tests/resources/exercise/idle-to-squat-animation-1.ani differ diff --git a/automated-tests/resources/exercise/jumping-jack-animation.ani b/automated-tests/resources/exercise/jumping-jack-animation.ani new file mode 100644 index 0000000..8bd679d Binary files /dev/null and b/automated-tests/resources/exercise/jumping-jack-animation.ani differ diff --git a/automated-tests/resources/exercise/jumping-jack-to-idle-animation.ani b/automated-tests/resources/exercise/jumping-jack-to-idle-animation.ani new file mode 100644 index 0000000..6d143e1 Binary files /dev/null and b/automated-tests/resources/exercise/jumping-jack-to-idle-animation.ani differ diff --git a/automated-tests/resources/exercise/jumping-jack-to-lunge-animation.ani b/automated-tests/resources/exercise/jumping-jack-to-lunge-animation.ani new file mode 100644 index 0000000..08c588b Binary files /dev/null and b/automated-tests/resources/exercise/jumping-jack-to-lunge-animation.ani differ diff --git a/automated-tests/resources/exercise/jumping-jack-to-squat-animation.ani b/automated-tests/resources/exercise/jumping-jack-to-squat-animation.ani new file mode 100644 index 0000000..ae66e77 Binary files /dev/null and b/automated-tests/resources/exercise/jumping-jack-to-squat-animation.ani differ diff --git a/automated-tests/resources/exercise/lunge-animation.ani b/automated-tests/resources/exercise/lunge-animation.ani new file mode 100644 index 0000000..3912665 Binary files /dev/null and b/automated-tests/resources/exercise/lunge-animation.ani differ diff --git a/automated-tests/resources/exercise/lunge-to-idle-animation.ani b/automated-tests/resources/exercise/lunge-to-idle-animation.ani new file mode 100644 index 0000000..d88c844 Binary files /dev/null and b/automated-tests/resources/exercise/lunge-to-idle-animation.ani differ diff --git a/automated-tests/resources/exercise/lunge-to-jumping-jack-animation.ani b/automated-tests/resources/exercise/lunge-to-jumping-jack-animation.ani new file mode 100644 index 0000000..118ffa1 Binary files /dev/null and b/automated-tests/resources/exercise/lunge-to-jumping-jack-animation.ani differ diff --git a/automated-tests/resources/exercise/lunge-to-squat-animation.ani b/automated-tests/resources/exercise/lunge-to-squat-animation.ani new file mode 100644 index 0000000..6d435de Binary files /dev/null and b/automated-tests/resources/exercise/lunge-to-squat-animation.ani differ diff --git a/automated-tests/resources/exercise/model.dae.bin b/automated-tests/resources/exercise/model.dae.bin new file mode 100644 index 0000000..c894ae9 Binary files /dev/null and b/automated-tests/resources/exercise/model.dae.bin differ diff --git a/automated-tests/resources/exercise/squat-animation-0.ani b/automated-tests/resources/exercise/squat-animation-0.ani new file mode 100644 index 0000000..435aaeb Binary files /dev/null and b/automated-tests/resources/exercise/squat-animation-0.ani differ diff --git a/automated-tests/resources/exercise/squat-animation-1.ani b/automated-tests/resources/exercise/squat-animation-1.ani new file mode 100644 index 0000000..6fd09cb Binary files /dev/null and b/automated-tests/resources/exercise/squat-animation-1.ani differ diff --git a/automated-tests/resources/exercise/squat-to-idle-animation.ani b/automated-tests/resources/exercise/squat-to-idle-animation.ani new file mode 100644 index 0000000..1bfef9a Binary files /dev/null and b/automated-tests/resources/exercise/squat-to-idle-animation.ani differ diff --git a/automated-tests/resources/exercise/squat-to-jumping-jack-animation.ani b/automated-tests/resources/exercise/squat-to-jumping-jack-animation.ani new file mode 100644 index 0000000..82316cb Binary files /dev/null and b/automated-tests/resources/exercise/squat-to-jumping-jack-animation.ani differ diff --git a/automated-tests/resources/exercise/squat-to-lunge-animation.ani b/automated-tests/resources/exercise/squat-to-lunge-animation.ani new file mode 100644 index 0000000..c967b9a Binary files /dev/null and b/automated-tests/resources/exercise/squat-to-lunge-animation.ani differ diff --git a/automated-tests/resources/forest_irradiance.ktx b/automated-tests/resources/forest_irradiance.ktx new file mode 100644 index 0000000..c6b2332 Binary files /dev/null and b/automated-tests/resources/forest_irradiance.ktx differ diff --git a/automated-tests/resources/forest_radiance.ktx b/automated-tests/resources/forest_radiance.ktx new file mode 100644 index 0000000..38f7f1a Binary files /dev/null and b/automated-tests/resources/forest_radiance.ktx differ diff --git a/automated-tests/resources/invalid.gltf b/automated-tests/resources/invalid.gltf new file mode 100644 index 0000000..a9e1c8a --- /dev/null +++ b/automated-tests/resources/invalid.gltf @@ -0,0 +1,3 @@ +{ + "error": yes +} diff --git a/automated-tests/resources/morph.dli b/automated-tests/resources/morph.dli new file mode 100644 index 0000000..9f9a5a2 --- /dev/null +++ b/automated-tests/resources/morph.dli @@ -0,0 +1,280 @@ +{ + "metadata" : [ { + "key" : "clock-type", + "value" : "com.samsung.watchface-01" + }, { + "key" : "tickpersecond", + "value" : "1" + }, { + "key" : "preview_time", + "value" : "10:08:32" + }, { + "key" : "tilt-mode", + "value" : "light" + } ], + "asset" : { + "version" : "1.0" + }, + "scene" : 0, + "scenes" : [ { + "nodes" : [ 0 ] + } ], + "nodes" : [ { + "name" : "HeadTest_002", + "matrix" : [ 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "children" : [ 1, 2 ], + "visible" : true, + "lightingMode" : "unlit" + }, { + "name" : "head", + "matrix" : [ 0.819152044288992, 0.0, 0.5735764363510462, 0.0, 0.0, 1.0, 0.0, 0.0, -0.5735764363510462, 0.0, 0.819152044288992, 0.0, 0.0, -143.995, -1.1208, 1.0 ], + "behavior" : [ 0 ], + "visible" : true, + "lightingMode" : "lit-solid", + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 0, + "mesh" : 0, + "shader" : 3 + } + }, { + "name" : "Cube", + "matrix" : [ 25.98076211353316, 0.0, -15.0, 0.0, 0.0, 30.0, 0.0, 0.0, 15.0, 0.0, 25.98076211353316, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "visible" : true, + "lightingMode" : "lit", + "model" : { + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "material" : 0, + "mesh" : 1, + "shader" : 4 + } + } ], + "meshes" : [ { + "uri" : "morph/HeadTest_002.dae.bin", + "attributes" : 31, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 0, + "byteLength" : 34524 + }, + "positions" : { + "byteOffset" : 34524, + "byteLength" : 37812 + }, + "normals" : { + "byteOffset" : 72336, + "byteLength" : 37812 + }, + "textures" : { + "byteOffset" : 110148, + "byteLength" : 25208 + }, + "tangents" : { + "byteOffset" : 135356, + "byteLength" : 37812 + }, + "blendShapeHeader" : { + "version" : "1.0", + "byteOffset" : 173168, + "byteLength" : 4 + }, + "blendShapes" : [ { + "name" : "Shape_01MeshMesh", + "weight" : 0.0, + "positions" : { + "byteOffset" : 173172, + "byteLength" : 37812 + }, + "normals" : { + "byteOffset" : 210984, + "byteLength" : 37812 + } + }, { + "name" : "Shape_02MeshMesh", + "weight" : 0.0, + "positions" : { + "byteOffset" : 248796, + "byteLength" : 37812 + }, + "normals" : { + "byteOffset" : 286608, + "byteLength" : 37812 + } + }, { + "name" : "Shape_03MeshMesh", + "weight" : 0.0, + "positions" : { + "byteOffset" : 324420, + "byteLength" : 37812 + }, + "normals" : { + "byteOffset" : 362232, + "byteLength" : 37812 + } + } ] + }, { + "uri" : "morph/cube.gltf.bin", + "attributes" : 31, + "primitive" : "TRIANGLES", + "indices" : { + "byteOffset" : 0, + "byteLength" : 72 + }, + "positions" : { + "byteOffset" : 72, + "byteLength" : 288 + }, + "normals" : { + "byteOffset" : 360, + "byteLength" : 288 + }, + "textures" : { + "byteOffset" : 648, + "byteLength" : 192 + }, + "tangents" : { + "byteOffset" : 840, + "byteLength" : 288 + } + } ], + "cameras" : [ { + "near" : 0.1, + "far" : 10000.0, + "matrix" : [ 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.767773, 1.0 ], + "fov" : 54.4321 + } ], + "lights" : [ { + "matrix" : [ 0.4999999403953552, 0.0, 0.8660255074501038, 0.0, 0.0, 1.0, 0.0, 0.0, -0.8660255074501038, 0.0, 0.4999999403953552, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "color" : [ 1.0, 1.0, 1.0 ], + "intensity" : 1.0, + "shadowMapSize" : 1024, + "orthographicSize" : 1.0, + "shadowIntensity" : 1.0 + } ], + "materials" : [ { + "name" : "No name", + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "mipmap" : true, + "roughness" : 1.0, + "metallic" : 1.0, + "environment" : 1 + } ], + "environment" : [ { + "cubeInitialOrientation" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "iblIntensity" : 1.0 + }, { + "cubeSpecular" : "Studio/Radiance.ktx", + "cubeDiffuse" : "Studio/Irradiance.ktx", + "cubeInitialOrientation" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "iblIntensity" : 1.0 + } ], + "shaders" : [ { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "defines" : [ "LIT" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "defines" : [ "THREE_TEX" ], + "rendererState" : "DEPTH_TEST|ALPHA_BLEND", + "uCubeMatrix" : [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "defines" : [ "MORPH", "MORPH_POSITION", "MORPH_NORMAL" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "hints" : [ "MODIFIES_GEOMETRY" ], + "defines" : [ "MORPH", "MORPH_POSITION", "MORPH_NORMAL" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_BACK|DEPTH_FUNC:LESS_EQUAL", + "uCubeMatrix" : [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "uMaxLOD" : 6 + }, { + "vertex" : "dli_pbr.vsh", + "fragment" : "dli_pbr.fsh", + "defines" : [ "LIT", "SHADOW" ], + "rendererState" : "DEPTH_TEST|DEPTH_WRITE|CULL_FRONT", + "uCubeMatrix" : [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], + "uMaxLOD" : 6 + } ], + "behaviors" : [ { + "url" : "head-behavior_1.lua", + "event" : "scene.loaded" + } ], + "animations" : [ { + "name" : "Morph", + "loopCount" : 0, + "duration" : 1.0, + "endAction" : "DISCARD", + "disconnectAction" : "BAKE", + "properties" : [ { + "node" : "head", + "property" : "uBlendShapeWeight[0]", + "value" : 1.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 0.5 + }, + "relative" : false + }, { + "node" : "head", + "property" : "uBlendShapeWeight[1]", + "value" : 1.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 0.5 + }, + "relative" : false + }, { + "node" : "head", + "property" : "uBlendShapeWeight[2]", + "value" : 1.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.0, + "duration" : 0.5 + }, + "relative" : false + }, { + "node" : "head", + "property" : "uBlendShapeWeight[0]", + "value" : 0.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.5, + "duration" : 0.5 + }, + "relative" : false + }, { + "node" : "head", + "property" : "uBlendShapeWeight[1]", + "value" : 0.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.5, + "duration" : 0.5 + }, + "relative" : false + }, { + "node" : "head", + "property" : "uBlendShapeWeight[2]", + "value" : 0.0, + "alphaFunction" : "DEFAULT", + "timePeriod" : { + "delay" : 0.5, + "duration" : 0.5 + }, + "relative" : false + } ] + } ] +} diff --git a/automated-tests/resources/morph/HeadTest_002.dae.bin b/automated-tests/resources/morph/HeadTest_002.dae.bin new file mode 100644 index 0000000..5fcc8c5 Binary files /dev/null and b/automated-tests/resources/morph/HeadTest_002.dae.bin differ diff --git a/automated-tests/resources/morph/cube.gltf.bin b/automated-tests/resources/morph/cube.gltf.bin new file mode 100644 index 0000000..8d715e4 Binary files /dev/null and b/automated-tests/resources/morph/cube.gltf.bin differ diff --git a/automated-tests/resources/simpleTriangle.bin b/automated-tests/resources/simpleTriangle.bin new file mode 100644 index 0000000..d642500 Binary files /dev/null and b/automated-tests/resources/simpleTriangle.bin differ diff --git a/automated-tests/resources/truncated.ktx b/automated-tests/resources/truncated.ktx new file mode 100644 index 0000000..a2dbcf1 Binary files /dev/null and b/automated-tests/resources/truncated.ktx differ diff --git a/automated-tests/src/dali-scene-loader-internal/CMakeLists.txt b/automated-tests/src/dali-scene-loader-internal/CMakeLists.txt new file mode 100755 index 0000000..14c7edd --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/CMakeLists.txt @@ -0,0 +1,88 @@ +SET(PKG_NAME "dali-scene-loader-internal") + +SET(EXEC_NAME "tct-${PKG_NAME}-core") +SET(RPM_NAME "core-${PKG_NAME}-tests") + +SET(CAPI_LIB "dali-scene-loader") + +# List of test case sources (Only these get parsed for test cases) +SET(TC_SOURCES + utc-Dali-Gltf2Asset.cpp + utc-Dali-Hash.cpp + utc-Dali-JsonReader.cpp + utc-Dali-JsonUtil.cpp +) + +# List of test harness files (Won't get parsed for test cases) +SET(TEST_HARNESS_DIR "../dali-toolkit/dali-toolkit-test-utils") + +SET(TEST_HARNESS_SOURCES + ${TEST_HARNESS_DIR}/toolkit-adaptor.cpp + ${TEST_HARNESS_DIR}/toolkit-application.cpp + ${TEST_HARNESS_DIR}/toolkit-event-thread-callback.cpp + ${TEST_HARNESS_DIR}/toolkit-environment-variable.cpp + ${TEST_HARNESS_DIR}/toolkit-input-method-context.cpp + ${TEST_HARNESS_DIR}/toolkit-input-method-options.cpp + ${TEST_HARNESS_DIR}/toolkit-lifecycle-controller.cpp + ${TEST_HARNESS_DIR}/toolkit-orientation.cpp + ${TEST_HARNESS_DIR}/toolkit-style-monitor.cpp + ${TEST_HARNESS_DIR}/toolkit-test-application.cpp + ${TEST_HARNESS_DIR}/toolkit-timer.cpp + ${TEST_HARNESS_DIR}/toolkit-trigger-event-factory.cpp + ${TEST_HARNESS_DIR}/toolkit-window.cpp + ${TEST_HARNESS_DIR}/toolkit-scene-holder.cpp + ${TEST_HARNESS_DIR}/dali-test-suite-utils.cpp + ${TEST_HARNESS_DIR}/dali-toolkit-test-suite-utils.cpp + ${TEST_HARNESS_DIR}/dummy-control.cpp + ${TEST_HARNESS_DIR}/mesh-builder.cpp + ${TEST_HARNESS_DIR}/test-actor-utils.cpp + ${TEST_HARNESS_DIR}/test-animation-data.cpp + ${TEST_HARNESS_DIR}/test-application.cpp + ${TEST_HARNESS_DIR}/test-button.cpp + ${TEST_HARNESS_DIR}/test-harness.cpp + ${TEST_HARNESS_DIR}/test-gesture-generator.cpp + ${TEST_HARNESS_DIR}/test-gl-abstraction.cpp + ${TEST_HARNESS_DIR}/test-gl-sync-abstraction.cpp + ${TEST_HARNESS_DIR}/test-platform-abstraction.cpp + ${TEST_HARNESS_DIR}/test-render-controller.cpp + ${TEST_HARNESS_DIR}/test-trace-call-stack.cpp +) + +PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED + dali2-core + dali2-adaptor + dali2-toolkit + dali2-scene-loader +) + +ADD_COMPILE_OPTIONS( -O0 -ggdb --coverage -Wall -Werror -DDEBUG_ENABLED) +ADD_COMPILE_OPTIONS( ${${CAPI_LIB}_CFLAGS_OTHER} ) + +ADD_DEFINITIONS(-DTEST_RESOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/../../resources\" ) + +FOREACH(directory ${${CAPI_LIB}_LIBRARY_DIRS}) + SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -L${directory}") +ENDFOREACH(directory ${CAPI_LIB_LIBRARY_DIRS}) + +INCLUDE_DIRECTORIES( + ../../../ + ${${CAPI_LIB}_INCLUDE_DIRS} + ../dali-toolkit/dali-toolkit-test-utils +) + +ADD_CUSTOM_COMMAND( + COMMAND ${SCRIPT_DIR}/tcheadgen.sh ${EXEC_NAME}.h ${TC_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT ${EXEC_NAME}.h + COMMENT "Generating test tables" + ) + +ADD_EXECUTABLE(${EXEC_NAME} ${EXEC_NAME}.h ${EXEC_NAME}.cpp ${TC_SOURCES} ${TEST_HARNESS_SOURCES}) +TARGET_LINK_LIBRARIES(${EXEC_NAME} + ${${CAPI_LIB}_LIBRARIES} + -lpthread --coverage +) + +INSTALL(PROGRAMS ${EXEC_NAME} + DESTINATION ${BIN_DIR}/${EXEC_NAME} +) diff --git a/automated-tests/src/dali-scene-loader-internal/tct-dali-scene-loader-internal-core.cpp b/automated-tests/src/dali-scene-loader-internal/tct-dali-scene-loader-internal-core.cpp new file mode 100644 index 0000000..9dea347 --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/tct-dali-scene-loader-internal-core.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include "tct-dali-scene-loader-internal-core.h" + +int main(int argc, char * const argv[]) +{ + int result = TestHarness::EXIT_STATUS_BAD_ARGUMENT; + + const char* optString = "sf"; + bool optRerunFailed(true); + bool optRunSerially(false); + + int nextOpt = 0; + do + { + nextOpt = getopt( argc, argv, optString ); + switch(nextOpt) + { + case 'f': + optRerunFailed = false; + break; + case 's': + optRunSerially = true; + break; + case '?': + TestHarness::Usage(argv[0]); + exit(TestHarness::EXIT_STATUS_BAD_ARGUMENT); + break; + } + } while( nextOpt != -1 ); + + if( optind == argc ) // no testcase name in argument list + { + if( optRunSerially ) + { + result = TestHarness::RunAll( argv[0], tc_array ); + } + else + { + result = TestHarness::RunAllInParallel( argv[0], tc_array, optRerunFailed ); + } + } + else + { + // optind is index of next argument - interpret as testcase name + result = TestHarness::FindAndRunTestCase(tc_array, argv[optind]); + } + return result; +} diff --git a/automated-tests/src/dali-scene-loader-internal/utc-Dali-Gltf2Asset.cpp b/automated-tests/src/dali-scene-loader-internal/utc-Dali-Gltf2Asset.cpp new file mode 100644 index 0000000..8574137 --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/utc-Dali-Gltf2Asset.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/internal/gltf2-asset.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliGltf2AssetComponentIsUnsigned(void) +{ + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::BYTE), false); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::UNSIGNED_BYTE), true); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::SHORT), false); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::UNSIGNED_SHORT), true); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::UNSIGNED_INT), true); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::FLOAT), false); + DALI_TEST_EQUAL(gltf2::Component::IsUnsigned(gltf2::Component::INVALID), false); + + END_TEST; +} + +int UtcDaliGltf2AssetComponentSize(void) +{ + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::BYTE), 1u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::UNSIGNED_BYTE), 1u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::SHORT), 2u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::UNSIGNED_SHORT), 2u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::UNSIGNED_INT), 4u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::FLOAT), 4u); + DALI_TEST_EQUAL(gltf2::Component::Size(gltf2::Component::INVALID), -1); + + END_TEST; +} + +#define FROM_STRING_HELPER(x) FromString(#x, strlen(#x)) + +#define STRING_CHECK(type, x) DALI_TEST_EQUAL(gltf2::type:: FROM_STRING_HELPER(x), gltf2::type::x) + +int UtcDaliGltf2AssetAccessorType(void) +{ + STRING_CHECK(AccessorType, SCALAR); + STRING_CHECK(AccessorType, VEC2); + STRING_CHECK(AccessorType, VEC3); + STRING_CHECK(AccessorType, VEC4); + STRING_CHECK(AccessorType, MAT2); + STRING_CHECK(AccessorType, MAT3); + STRING_CHECK(AccessorType, MAT4); + DALI_TEST_EQUAL(gltf2::AccessorType::FROM_STRING_HELPER(VEC88), gltf2::AccessorType::INVALID); + + END_TEST; +} + +int UtcDaliGltf2AssetAlphaMode(void) +{ + STRING_CHECK(AlphaMode, OPAQUE); + STRING_CHECK(AlphaMode, MASK); + STRING_CHECK(AlphaMode, BLEND); + DALI_TEST_EQUAL(gltf2::AlphaMode::FROM_STRING_HELPER(ALPHA_SCHMALPHA), gltf2::AlphaMode::INVALID); + + END_TEST; +} + +int UtcDaliGltf2AssetAttribute(void) +{ + STRING_CHECK(Attribute, POSITION); + STRING_CHECK(Attribute, NORMAL); + STRING_CHECK(Attribute, TANGENT); + STRING_CHECK(Attribute, TEXCOORD_0); + STRING_CHECK(Attribute, TEXCOORD_1); + STRING_CHECK(Attribute, COLOR_0); + STRING_CHECK(Attribute, JOINTS_0); + STRING_CHECK(Attribute, WEIGHTS_0); + DALI_TEST_EQUAL(gltf2::Attribute::FROM_STRING_HELPER(VISCOSITY), gltf2::Attribute::INVALID); + + END_TEST; +} + +int UtcDaliGltf2AssetAnimationSamplerInterpolation(void) +{ + STRING_CHECK(Animation::Sampler::Interpolation, STEP); + STRING_CHECK(Animation::Sampler::Interpolation, LINEAR); + STRING_CHECK(Animation::Sampler::Interpolation, CUBICSPLINE); + DALI_TEST_EQUAL(gltf2::Animation::Sampler::Interpolation::FROM_STRING_HELPER(EASE_IN_OUT), gltf2::Animation::Sampler::Interpolation::INVALID); + + END_TEST; +} + +int UtcDaliGltf2AssetAnimationChannelTarget(void) +{ + STRING_CHECK(Animation::Channel::Target, TRANSLATION); + STRING_CHECK(Animation::Channel::Target, ROTATION); + STRING_CHECK(Animation::Channel::Target, SCALE); + STRING_CHECK(Animation::Channel::Target, WEIGHTS); + DALI_TEST_EQUAL(gltf2::Animation::Channel::Target::FROM_STRING_HELPER(FLUFFINESS), gltf2::Animation::Channel::Target::INVALID); + + END_TEST; +} + +int UtcDaliGltf2AssetAccessorSparse(void) +{ + gltf2::Accessor acc; + DALI_TEST_CHECK(!acc.mSparse); + + std::vector bufferViews; + + gltf2::Accessor::Sparse sparse{ 256u }; + sparse.mIndices.mBufferView = gltf2::Ref(bufferViews, 5u); + sparse.mIndices.mComponentType = gltf2::Component::FLOAT; + sparse.mValues.mBufferView = gltf2::Ref(bufferViews, 284u); + sparse.mValues.mByteOffset = 16532; + acc.SetSparse(sparse); + + DALI_TEST_EQUAL(acc.mSparse->mCount, sparse.mCount); + DALI_TEST_EQUAL(acc.mSparse->mIndices.mBufferView, sparse.mIndices.mBufferView); + DALI_TEST_EQUAL(acc.mSparse->mIndices.mByteOffset, sparse.mIndices.mByteOffset); + DALI_TEST_EQUAL(acc.mSparse->mIndices.mComponentType, sparse.mIndices.mComponentType); + DALI_TEST_EQUAL(acc.mSparse->mValues.mBufferView, sparse.mValues.mBufferView); + DALI_TEST_EQUAL(acc.mSparse->mValues.mByteOffset, sparse.mValues.mByteOffset); + + END_TEST; +} + diff --git a/automated-tests/src/dali-scene-loader-internal/utc-Dali-Hash.cpp b/automated-tests/src/dali-scene-loader-internal/utc-Dali-Hash.cpp new file mode 100644 index 0000000..efd5053 --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/utc-Dali-Hash.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/internal/hash.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliHash(void) +{ + DALI_TEST_EQUAL(Hash(0).Add(true), 0); + DALI_TEST_EQUAL(Hash(0).Add(false), 1); + + int32_t myInt32 = std::numeric_limits::min(); + DALI_TEST_EQUAL(Hash(0).Add(myInt32), myInt32); + + uint32_t myUint32 = std::numeric_limits::max(); + DALI_TEST_EQUAL(Hash(0).Add(myUint32), myUint32); + + uint64_t myUint64 = std::numeric_limits::max(); + DALI_TEST_EQUAL(uint64_t(Hash(0).Add(myUint64)), myUint64); + + constexpr uint32_t multiplier = 31; + uint64_t expected = 0; + float f = 1928.46852; + for (auto i0 = reinterpret_cast(&f), i1 = i0 + sizeof(f); i0 != i1; ++i0) + { + expected = expected * multiplier + *i0; + } + + DALI_TEST_EQUAL(uint64_t(Hash(0).Add(f)), expected); + + END_TEST; +} + diff --git a/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonReader.cpp b/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonReader.cpp new file mode 100644 index 0000000..6b7e000 --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonReader.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/internal/json-reader.h" +#include +#include + +using namespace Dali; + +#define JSON_STRING(x) #x, strlen(#x) + +int UtcDaliJsonReaderStrCmp(void) +{ + json_string_s jstr[] { + { JSON_STRING(hello) }, + { JSON_STRING(hellew) }, + }; + DALI_TEST_EQUAL(json::StrCmp(jstr[0], "hello"), 0); + DALI_TEST_EQUAL(json::StrCmp(jstr[1], "hello"), 'e' - 'o'); + + END_TEST; +} + +int UtcDaliJsonReaderValidateThrow(void) +{ + json_value_s jval { nullptr, json_type_array }; + DALI_TEST_THROWS(json::Validate(jval, json_type_object), std::runtime_error); + json::Validate(jval, json_type_array); + + END_TEST; +} + +int UtcDaliJsonReaderFindObjectChild(void) +{ + json_string_s jkey{ JSON_STRING(fudgeFactor) }; + json_number_s jActualValue{ JSON_STRING(5.2) }; + json_value_s jvalue { &jActualValue, json_type_number }; + json_object_element_s jobjelem { &jkey, &jvalue, nullptr }; + + json_object_s jobj{ &jobjelem, 1 }; + + DALI_TEST_EQUAL(json::FindObjectChild(jkey.string, jobj), &jvalue); + DALI_TEST_EQUAL(json::FindObjectChild("fudgeFactory", jobj), static_cast(nullptr)); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonUtil.cpp b/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonUtil.cpp new file mode 100644 index 0000000..41ac039 --- /dev/null +++ b/automated-tests/src/dali-scene-loader-internal/utc-Dali-JsonUtil.cpp @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/internal/json-util.h" +#include "dali-toolkit/devel-api/builder/json-parser.h" +#include +#include + +#define STRINGIFY(x) #x + +using namespace Dali; +using namespace Dali::Toolkit; +using namespace Dali::SceneLoader; + +namespace +{ +const std::string TEST_JSON = + "{ \"int\": 17834," + "\"float\": 3.1415628," + "\"bool\": true," + "\"null\": null," + "\"string\": \"hello\"," + "\"floatArray\": [ 0.0, 0.25, 1.0, 0.75 ]," + "\"intArray\": [ 1, 2, 3, 5, 7, 11, 13, -1, -5 ]," + "\"mixedArray\": [ 1.99, \"the\", 6, \"brown\", \"fox\" ]," + "\"stringArray\": [ \"lorem\", \"ipsum\", \"dolor\", \"sic\", \"amet\" ]," + "\"object\": { \"duration\": 4.0, \"delay\": 1.0 }," + "\"rgb\": [ 0.5, 0.8, 0.25 ]," + "\"disambiguatedFloat\": { \"type\": \"float\", \"value\": 15.8 }," + "\"rotation1\": { \"type\": \"rotation\", \"value\": [ 15.0, 90.0, -45.0 ] }," + "\"rotation2\": { \"type\": \"rotation\", \"value\": [ 0.707, 0.0, 0.707, 0.0 ] }," + "\"matrix\": [ 1.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 1.0, 2.0, 3.0, 4.0 ]," + "\"matrix3\": [ 2.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 1.0, 2.0 ]," + "\"vector2\": [ 2.0, 1.0 ]" + "}"; + +template +struct Item +{ + std::string name; + bool readResult; + T result; +}; + +struct Document +{ + Document(const std::string& json) + : parser(JsonParser::New()) + { + //DALI_TEST_CHECK(parser.Parse(json)); + if (!parser.Parse(json)) + { + auto error = parser.GetErrorDescription(); + printf("Error: %s in {%d, %d}\n", error.c_str(), parser.GetErrorLineNumber(), parser.GetErrorColumn()); + } + root = parser.GetRoot(); + } + + JsonParser parser; + const TreeNode* root; +}; + +template +bool CompareArrays(const T (&array)[N], const T* p, T epsilon = T(0)) +{ + for (auto& i: array) + { + if (std::abs(i - *p) > epsilon) + { + printf("Element %d mismatched.\n", int32_t(std::distance(array, &i))); + return false; + } + ++p; + } + return true; +} + +} + +int UtcDaliJsonUtilReadBool(void) +{ + bool value = false; + DALI_TEST_CHECK(!ReadBool(nullptr, value)); + DALI_TEST_EQUAL(value, false); // unchanged + + Document doc{ TEST_JSON }; + + for (auto& i : { + Item{ "bool", true, true }, + Item{ "int", false, true }, // value unchanged + Item{ "float", false, true }, + Item{ "null", false, true }, + Item{ "floatArray", false, true }, + Item{ "intArray", false, true }, + Item{ "object", false, true }, + }) + { + bool readResult = ReadBool(doc.root->GetChild(i.name), value); + DALI_TEST_EQUAL(readResult, i.readResult); + if (readResult) + { + DALI_TEST_EQUAL(value, i.result); + } + } + + END_TEST; +} + +int UtcDaliJsonUtilReadInt(void) +{ + int value = 0xbadbeef; + DALI_TEST_CHECK(!ReadInt(nullptr, value)); + DALI_TEST_EQUAL(value, 0xbadbeef); + + Document doc{ TEST_JSON }; + + for (auto& i : { + Item{ "bool", false, 0xbadbeef }, // unchanged from initial + Item{ "int", true, 17834 }, + Item{ "float", true, 3 }, + Item{ "null", false, 3 }, + Item{ "floatArray", false, 3 }, + Item{ "intArray", false, 3 }, + Item{ "object", false, 3 }, + }) + { + bool readResult = ReadInt(doc.root->GetChild(i.name), value); + DALI_TEST_EQUAL(readResult, i.readResult); + if (readResult) + { + DALI_TEST_EQUAL(value, i.result); + } + } + + END_TEST; +} + +int UtcDaliJsonUtilReadFloat(void) +{ + float value = 10.101f; + DALI_TEST_CHECK(!ReadFloat(nullptr, value)); + DALI_TEST_EQUAL(value, 10.101f); + + Document doc{ TEST_JSON }; + + for (auto& i : { + Item{ "bool", false, 10.101f }, // unchanged from initial + Item{ "int", true, 17834.f }, + Item{ "float", true, 3.1415628f }, + Item{ "null", false, 3.1415628f }, + Item{ "floatArray", false, 3.1415628f }, + Item{ "intArray", false, 3.1415628f }, + Item{ "object", false, 3.1415628f }, + }) + { + bool readResult = ReadFloat(doc.root->GetChild(i.name), value); + DALI_TEST_EQUAL(readResult, i.readResult); + if (readResult) + { + DALI_TEST_EQUAL(value, i.result); + } + } + + END_TEST; +} + +int UtcDaliJsonUtilNumericalArrays(void) +{ + Document doc{ TEST_JSON }; + + DALI_TEST_EQUAL(4u, GetNumericalArraySize(doc.root->GetChild("floatArray"))); + DALI_TEST_EQUAL(9u, GetNumericalArraySize(doc.root->GetChild("intArray"))); + DALI_TEST_EQUAL(1u, GetNumericalArraySize(doc.root->GetChild("mixedArray"))); + + END_TEST; +} + +int UtcDaliJsonUtilReadVectorInt(void) +{ + DALI_TEST_CHECK(!ReadVector(nullptr, static_cast(nullptr), 0)); + + Document doc{ TEST_JSON }; + + int ints[9]; + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("floatArray"), ints, 4u)); + DALI_TEST_CHECK(CompareArrays({ 0, 0, 1, 0 }, ints)); + + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("intArray"), ints, 9u)); + DALI_TEST_CHECK(CompareArrays({ 1, 2, 3, 5, 7, 11, 13, -1, -5 }, ints)); + + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("mixedArray"), ints, 1u)); + DALI_TEST_CHECK(CompareArrays({ 1 }, ints)); + + END_TEST; +} + +int UtcDaliJsonUtilReadVectorFloat(void) +{ + DALI_TEST_CHECK(!ReadVector(nullptr, static_cast(nullptr), 0)); + + Document doc{ TEST_JSON }; + + constexpr float e = 1e-6f; + float floats[9]; + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("floatArray"), floats, 4u)); + DALI_TEST_CHECK(CompareArrays({ 0.f, 0.25f, 1.f, 0.75f }, floats, e)); + + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("intArray"), floats, 9u)); + DALI_TEST_CHECK(CompareArrays({ 1.f, 2.f, 3.f, 5.f, 7.f, 11.f, 13.f, -1.f, -5.f }, floats, e)); + + DALI_TEST_CHECK(ReadVector(doc.root->GetChild("mixedArray"), floats, 1u)); + DALI_TEST_CHECK(CompareArrays({ 1.99f }, floats, e)); + + END_TEST; +} + +int UtcDaliJsonUtilReadColor(void) +{ + Vector4 color; + DALI_TEST_CHECK(!ReadColor(nullptr, color)); + + Document doc{ TEST_JSON }; + DALI_TEST_CHECK(!ReadColor(doc.root->GetChild("bool"), color)); + DALI_TEST_CHECK(!ReadColor(doc.root->GetChild("int"), color)); + DALI_TEST_CHECK(!ReadColor(doc.root->GetChild("float"), color)); + DALI_TEST_CHECK(!ReadColor(doc.root->GetChild("string"), color)); + DALI_TEST_CHECK(!ReadColor(doc.root->GetChild("object"), color)); + + constexpr float e = 1e-6f; + DALI_TEST_CHECK(ReadColor(doc.root->GetChild("floatArray"), color)); + DALI_TEST_CHECK(CompareArrays({ 0.f, 0.25f, 1.0f, 0.75f }, color.AsFloat(), e)); + + DALI_TEST_CHECK(ReadColor(doc.root->GetChild("intArray"), color)); + DALI_TEST_CHECK(CompareArrays({ 1.f, 2.f, 3.f, 5.f }, color.AsFloat(), e)); + + DALI_TEST_CHECK(ReadColor(doc.root->GetChild("rgb"), color)); + DALI_TEST_CHECK(CompareArrays({ .5f, .8f, .25f, 1.f }, color.AsFloat(), e)); + + END_TEST; +} + +int UtcDaliJsonUtilReadTimePeriod(void) +{ + TimePeriod value(60.f); + DALI_TEST_CHECK(!ReadTimePeriod(nullptr, value)); + DALI_TEST_EQUAL(value.durationSeconds, 60.f); + DALI_TEST_EQUAL(value.delaySeconds, 0.f); + + Document doc{ TEST_JSON }; + DALI_TEST_CHECK(ReadTimePeriod(doc.root->GetChild("object"), value)); + DALI_TEST_EQUAL(value.durationSeconds, 4.f); + DALI_TEST_EQUAL(value.delaySeconds, 1.f); + + END_TEST; +} + +int UtcDaliJsonUtilReadString(void) +{ + std::string value = "bye"; + DALI_TEST_CHECK(!ReadString(nullptr, value)); + DALI_TEST_EQUAL(value, "bye"); + + Document doc{ TEST_JSON }; + + for (auto& i : { + Item{ "bool", false, "bye"}, // unchanged from initial + Item{ "int", false, "bye"}, + Item{ "float", false, "bye"}, + Item{ "null", false, "bye"}, + Item{ "string", true, "hello"}, + Item{ "floatArray", false, "hello"}, // unchanged + Item{ "object", false, "hello"}, + }) + { + bool readResult = ReadString(doc.root->GetChild(i.name), value); + DALI_TEST_EQUAL(readResult, i.readResult); + if (readResult) + { + DALI_TEST_EQUAL(value, i.result); + } + } + + END_TEST; +} + +int UtcDaliJsonUtilReadStringVector(void) +{ + std::vector strings; + DALI_TEST_CHECK(!ReadStringVector(nullptr, strings)); + DALI_TEST_CHECK(strings.empty()); + + Document doc{ TEST_JSON }; + + DALI_TEST_CHECK(!ReadStringVector(doc.root->GetChild("floatArray"), strings)); + DALI_TEST_CHECK(strings.empty()); + + DALI_TEST_CHECK(!ReadStringVector(doc.root->GetChild("intArray"), strings)); + DALI_TEST_CHECK(strings.empty()); + + DALI_TEST_CHECK(!ReadStringVector(doc.root->GetChild("mixedArray"), strings)); + DALI_TEST_CHECK(strings.empty()); + + DALI_TEST_CHECK(ReadStringVector(doc.root->GetChild("stringArray"), strings)); + DALI_TEST_EQUAL(strings.size(), 5u); + + auto iStrings = strings.begin(); + for (auto& i : { "lorem", "ipsum", "dolor", "sic", "amet" }) + { + DALI_TEST_EQUAL(*iStrings, i); + ++iStrings; + } + + END_TEST; +} + +int UtcDaliJsonUtilReadAndReturnPropertyValue(void) +{ + Document doc{ TEST_JSON }; + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("disambiguatedFloat")).Get(), 15.8f); + + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("rotation1")).Get(), + Quaternion(Radian(Degree(15.0)), Radian(Degree(90.0)), Radian(Degree(-45.f)))); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("rotation2")).Get(), + Quaternion(Vector4(0.707f, 0.f, 0.707f, 0.f))); + + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("bool")).Get(), true); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("int")).Get(), 17834); + + const float floats[]{ 1.f, 0.f, 0.f, 0.f, 0.f, 2.f, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f, 1.f, 2.f, 3.f, 4.f }; + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("matrix")).Get(), Matrix(floats)); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("matrix3")).Get(), Matrix3(floats[5], + floats[6], floats[7], floats[8], floats[9], floats[10], floats[11], floats[12], floats[13])); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("floatArray")).Get(), + Vector4(0.f, .25f, 1.f, .75f)); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("rgb")).Get(), + Vector3(.5f, .8f, .25f)); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("vector2")).Get(), + Vector2(2.f, 1.f)); + DALI_TEST_EQUAL(ReadPropertyValue(*doc.root->GetChild("object")->GetChild("duration")).Get(), 4.f ); + + END_TEST; +} + +namespace +{ +template +void CheckEqualityAs(Property::Value lhs, Property::Value rhs) +{ + DALI_TEST_EQUAL(lhs.Get(), rhs.Get()); +} + +} + +int UtcDaliJsonUtilReadPropertyValue(void) +{ + struct TypeNameValue + { + Property::Type type; + std::string name; + Property::Value value; + void(*compareFn)(Property::Value, Property::Value); + }; + + Document doc{ TEST_JSON }; + + const float floats[]{ 1.f, 0.f, 0.f, 0.f, 0.f, 2.f, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f, 1.f, 2.f, 3.f, 4.f }; + const TypeNameValue typeNameValues[] { + { Property::BOOLEAN, "bool", true, CheckEqualityAs }, + { Property::FLOAT, "float", 3.1415628f, CheckEqualityAs }, + { Property::INTEGER, "int", 17834, CheckEqualityAs }, + { Property::VECTOR2, "vector2", Vector2(2.f, 1.f), CheckEqualityAs }, + { Property::VECTOR3, "rgb", Vector3(.5f, .8f, .25f), CheckEqualityAs }, + { Property::VECTOR4, "floatArray", Vector4(.0f, .25f, 1.f, .75f), CheckEqualityAs }, + { Property::MATRIX3, "matrix3", Matrix3(2.f, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f, 1.f, 2.f), + CheckEqualityAs }, + { Property::MATRIX, "matrix", Matrix(floats), CheckEqualityAs }, + { Property::RECTANGLE, "intArray", Rect(1, 2, 3, 5), CheckEqualityAs> }, + { Property::EXTENTS, "intArray", Extents(1, 2, 3, 5), CheckEqualityAs }, + }; + for(auto& i: typeNameValues) + { + std::cout << i.value << std::endl; + i.compareFn(ReadPropertyValue(i.type, *doc.root->GetChild(i.name)), i.value); + } + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/CMakeLists.txt b/automated-tests/src/dali-scene-loader/CMakeLists.txt new file mode 100755 index 0000000..348f29c --- /dev/null +++ b/automated-tests/src/dali-scene-loader/CMakeLists.txt @@ -0,0 +1,102 @@ +SET(PKG_NAME "dali-scene-loader") + +SET(EXEC_NAME "tct-${PKG_NAME}-core") +SET(RPM_NAME "core-${PKG_NAME}-tests") + +SET(CAPI_LIB "dali-scene-loader") + +# List of test case sources (Only these get parsed for test cases) +SET(TC_SOURCES + utc-Dali-AlphaFunctionHelper.cpp + utc-Dali-AnimationDefinition.cpp + utc-Dali-AnimatedProperty.cpp + utc-Dali-CameraParameters.cpp + utc-Dali-DliLoader.cpp + utc-Dali-EnvironmentDefinition.cpp + utc-Dali-Gltf2Loader.cpp + utc-Dali-KtxLoader.cpp + utc-Dali-MatrixStack.cpp + utc-Dali-NodeDefinition.cpp + utc-Dali-RendererState.cpp + utc-Dali-ResourceBundle.cpp + utc-Dali-SceneDefinition.cpp + utc-Dali-ShaderDefinition.cpp + utc-Dali-ShaderDefinitionFactory.cpp + utc-Dali-StringCallback.cpp + utc-Dali-Utils.cpp + utc-Dali-ViewProjection.cpp +) + +# List of test harness files (Won't get parsed for test cases) +SET(TEST_HARNESS_DIR "../dali-toolkit/dali-toolkit-test-utils") + +SET(TEST_HARNESS_SOURCES + ${TEST_HARNESS_DIR}/toolkit-adaptor.cpp + ${TEST_HARNESS_DIR}/toolkit-application.cpp + ${TEST_HARNESS_DIR}/toolkit-event-thread-callback.cpp + ${TEST_HARNESS_DIR}/toolkit-environment-variable.cpp + ${TEST_HARNESS_DIR}/toolkit-input-method-context.cpp + ${TEST_HARNESS_DIR}/toolkit-input-method-options.cpp + ${TEST_HARNESS_DIR}/toolkit-lifecycle-controller.cpp + ${TEST_HARNESS_DIR}/toolkit-orientation.cpp + ${TEST_HARNESS_DIR}/toolkit-style-monitor.cpp + ${TEST_HARNESS_DIR}/toolkit-test-application.cpp + ${TEST_HARNESS_DIR}/toolkit-timer.cpp + ${TEST_HARNESS_DIR}/toolkit-trigger-event-factory.cpp + ${TEST_HARNESS_DIR}/toolkit-window.cpp + ${TEST_HARNESS_DIR}/toolkit-scene-holder.cpp + ${TEST_HARNESS_DIR}/dali-test-suite-utils.cpp + ${TEST_HARNESS_DIR}/dali-toolkit-test-suite-utils.cpp + ${TEST_HARNESS_DIR}/dummy-control.cpp + ${TEST_HARNESS_DIR}/mesh-builder.cpp + ${TEST_HARNESS_DIR}/test-actor-utils.cpp + ${TEST_HARNESS_DIR}/test-animation-data.cpp + ${TEST_HARNESS_DIR}/test-application.cpp + ${TEST_HARNESS_DIR}/test-button.cpp + ${TEST_HARNESS_DIR}/test-harness.cpp + ${TEST_HARNESS_DIR}/test-gesture-generator.cpp + ${TEST_HARNESS_DIR}/test-gl-abstraction.cpp + ${TEST_HARNESS_DIR}/test-gl-sync-abstraction.cpp + ${TEST_HARNESS_DIR}/test-platform-abstraction.cpp + ${TEST_HARNESS_DIR}/test-render-controller.cpp + ${TEST_HARNESS_DIR}/test-trace-call-stack.cpp +) + +PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED + dali2-core + dali2-adaptor + dali2-toolkit + dali2-scene-loader +) + +ADD_COMPILE_OPTIONS( -O0 -ggdb --coverage -Wall -Werror -DDEBUG_ENABLED) +ADD_COMPILE_OPTIONS( ${${CAPI_LIB}_CFLAGS_OTHER} ) + +ADD_DEFINITIONS(-DTEST_RESOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/../../resources\" ) + +FOREACH(directory ${${CAPI_LIB}_LIBRARY_DIRS}) + SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -L${directory}") +ENDFOREACH(directory ${CAPI_LIB_LIBRARY_DIRS}) + +INCLUDE_DIRECTORIES( + ../../../ + ${${CAPI_LIB}_INCLUDE_DIRS} + ../dali-toolkit/dali-toolkit-test-utils +) + +ADD_CUSTOM_COMMAND( + COMMAND ${SCRIPT_DIR}/tcheadgen.sh ${EXEC_NAME}.h ${TC_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT ${EXEC_NAME}.h + COMMENT "Generating test tables" + ) + +ADD_EXECUTABLE(${EXEC_NAME} ${EXEC_NAME}.h ${EXEC_NAME}.cpp ${TC_SOURCES} ${TEST_HARNESS_SOURCES}) +TARGET_LINK_LIBRARIES(${EXEC_NAME} + ${${CAPI_LIB}_LIBRARIES} + -lpthread --coverage +) + +INSTALL(PROGRAMS ${EXEC_NAME} + DESTINATION ${BIN_DIR}/${EXEC_NAME} +) diff --git a/automated-tests/src/dali-scene-loader/tct-dali-scene-loader-core.cpp b/automated-tests/src/dali-scene-loader/tct-dali-scene-loader-core.cpp new file mode 100644 index 0000000..90b7a2c --- /dev/null +++ b/automated-tests/src/dali-scene-loader/tct-dali-scene-loader-core.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include "tct-dali-scene-loader-core.h" + +int main(int argc, char * const argv[]) +{ + int result = TestHarness::EXIT_STATUS_BAD_ARGUMENT; + + const char* optString = "sf"; + bool optRerunFailed(true); + bool optRunSerially(false); + + int nextOpt = 0; + do + { + nextOpt = getopt( argc, argv, optString ); + switch(nextOpt) + { + case 'f': + optRerunFailed = false; + break; + case 's': + optRunSerially = true; + break; + case '?': + TestHarness::Usage(argv[0]); + exit(TestHarness::EXIT_STATUS_BAD_ARGUMENT); + break; + } + } while( nextOpt != -1 ); + + if( optind == argc ) // no testcase name in argument list + { + if( optRunSerially ) + { + result = TestHarness::RunAll( argv[0], tc_array ); + } + else + { + result = TestHarness::RunAllInParallel( argv[0], tc_array, optRerunFailed ); + } + } + else + { + // optind is index of next argument - interpret as testcase name + result = TestHarness::FindAndRunTestCase(tc_array, argv[optind]); + } + return result; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-AlphaFunctionHelper.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-AlphaFunctionHelper.cpp new file mode 100644 index 0000000..da40b27 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-AlphaFunctionHelper.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/alpha-function-helper.h" +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +#define ALPHA_FN_PAIR(x) { #x, AlphaFunction::x } + +const std::pair BUILTIN_FUNCTIONS[] { + ALPHA_FN_PAIR(DEFAULT), + ALPHA_FN_PAIR(LINEAR), + ALPHA_FN_PAIR(REVERSE), + ALPHA_FN_PAIR(EASE_IN), + ALPHA_FN_PAIR(EASE_OUT), + ALPHA_FN_PAIR(EASE_IN_OUT), + ALPHA_FN_PAIR(EASE_IN_SQUARE), + ALPHA_FN_PAIR(EASE_OUT_SQUARE), + ALPHA_FN_PAIR(EASE_IN_SINE), + ALPHA_FN_PAIR(EASE_OUT_SINE), + ALPHA_FN_PAIR(EASE_IN_OUT_SINE), + ALPHA_FN_PAIR(BOUNCE), + ALPHA_FN_PAIR(SIN), + ALPHA_FN_PAIR(EASE_OUT_BACK), +}; + +int UtcDaliAlphaFunctionHelperGet(void) +{ + bool found; + for (auto& a: BUILTIN_FUNCTIONS) + { + auto result = GetAlphaFunction(a.first, &found); + DALI_TEST_EQUAL(result.GetBuiltinFunction(), a.second); + DALI_TEST_EQUAL(result.GetMode(), AlphaFunction::BUILTIN_FUNCTION); + DALI_TEST_CHECK(found); + } + + auto result = GetAlphaFunction("made up function", &found); + DALI_TEST_EQUAL(result.GetBuiltinFunction(), AlphaFunction::DEFAULT); + DALI_TEST_EQUAL(result.GetMode(), AlphaFunction::BUILTIN_FUNCTION); + DALI_TEST_CHECK(!found); + + END_TEST; +} + +int UtcDaliAlphaFunctionHelperRegister(void) +{ + for (auto& a: BUILTIN_FUNCTIONS) + { + DALI_TEST_ASSERTION(RegisterAlphaFunction(a.first, AlphaFunction()), "given key already exists"); + } + + AlphaFunctionPrototype testFn = [](float f) { + return f > .5f ? 1.f : 0.f; + }; + RegisterAlphaFunction("step", AlphaFunction(testFn)); + + bool found; + auto result = GetAlphaFunction("step", &found); + DALI_TEST_EQUAL(result.GetMode(), AlphaFunction::CUSTOM_FUNCTION); + DALI_TEST_EQUAL(result.GetCustomFunction(), testFn); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-AnimatedProperty.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-AnimatedProperty.cpp new file mode 100644 index 0000000..c660a1d --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-AnimatedProperty.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/animated-property.h" +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliAnimatedPropertyGetPropertyType(void) +{ + TestApplication app; + auto actor = Actor::New(); + actor.SetProperty(Actor::Property::NAME, "ChristopherPlummer"); + + AnimatedProperty animProp { + "ChristopherPlummer", + "position", + KeyFrames(), + std::unique_ptr{ new AnimatedProperty::Value{ + Property::Value{ Vector3::XAXIS * 100.f }, + true + } }, + }; + + Property expected(actor, Actor::Property::POSITION); + Property result = animProp.GetProperty(actor); + DALI_TEST_EQUAL(result.object, expected.object); + DALI_TEST_EQUAL(result.propertyIndex, expected.propertyIndex); + DALI_TEST_EQUAL(result.componentIndex, expected.componentIndex); + DALI_TEST_EQUAL(animProp.GetPropertyType(actor), Property::VECTOR3); + + END_TEST; +} + + + + + + + + diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-AnimationDefinition.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-AnimationDefinition.cpp new file mode 100644 index 0000000..e27fb36 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-AnimationDefinition.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/animation-definition.h" +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliAnimationDefinitionStopForModification(void) +{ + TestApplication app; + auto anim = Animation::New(15.f); + anim.Play(); + + auto oldEndAction = AnimationDefinition::StopForModification(anim); + DALI_TEST_EQUAL(anim.GetState(), Animation::STOPPED); + DALI_TEST_EQUAL(oldEndAction, Animation::BAKE); + DALI_TEST_EQUAL(anim.GetEndAction(), Animation::DISCARD); + + END_TEST; +} + +int UtcDaliAnimationDefinitionReAnimate(void) +{ + TestApplication app; + auto actor = Actor::New(); + actor.SetProperty(Actor::Property::NAME, "ChristopherPlummer"); + + auto getActor = [&actor](const std::string& name) { + return actor.FindChildByName(name); + }; + + for (bool b: { false, true }) + { + AnimationDefinition animDef; + animDef.mName = "WalkRight"; + animDef.mDuration = 10.f; + animDef.mLoopCount = 2; + animDef.mEndAction = Animation::BAKE_FINAL; + animDef.mSpeedFactor = .7f; + animDef.mProperties.push_back(AnimatedProperty{ + "ChristopherPlummer", + "position", + KeyFrames(), + std::unique_ptr{ new AnimatedProperty::Value{ + Property::Value{ Vector3::XAXIS * 100.f }, + b + } }, + AlphaFunction::EASE_OUT, + TimePeriod(animDef.mDuration) + }); + + auto anim = animDef.ReAnimate(getActor); + DALI_TEST_EQUAL(anim.GetDuration(), animDef.mDuration); + DALI_TEST_EQUAL(anim.GetEndAction(), animDef.mEndAction); + DALI_TEST_EQUAL(anim.GetSpeedFactor(), animDef.mSpeedFactor); + DALI_TEST_EQUAL(anim.GetLoopCount(), animDef.mLoopCount); + } + + END_TEST; +} + +int UtcDaliAnimationDefinitionReAnimateKeyFrames(void) +{ + TestApplication app; + auto actor = Actor::New(); + actor.SetProperty(Actor::Property::NAME, "ChristopherPlummer"); + + auto getActor = [&actor](const std::string& name) { + return actor.FindChildByName(name); + }; + + KeyFrames kf = KeyFrames::New(); + kf.Add(0.f, Vector3::ZERO); + kf.Add(1.f, Vector3::XAXIS * 100.f); + + AnimationDefinition animDef; + animDef.mName = "WalkRight"; + animDef.mDuration = 10.f; + animDef.mLoopCount = 2; + animDef.mEndAction = Animation::BAKE_FINAL; + animDef.mSpeedFactor = .7f; + animDef.mProperties.push_back(AnimatedProperty{ + "ChristopherPlummer", + "position", + kf, + nullptr, + AlphaFunction::EASE_OUT, + TimePeriod(animDef.mDuration) + }); + + auto anim = animDef.ReAnimate(getActor); + DALI_TEST_EQUAL(anim.GetDuration(), animDef.mDuration); + DALI_TEST_EQUAL(anim.GetEndAction(), animDef.mEndAction); + DALI_TEST_EQUAL(anim.GetSpeedFactor(), animDef.mSpeedFactor); + DALI_TEST_EQUAL(anim.GetLoopCount(), animDef.mLoopCount); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-CameraParameters.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-CameraParameters.cpp new file mode 100644 index 0000000..5ad4a40 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-CameraParameters.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/camera-parameters.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliCameraParameters(void) +{ + Quaternion qView = Quaternion(Radian(Degree(180.f)), Vector3::YAXIS); + CameraParameters camParams; + camParams.matrix.SetTransformComponents(Vector3::ONE * 2.f, + qView, + Vector3::ZAXIS * -100.f); + camParams.orthographicSize = Vector4{ -1.f, 1.f, -1.f, 1.f }; + camParams.yFov = Radian(M_PI * .5).radian; + camParams.zNear = 1.f; + camParams.zFar = 1000.f; + + Vector3 scale; + Quaternion orientation; + Vector3 position; + camParams.CalculateTransformComponents(position, orientation, scale); + DALI_TEST_EQUAL(scale, Vector3::ONE * 2.f); + DALI_TEST_EQUAL(orientation, Quaternion::IDENTITY); // 2 180 degrees rotations along y + DALI_TEST_EQUAL(position, Vector3::ZAXIS * -100.f); + + TestApplication app; + CameraActor camera = CameraActor::New(); + for (auto i : { false, true }) + { + camParams.isPerspective = i; + + auto viewProjection = camParams.GetViewProjection(); + Matrix view{ false }; + Matrix::Multiply(view, Matrix(qView), camParams.matrix); + view.Invert(); + DALI_TEST_EQUAL(viewProjection.GetView(), view); + + camParams.ConfigureCamera(camera); + DALI_TEST_EQUAL(camParams.zNear, camera.GetNearClippingPlane()); + DALI_TEST_EQUAL(camParams.zFar, camera.GetFarClippingPlane()); + + DALI_TEST_EQUAL(camera.GetInvertYAxis(), true); + DALI_TEST_EQUAL(camera.GetProperty(Actor::Property::POSITION).Get(), position); + DALI_TEST_EQUAL(camera.GetProperty(Actor::Property::ORIENTATION).Get(), orientation); + DALI_TEST_EQUAL(camera.GetProperty(Actor::Property::SCALE).Get(), scale); + } + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-DliLoader.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-DliLoader.cpp new file mode 100644 index 0000000..d09d2da --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-DliLoader.cpp @@ -0,0 +1,641 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/dli-loader.h" +#include "dali-scene-loader/public-api/resource-bundle.h" +#include "dali-scene-loader/public-api/scene-definition.h" +#include "dali-scene-loader/public-api/load-result.h" +#include "dali-scene-loader/internal/json-util.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +namespace +{ + +void ConfigureBlendShapeShaders(ResourceBundle& resources, const SceneDefinition& scene, Actor root, + std::vector&& requests) +{ + std::vector errors; + auto onError = [&errors](const std::string& msg) { + errors.push_back(msg); + }; + + if (!scene.ConfigureBlendshapeShaders(resources, root, std::move(requests), onError)) + { + ExceptionFlinger flinger(ASSERT_LOCATION); + for (auto& msg : errors) + { + flinger << msg << '\n'; + } + } +} + +struct Context +{ + ResourceBundle::PathProvider pathProvider = [](ResourceType::Value type) { + return TEST_RESOURCE_DIR "/"; + }; + + ResourceBundle resources; + SceneDefinition scene; + std::vector cameraParameters; + std::vector lights; + std::vector animations; + std::vector animGroups; + + LoadResult output { + resources, + scene, + animations, + animGroups, + cameraParameters, + lights + }; + + DliLoader::InputParams input { + pathProvider(ResourceType::Mesh), + nullptr, + {}, + {}, + nullptr, + }; + DliLoader::LoadParams loadParams{ input, output }; + + std::vector errors; + DliLoader loader; + + StringCallback onError = [this](const std::string& error) { + errors.push_back(error); + printf("%s\n", error.c_str()); + }; + + Context() + { + loader.SetErrorCallback(onError); + } +}; + +bool StringHasTokens(const char* string, const std::vector& tokens) +{ + for (auto& token: tokens) + { + auto result = strstr(string, token); + if(nullptr == result) + { + return false; + } + string = result + strlen(token); + } + return true; +} + +} + +int UtcDaliDliLoaderLoadSceneNotFound(void) +{ + Context ctx; + + DALI_TEST_EQUAL(ctx.loader.LoadScene("does_not_exist.dli", ctx.loadParams), false); + + auto error = ctx.loader.GetParseError(); + DALI_TEST_CHECK(StringHasTokens(error.c_str(), { "Empty source buffer to parse." })); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneFailParse(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "invalid.gltf"; + DALI_TEST_EQUAL(ctx.loader.LoadScene(path, ctx.loadParams), false); + + auto error = ctx.loader.GetParseError(); + DALI_TEST_CHECK(StringHasTokens(error.c_str(), { "Unexpected character." })); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneAssertions(void) +{ + const std::pair pathExceptionPairs[] { + // from RequireChild() + { "scenes-nodes-missing", "Failed to find child node" }, + { "scenes-missing", "Failed to find child node" }, + { "nodes-missing", "Failed to find child node" }, + // from ParseSceneInternal() + { "scene-out-of-bounds", "out of bounds" }, + { "nodes-invalid-type", "invalid type; array required" }, + { "nodes-array-empty", "must define a node id" }, + { "root-id-invalid", "invalid value for root node index" }, + { "root-id-out-of-bounds", "out of bounds" }, + { "root-node-invalid-type", "invalid JSON type; object required" }, + // from ParseSkeletons() + { "skeleton-node-missing", "Missing required attribute" }, + { "skeleton-root-not-found", "not defined" }, + // from ParseShaders() + { "shader-vertex-missing", "Missing vertex / fragment shader" }, + { "shader-fragment-missing", "Missing vertex / fragment shader" }, + // from ParseMeshes() + { "mesh-uri-missing", "Missing required attribute" }, + { "mesh-indices-read-fail", "Failed to read indices" }, + { "mesh-positions-read-fail", "Failed to read positions" }, + // from ParseMaterials() + { "material-environment-out-of-bounds", "out of bounds" }, + // from ParseNodes() + { "node-model-mesh-missing", "Missing mesh" }, + { "node-arc-mesh-missing", "Missing mesh" }, + { "node-animated-image-mesh-missing", "Missing mesh" }, + { "node-renderable-mesh-invalid-type", "Invalid Mesh index type" }, + { "node-renderable-mesh-out-of-bounds", "out of bounds" }, + { "node-child-invalid-type", "invalid index type" }, + { "node-name-already-used", "name already used" }, + // from ParseAnimations() + { "animation-failed-to-open", "Failed to open animation data" } + }; + for (auto& i: pathExceptionPairs) + { + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "dli/" + i.first + ".dli"; + printf("\n\n%s: %s\n", path.c_str(), i.second.c_str()); + DALI_TEST_ASSERTION(ctx.loader.LoadScene(path, ctx.loadParams), i.second.c_str()); + } + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneExercise(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "exercise.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_CHECK(ctx.errors.empty()); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 2u); + DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "Backdrop"); // default scene is scene 1 - this one. + DALI_TEST_EQUAL(scene.GetNode(roots[1])->mName, "ExerciseDemo"); + + DALI_TEST_EQUAL(scene.GetNodeCount(), 96u); + + auto& resources = ctx.resources; + DALI_TEST_EQUAL(resources.mMeshes.size(), 11u); + DALI_TEST_EQUAL(resources.mMaterials.size(), 13u); + DALI_TEST_EQUAL(resources.mShaders.size(), 5u); + DALI_TEST_EQUAL(resources.mEnvironmentMaps.size(), 2u); + DALI_TEST_EQUAL(resources.mSkeletons.size(), 1u); + + DALI_TEST_EQUAL(ctx.cameraParameters.size(), 1u); + DALI_TEST_EQUAL(ctx.lights.size(), 1u); + DALI_TEST_EQUAL(ctx.animations.size(), 18u); + DALI_TEST_EQUAL(ctx.animGroups.size(), 16u); + + ViewProjection viewProjection; + Transforms xforms { + MatrixStack{}, + viewProjection + }; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = Actor::New(); + SetActorCentered(root); + for (auto iRoot : scene.GetRoots()) + { + auto resourceRefs = resources.CreateRefCounter(); + scene.CountResourceRefs(iRoot, choices, resourceRefs); + resources.CountEnvironmentReferences(resourceRefs); + resources.LoadResources(resourceRefs, ctx.pathProvider); + if (auto actor = scene.CreateNodes(iRoot, choices, nodeParams)) + { + scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor); + scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables)); + ConfigureBlendShapeShaders(resources, scene, actor, std::move(nodeParams.mBlendshapeRequests)); + scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables)); + root.Add(actor); + } + } + + DALI_TEST_EQUAL(root.GetChildCount(), 2u); + DALI_TEST_EQUAL(root.GetChildAt(0).GetProperty(Actor::Property::NAME).Get(), "Backdrop"); + DALI_TEST_EQUAL(root.GetChildAt(1).GetProperty(Actor::Property::NAME).Get(), "ExerciseDemo"); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneMorph(void) +{ + Context ctx; + + std::vector metadata; + uint32_t metadataCount = 0; + ctx.input.mPreNodeCategoryProcessors.push_back({ "metadata", + [&](const Property::Array& array, StringCallback) { + std::string key, value; + for (uint32_t i0 = 0, i1 = array.Count(); i0 < i1; ++i0) + { + auto& data = array.GetElementAt(i0); + DALI_TEST_EQUAL(data.GetType(), Property::MAP); + + auto map = data.GetMap(); + auto key = map->Find("key"); + auto value = map->Find("value"); + DALI_TEST_EQUAL(key->GetType(), Property::STRING); + DALI_TEST_EQUAL(value->GetType(), Property::STRING); + metadata.push_back(key->Get() + ":" + value->Get()); + + ++metadataCount; + } + } + }); + + std::vector behaviors; + uint32_t behaviorCount = 0; + ctx.input.mPostNodeCategoryProcessors.push_back({ "behaviors", + [&](const Property::Array& array, StringCallback) { + for (uint32_t i0 = 0, i1 = array.Count(); i0 < i1; ++i0) + { + auto& data = array.GetElementAt(i0); + DALI_TEST_EQUAL(data.GetType(), Property::MAP); + + auto map = data.GetMap(); + auto event = map->Find("event"); + auto url = map->Find("url"); + DALI_TEST_EQUAL(event->GetType(), Property::STRING); + DALI_TEST_EQUAL(url->GetType(), Property::STRING); + behaviors.push_back(event->Get() + ":" + url->Get()); + + ++behaviorCount; + } + } + }); + + size_t numNodes = 0; + ctx.input.mNodePropertyProcessor = [&](const NodeDefinition&, const Property::Map&, StringCallback) { + ++numNodes; + }; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "morph.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_CHECK(ctx.errors.empty()); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "HeadTest_002"); + + DALI_TEST_EQUAL(numNodes, 3u); + DALI_TEST_EQUAL(scene.GetNodeCount(), numNodes); + + auto& resources = ctx.resources; + DALI_TEST_EQUAL(resources.mMeshes.size(), 2u); + DALI_TEST_EQUAL(resources.mMaterials.size(), 1u); + DALI_TEST_EQUAL(resources.mShaders.size(), 5u); + DALI_TEST_EQUAL(resources.mEnvironmentMaps.size(), 2u); + DALI_TEST_EQUAL(resources.mSkeletons.size(), 0u); + + DALI_TEST_EQUAL(ctx.cameraParameters.size(), 1u); + DALI_TEST_EQUAL(ctx.lights.size(), 1u); + DALI_TEST_EQUAL(ctx.animations.size(), 1u); + DALI_TEST_EQUAL(ctx.animGroups.size(), 0u); + + DALI_TEST_EQUAL(metadata.size(), 4u); + DALI_TEST_EQUAL(behaviors.size(), 1u); + + ViewProjection viewProjection; + Transforms xforms { + MatrixStack{}, + viewProjection + }; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = Actor::New(); + SetActorCentered(root); + for (auto iRoot : scene.GetRoots()) + { + auto resourceRefs = resources.CreateRefCounter(); + scene.CountResourceRefs(iRoot, choices, resourceRefs); + resources.CountEnvironmentReferences(resourceRefs); + resources.LoadResources(resourceRefs, ctx.pathProvider); + if (auto actor = scene.CreateNodes(iRoot, choices, nodeParams)) + { + scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor); + scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables)); + ConfigureBlendShapeShaders(resources, scene, actor, std::move(nodeParams.mBlendshapeRequests)); + scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables)); + root.Add(actor); + } + } + + DALI_TEST_EQUAL(root.GetChildCount(), 1u); + DALI_TEST_EQUAL(root.GetChildAt(0).GetProperty(Actor::Property::NAME).Get(), "HeadTest_002"); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneArc(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "arc.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_CHECK(ctx.errors.empty()); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "root"); + + DALI_TEST_EQUAL(scene.GetNodeCount(), 2u); + + auto& resources = ctx.resources; + DALI_TEST_EQUAL(resources.mMeshes.size(), 1u); + DALI_TEST_EQUAL(resources.mMaterials.size(), 1u); + DALI_TEST_EQUAL(resources.mShaders.size(), 1u); + DALI_TEST_EQUAL(resources.mEnvironmentMaps.size(), 1u); + DALI_TEST_EQUAL(resources.mSkeletons.size(), 0u); + + DALI_TEST_EQUAL(ctx.cameraParameters.size(), 0u); + DALI_TEST_EQUAL(ctx.lights.size(), 0u); + DALI_TEST_EQUAL(ctx.animations.size(), 0u); + DALI_TEST_EQUAL(ctx.animGroups.size(), 0u); + + ViewProjection viewProjection; + Transforms xforms { + MatrixStack{}, + viewProjection + }; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = Actor::New(); + SetActorCentered(root); + for (auto iRoot : scene.GetRoots()) + { + auto resourceRefs = resources.CreateRefCounter(); + scene.CountResourceRefs(iRoot, choices, resourceRefs); + resources.CountEnvironmentReferences(resourceRefs); + resources.LoadResources(resourceRefs, ctx.pathProvider); + if (auto actor = scene.CreateNodes(iRoot, choices, nodeParams)) + { + scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor); + scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables)); + ConfigureBlendShapeShaders(resources, scene, actor, std::move(nodeParams.mBlendshapeRequests)); + scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables)); + root.Add(actor); + } + } + + DALI_TEST_EQUAL(root.GetChildCount(), 1u); + DALI_TEST_EQUAL(root.GetChildAt(0).GetProperty(Actor::Property::NAME).Get(), "root"); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneShaderUniforms(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "dli/shader-uniforms.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_EQUAL(ctx.errors.size(), 1u); + DALI_TEST_CHECK(ctx.errors[0].find("failed to infer type") != std::string::npos); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "root"); + + DALI_TEST_EQUAL(scene.GetNodeCount(), 1u); + + auto& resources = ctx.resources; + DALI_TEST_EQUAL(resources.mMeshes.size(), 0u); + DALI_TEST_EQUAL(resources.mMaterials.size(), 0u); + DALI_TEST_EQUAL(resources.mShaders.size(), 1u); + DALI_TEST_EQUAL(resources.mEnvironmentMaps.size(), 0u); + DALI_TEST_EQUAL(resources.mSkeletons.size(), 0u); + + auto raw = resources.mShaders[0].first.LoadRaw(ctx.pathProvider(ResourceType::Shader)); + + TestApplication app; + + auto shader = resources.mShaders[0].first.Load(std::move(raw)); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uBool")).Get(), 1.0f); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uInt")).Get(), 255.0f); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uFloat")).Get(), -0.5f); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uVec2")).Get(), Vector2(100.0f, -100.0f)); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uVec3")).Get(), Vector3(50.0f, 0.f, -200.0f)); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uVec4")).Get(), Vector4(0.1774f, 1.0f, 0.5333f, 0.7997f)); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uMat3")).Get(), Matrix3(9.0f, 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f)); + + Matrix expectedMatrix; + expectedMatrix.SetTransformComponents(Vector3::ONE * 8.0, Quaternion::IDENTITY, Vector3::ZERO); + DALI_TEST_EQUAL(shader.GetProperty(shader.GetPropertyIndex("uMat4")).Get(), expectedMatrix); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneExtras(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "dli/extras.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_EQUAL(ctx.errors.size(), 3u); + DALI_TEST_CHECK(ctx.errors[0].find("already defined; overriding") != std::string::npos); + DALI_TEST_CHECK(ctx.errors[1].find("empty string is invalid for name") != std::string::npos); + DALI_TEST_CHECK(ctx.errors[2].find("failed to interpret value") != std::string::npos); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "root"); + + DALI_TEST_EQUAL(scene.GetNodeCount(), 1u); + + ViewProjection viewProjection; + Transforms xforms { + MatrixStack{}, + viewProjection + }; + auto& resources = ctx.resources; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + Actor actor = scene.CreateNodes(0, choices, nodeParams); + + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("fudgeFactor")).Get(), 9000.1f); + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("fudgeVector")).Get(), Vector2(-.25f, 17.f)); + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("isThisTheRealLife")).Get(), true); + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("isThisJustFantasy")).Get(), false); + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("velocity")).Get(), Vector3(.1f, 58.f, -.2f)); + DALI_TEST_EQUAL(actor.GetProperty(actor.GetPropertyIndex("frameOfReference")).Get(), Matrix::IDENTITY); + + END_TEST; +} + +int UtcDaliDliLoaderLoadSceneConstraints(void) +{ + Context ctx; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "dli/constraints.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + DALI_TEST_EQUAL(ctx.errors.size(), 1u); + DALI_TEST_CHECK(ctx.errors[0].find("invalid", ctx.errors[0].find("node ID")) != std::string::npos); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + DALI_TEST_EQUAL(scene.GetNode(0)->mName, "root"); + DALI_TEST_EQUAL(scene.GetNode(1)->mName, "Alice"); + DALI_TEST_EQUAL(scene.GetNode(2)->mName, "Bob"); + DALI_TEST_EQUAL(scene.GetNode(3)->mName, "Charlie"); + + DALI_TEST_EQUAL(scene.GetNodeCount(), 4u); + + ViewProjection viewProjection; + Transforms xforms { + MatrixStack{}, + viewProjection + }; + auto& resources = ctx.resources; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = scene.CreateNodes(0, choices, nodeParams); + Actor alice = root.FindChildByName("Alice"); + Actor bob = root.FindChildByName("Bob"); + Actor charlie = root.FindChildByName("Charlie"); + + DALI_TEST_EQUAL(nodeParams.mConstrainables.size(), 3u); + DALI_TEST_EQUAL(bob.GetProperty(bob.GetPropertyIndex("angularVelocity")).Get(), Vector2(-0.5, 0.0004)); + + ctx.errors.clear(); + scene.ApplyConstraints(root, std::move(nodeParams.mConstrainables), ctx.onError); + DALI_TEST_CHECK(ctx.errors.empty()); + + app.GetScene().Add(root); + app.SendNotification(); + app.Render(); + app.SendNotification(); + app.Render(); + + DALI_TEST_EQUAL(charlie.GetCurrentProperty(Actor::Property::ORIENTATION), alice.GetProperty(Actor::Property::ORIENTATION)); + DALI_TEST_EQUAL(charlie.GetCurrentProperty(Actor::Property::POSITION), bob.GetProperty(Actor::Property::POSITION)); + DALI_TEST_EQUAL(charlie.GetCurrentProperty(charlie.GetPropertyIndex("angularVelocity")), bob.GetProperty(bob.GetPropertyIndex("angularVelocity"))); + + END_TEST; +} + +int UtcDaliDliLoaderNodeProcessor(void) +{ + Context ctx; + + std::vector nodeMaps; + ctx.input.mNodePropertyProcessor = [&](const NodeDefinition&, Property::Map&& map, StringCallback) { + nodeMaps.push_back(map); + }; + + auto path = ctx.pathProvider(ResourceType::Mesh) + "dli/node-processor.dli"; + DALI_TEST_CHECK(ctx.loader.LoadScene(path, ctx.loadParams)); + + DALI_TEST_EQUAL(nodeMaps.size(), 2u); + DALI_TEST_EQUAL(nodeMaps[0].Count(), 5u); + DALI_TEST_EQUAL(nodeMaps[0].Find("name")->Get(), "rootA"); + DALI_TEST_EQUAL(nodeMaps[0].Find("nickname")->Get(), "same as name"); + DALI_TEST_EQUAL(nodeMaps[0].Find("favourite number")->Get(), 63478); + + auto propArray = nodeMaps[0].Find("array"); + DALI_TEST_EQUAL(propArray->GetType(), Property::ARRAY); + + auto array = propArray->GetArray(); + DALI_TEST_EQUAL(array->Count(), 5); + DALI_TEST_EQUAL(array->GetElementAt(0).Get(), 1); + DALI_TEST_EQUAL(array->GetElementAt(1).Get(), 2); + DALI_TEST_EQUAL(array->GetElementAt(2).Get(), 4); + DALI_TEST_EQUAL(array->GetElementAt(3).Get(), 8); + DALI_TEST_EQUAL(array->GetElementAt(4).Get(), -500); + + auto propObject = nodeMaps[0].Find("object"); + DALI_TEST_EQUAL(propObject->GetType(), Property::MAP); + + auto object = propObject->GetMap(); + DALI_TEST_EQUAL(object->Count(), 5); + DALI_TEST_EQUAL(object->Find("physics")->Get(), true); + DALI_TEST_EQUAL(object->Find("elasticity")->Get(), .27f); + DALI_TEST_EQUAL(object->Find("drag")->Get(), .91f); + + auto propInnerArray = object->Find("inner array"); + DALI_TEST_EQUAL(propInnerArray->GetType(), Property::ARRAY); + + auto innerArray = propInnerArray->GetArray(); + DALI_TEST_EQUAL(innerArray->Count(), 3); + DALI_TEST_EQUAL(innerArray->GetElementAt(0).Get(), "why"); + DALI_TEST_EQUAL(innerArray->GetElementAt(1).Get(), "not"); + DALI_TEST_EQUAL(innerArray->GetElementAt(2).Get(), false); + + auto propInnerObject = object->Find("inner object"); + DALI_TEST_EQUAL(propInnerObject->GetType(), Property::MAP); + + auto innerObject = propInnerObject->GetMap(); + DALI_TEST_EQUAL(innerObject->Count(), 1); + DALI_TEST_EQUAL(innerObject->Find("supported")->Get(), true); + + DALI_TEST_EQUAL(nodeMaps[1].Count(), 1u); + DALI_TEST_EQUAL(nodeMaps[1].Find("name")->Get(), "rootB"); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-EnvironmentDefinition.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-EnvironmentDefinition.cpp new file mode 100644 index 0000000..e151c6a --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-EnvironmentDefinition.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/environment-definition.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliEnvironmentDefinitionLoadRawDefault(void) +{ + EnvironmentDefinition envDef; + auto rawData = envDef.LoadRaw(""); + + DALI_TEST_EQUAL(rawData.mDiffuse.data.size(), 6u); + for (auto& face: rawData.mDiffuse.data) + { + DALI_TEST_EQUAL(face.size(), 1u); + } + + DALI_TEST_EQUAL(rawData.mSpecular.data.size(), 6u); + for (auto& face: rawData.mSpecular.data) + { + DALI_TEST_EQUAL(face.size(), 1u); + } + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadRawFail(void) +{ + for (auto name: { "nonexistent.ktx", TEST_RESOURCE_DIR "Cobe.obj" , TEST_RESOURCE_DIR "truncated.ktx" }) + { + EnvironmentDefinition envDef { name, name }; + DALI_TEST_ASSERTION(envDef.LoadRaw(""), "Failed to load cubemap texture"); + + envDef.mDiffuseMapPath = ""; + DALI_TEST_ASSERTION(envDef.LoadRaw(""), "Failed to load cubemap texture"); // specular map still invalid + } + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadRawSuccess(void) +{ + EnvironmentDefinition envDef { "forest_irradiance.ktx", "forest_radiance.ktx" }; + auto rawData = envDef.LoadRaw(TEST_RESOURCE_DIR "/"); + + DALI_TEST_EQUAL(rawData.mDiffuse.data.size(), 6u); + for (auto& face: rawData.mDiffuse.data) + { + DALI_TEST_EQUAL(face.size(), 1u); + uint32_t size = 64u; + for (auto& mipLevel : face) + { + DALI_TEST_EQUAL(mipLevel.GetPixelFormat(), Pixel::Format::RGB888); + DALI_TEST_EQUAL(mipLevel.GetWidth(), size); + DALI_TEST_EQUAL(mipLevel.GetHeight(), size); + size /= 2; + } + } + + DALI_TEST_EQUAL(rawData.mSpecular.data.size(), 6u); + for (auto& face: rawData.mSpecular.data) + { + DALI_TEST_EQUAL(face.size(), 5u); + uint32_t size = 64u; + for (auto& mipLevel : face) + { + DALI_TEST_EQUAL(mipLevel.GetPixelFormat(), Pixel::Format::RGB888); + DALI_TEST_EQUAL(mipLevel.GetWidth(), size); + DALI_TEST_EQUAL(mipLevel.GetHeight(), size); + size /= 2; + } + } + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadEmptyRaw(void) +{ + EnvironmentDefinition::RawData rawData; + EnvironmentDefinition envDef; + auto textures = envDef.Load(std::move(rawData)); + DALI_TEST_CHECK(!textures.mDiffuse); + DALI_TEST_CHECK(!textures.mSpecular); + + END_TEST; +} + +namespace +{ + +void CheckTextureDefault(Texture texture) +{ + DALI_TEST_CHECK(texture); + DALI_TEST_EQUAL(texture.GetWidth(), 1u); + DALI_TEST_EQUAL(texture.GetHeight(), 1u); +} + +void CheckTextureNotDefault(Texture texture) +{ + DALI_TEST_CHECK(texture); + DALI_TEST_CHECK(texture.GetWidth() > 1u); + DALI_TEST_CHECK(texture.GetHeight() > 1u); +} + +} + +int UtcDaliEnvironmentDefinitionLoadDefault(void) +{ + EnvironmentDefinition envDef{}; + auto rawData = envDef.LoadRaw(TEST_RESOURCE_DIR "/");; + + TestApplication app; + auto textures = envDef.Load(std::move(rawData)); + + CheckTextureDefault(textures.mSpecular); + CheckTextureDefault(textures.mDiffuse); + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadDiffuse(void) +{ + EnvironmentDefinition envDef{ "forest_irradiance.ktx" }; + auto rawData = envDef.LoadRaw(TEST_RESOURCE_DIR "/");; + + TestApplication app; + auto textures = envDef.Load(std::move(rawData)); + + CheckTextureNotDefault(textures.mDiffuse); + CheckTextureDefault(textures.mSpecular); + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadSpecular(void) +{ + EnvironmentDefinition envDef{ "", "forest_radiance.ktx" }; + auto rawData = envDef.LoadRaw(TEST_RESOURCE_DIR "/");; + + TestApplication app; + auto textures = envDef.Load(std::move(rawData)); + + CheckTextureDefault(textures.mDiffuse); + CheckTextureNotDefault(textures.mSpecular); + + END_TEST; +} + +int UtcDaliEnvironmentDefinitionLoadBoth(void) +{ + EnvironmentDefinition envDef{ "forest_irradiance.ktx", "forest_radiance.ktx" }; + auto rawData = envDef.LoadRaw(TEST_RESOURCE_DIR "/");; + + TestApplication app; + auto textures = envDef.Load(std::move(rawData)); + + CheckTextureNotDefault(textures.mDiffuse); + CheckTextureNotDefault(textures.mSpecular); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-Gltf2Loader.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-Gltf2Loader.cpp new file mode 100644 index 0000000..3f829dc --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-Gltf2Loader.cpp @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/resource-bundle.h" +#include "dali-scene-loader/public-api/scene-definition.h" +#include "dali-scene-loader/public-api/load-result.h" +#include "dali-scene-loader/public-api/gltf2-loader.h" +#include "dali-scene-loader/public-api/shader-definition-factory.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +#define DALI_TEST_THROW(expression, exception, predicate) \ + {\ + bool daliTestThrowSuccess__ = false;\ + try\ + {\ + do { expression; } while(0);\ + printf("No exception was thrown.\n");\ + }\ + catch (std::decay::type& ex)\ + {\ + daliTestThrowSuccess__ = predicate(ex);\ + }\ + catch (...)\ + {\ + printf("Wrong type of exception thrown.\n");\ + }\ + DALI_TEST_CHECK(daliTestThrowSuccess__);\ + } + +namespace +{ +struct Context +{ + ResourceBundle resources; + SceneDefinition scene; + + std::vector animations; + std::vector animationGroups; + std::vector cameras; + std::vector lights; + + LoadResult loadResult { + resources, + scene, + animations, + animationGroups, + cameras, + lights + }; +}; + +struct ExceptionMessageStartsWith +{ + const std::string_view expected; + + bool operator()(const std::runtime_error& e) + { + const bool success = (0 == strncmp(e.what(), expected.data(), expected.size())); + if (!success) + { + printf("Expected: %s, got: %s.\n", expected.data(), e.what()); + } + return success; + } +}; + +} + +int UtcDaliGltfLoaderFailedToLoad(void) +{ + Context ctx; + + ShaderDefinitionFactory sdf; + sdf.SetResources(ctx.resources); + + DALI_TEST_THROW(LoadGltfScene("non-existent.gltf", sdf, ctx.loadResult), + std::runtime_error, + ExceptionMessageStartsWith{"Failed to load"}); + + DALI_TEST_EQUAL(0, ctx.scene.GetRoots().size()); + DALI_TEST_EQUAL(0, ctx.scene.GetNodeCount()); + + DALI_TEST_EQUAL(0, ctx.resources.mEnvironmentMaps.size()); + DALI_TEST_EQUAL(0, ctx.resources.mMaterials.size()); + DALI_TEST_EQUAL(0, ctx.resources.mMeshes.size()); + DALI_TEST_EQUAL(0, ctx.resources.mShaders.size()); + DALI_TEST_EQUAL(0, ctx.resources.mSkeletons.size()); + + DALI_TEST_EQUAL(0, ctx.cameras.size()); + DALI_TEST_EQUAL(0, ctx.lights.size()); + DALI_TEST_EQUAL(0, ctx.animations.size()); + DALI_TEST_EQUAL(0, ctx.animationGroups.size()); + + END_TEST; +} + +int UtcDaliGltfLoaderFailedToParse(void) +{ + Context ctx; + + ShaderDefinitionFactory sdf; + sdf.SetResources(ctx.resources); + + DALI_TEST_THROW(LoadGltfScene(TEST_RESOURCE_DIR "/invalid.gltf", sdf, ctx.loadResult), + std::runtime_error, + ExceptionMessageStartsWith{"Failed to parse"}); + + DALI_TEST_EQUAL(0, ctx.scene.GetRoots().size()); + DALI_TEST_EQUAL(0, ctx.scene.GetNodeCount()); + + DALI_TEST_EQUAL(0, ctx.resources.mEnvironmentMaps.size()); + DALI_TEST_EQUAL(0, ctx.resources.mMaterials.size()); + DALI_TEST_EQUAL(0, ctx.resources.mMeshes.size()); + DALI_TEST_EQUAL(0, ctx.resources.mShaders.size()); + DALI_TEST_EQUAL(0, ctx.resources.mSkeletons.size()); + + DALI_TEST_EQUAL(0, ctx.cameras.size()); + DALI_TEST_EQUAL(0, ctx.lights.size()); + DALI_TEST_EQUAL(0, ctx.animations.size()); + DALI_TEST_EQUAL(0, ctx.animationGroups.size()); + + END_TEST; +} + +int UtcDaliGltfLoaderSuccess1(void) +{ + Context ctx; + + ShaderDefinitionFactory sdf; + sdf.SetResources(ctx.resources); + + LoadGltfScene(TEST_RESOURCE_DIR "/AnimatedCube.gltf", sdf, ctx.loadResult); + + DALI_TEST_EQUAL(1u, ctx.scene.GetRoots().size()); + DALI_TEST_EQUAL(6u, ctx.scene.GetNodeCount()); + + DALI_TEST_EQUAL(0u, ctx.resources.mEnvironmentMaps.size()); + + auto& materials = ctx.resources.mMaterials; + DALI_TEST_EQUAL(2u, materials.size()); + const MaterialDefinition materialGroundTruth[] { + { + MaterialDefinition::ALBEDO | MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | + MaterialDefinition::NORMAL | MaterialDefinition::TRANSPARENCY | MaterialDefinition::GLTF_CHANNELS | + (0x80 << MaterialDefinition::ALPHA_CUTOFF_SHIFT), + 0, + Vector4(1.f, .766f, .336f, 1.f), + 1.f, + 0.f, + { + { MaterialDefinition::ALBEDO, + { "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT) } }, + { MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | MaterialDefinition::GLTF_CHANNELS, + { "AnimatedCube_MetallicRoughness.png", + SamplerFlags::Encode(FilterMode::NEAREST_MIPMAP_LINEAR, FilterMode::NEAREST, WrapMode::CLAMP_TO_EDGE, WrapMode::MIRRORED_REPEAT) } }, + { MaterialDefinition::NORMAL, + { "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT) } }, + } + }, + { + MaterialDefinition::ALBEDO | MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | + MaterialDefinition::NORMAL | MaterialDefinition::GLTF_CHANNELS, + 0, + Vector4(1.f, .766f, .336f, 1.f), + 1.f, + 0.f, + { + { MaterialDefinition::ALBEDO, + { "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT) } }, + { MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | MaterialDefinition::GLTF_CHANNELS, + { "AnimatedCube_MetallicRoughness.png", + SamplerFlags::Encode(FilterMode::NEAREST_MIPMAP_LINEAR, FilterMode::NEAREST, WrapMode::CLAMP_TO_EDGE, WrapMode::MIRRORED_REPEAT) } }, + { MaterialDefinition::NORMAL, + { "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT) } }, + } + }, + }; + + auto iMaterial = materials.begin(); + for (auto& m : materialGroundTruth) + { + printf("material %ld\n", iMaterial - materials.begin()); + auto& md = iMaterial->first; + DALI_TEST_EQUAL(md.mFlags, m.mFlags); + DALI_TEST_EQUAL(md.mEnvironmentIdx, m.mEnvironmentIdx); + DALI_TEST_EQUAL(md.mColor, m.mColor); + DALI_TEST_EQUAL(md.mMetallic, m.mMetallic); + DALI_TEST_EQUAL(md.mRoughness, m.mRoughness); + + DALI_TEST_EQUAL(md.mTextureStages.size(), m.mTextureStages.size()); + auto iTexture = md.mTextureStages.begin(); + for (auto& ts: m.mTextureStages) + { + printf("texture %ld\n", iTexture - md.mTextureStages.begin()); + DALI_TEST_EQUAL(iTexture->mSemantic, ts.mSemantic); + DALI_TEST_EQUAL(iTexture->mTexture.mImageUri, ts.mTexture.mImageUri); + DALI_TEST_EQUAL(uint32_t(iTexture->mTexture.mSamplerFlags), uint32_t(ts.mTexture.mSamplerFlags)); // don't interpret it as a character + ++iTexture; + } + ++iMaterial; + } + + auto& meshes = ctx.resources.mMeshes; + DALI_TEST_EQUAL(2u, meshes.size()); + + using Blob = MeshDefinition::Blob; + using Accessor = MeshDefinition::Accessor; + const MeshDefinition meshGroundTruth[] { + { + 0, + Geometry::TRIANGLES, + "AnimatedCube.bin", + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + }, + { + 0, + Geometry::TRIANGLES, + "AnimatedCube.bin", + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + Accessor{ Blob{ 0, 0 }, {} }, + }, + }; + + auto iMesh = meshes.begin(); + for (auto& m : meshGroundTruth) + { + printf("mesh %ld\n", iMesh - meshes.begin()); + + auto& md = iMesh->first; + DALI_TEST_EQUAL(md.mFlags, m.mFlags); + DALI_TEST_EQUAL(md.mPrimitiveType, m.mPrimitiveType); + for (auto mp: { + &MeshDefinition::mIndices, + &MeshDefinition::mPositions, + &MeshDefinition::mNormals, + &MeshDefinition::mTexCoords, + &MeshDefinition::mTangents, + &MeshDefinition::mJoints0, + &MeshDefinition::mWeights0 + }) + { + DALI_TEST_EQUAL((md.*mp).IsDefined(), (m.*mp).IsDefined()); + DALI_TEST_EQUAL((md.*mp).mBlob.IsDefined(), (m.*mp).mBlob.IsDefined()); + } + + DALI_TEST_EQUAL(md.mBlendShapeHeader.IsDefined(), m.mBlendShapeHeader.IsDefined()); + + ++iMesh; + } + + DALI_TEST_EQUAL(2u, ctx.resources.mShaders.size()); + DALI_TEST_EQUAL(0u, ctx.resources.mSkeletons.size()); + + DALI_TEST_EQUAL(3u, ctx.cameras.size()); + DALI_TEST_EQUAL(0u, ctx.lights.size()); + DALI_TEST_EQUAL(1u, ctx.animations.size()); + DALI_TEST_EQUAL(0u, ctx.animationGroups.size()); + + END_TEST; +} + +int UtcDaliGltfLoaderSuccessShort(void) +{ + TestApplication app; + + const std::string resourcePath = TEST_RESOURCE_DIR "/"; + auto pathProvider = [resourcePath](ResourceType::Value) { + return resourcePath; + }; + + Customization::Choices choices; + for (auto modelName : { + "2CylinderEngine", + "AnimatedMorphCube", + "AnimatedMorphSphere", + "AnimatedTriangle", + "BoxAnimated", + "CesiumMan", + "CesiumMilkTruck", + "EnvironmentTest", + "MetalRoughSpheres", + "MorphPrimitivesTest", + "SimpleSparseAccessor", + }) + { + Context ctx; + + ShaderDefinitionFactory sdf; + + auto& resources = ctx.resources; + resources.mEnvironmentMaps.push_back({}); + + sdf.SetResources(resources); + + printf("%s\n", modelName); + LoadGltfScene(resourcePath + modelName + ".gltf", sdf, ctx.loadResult); + DALI_TEST_CHECK(ctx.scene.GetNodeCount() > 0); + + auto& scene = ctx.scene; + for (auto iRoot : scene.GetRoots()) + { + struct Visitor: NodeDefinition::IVisitor + { + struct ResourceReceiver: IResourceReceiver + { + std::vector mCounts; + + void Register(ResourceType::Value type, Index id) override + { + if (type == ResourceType::Mesh) + { + mCounts[id] = true; + } + } + } receiver; + + void Start(NodeDefinition& n) override + { + if (n.mRenderable) + { + n.mRenderable->RegisterResources(receiver); + } + } + + void Finish(NodeDefinition& n) override + {} + } visitor; + visitor.receiver.mCounts.resize(resources.mMeshes.size(), false); + + scene.Visit(iRoot, choices, visitor); + for (uint32_t i0 = 0, i1 = resources.mMeshes.size(); i0 < i1; ++i0) + { + if (visitor.receiver.mCounts[i0]) + { + auto raw = resources.mMeshes[i0].first.LoadRaw(resourcePath); + DALI_TEST_CHECK(!raw.mAttribs.empty()); + + resources.mMeshes[i0].second = resources.mMeshes[i0].first.Load(std::move(raw)); + DALI_TEST_CHECK(resources.mMeshes[i0].second.geometry); + } + } + } + } + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-KtxLoader.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-KtxLoader.cpp new file mode 100644 index 0000000..15d6b58 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-KtxLoader.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/ktx-loader.h" +#include +#include + +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliKtxLoaderFailNonexistent(void) +{ + CubeData data; + DALI_TEST_CHECK(!LoadCubeMapData("non-existent.ktx", data)); + END_TEST; +} + +int UtcDaliKtxLoaderFailInvalid1(void) +{ + CubeData data; + DALI_TEST_CHECK(!LoadCubeMapData(TEST_RESOURCE_DIR "/invalid.svg", data)); // file smaller than KTX header + END_TEST; +} + +int UtcDaliKtxLoaderFailInvalid2(void) +{ + CubeData data; + DALI_TEST_CHECK(!LoadCubeMapData(TEST_RESOURCE_DIR "/anim.gif", data)); // not a KTX + END_TEST; +} + +int UtcDaliKtxLoaderFailTruncated(void) +{ + CubeData data; + DALI_TEST_CHECK(!LoadCubeMapData(TEST_RESOURCE_DIR "/truncated.ktx", data)); + END_TEST; +} + +int UtcDaliKtxLoaderSuccess(void) +{ + CubeData cubeData; + auto path = TEST_RESOURCE_DIR "/forest_radiance.ktx"; + DALI_TEST_CHECK(LoadCubeMapData(path, cubeData)); + + DALI_TEST_EQUAL(6u, cubeData.data.size()); + for (auto& face: cubeData.data) + { + uint32_t size = 64; + for (auto& mipData: face) + { + DALI_TEST_EQUAL(size, mipData.GetWidth()); + DALI_TEST_EQUAL(size, mipData.GetHeight()); + DALI_TEST_EQUAL(Pixel::Format::RGB888, mipData.GetPixelFormat()); + size /= 2; + } + } + + END_TEST; +} + +int UtcDaliKtxLoaderFormats(void) +{ + auto resPath = TEST_RESOURCE_DIR "/"; +#define FORMAT_PATH(x) { #x, Pixel::x } +#define FORMAT_COMPRESSED_PATH(x) { #x, Pixel::COMPRESSED_ ## x ## _KHR } + std::pair pathFormats[] { + FORMAT_COMPRESSED_PATH(RGBA_ASTC_4x4), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_5x4), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_5x5), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_6x5), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_6x6), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_8x5), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_8x6), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_8x8), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_10x5), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_10x6), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_10x10), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_12x10), + FORMAT_COMPRESSED_PATH(RGBA_ASTC_12x12), + FORMAT_PATH(RGB16F), + FORMAT_PATH(RGB32F), + FORMAT_PATH(RGBA8888), + }; + for (auto i : pathFormats) + { + CubeData cubeData; + DALI_TEST_CHECK(LoadCubeMapData(resPath + i.first + ".ktx", cubeData)); + DALI_TEST_EQUAL(cubeData.data[0][0].GetPixelFormat(), i.second); + } + + END_TEST; +} + +int UtcDaliKtxLoaderCubeDataCreateTexture1(void) +{ + uint32_t pixelBufferSize = 3; + uint8_t* pixelBuffer = new uint8_t[pixelBufferSize]; + + CubeData cubeData; + cubeData.data.push_back({}); + + auto pixelData = PixelData::New(pixelBuffer, pixelBufferSize, 1, 1, Pixel::Format::RGB888, PixelData::DELETE_ARRAY); + cubeData.data[0].push_back(pixelData); + + TestApplication app; + auto texture = cubeData.CreateTexture(); + + DALI_TEST_CHECK(texture); + DALI_TEST_EQUAL(1u, texture.GetWidth()); + DALI_TEST_EQUAL(1u, texture.GetHeight()); + + END_TEST; +} + +int UtcDaliKtxLoaderCubeDataCreateTexture2(void) +{ + CubeData cubeData; + auto path = TEST_RESOURCE_DIR "/forest_radiance.ktx"; + DALI_TEST_CHECK(LoadCubeMapData(path, cubeData)); + + TestApplication app; + auto texture = cubeData.CreateTexture(); + + DALI_TEST_CHECK(texture); + DALI_TEST_EQUAL(64u, texture.GetWidth()); + DALI_TEST_EQUAL(64u, texture.GetHeight()); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-MatrixStack.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-MatrixStack.cpp new file mode 100644 index 0000000..776ded7 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-MatrixStack.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/matrix-stack.h" +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +int UtcDaliMatrixStack(void) +{ + MatrixStack stack; + DALI_TEST_CHECK(stack.IsEmpty()); + + Matrix testMatrix; + testMatrix.SetTransformComponents(Vector3::ONE * 5.f, + Quaternion(Radian(Degree(-45.f)), Vector3::XAXIS), + Vector3(100.f, 0.f, -200.f)); + + stack.Push(testMatrix); + DALI_TEST_CHECK(!stack.IsEmpty()); + DALI_TEST_EQUAL(stack.Top(), testMatrix); + + stack.Push(Matrix::IDENTITY); + DALI_TEST_CHECK(!stack.IsEmpty()); + DALI_TEST_EQUAL(stack.Top(), testMatrix); + + stack.Push(testMatrix); + + Matrix testMatrix2; + Matrix::Multiply(testMatrix2, testMatrix, testMatrix); + DALI_TEST_CHECK(!stack.IsEmpty()); + DALI_TEST_EQUAL(stack.Top(), testMatrix2); + + stack.PopAll(); + DALI_TEST_CHECK(stack.IsEmpty()); + + stack.Push(Matrix::IDENTITY); + DALI_TEST_EQUAL(stack.Top(), Matrix::IDENTITY); + + stack.Push(testMatrix); + DALI_TEST_EQUAL(stack.Top(), testMatrix); + + stack.Pop(); + DALI_TEST_EQUAL(stack.Top(), Matrix::IDENTITY); + DALI_TEST_CHECK(!stack.IsEmpty()); + + stack.Pop(); + DALI_TEST_CHECK(stack.IsEmpty()); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-NodeDefinition.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-NodeDefinition.cpp new file mode 100644 index 0000000..7f1a7cf --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-NodeDefinition.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/node-definition.h" +#include "dali-scene-loader/public-api/view-projection.h" +#include +#include +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +namespace +{ + +struct Context +{ + ResourceBundle resources; + + ViewProjection viewProjection; + Transforms transforms { MatrixStack{}, viewProjection }; + + NodeDefinition::CreateParams createParams { + resources, + transforms + }; +}; + +} + +int UtcDaliConstraintDefinitionsCompare(void) +{ + ConstraintDefinition cd1{ "orientation", 0 }; + ConstraintDefinition cd2{ "position", 1 }; + + DALI_TEST_CHECK(cd1 < cd2); + DALI_TEST_CHECK(!(cd2 < cd1)); + DALI_TEST_CHECK(!(cd1 < cd1)); + DALI_TEST_CHECK(!(cd2 < cd2)); + + DALI_TEST_CHECK(cd1 == cd1); + DALI_TEST_CHECK(cd2 == cd2); + + ConstraintDefinition cd3{ "position", 0 }; + ConstraintDefinition cd4{ "scale", 1 }; + ConstraintDefinition cd5{ "position", 1 }; + DALI_TEST_CHECK(cd2 != cd3); + DALI_TEST_CHECK(cd2 != cd4); + DALI_TEST_CHECK(cd2 == cd5); + DALI_TEST_CHECK(cd5 == cd2); + + END_TEST; +} + +int UtcDaliBlendshapeShaderConfigurationRequestsCompare(void) +{ + TestApplication app; + BlendshapeShaderConfigurationRequest bsscr1{ "", 0, Shader(nullptr) }; + + BlendshapeShaderConfigurationRequest bsscr2{ "", 0, Shader::New( + "void main(){ gl_Position = vec4(0.); }", + "void main(){ gl_FragColor = vec4(1.); }" + ) }; + + DALI_TEST_CHECK(bsscr1 < bsscr2); + DALI_TEST_CHECK(!(bsscr2 < bsscr1)); + DALI_TEST_CHECK(!(bsscr1 < bsscr1)); + DALI_TEST_CHECK(!(bsscr2 < bsscr2)); + + END_TEST; +} + +int UtcDaliNodeDefinitionExtrasCompare(void) +{ + NodeDefinition::Extra e1{ "alpha", Vector3::XAXIS * 2.f }; + NodeDefinition::Extra e2{ "beta", 8 }; + + DALI_TEST_CHECK(e1 < e2); + DALI_TEST_CHECK(!(e1 < e1)); + DALI_TEST_CHECK(!(e2 < e1)); + DALI_TEST_CHECK(!(e2 < e2)); + + END_TEST; +} + +int UtcDaliNodeDefinitionProperties(void) +{ + TestApplication testApp; + NodeDefinition nodeDef{ + "testRootNode", + Vector3{ -100.f, 100.f, -500.f }, + Quaternion{ Radian(Degree(45.f)), Vector3::ZAXIS }, + Vector3{ 2.f, 4.f, 8.f }, + Vector3{ 100.f, 50.f, 25.f }, + false, + }; + + Quaternion frobnicateFactor(0.f, 1.f, 2.f, 3.f); + frobnicateFactor.Normalize(); // because it will be (by DALi) once it's set as a property. + nodeDef.mExtras.push_back(NodeDefinition::Extra{ "frobnicateFactor", frobnicateFactor }); + + Context ctx; + auto actor = nodeDef.CreateActor(ctx.createParams); + DALI_TEST_EQUAL(nodeDef.mName, actor.GetProperty(Actor::Property::NAME).Get()); + DALI_TEST_EQUAL(nodeDef.mPosition, actor.GetProperty(Actor::Property::POSITION).Get()); + DALI_TEST_EQUAL(nodeDef.mOrientation, actor.GetProperty(Actor::Property::ORIENTATION).Get()); + DALI_TEST_EQUAL(nodeDef.mScale, actor.GetProperty(Actor::Property::SCALE).Get()); + DALI_TEST_EQUAL(nodeDef.mSize, actor.GetProperty(Actor::Property::SIZE).Get()); + DALI_TEST_EQUAL(nodeDef.mIsVisible, actor.GetProperty(Actor::Property::VISIBLE).Get()); + + Property::Index propFrobnicateFactor = actor.GetPropertyIndex("frobnicateFactor"); + DALI_TEST_CHECK(propFrobnicateFactor != Property::INVALID_INDEX); + + auto frobnicateFactorValue = actor.GetProperty(propFrobnicateFactor); + DALI_TEST_EQUAL(Property::ROTATION, frobnicateFactorValue.GetType()); + DALI_TEST_EQUAL(frobnicateFactorValue.Get(), frobnicateFactor); + + DALI_TEST_EQUAL(0, actor.GetChildCount()); + DALI_TEST_EQUAL(0, actor.GetRendererCount()); + + END_TEST; +} + +int UtcDaliNodeDefinitionRenderableRegisterResources(void) +{ + NodeDefinition nodeDef; + + auto renderable = new NodeDefinition::Renderable(); + renderable->mShaderIdx = 0; + nodeDef.mRenderable.reset(renderable); + + struct : IResourceReceiver + { + std::vector shaders; + uint32_t otherResources = 0; + + void Register(ResourceType::Value type, Index id) override + { + switch(type) + { + case ResourceType::Shader: + shaders.push_back(id); + break; + + default: + ++otherResources; + } + } + } resourceReceiver; + + nodeDef.mRenderable->RegisterResources(resourceReceiver); + DALI_TEST_EQUAL(1u, resourceReceiver.shaders.size()); + DALI_TEST_EQUAL(0, resourceReceiver.shaders[0]); + DALI_TEST_EQUAL(0, resourceReceiver.otherResources); + + END_TEST; +} + +int UtcDaliNodeDefinitionRenderableReflectResources(void) +{ + NodeDefinition nodeDef; + + auto renderable = new NodeDefinition::Renderable(); + renderable->mShaderIdx = 0; + nodeDef.mRenderable.reset(renderable); + + struct : IResourceReflector + { + std::vector shaders; + uint32_t otherResources = 0; + + void Reflect(ResourceType::Value type, Index& id) override + { + switch(type) + { + case ResourceType::Shader: + shaders.push_back(&id); + break; + + default: + ++otherResources; + } + } + } resourceReflector; + + nodeDef.mRenderable->ReflectResources(resourceReflector); + DALI_TEST_EQUAL(1u, resourceReflector.shaders.size()); + DALI_TEST_EQUAL(&renderable->mShaderIdx, resourceReflector.shaders[0]); + DALI_TEST_EQUAL(0, resourceReflector.otherResources); + + END_TEST; +} + +int UtcDaliNodeDefinitionRenderable(void) +{ + TestApplication testApp; + NodeDefinition nodeDef; + + auto renderable = new NodeDefinition::Renderable(); + renderable->mShaderIdx = 0; + nodeDef.mRenderable.reset(renderable); + + Context ctx; + const auto VSH = "void main() { gl_Position = vec4(0.); }"; + const auto FSH = "void main() { gl_FragColor = vec4(1.); }"; + auto shader = Shader::New(VSH, FSH); + ctx.resources.mShaders.push_back({ ShaderDefinition{}, shader }); + + auto actor = nodeDef.CreateActor(ctx.createParams); + DALI_TEST_EQUAL(1, actor.GetRendererCount()); + + auto renderer = actor.GetRendererAt(0); + DALI_TEST_EQUAL(renderer.GetShader(), shader); + + END_TEST; +} diff --git a/automated-tests/src/dali-scene-loader/utc-Dali-RendererState.cpp b/automated-tests/src/dali-scene-loader/utc-Dali-RendererState.cpp new file mode 100644 index 0000000..a6f6251 --- /dev/null +++ b/automated-tests/src/dali-scene-loader/utc-Dali-RendererState.cpp @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Enable debug log for test coverage +#define DEBUG_ENABLED 1 + +#include "dali-scene-loader/public-api/renderer-state.h" +#include "dali-scene-loader/public-api/parse-renderer-state.h" +#include "dali-scene-loader/public-api/utils.h" +#include + +using namespace Dali; +using namespace Dali::SceneLoader; + +namespace sl = SceneLoader; +namespace rs = RendererState; + +int UtcDaliRendererStateFromBlendFactors(void) +{ + rs::Type state = rs::FromBlendFactors(sl::BlendFactor::ZERO, sl::BlendFactor::ONE, + sl::BlendFactor::SRC_COLOR, sl::BlendFactor::ONE_MINUS_SRC_COLOR); + + DALI_TEST_EQUAL((state >> rs::BLEND_FACTOR_BASE_SHIFT) & rs::BLEND_FACTOR_ITEM_MASK, rs::Type(sl::BlendFactor::ZERO)); + DALI_TEST_EQUAL((state >> (rs::BLEND_FACTOR_BASE_SHIFT + rs::BLEND_FACTOR_ITEM_BITS)) & + rs::BLEND_FACTOR_ITEM_MASK, rs::Type(sl::BlendFactor::ONE)); + DALI_TEST_EQUAL((state >> (rs::BLEND_FACTOR_BASE_SHIFT + rs::BLEND_FACTOR_ITEM_BITS * 2)) & + rs::BLEND_FACTOR_ITEM_MASK, rs::Type(sl::BlendFactor::SRC_COLOR)); + DALI_TEST_EQUAL((state >> (rs::BLEND_FACTOR_BASE_SHIFT + rs::BLEND_FACTOR_ITEM_BITS * 3)) & + rs::BLEND_FACTOR_ITEM_MASK, rs::Type(sl::BlendFactor::ONE_MINUS_SRC_COLOR)); + + END_TEST; +} + +#define HELP_TEST_RENDERER_STATE(property, resetValue, state, checkValue, renderer)\ + renderer.SetProperty(property, ~(resetValue));\ + rs::Apply((state), (renderer));\ + printf("%s %s vs %s\n", #property, #state, #checkValue);\ + DALI_TEST_EQUAL(renderer.GetProperty(property).Get(), (checkValue)); + +int UtcDaliRendererStateApply(void) +{ + TestApplication app; + auto vsh = "void main() { gl_Position = vec4(0.); }"; + auto fsh = "void main() { gl_FragColor = vec4(1.); }"; + Geometry geom = Geometry::New(); + Shader shader = Shader::New(vsh, fsh); + Renderer renderer = Renderer::New(geom, shader); + + HELP_TEST_RENDERER_STATE(Renderer::Property::DEPTH_WRITE_MODE, DepthWriteMode::OFF, rs::DEPTH_WRITE, DepthWriteMode::ON, renderer); + HELP_TEST_RENDERER_STATE(Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::OFF, rs::DEPTH_TEST, DepthTestMode::ON, renderer); + + HELP_TEST_RENDERER_STATE(Renderer::Property::BLEND_MODE, BlendMode::OFF, rs::ALPHA_BLEND, BlendMode::ON, renderer); + + HELP_TEST_RENDERER_STATE(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::NONE, rs::CULL_FRONT, FaceCullingMode::FRONT, renderer); + HELP_TEST_RENDERER_STATE(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::NONE, rs::CULL_BACK, FaceCullingMode::BACK, renderer); + HELP_TEST_RENDERER_STATE(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::NONE, rs::CULL_FRONT | rs::CULL_BACK, + FaceCullingMode::FRONT_AND_BACK, renderer); + +#define DEPTH_FUNC_PAIR(x) { Comparison::x << rs::DEPTH_FUNCTION_SHIFT, DepthFunction::x } + const std::pair depthFunctionPairs[] { + DEPTH_FUNC_PAIR(NEVER), + DEPTH_FUNC_PAIR(ALWAYS), + DEPTH_FUNC_PAIR(LESS), + DEPTH_FUNC_PAIR(GREATER), + DEPTH_FUNC_PAIR(EQUAL), + DEPTH_FUNC_PAIR(NOT_EQUAL), + DEPTH_FUNC_PAIR(LESS_EQUAL), + DEPTH_FUNC_PAIR(GREATER_EQUAL), + }; +#undef DEPTH_FUNC_PAIR + for (auto& p : depthFunctionPairs) + { + HELP_TEST_RENDERER_STATE(Renderer::Property::DEPTH_FUNCTION, DepthFunction::LESS, p.first, p.second, renderer); + } + +#define BLEND_FACTOR_PAIR(x) { sl::BlendFactor::x, BlendFactor::x } + const std::pair BLEND_FACTORS[] { + BLEND_FACTOR_PAIR(ZERO), + BLEND_FACTOR_PAIR(ONE), + BLEND_FACTOR_PAIR(SRC_COLOR), + BLEND_FACTOR_PAIR(ONE_MINUS_SRC_COLOR), + BLEND_FACTOR_PAIR(SRC_ALPHA), + BLEND_FACTOR_PAIR(ONE_MINUS_SRC_ALPHA), + BLEND_FACTOR_PAIR(DST_COLOR), + BLEND_FACTOR_PAIR(ONE_MINUS_DST_COLOR), + BLEND_FACTOR_PAIR(DST_ALPHA), + BLEND_FACTOR_PAIR(ONE_MINUS_DST_ALPHA), + BLEND_FACTOR_PAIR(SRC_ALPHA_SATURATE), + BLEND_FACTOR_PAIR(CONSTANT_COLOR), + BLEND_FACTOR_PAIR(ONE_MINUS_CONSTANT_COLOR), + BLEND_FACTOR_PAIR(CONSTANT_ALPHA), + BLEND_FACTOR_PAIR(ONE_MINUS_CONSTANT_ALPHA), + }; +#undef BLEND_FACTOR_PAIR + for (auto property: { + Renderer::Property::BLEND_FACTOR_SRC_RGB, + Renderer::Property::BLEND_FACTOR_DEST_RGB, + Renderer::Property::BLEND_FACTOR_SRC_ALPHA, + Renderer::Property::BLEND_FACTOR_DEST_ALPHA, + }) + { + const auto itemShift = rs::BLEND_FACTOR_ITEM_BITS * (property - Renderer::Property::BLEND_FACTOR_SRC_RGB); + const auto shift = rs::BLEND_FACTOR_BASE_SHIFT + itemShift; + for (auto& value: BLEND_FACTORS) + { + HELP_TEST_RENDERER_STATE(property, BlendFactor::ZERO, value.first << shift, value.second, renderer); + } + } + +#define RENDER_MODE_PAIR(x) { BufferMode::x << rs::BUFFER_MODE_SHIFT, RenderMode::x } + std::pair renderModePairs[] { + // same as our reset value: RENDER_MODE_PAIR(NONE), + RENDER_MODE_PAIR(AUTO), + RENDER_MODE_PAIR(COLOR), + RENDER_MODE_PAIR(STENCIL), + RENDER_MODE_PAIR(COLOR_STENCIL), + }; +#undef RENDER_MODE_PAIR + for (auto& p: renderModePairs) + { + HELP_TEST_RENDERER_STATE(Renderer::Property::RENDER_MODE, RenderMode::NONE, p.first, p.second, renderer); + } + + END_TEST; +} + +int UtcDaliRendererStateParseEmpty(void) +{ + std::string error; + auto onError = [&](const std::string& e) { error = e; }; + + DALI_TEST_EQUAL(rs::Parse("", 0, onError), uint32_t(rs::NONE)); + DALI_TEST_CHECK(error.empty()); + END_TEST; +} + +int UtcDaliRendererStateParseInvalid(void) +{ + std::string error; + auto onError = [&](const std::string& e) { error = e; }; + + DALI_TEST_EQUAL(rs::Parse("definitelyNotAValidRendererState", 0, onError), uint32_t(rs::NONE)); + DALI_TEST_CHECK(strstr(error.c_str(), "Not a valid RendererState") != nullptr); + END_TEST; +} + +namespace +{ +struct Option +{ + std::string_view name; + rs::Type expected; + + void Apply(std::ostream& stream, uint8_t shift, uint32_t& result) const + { + stream << name; + result |= expected << shift; + } +}; + +struct StateGenerator +{ + std::string_view name; + + uint8_t shift; + std::vector