summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Dubitskiy <sergey.dubitskiy@nokia.com>2012-06-08 10:11:42 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-24 04:53:42 +0200
commita92ad1a2b363e18fc8a1ea3660482d2d1adfd67d (patch)
treece910844b135b640d29b24b60c503ad26a82bc7e
parent2f6f43649a89975ce93c07950f0935d3e66c1b7c (diff)
downloadqt3d-stable.tar.gz
Object animations.stablerelease
Animation tracks for object rotate/scale/translate can be loaded and played. A simple example illustrating this feature is also provided. Task-number: QTBUG-19906 Change-Id: I7a07c214f8ad7065b7f3f48d8929cb7d546af5f3 Reviewed-by: Sergey Dubitskiy <sergey.dubitskiy@nokia.com>
-rw-r--r--examples/qt3d/qt3d.pro2
-rw-r--r--examples/qt3d/scene_animations/brick.dae222
-rwxr-xr-xexamples/qt3d/scene_animations/cube_2rotations_angles_text.x433
-rw-r--r--examples/qt3d/scene_animations/cube_rotated.dae561
-rw-r--r--examples/qt3d/scene_animations/qt3d.icobin0 -> 54334 bytes
-rw-r--r--examples/qt3d/scene_animations/rotate.dae697
-rw-r--r--examples/qt3d/scene_animations/scale.dae697
-rw-r--r--examples/qt3d/scene_animations/scale_rotate_translate.dae697
-rw-r--r--examples/qt3d/scene_animations/scene_animations.cpp140
-rw-r--r--examples/qt3d/scene_animations/scene_animations.h73
-rw-r--r--examples/qt3d/scene_animations/scene_animations.pro17
-rw-r--r--examples/qt3d/scene_animations/scene_animations.qrc14
-rw-r--r--examples/qt3d/scene_animations/scene_animations.rc1
-rw-r--r--examples/qt3d/scene_animations/scene_animations_main.cpp79
-rw-r--r--examples/qt3d/scene_animations/stonewal.jpgbin0 -> 19550 bytes
-rw-r--r--examples/qt3d/scene_animations/translate.dae697
-rw-r--r--src/imports/threed/viewport.cpp4
-rw-r--r--src/threed/scene/qglabstractscene.cpp162
-rw-r--r--src/threed/scene/qglabstractscene.h10
-rw-r--r--src/threed/scene/qglsceneanimation.cpp50
-rw-r--r--src/threed/scene/qglsceneanimation.h34
-rw-r--r--src/threed/scene_ai/qaianimation.cpp431
-rw-r--r--src/threed/scene_ai/qaianimation.h92
-rw-r--r--src/threed/scene_ai/qaianimation_p.h149
-rw-r--r--src/threed/scene_ai/qailoader.cpp81
-rw-r--r--src/threed/scene_ai/qailoader.h9
-rw-r--r--src/threed/scene_ai/qaiscene.cpp59
-rw-r--r--src/threed/scene_ai/qaiscene.h1
-rw-r--r--src/threed/scene_ai/scene_ai.pri3
29 files changed, 5364 insertions, 51 deletions
diff --git a/examples/qt3d/qt3d.pro b/examples/qt3d/qt3d.pro
index f1e5903aa..b13095849 100644
--- a/examples/qt3d/qt3d.pro
+++ b/examples/qt3d/qt3d.pro
@@ -1,2 +1,2 @@
TEMPLATE = subdirs
-SUBDIRS += basket builder cube cylinder geometry nesting solarsystem tank teapot load_model
+SUBDIRS += scene_animations basket builder cube cylinder geometry nesting solarsystem tank teapot load_model
diff --git a/examples/qt3d/scene_animations/brick.dae b/examples/qt3d/scene_animations/brick.dae
new file mode 100644
index 000000000..a25cc2fa5
--- /dev/null
+++ b/examples/qt3d/scene_animations/brick.dae
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>Blender User</author>
+ <authoring_tool>Blender 2.62.0 r44136</authoring_tool>
+ </contributor>
+ <created>2012-04-12T12:56:41</created>
+ <modified>2012-04-12T12:56:41</modified>
+ <unit name="meter" meter="1"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_cameras>
+ <camera id="Camera-camera" name="Camera">
+ <optics>
+ <technique_common>
+ <perspective>
+ <xfov sid="xfov">49.13434</xfov>
+ <aspect_ratio>1.777778</aspect_ratio>
+ <znear sid="znear">0.1</znear>
+ <zfar sid="zfar">100</zfar>
+ </perspective>
+ </technique_common>
+ </optics>
+ </camera>
+ </library_cameras>
+ <library_lights>
+ <light id="Lamp-light" name="Lamp">
+ <technique_common>
+ <point>
+ <color sid="color">1 1 1</color>
+ <constant_attenuation>1</constant_attenuation>
+ <linear_attenuation>0</linear_attenuation>
+ <quadratic_attenuation>0.00111109</quadratic_attenuation>
+ </point>
+ </technique_common>
+ <extra>
+ <technique profile="blender">
+ <adapt_thresh>0.000999987</adapt_thresh>
+ <area_shape>0</area_shape>
+ <area_size>1</area_size>
+ <area_sizey>1</area_sizey>
+ <area_sizez>1</area_sizez>
+ <atm_distance_factor>1</atm_distance_factor>
+ <atm_extinction_factor>1</atm_extinction_factor>
+ <atm_turbidity>2</atm_turbidity>
+ <att1>0</att1>
+ <att2>1</att2>
+ <backscattered_light>1</backscattered_light>
+ <bias>1</bias>
+ <blue>1</blue>
+ <buffers>1</buffers>
+ <bufflag>0</bufflag>
+ <bufsize>2880</bufsize>
+ <buftype>2</buftype>
+ <clipend>30.002</clipend>
+ <clipsta>1.000799</clipsta>
+ <compressthresh>0.04999995</compressthresh>
+ <dist sid="blender_dist">29.99998</dist>
+ <energy sid="blender_energy">1</energy>
+ <falloff_type>2</falloff_type>
+ <filtertype>0</filtertype>
+ <flag>0</flag>
+ <gamma sid="blender_gamma">1</gamma>
+ <green>1</green>
+ <halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
+ <horizon_brightness>1</horizon_brightness>
+ <mode>8192</mode>
+ <ray_samp>1</ray_samp>
+ <ray_samp_method>1</ray_samp_method>
+ <ray_samp_type>0</ray_samp_type>
+ <ray_sampy>1</ray_sampy>
+ <ray_sampz>1</ray_sampz>
+ <red>1</red>
+ <samp>3</samp>
+ <shadhalostep>0</shadhalostep>
+ <shadow_b sid="blender_shadow_b">0</shadow_b>
+ <shadow_g sid="blender_shadow_g">0</shadow_g>
+ <shadow_r sid="blender_shadow_r">0</shadow_r>
+ <shadspotsize>45</shadspotsize>
+ <sky_colorspace>0</sky_colorspace>
+ <sky_exposure>1</sky_exposure>
+ <skyblendfac>1</skyblendfac>
+ <skyblendtype>1</skyblendtype>
+ <soft>3</soft>
+ <spotblend>0.15</spotblend>
+ <spotsize>75</spotsize>
+ <spread>1</spread>
+ <sun_brightness>1</sun_brightness>
+ <sun_effect_type>0</sun_effect_type>
+ <sun_intensity>1</sun_intensity>
+ <sun_size>1</sun_size>
+ <type>0</type>
+ </technique>
+ </extra>
+ </light>
+ </library_lights>
+ <library_effects>
+ <effect id="Material-effect">
+ <profile_COMMON>
+ <technique sid="common">
+ <phong>
+ <emission>
+ <color sid="emission">0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color sid="ambient">0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color sid="diffuse">0.64 0.64 0.64 1</color>
+ </diffuse>
+ <specular>
+ <color sid="specular">0.5 0.5 0.5 1</color>
+ </specular>
+ <shininess>
+ <float sid="shininess">50</float>
+ </shininess>
+ <index_of_refraction>
+ <float sid="index_of_refraction">1</float>
+ </index_of_refraction>
+ </phong>
+ </technique>
+ <extra>
+ <technique profile="GOOGLEEARTH">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </profile_COMMON>
+ <extra><technique profile="MAX3D"><double_sided>1</double_sided></technique></extra>
+ </effect>
+ </library_effects>
+ <library_materials>
+ <material id="Material-material" name="Material">
+ <instance_effect url="#Material-effect"/>
+ </material>
+ </library_materials>
+ <library_geometries>
+ <geometry id="Cube-mesh" name="Cube">
+ <mesh>
+ <source id="Cube-mesh-positions">
+ <float_array id="Cube-mesh-positions-array" count="60">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999994 -1.000001 1 -1 -0.9999997 1 -1 1 1 -1.000001 -3.177726 0.9999998 0.9999989 -3.177727 0.9999998 -1.000001 -3.177726 -1 0.9999995 -3.177726 -1 -1.000001 -3.177726 -1 -1.000001 -3.177726 0.9999998 -1 -0.9999997 1 -1 -0.9999998 -1 -2.741302 -0.9999995 -1 -2.741302 -0.9999993 0.9999998 -2.741302 -3.177725 0.9999995 -2.741302 -3.177725 -1</float_array>
+ <technique_common>
+ <accessor source="#Cube-mesh-positions-array" count="20" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube-mesh-normals">
+ <float_array id="Cube-mesh-normals-array" count="54">0 0 -1 0 0 1 1 -2.83122e-7 0 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7 0 0 1 1 -2.18961e-7 3.27825e-7 0 0 -1 -2.98023e-7 -1 -1.78814e-7 0 0 0 0 0 0 0 0 0 0 0 0 2.0538e-7 1 0 -1.3692e-7 0 1 1.3692e-7 0 -1 -2.73839e-7 -1 0 -1 2.18961e-7 -1.19209e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube-mesh-normals-array" count="18" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube-mesh-map-0">
+ <float_array id="Cube-mesh-map-0-array" count="144">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube-mesh-map-0-array" count="72" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube-mesh-vertices">
+ <input semantic="POSITION" source="#Cube-mesh-positions"/>
+ </vertices>
+ <polylist material="Material1" count="18">
+ <input semantic="VERTEX" source="#Cube-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 2 3 12 6 3 13 7 3 14 3 3 15 4 4 16 0 4 17 3 4 18 7 4 19 5 5 20 6 5 21 8 5 22 9 5 23 1 6 24 5 6 25 9 6 26 11 6 27 2 7 28 1 7 29 11 7 30 10 7 31 11 8 32 9 8 33 8 8 34 10 8 35 10 9 36 8 9 37 13 9 38 12 9 39 2 10 40 10 10 41 12 10 42 15 10 43 8 11 44 6 11 45 14 11 46 13 11 47 6 12 48 2 12 49 15 12 50 14 12 51 14 13 52 15 13 53 16 13 54 17 13 55 13 14 56 14 14 57 17 14 58 18 14 59 15 15 60 12 15 61 19 15 62 16 15 63 12 16 64 13 16 65 18 16 66 19 16 67 17 17 68 16 17 69 19 17 70 18 17 71</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Scene" name="Scene">
+ <node id="Cube" type="NODE">
+ <translate sid="location">0 0 0</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_geometry url="#Cube-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Material1" target="#Material-material">
+ <bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
+ </instance_material>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <node id="Lamp" type="NODE">
+ <translate sid="location">4.076245 1.005454 5.903862</translate>
+ <rotate sid="rotationZ">0 0 1 106.9363</rotate>
+ <rotate sid="rotationY">0 1 0 3.163708</rotate>
+ <rotate sid="rotationX">1 0 0 37.26105</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_light url="#Lamp-light"/>
+ </node>
+ <node id="Camera" type="NODE">
+ <translate sid="location">7.481132 -6.50764 5.343665</translate>
+ <rotate sid="rotationZ">0 0 1 46.69195</rotate>
+ <rotate sid="rotationY">0 1 0 0.619768</rotate>
+ <rotate sid="rotationX">1 0 0 63.5593</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_camera url="#Camera-camera"/>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Scene"/>
+ </scene>
+</COLLADA> \ No newline at end of file
diff --git a/examples/qt3d/scene_animations/cube_2rotations_angles_text.x b/examples/qt3d/scene_animations/cube_2rotations_angles_text.x
new file mode 100755
index 000000000..ff7d0b6f0
--- /dev/null
+++ b/examples/qt3d/scene_animations/cube_2rotations_angles_text.x
@@ -0,0 +1,433 @@
+xof 0303txt 0032
+template Frame {
+ <3d82ab46-62da-11cf-ab39-0020af71e433>
+ [...]
+}
+
+template Matrix4x4 {
+ <f6f23f45-7686-11cf-8f52-0040333594a3>
+ array FLOAT matrix[16];
+}
+
+template FrameTransformMatrix {
+ <f6f23f41-7686-11cf-8f52-0040333594a3>
+ Matrix4x4 frameMatrix;
+}
+
+template Vector {
+ <3d82ab5e-62da-11cf-ab39-0020af71e433>
+ FLOAT x;
+ FLOAT y;
+ FLOAT z;
+}
+
+template MeshFace {
+ <3d82ab5f-62da-11cf-ab39-0020af71e433>
+ DWORD nFaceVertexIndices;
+ array DWORD faceVertexIndices[nFaceVertexIndices];
+}
+
+template Mesh {
+ <3d82ab44-62da-11cf-ab39-0020af71e433>
+ DWORD nVertices;
+ array Vector vertices[nVertices];
+ DWORD nFaces;
+ array MeshFace faces[nFaces];
+ [...]
+}
+
+template MeshNormals {
+ <f6f23f43-7686-11cf-8f52-0040333594a3>
+ DWORD nNormals;
+ array Vector normals[nNormals];
+ DWORD nFaceNormals;
+ array MeshFace faceNormals[nFaceNormals];
+}
+
+template ColorRGBA {
+ <35ff44e0-6c7c-11cf-8f52-0040333594a3>
+ FLOAT red;
+ FLOAT green;
+ FLOAT blue;
+ FLOAT alpha;
+}
+
+template ColorRGB {
+ <d3e16e81-7835-11cf-8f52-0040333594a3>
+ FLOAT red;
+ FLOAT green;
+ FLOAT blue;
+}
+
+template Material {
+ <3d82ab4d-62da-11cf-ab39-0020af71e433>
+ ColorRGBA faceColor;
+ FLOAT power;
+ ColorRGB specularColor;
+ ColorRGB emissiveColor;
+ [...]
+}
+
+template MeshMaterialList {
+ <f6f23f42-7686-11cf-8f52-0040333594a3>
+ DWORD nMaterials;
+ DWORD nFaceIndexes;
+ array DWORD faceIndexes[nFaceIndexes];
+ [Material <3d82ab4d-62da-11cf-ab39-0020af71e433>]
+}
+
+template Coords2d {
+ <f6f23f44-7686-11cf-8f52-0040333594a3>
+ FLOAT u;
+ FLOAT v;
+}
+
+template MeshTextureCoords {
+ <f6f23f40-7686-11cf-8f52-0040333594a3>
+ DWORD nTextureCoords;
+ array Coords2d textureCoords[nTextureCoords];
+}
+
+template Animation {
+ <3d82ab4f-62da-11cf-ab39-0020af71e433>
+ [...]
+}
+
+template AnimationSet {
+ <3d82ab50-62da-11cf-ab39-0020af71e433>
+ [Animation <3d82ab4f-62da-11cf-ab39-0020af71e433>]
+}
+
+template FloatKeys {
+ <10dd46a9-775b-11cf-8f52-0040333594a3>
+ DWORD nValues;
+ array FLOAT values[nValues];
+}
+
+template TimedFloatKeys {
+ <f406b180-7b3b-11cf-8f52-0040333594a3>
+ DWORD time;
+ FloatKeys tfkeys;
+}
+
+template AnimationKey {
+ <10dd46a8-775b-11cf-8f52-0040333594a3>
+ DWORD keyType;
+ DWORD nKeys;
+ array TimedFloatKeys keys[nKeys];
+}
+
+
+Frame Box01 {
+
+
+ FrameTransformMatrix {
+ 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;
+ }
+
+ Mesh {
+ 20;
+ -20.000000;0.000000;-20.000000;,
+ 20.000000;0.000000;-20.000000;,
+ -20.000000;0.000000;20.000000;,
+ 20.000000;0.000000;20.000000;,
+ -20.000000;20.000000;-20.000000;,
+ 20.000000;20.000000;-20.000000;,
+ -20.000000;20.000000;20.000000;,
+ 20.000000;20.000000;20.000000;,
+ -20.000000;0.000000;-20.000000;,
+ 20.000000;20.000000;-20.000000;,
+ 20.000000;0.000000;-20.000000;,
+ -20.000000;20.000000;-20.000000;,
+ 20.000000;0.000000;20.000000;,
+ 20.000000;20.000000;-20.000000;,
+ 20.000000;0.000000;20.000000;,
+ -20.000000;20.000000;20.000000;,
+ -20.000000;0.000000;20.000000;,
+ 20.000000;20.000000;20.000000;,
+ -20.000000;0.000000;20.000000;,
+ -20.000000;20.000000;-20.000000;;
+ 12;
+ 3;0,3,2;,
+ 3;3,0,1;,
+ 3;4,7,5;,
+ 3;7,4,6;,
+ 3;8,9,10;,
+ 3;9,8,11;,
+ 3;1,7,12;,
+ 3;7,1,13;,
+ 3;14,15,16;,
+ 3;15,14,17;,
+ 3;18,19,0;,
+ 3;19,18,6;;
+
+ MeshNormals {
+ 6;
+ 0.000000;-1.000000;0.000000;,
+ 0.000000;1.000000;0.000000;,
+ 0.000000;0.000000;-1.000000;,
+ 1.000000;0.000000;0.000000;,
+ 0.000000;0.000000;1.000000;,
+ -1.000000;0.000000;0.000000;;
+ 12;
+ 3;0,0,0;,
+ 3;0,0,0;,
+ 3;1,1,1;,
+ 3;1,1,1;,
+ 3;2,2,2;,
+ 3;2,2,2;,
+ 3;3,3,3;,
+ 3;3,3,3;,
+ 3;4,4,4;,
+ 3;4,4,4;,
+ 3;5,5,5;,
+ 3;5,5,5;;
+ }
+
+ MeshMaterialList {
+ 1;
+ 12;
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0;
+
+ Material {
+ 0.890196;0.596078;0.596078;1.000000;;
+ 0.000000;
+ 0.890196;0.596078;0.596078;;
+ 0.000000;0.000000;0.000000;;
+ }
+ }
+
+ MeshTextureCoords {
+ 20;
+ 1.000000;1.000000;,
+ 0.000000;1.000000;,
+ 1.000000;0.000000;,
+ 0.000000;0.000000;,
+ 0.000000;1.000000;,
+ 1.000000;1.000000;,
+ 0.000000;0.000000;,
+ 1.000000;0.000000;,
+ 0.000000;1.000000;,
+ 1.000000;0.000000;,
+ 1.000000;1.000000;,
+ 0.000000;0.000000;,
+ 1.000000;1.000000;,
+ 0.000000;0.000000;,
+ 0.000000;1.000000;,
+ 1.000000;0.000000;,
+ 1.000000;1.000000;,
+ 0.000000;0.000000;,
+ 0.000000;1.000000;,
+ 1.000000;0.000000;;
+ }
+ }
+}
+
+AnimationSet rotate1 {
+
+
+ Animation Anim-Box01 {
+
+ { Box01 }
+
+ AnimationKey {
+ 0;
+ 25;
+ 0;4;-1.000000,0.000000,0.000000,0.000000;;,
+ 160;4;-0.999992,0.000000,-0.003977,0.000000;;,
+ 320;4;-0.999881,0.000000,-0.015453,0.000000;;,
+ 480;4;-0.999431,0.000000,-0.033741,0.000000;;,
+ 640;4;-0.998308,0.000000,-0.058145,0.000000;;,
+ 800;4;-0.996125,0.000000,-0.087948,0.000000;;,
+ 960;4;-0.992480,0.000000,-0.122411,0.000000;;,
+ 1120;4;-0.986993,0.000000,-0.160765,0.000000;;,
+ 1280;4;-0.979341,0.000000,-0.202218,0.000000;;,
+ 1440;4;-0.969281,0.000000,-0.245955,0.000000;;,
+ 1600;4;-0.956676,0.000000,-0.291154,0.000000;;,
+ 1760;4;-0.941506,0.000000,-0.336997,0.000000;;,
+ 1920;4;-0.923880,0.000000,-0.382683,0.000000;;,
+ 2080;4;-0.904038,0.000000,-0.427452,0.000000;;,
+ 2240;4;-0.882349,0.000000,-0.470595,0.000000;;,
+ 2400;4;-0.859302,0.000000,-0.511469,0.000000;;,
+ 2560;4;-0.835488,0.000000,-0.549509,0.000000;;,
+ 2720;4;-0.811587,0.000000,-0.584231,0.000000;;,
+ 2880;4;-0.788346,0.000000,-0.615232,0.000000;;,
+ 3040;4;-0.766555,0.000000,-0.642178,0.000000;;,
+ 3200;4;-0.747025,0.000000,-0.664796,0.000000;;,
+ 3360;4;-0.730563,0.000000,-0.682846,0.000000;;,
+ 3520;4;-0.717949,0.000000,-0.696096,0.000000;;,
+ 3680;4;-0.709913,0.000000,-0.704289,0.000000;;,
+ 3840;4;-0.707107,0.000000,-0.707107,0.000000;;;
+ }
+
+ AnimationKey {
+ 1;
+ 25;
+ 0;3;1.000000,1.000000,1.000000;;,
+ 160;3;1.000000,1.000000,1.000000;;,
+ 320;3;1.000000,1.000000,1.000000;;,
+ 480;3;1.000000,1.000000,1.000000;;,
+ 640;3;1.000000,1.000000,1.000000;;,
+ 800;3;1.000000,1.000000,1.000000;;,
+ 960;3;1.000000,1.000000,1.000000;;,
+ 1120;3;1.000000,1.000000,1.000000;;,
+ 1280;3;1.000000,1.000000,1.000000;;,
+ 1440;3;1.000000,1.000000,1.000000;;,
+ 1600;3;1.000000,1.000000,1.000000;;,
+ 1760;3;1.000000,1.000000,1.000000;;,
+ 1920;3;1.000000,1.000000,1.000000;;,
+ 2080;3;1.000000,1.000000,1.000000;;,
+ 2240;3;1.000000,1.000000,1.000000;;,
+ 2400;3;1.000000,1.000000,1.000000;;,
+ 2560;3;1.000000,1.000000,1.000000;;,
+ 2720;3;1.000000,1.000000,1.000000;;,
+ 2880;3;1.000000,1.000000,1.000000;;,
+ 3040;3;1.000000,1.000000,1.000000;;,
+ 3200;3;1.000000,1.000000,1.000000;;,
+ 3360;3;1.000000,1.000000,1.000000;;,
+ 3520;3;1.000000,1.000000,1.000000;;,
+ 3680;3;1.000000,1.000000,1.000000;;,
+ 3840;3;1.000000,1.000000,1.000000;;;
+ }
+
+ AnimationKey {
+ 2;
+ 25;
+ 0;3;0.000000,0.000000,0.000000;;,
+ 160;3;0.000000,0.000000,0.000000;;,
+ 320;3;0.000000,0.000000,0.000000;;,
+ 480;3;0.000000,0.000000,0.000000;;,
+ 640;3;0.000000,0.000000,0.000000;;,
+ 800;3;0.000000,0.000000,0.000000;;,
+ 960;3;0.000000,0.000000,0.000000;;,
+ 1120;3;0.000000,0.000000,0.000000;;,
+ 1280;3;0.000000,0.000000,0.000000;;,
+ 1440;3;0.000000,0.000000,0.000000;;,
+ 1600;3;0.000000,0.000000,0.000000;;,
+ 1760;3;0.000000,0.000000,0.000000;;,
+ 1920;3;0.000000,0.000000,0.000000;;,
+ 2080;3;0.000000,0.000000,0.000000;;,
+ 2240;3;0.000000,0.000000,0.000000;;,
+ 2400;3;0.000000,0.000000,0.000000;;,
+ 2560;3;0.000000,0.000000,0.000000;;,
+ 2720;3;0.000000,0.000000,0.000000;;,
+ 2880;3;0.000000,0.000000,0.000000;;,
+ 3040;3;0.000000,0.000000,0.000000;;,
+ 3200;3;0.000000,0.000000,0.000000;;,
+ 3360;3;0.000000,0.000000,0.000000;;,
+ 3520;3;0.000000,0.000000,0.000000;;,
+ 3680;3;0.000000,0.000000,0.000000;;,
+ 3840;3;0.000000,0.000000,0.000000;;;
+ }
+ }
+}
+
+AnimationSet rotate2 {
+
+
+ Animation Anim-Box01 {
+
+ { Box01 }
+
+ AnimationKey {
+ 0;
+ 25;
+ 0;4;-1.000000,0.000000,-0.000000,0.000000;;,
+ 160;4;-0.999992,0.000000,-0.000000,-0.003977;;,
+ 320;4;-0.999881,0.000000,-0.000000,-0.015453;;,
+ 480;4;-0.999431,0.000000,-0.000000,-0.033741;;,
+ 640;4;-0.998308,0.000000,-0.000000,-0.058145;;,
+ 800;4;-0.996125,0.000000,-0.000000,-0.087948;;,
+ 960;4;-0.992480,0.000000,-0.000000,-0.122411;;,
+ 1120;4;-0.986993,0.000000,-0.000000,-0.160765;;,
+ 1280;4;-0.979341,0.000000,-0.000000,-0.202218;;,
+ 1440;4;-0.969281,0.000000,-0.000000,-0.245955;;,
+ 1600;4;-0.956676,0.000000,-0.000000,-0.291154;;,
+ 1760;4;-0.941506,0.000000,-0.000000,-0.336997;;,
+ 1920;4;-0.923880,0.000000,-0.000000,-0.382683;;,
+ 2080;4;-0.904038,0.000000,-0.000000,-0.427452;;,
+ 2240;4;-0.882349,0.000000,-0.000000,-0.470595;;,
+ 2400;4;-0.859302,0.000000,-0.000000,-0.511469;;,
+ 2560;4;-0.835488,0.000000,-0.000000,-0.549509;;,
+ 2720;4;-0.811587,0.000000,-0.000000,-0.584231;;,
+ 2880;4;-0.788346,0.000000,-0.000000,-0.615232;;,
+ 3040;4;-0.766555,0.000000,-0.000000,-0.642178;;,
+ 3200;4;-0.747025,0.000000,-0.000000,-0.664796;;,
+ 3360;4;-0.730563,0.000000,-0.000000,-0.682846;;,
+ 3520;4;-0.717949,0.000000,-0.000000,-0.696096;;,
+ 3680;4;-0.709913,0.000000,-0.000000,-0.704289;;,
+ 3840;4;-0.707107,0.000000,-0.000000,-0.707107;;;
+ }
+
+ AnimationKey {
+ 1;
+ 25;
+ 0;3;1.000000,1.000000,1.000000;;,
+ 160;3;1.000000,1.000000,1.000000;;,
+ 320;3;1.000000,1.000000,1.000000;;,
+ 480;3;1.000000,1.000000,1.000000;;,
+ 640;3;1.000000,1.000000,1.000000;;,
+ 800;3;1.000000,1.000000,1.000000;;,
+ 960;3;1.000000,1.000000,1.000000;;,
+ 1120;3;1.000000,1.000000,1.000000;;,
+ 1280;3;1.000000,1.000000,1.000000;;,
+ 1440;3;1.000000,1.000000,1.000000;;,
+ 1600;3;1.000000,1.000000,1.000000;;,
+ 1760;3;1.000000,1.000000,1.000000;;,
+ 1920;3;1.000000,1.000000,1.000000;;,
+ 2080;3;1.000000,1.000000,1.000000;;,
+ 2240;3;1.000000,1.000000,1.000000;;,
+ 2400;3;1.000000,1.000000,1.000000;;,
+ 2560;3;1.000000,1.000000,1.000000;;,
+ 2720;3;1.000000,1.000000,1.000000;;,
+ 2880;3;1.000000,1.000000,1.000000;;,
+ 3040;3;1.000000,1.000000,1.000000;;,
+ 3200;3;1.000000,1.000000,1.000000;;,
+ 3360;3;1.000000,1.000000,1.000000;;,
+ 3520;3;1.000000,1.000000,1.000000;;,
+ 3680;3;1.000000,1.000000,1.000000;;,
+ 3840;3;1.000000,1.000000,1.000000;;;
+ }
+
+ AnimationKey {
+ 2;
+ 25;
+ 0;3;0.000000,0.000000,0.000000;;,
+ 160;3;0.000000,0.000000,0.000000;;,
+ 320;3;0.000000,0.000000,0.000000;;,
+ 480;3;0.000000,0.000000,0.000000;;,
+ 640;3;0.000000,0.000000,0.000000;;,
+ 800;3;0.000000,0.000000,0.000000;;,
+ 960;3;0.000000,0.000000,0.000000;;,
+ 1120;3;0.000000,0.000000,0.000000;;,
+ 1280;3;0.000000,0.000000,0.000000;;,
+ 1440;3;0.000000,0.000000,0.000000;;,
+ 1600;3;0.000000,0.000000,0.000000;;,
+ 1760;3;0.000000,0.000000,0.000000;;,
+ 1920;3;0.000000,0.000000,0.000000;;,
+ 2080;3;0.000000,0.000000,0.000000;;,
+ 2240;3;0.000000,0.000000,0.000000;;,
+ 2400;3;0.000000,0.000000,0.000000;;,
+ 2560;3;0.000000,0.000000,0.000000;;,
+ 2720;3;0.000000,0.000000,0.000000;;,
+ 2880;3;0.000000,0.000000,0.000000;;,
+ 3040;3;0.000000,0.000000,0.000000;;,
+ 3200;3;0.000000,0.000000,0.000000;;,
+ 3360;3;0.000000,0.000000,0.000000;;,
+ 3520;3;0.000000,0.000000,0.000000;;,
+ 3680;3;0.000000,0.000000,0.000000;;,
+ 3840;3;0.000000,0.000000,0.000000;;;
+ }
+ }
+} \ No newline at end of file
diff --git a/examples/qt3d/scene_animations/cube_rotated.dae b/examples/qt3d/scene_animations/cube_rotated.dae
new file mode 100644
index 000000000..ac681b5fb
--- /dev/null
+++ b/examples/qt3d/scene_animations/cube_rotated.dae
@@ -0,0 +1,561 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.0">
+ <asset>
+ <contributor>
+ <author></author>
+ <authoring_tool>FBX COLLADA exporter</authoring_tool>
+ <comments></comments>
+ </contributor>
+ <created>2012-01-09T10:08:02Z</created>
+ <modified>2012-01-09T10:08:02Z</modified>
+ <revision></revision>
+ <title></title>
+ <subject></subject>
+ <keywords></keywords>
+ <unit meter="0.025400"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_images>
+ <image id="Map__2-image" name="Map__2">
+ <init_from>file://stonewal.jpg</init_from>
+ </image>
+ <image id="Map__1-image" name="Map__1">
+ <init_from>file://stonewal.jpg</init_from>
+ </image>
+ </library_images>
+ <library_materials>
+ <material id="_02___Default" name="_02___Default">
+ <instance_effect url="#_02___Default-fx"/>
+ </material>
+ <material id="_01___Default" name="_01___Default">
+ <instance_effect url="#_01___Default-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="_02___Default-fx" name="_02___Default">
+ <profile_COMMON>
+ <technique sid="standard">
+ <phong>
+ <emission>
+ <color sid="emission">0.000000 0.000000 0.000000 1.000000</color>
+ </emission>
+ <ambient>
+ <color sid="ambient">0.588235 0.588235 0.588235 1.000000</color>
+ </ambient>
+ <diffuse>
+ <texture texture="Map__2-image" texcoord="CHANNEL0">
+ <extra>
+ <technique profile="MAYA">
+ <wrapU sid="wrapU0">TRUE</wrapU>
+ <wrapV sid="wrapV0">TRUE</wrapV>
+ <blend_mode>ADD</blend_mode>
+ </technique>
+ </extra>
+ </texture>
+ </diffuse>
+ <specular>
+ <color sid="specular">0.000000 0.000000 0.000000 1.000000</color>
+ </specular>
+ <shininess>
+ <float sid="shininess">2.000000</float>
+ </shininess>
+ <reflective>
+ <color sid="reflective">0.000000 0.000000 0.000000 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float sid="reflectivity">1.000000</float>
+ </reflectivity>
+ <transparent>
+ <color sid="transparent">1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float sid="transparency">0.000000</float>
+ </transparency>
+ </phong>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="_01___Default-fx" name="_01___Default">
+ <profile_COMMON>
+ <technique sid="standard">
+ <phong>
+ <emission>
+ <color sid="emission">0.000000 0.000000 0.000000 1.000000</color>
+ </emission>
+ <ambient>
+ <color sid="ambient">0.588235 0.588235 0.588235 1.000000</color>
+ </ambient>
+ <diffuse>
+ <texture texture="Map__1-image" texcoord="CHANNEL0">
+ <extra>
+ <technique profile="MAYA">
+ <wrapU sid="wrapU0">TRUE</wrapU>
+ <wrapV sid="wrapV0">TRUE</wrapV>
+ <blend_mode>ADD</blend_mode>
+ </technique>
+ </extra>
+ </texture>
+ </diffuse>
+ <specular>
+ <color sid="specular">0.000000 0.000000 0.000000 1.000000</color>
+ </specular>
+ <shininess>
+ <float sid="shininess">2.000000</float>
+ </shininess>
+ <reflective>
+ <color sid="reflective">0.000000 0.000000 0.000000 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float sid="reflectivity">1.000000</float>
+ </reflectivity>
+ <transparent>
+ <color sid="transparent">1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float sid="transparency">0.000000</float>
+ </transparency>
+ </phong>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Box01-lib" name="Box01Mesh">
+ <mesh>
+ <source id="Box01-lib-Position">
+ <float_array id="Box01-lib-Position-array" count="24">
+-50.000000 -50.000000 0.000000
+50.000000 -50.000000 0.000000
+-50.000000 50.000000 0.000000
+50.000000 50.000000 0.000000
+-50.000000 -50.000000 1.000000
+50.000000 -50.000000 1.000000
+-50.000000 50.000000 1.000000
+50.000000 50.000000 1.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box01-lib-Position-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box01-lib-Normal0">
+ <float_array id="Box01-lib-Normal0-array" count="108">
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box01-lib-Normal0-array" count="36" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box01-lib-UV0">
+ <float_array id="Box01-lib-UV0-array" count="24">
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box01-lib-UV0-array" count="12" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Box01-lib-Vertex">
+ <input semantic="POSITION" source="#Box01-lib-Position"/>
+ </vertices>
+ <polygons material="_02___Default" count="12">
+ <input semantic="VERTEX" offset="0" source="#Box01-lib-Vertex"/>
+ <input semantic="NORMAL" offset="1" source="#Box01-lib-Normal0"/>
+ <input semantic="TEXCOORD" offset="2" set="0" source="#Box01-lib-UV0"/>
+ <p>0 0 9 2 1 11 3 2 10</p>
+ <p>3 3 10 1 4 8 0 5 9</p>
+ <p>4 6 8 5 7 9 7 8 11</p>
+ <p>7 9 11 6 10 10 4 11 8</p>
+ <p>0 12 4 1 13 5 5 14 7</p>
+ <p>5 15 7 4 16 6 0 17 4</p>
+ <p>1 18 0 3 19 1 7 20 3</p>
+ <p>7 21 3 5 22 2 1 23 0</p>
+ <p>3 24 4 2 25 5 6 26 7</p>
+ <p>6 27 7 7 28 6 3 29 4</p>
+ <p>2 30 0 0 31 1 4 32 3</p>
+ <p>4 33 3 6 34 2 2 35 0</p>
+ </polygons>
+ </mesh>
+ </geometry>
+ <geometry id="Box02-lib" name="Box02Mesh">
+ <mesh>
+ <source id="Box02-lib-Position">
+ <float_array id="Box02-lib-Position-array" count="24">
+-20.000000 -20.000000 0.000000
+20.000000 -20.000000 0.000000
+-20.000000 20.000000 0.000000
+20.000000 20.000000 0.000000
+-20.000000 -20.000000 20.000000
+20.000000 -20.000000 20.000000
+-20.000000 20.000000 20.000000
+20.000000 20.000000 20.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box02-lib-Position-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-lib-Normal0">
+ <float_array id="Box02-lib-Normal0-array" count="108">
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 -1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+0.000000 -1.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+1.000000 0.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+0.000000 1.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+-1.000000 0.000000 0.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box02-lib-Normal0-array" count="36" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-lib-UV0">
+ <float_array id="Box02-lib-UV0-array" count="24">
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+0.000000 0.000000
+1.000000 0.000000
+0.000000 1.000000
+1.000000 1.000000
+</float_array>
+ <technique_common>
+ <accessor source="#Box02-lib-UV0-array" count="12" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Box02-lib-Vertex">
+ <input semantic="POSITION" source="#Box02-lib-Position"/>
+ </vertices>
+ <polygons material="_01___Default" count="12">
+ <input semantic="VERTEX" offset="0" source="#Box02-lib-Vertex"/>
+ <input semantic="NORMAL" offset="1" source="#Box02-lib-Normal0"/>
+ <input semantic="TEXCOORD" offset="2" set="0" source="#Box02-lib-UV0"/>
+ <p>0 0 9 2 1 11 3 2 10</p>
+ <p>3 3 10 1 4 8 0 5 9</p>
+ <p>4 6 8 5 7 9 7 8 11</p>
+ <p>7 9 11 6 10 10 4 11 8</p>
+ <p>0 12 4 1 13 5 5 14 7</p>
+ <p>5 15 7 4 16 6 0 17 4</p>
+ <p>1 18 0 3 19 1 7 20 3</p>
+ <p>7 21 3 5 22 2 1 23 0</p>
+ <p>3 24 4 2 25 5 6 26 7</p>
+ <p>6 27 7 7 28 6 3 29 4</p>
+ <p>2 30 0 0 31 1 4 32 3</p>
+ <p>4 33 3 6 34 2 2 35 0</p>
+ </polygons>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_animations>
+ <animation id="Box02-anim" name="Box02">
+ <animation>
+ <source id="Box02-rotateX-animation-inputANGLE">
+ <float_array id="Box02-rotateX-animation-inputANGLE-array" count="2">
+
+0.000000 0.800000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateX-animation-inputANGLE-array" count="2">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateX-animation-outputANGLE">
+ <float_array id="Box02-rotateX-animation-outputANGLE-array" count="2">
+
+0.000000 0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateX-animation-outputANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateX-animation-intanANGLE">
+ <float_array id="Box02-rotateX-animation-intanANGLE-array" count="2">
+
+0.000000 -0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateX-animation-intanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateX-animation-outtanANGLE">
+ <float_array id="Box02-rotateX-animation-outtanANGLE-array" count="2">
+
+0.000000 0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateX-animation-outtanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateX-animation-interpolationANGLE">
+ <Name_array id="Box02-rotateX-animation-interpolationANGLE-array" count="2">
+ BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Box02-rotateX-animation-interpolationANGLE-array" count="2">
+ <param type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Box02-rotateX-animationANGLE">
+ <input semantic="INPUT" source="#Box02-rotateX-animation-inputANGLE"/>
+ <input semantic="OUTPUT" source="#Box02-rotateX-animation-outputANGLE"/>
+ <input semantic="IN_TANGENT" source="#Box02-rotateX-animation-intanANGLE"/>
+ <input semantic="OUT_TANGENT" source="#Box02-rotateX-animation-outtanANGLE"/>
+ <input semantic="INTERPOLATION" source="#Box02-rotateX-animation-interpolationANGLE"/>
+ </sampler>
+ <channel source="#Box02-rotateX-animationANGLE" target="Box02/rotateX.ANGLE"/>
+ </animation>
+ <animation>
+ <source id="Box02-rotateY-animation-inputANGLE">
+ <float_array id="Box02-rotateY-animation-inputANGLE-array" count="2">
+
+0.000000 0.800000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateY-animation-inputANGLE-array" count="2">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateY-animation-outputANGLE">
+ <float_array id="Box02-rotateY-animation-outputANGLE-array" count="2">
+
+-0.000000 -0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateY-animation-outputANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateY-animation-intanANGLE">
+ <float_array id="Box02-rotateY-animation-intanANGLE-array" count="2">
+
+0.000000 -0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateY-animation-intanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateY-animation-outtanANGLE">
+ <float_array id="Box02-rotateY-animation-outtanANGLE-array" count="2">
+
+0.000000 0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateY-animation-outtanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateY-animation-interpolationANGLE">
+ <Name_array id="Box02-rotateY-animation-interpolationANGLE-array" count="2">
+ BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Box02-rotateY-animation-interpolationANGLE-array" count="2">
+ <param type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Box02-rotateY-animationANGLE">
+ <input semantic="INPUT" source="#Box02-rotateY-animation-inputANGLE"/>
+ <input semantic="OUTPUT" source="#Box02-rotateY-animation-outputANGLE"/>
+ <input semantic="IN_TANGENT" source="#Box02-rotateY-animation-intanANGLE"/>
+ <input semantic="OUT_TANGENT" source="#Box02-rotateY-animation-outtanANGLE"/>
+ <input semantic="INTERPOLATION" source="#Box02-rotateY-animation-interpolationANGLE"/>
+ </sampler>
+ <channel source="#Box02-rotateY-animationANGLE" target="Box02/rotateY.ANGLE"/>
+ </animation>
+ <animation>
+ <source id="Box02-rotateZ-animation-inputANGLE">
+ <float_array id="Box02-rotateZ-animation-inputANGLE-array" count="2">
+
+0.000000 0.800000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateZ-animation-inputANGLE-array" count="2">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateZ-animation-outputANGLE">
+ <float_array id="Box02-rotateZ-animation-outputANGLE-array" count="2">
+
+0.000000 90.000008</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateZ-animation-outputANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateZ-animation-intanANGLE">
+ <float_array id="Box02-rotateZ-animation-intanANGLE-array" count="2">
+
+0.000000 -0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateZ-animation-intanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateZ-animation-outtanANGLE">
+ <float_array id="Box02-rotateZ-animation-outtanANGLE-array" count="2">
+
+0.000000 0.000000</float_array>
+ <technique_common>
+ <accessor source="#Box02-rotateZ-animation-outtanANGLE-array" count="2">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Box02-rotateZ-animation-interpolationANGLE">
+ <Name_array id="Box02-rotateZ-animation-interpolationANGLE-array" count="2">
+ BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Box02-rotateZ-animation-interpolationANGLE-array" count="2">
+ <param type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Box02-rotateZ-animationANGLE">
+ <input semantic="INPUT" source="#Box02-rotateZ-animation-inputANGLE"/>
+ <input semantic="OUTPUT" source="#Box02-rotateZ-animation-outputANGLE"/>
+ <input semantic="IN_TANGENT" source="#Box02-rotateZ-animation-intanANGLE"/>
+ <input semantic="OUT_TANGENT" source="#Box02-rotateZ-animation-outtanANGLE"/>
+ <input semantic="INTERPOLATION" source="#Box02-rotateZ-animation-interpolationANGLE"/>
+ </sampler>
+ <channel source="#Box02-rotateZ-animationANGLE" target="Box02/rotateZ.ANGLE"/>
+ </animation>
+ </animation>
+ </library_animations>
+ <library_visual_scenes>
+ <visual_scene id="RootNode" name="RootNode">
+ <node id="Box01" name="Box01">
+ <rotate sid="jointOrientX">1 0 0 -90.000000</rotate>
+ <instance_geometry url="#Box01-lib">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="_02___Default" target="#_02___Default"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <node id="Box02" name="Box02">
+ <translate sid="translate">0.000000 5.000000 -0.000000</translate>
+ <rotate sid="jointOrientX">1 0 0 -90.000000</rotate>
+ <rotate sid="rotateZ">0 0 1 0.000000</rotate>
+ <rotate sid="rotateY">0 1 0 0.000000</rotate>
+ <rotate sid="rotateX">1 0 0 0.000000</rotate>
+ <instance_geometry url="#Box02-lib">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="_01___Default" target="#_01___Default"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#RootNode"/>
+ </scene>
+</COLLADA>
+
diff --git a/examples/qt3d/scene_animations/qt3d.ico b/examples/qt3d/scene_animations/qt3d.ico
new file mode 100644
index 000000000..1d07c43dd
--- /dev/null
+++ b/examples/qt3d/scene_animations/qt3d.ico
Binary files differ
diff --git a/examples/qt3d/scene_animations/rotate.dae b/examples/qt3d/scene_animations/rotate.dae
new file mode 100644
index 000000000..23531c092
--- /dev/null
+++ b/examples/qt3d/scene_animations/rotate.dae
@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>Blender User</author>
+ <authoring_tool>Blender 2.62.0 r44136</authoring_tool>
+ </contributor>
+ <created>2012-04-13T13:11:43</created>
+ <modified>2012-04-13T13:11:43</modified>
+ <unit name="meter" meter="1"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_cameras>
+ <camera id="Camera-camera" name="Camera">
+ <optics>
+ <technique_common>
+ <perspective>
+ <xfov sid="xfov">49.13434</xfov>
+ <aspect_ratio>1.777778</aspect_ratio>
+ <znear sid="znear">0.1</znear>
+ <zfar sid="zfar">100</zfar>
+ </perspective>
+ </technique_common>
+ </optics>
+ </camera>
+ </library_cameras>
+ <library_lights>
+ <light id="Lamp-light" name="Lamp">
+ <technique_common>
+ <point>
+ <color sid="color">1 1 1</color>
+ <constant_attenuation>1</constant_attenuation>
+ <linear_attenuation>0</linear_attenuation>
+ <quadratic_attenuation>0.00111109</quadratic_attenuation>
+ </point>
+ </technique_common>
+ <extra>
+ <technique profile="blender">
+ <adapt_thresh>0.000999987</adapt_thresh>
+ <area_shape>0</area_shape>
+ <area_size>1</area_size>
+ <area_sizey>1</area_sizey>
+ <area_sizez>1</area_sizez>
+ <atm_distance_factor>1</atm_distance_factor>
+ <atm_extinction_factor>1</atm_extinction_factor>
+ <atm_turbidity>2</atm_turbidity>
+ <att1>0</att1>
+ <att2>1</att2>
+ <backscattered_light>1</backscattered_light>
+ <bias>1</bias>
+ <blue>1</blue>
+ <buffers>1</buffers>
+ <bufflag>0</bufflag>
+ <bufsize>2880</bufsize>
+ <buftype>2</buftype>
+ <clipend>30.002</clipend>
+ <clipsta>1.000799</clipsta>
+ <compressthresh>0.04999995</compressthresh>
+ <dist sid="blender_dist">29.99998</dist>
+ <energy sid="blender_energy">1</energy>
+ <falloff_type>2</falloff_type>
+ <filtertype>0</filtertype>
+ <flag>0</flag>
+ <gamma sid="blender_gamma">1</gamma>
+ <green>1</green>
+ <halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
+ <horizon_brightness>1</horizon_brightness>
+ <mode>8192</mode>
+ <ray_samp>1</ray_samp>
+ <ray_samp_method>1</ray_samp_method>
+ <ray_samp_type>0</ray_samp_type>
+ <ray_sampy>1</ray_sampy>
+ <ray_sampz>1</ray_sampz>
+ <red>1</red>
+ <samp>3</samp>
+ <shadhalostep>0</shadhalostep>
+ <shadow_b sid="blender_shadow_b">0</shadow_b>
+ <shadow_g sid="blender_shadow_g">0</shadow_g>
+ <shadow_r sid="blender_shadow_r">0</shadow_r>
+ <shadspotsize>45</shadspotsize>
+ <sky_colorspace>0</sky_colorspace>
+ <sky_exposure>1</sky_exposure>
+ <skyblendfac>1</skyblendfac>
+ <skyblendtype>1</skyblendtype>
+ <soft>3</soft>
+ <spotblend>0.15</spotblend>
+ <spotsize>75</spotsize>
+ <spread>1</spread>
+ <sun_brightness>1</sun_brightness>
+ <sun_effect_type>0</sun_effect_type>
+ <sun_intensity>1</sun_intensity>
+ <sun_size>1</sun_size>
+ <type>0</type>
+ </technique>
+ </extra>
+ </light>
+ </library_lights>
+ <library_geometries>
+ <geometry id="Cube_002-mesh" name="Cube.002">
+ <mesh>
+ <source id="Cube_002-mesh-positions">
+ <float_array id="Cube_002-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-normals">
+ <float_array id="Cube_002-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-map-0">
+ <float_array id="Cube_002-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_002-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_002-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_002-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ <geometry id="Cube_001-mesh" name="Cube.001">
+ <mesh>
+ <source id="Cube_001-mesh-positions">
+ <float_array id="Cube_001-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-normals">
+ <float_array id="Cube_001-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-map-0">
+ <float_array id="Cube_001-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_001-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_001-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ </library_geometries>
+ <library_animations>
+ <animation id="Cube_location_X">
+ <source id="Cube_location_X-input">
+ <float_array id="Cube_location_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-output">
+ <float_array id="Cube_location_X-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-output-array" count="2" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-interpolation">
+ <Name_array id="Cube_location_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-intangent">
+ <float_array id="Cube_location_X-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-outtangent">
+ <float_array id="Cube_location_X-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_X-sampler">
+ <input semantic="INPUT" source="#Cube_location_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_X-sampler" target="Cube/location.X"/>
+ </animation>
+ <animation id="Cube_location_Y">
+ <source id="Cube_location_Y-input">
+ <float_array id="Cube_location_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-output">
+ <float_array id="Cube_location_Y-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-output-array" count="2" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-interpolation">
+ <Name_array id="Cube_location_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-intangent">
+ <float_array id="Cube_location_Y-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-outtangent">
+ <float_array id="Cube_location_Y-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Y-sampler">
+ <input semantic="INPUT" source="#Cube_location_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Y-sampler" target="Cube/location.Y"/>
+ </animation>
+ <animation id="Cube_location_Z">
+ <source id="Cube_location_Z-input">
+ <float_array id="Cube_location_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-output">
+ <float_array id="Cube_location_Z-output-array" count="2">2.5 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-output-array" count="2" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-interpolation">
+ <Name_array id="Cube_location_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-intangent">
+ <float_array id="Cube_location_Z-intangent-array" count="4">-0.7228892 2.5 1.235444 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-outtangent">
+ <float_array id="Cube_location_Z-outtangent-array" count="4">0.8062225 2.5 2.764556 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Z-sampler">
+ <input semantic="INPUT" source="#Cube_location_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Z-sampler" target="Cube/location.Z"/>
+ </animation>
+ <animation id="Cube_rotation_euler_X">
+ <source id="Cube_rotation_euler_X-input">
+ <float_array id="Cube_rotation_euler_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-output">
+ <float_array id="Cube_rotation_euler_X-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-interpolation">
+ <Name_array id="Cube_rotation_euler_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-intangent">
+ <float_array id="Cube_rotation_euler_X-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-outtangent">
+ <float_array id="Cube_rotation_euler_X-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_X-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_X-sampler" target="Cube/rotationX.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Y">
+ <source id="Cube_rotation_euler_Y-input">
+ <float_array id="Cube_rotation_euler_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-output">
+ <float_array id="Cube_rotation_euler_Y-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-interpolation">
+ <Name_array id="Cube_rotation_euler_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-intangent">
+ <float_array id="Cube_rotation_euler_Y-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-outtangent">
+ <float_array id="Cube_rotation_euler_Y-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Y-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Y-sampler" target="Cube/rotationY.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Z">
+ <source id="Cube_rotation_euler_Z-input">
+ <float_array id="Cube_rotation_euler_Z-input-array" count="3">0.04166662 2 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-input-array" count="3" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-output">
+ <float_array id="Cube_rotation_euler_Z-output-array" count="3">0 179.0001 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-output-array" count="3" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-interpolation">
+ <Name_array id="Cube_rotation_euler_Z-interpolation-array" count="3">BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-interpolation-array" count="3" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-intangent">
+ <float_array id="Cube_rotation_euler_Z-intangent-array" count="6">-0.7212057 0 1.235444 179.0001 3.220825 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-intangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-outtangent">
+ <float_array id="Cube_rotation_euler_Z-outtangent-array" count="6">0.804539 0 2.780823 179.0001 4.779174 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-outtangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Z-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Z-sampler" target="Cube/rotationZ.ANGLE"/>
+ </animation>
+ <animation id="Cube_scale_X">
+ <source id="Cube_scale_X-input">
+ <float_array id="Cube_scale_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-output">
+ <float_array id="Cube_scale_X-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-output-array" count="2" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-interpolation">
+ <Name_array id="Cube_scale_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-intangent">
+ <float_array id="Cube_scale_X-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-outtangent">
+ <float_array id="Cube_scale_X-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_X-sampler">
+ <input semantic="INPUT" source="#Cube_scale_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_X-sampler" target="Cube/scale.X"/>
+ </animation>
+ <animation id="Cube_scale_Y">
+ <source id="Cube_scale_Y-input">
+ <float_array id="Cube_scale_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-output">
+ <float_array id="Cube_scale_Y-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-output-array" count="2" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-interpolation">
+ <Name_array id="Cube_scale_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-intangent">
+ <float_array id="Cube_scale_Y-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-outtangent">
+ <float_array id="Cube_scale_Y-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Y-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Y-sampler" target="Cube/scale.Y"/>
+ </animation>
+ <animation id="Cube_scale_Z">
+ <source id="Cube_scale_Z-input">
+ <float_array id="Cube_scale_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-output">
+ <float_array id="Cube_scale_Z-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-output-array" count="2" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-interpolation">
+ <Name_array id="Cube_scale_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-intangent">
+ <float_array id="Cube_scale_Z-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-outtangent">
+ <float_array id="Cube_scale_Z-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Z-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Z-sampler" target="Cube/scale.Z"/>
+ </animation>
+ </library_animations>
+ <library_visual_scenes>
+ <visual_scene id="Scene" name="Scene">
+ <node id="Cube_001" type="NODE">
+ <translate sid="location">0 0 0</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">5 5 0.05</scale>
+ <instance_geometry url="#Cube_002-mesh"/>
+ </node>
+ <node id="Cube" type="NODE">
+ <translate sid="location">0 0 2.5</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_geometry url="#Cube_001-mesh"/>
+ </node>
+ <node id="Lamp" type="NODE">
+ <translate sid="location">4.076245 1.005454 5.903862</translate>
+ <rotate sid="rotationZ">0 0 1 106.9363</rotate>
+ <rotate sid="rotationY">0 1 0 3.163708</rotate>
+ <rotate sid="rotationX">1 0 0 37.26105</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_light url="#Lamp-light"/>
+ </node>
+ <node id="Camera" type="NODE">
+ <translate sid="location">7.481132 -6.50764 5.343665</translate>
+ <rotate sid="rotationZ">0 0 1 46.69195</rotate>
+ <rotate sid="rotationY">0 1 0 0.619768</rotate>
+ <rotate sid="rotationX">1 0 0 63.5593</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_camera url="#Camera-camera"/>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Scene"/>
+ </scene>
+</COLLADA> \ No newline at end of file
diff --git a/examples/qt3d/scene_animations/scale.dae b/examples/qt3d/scene_animations/scale.dae
new file mode 100644
index 000000000..d7e3b647e
--- /dev/null
+++ b/examples/qt3d/scene_animations/scale.dae
@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>Blender User</author>
+ <authoring_tool>Blender 2.62.0 r44136</authoring_tool>
+ </contributor>
+ <created>2012-04-13T11:49:19</created>
+ <modified>2012-04-13T11:49:19</modified>
+ <unit name="meter" meter="1"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_cameras>
+ <camera id="Camera-camera" name="Camera">
+ <optics>
+ <technique_common>
+ <perspective>
+ <xfov sid="xfov">49.13434</xfov>
+ <aspect_ratio>1.777778</aspect_ratio>
+ <znear sid="znear">0.1</znear>
+ <zfar sid="zfar">100</zfar>
+ </perspective>
+ </technique_common>
+ </optics>
+ </camera>
+ </library_cameras>
+ <library_lights>
+ <light id="Lamp-light" name="Lamp">
+ <technique_common>
+ <point>
+ <color sid="color">1 1 1</color>
+ <constant_attenuation>1</constant_attenuation>
+ <linear_attenuation>0</linear_attenuation>
+ <quadratic_attenuation>0.00111109</quadratic_attenuation>
+ </point>
+ </technique_common>
+ <extra>
+ <technique profile="blender">
+ <adapt_thresh>0.000999987</adapt_thresh>
+ <area_shape>0</area_shape>
+ <area_size>1</area_size>
+ <area_sizey>1</area_sizey>
+ <area_sizez>1</area_sizez>
+ <atm_distance_factor>1</atm_distance_factor>
+ <atm_extinction_factor>1</atm_extinction_factor>
+ <atm_turbidity>2</atm_turbidity>
+ <att1>0</att1>
+ <att2>1</att2>
+ <backscattered_light>1</backscattered_light>
+ <bias>1</bias>
+ <blue>1</blue>
+ <buffers>1</buffers>
+ <bufflag>0</bufflag>
+ <bufsize>2880</bufsize>
+ <buftype>2</buftype>
+ <clipend>30.002</clipend>
+ <clipsta>1.000799</clipsta>
+ <compressthresh>0.04999995</compressthresh>
+ <dist sid="blender_dist">29.99998</dist>
+ <energy sid="blender_energy">1</energy>
+ <falloff_type>2</falloff_type>
+ <filtertype>0</filtertype>
+ <flag>0</flag>
+ <gamma sid="blender_gamma">1</gamma>
+ <green>1</green>
+ <halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
+ <horizon_brightness>1</horizon_brightness>
+ <mode>8192</mode>
+ <ray_samp>1</ray_samp>
+ <ray_samp_method>1</ray_samp_method>
+ <ray_samp_type>0</ray_samp_type>
+ <ray_sampy>1</ray_sampy>
+ <ray_sampz>1</ray_sampz>
+ <red>1</red>
+ <samp>3</samp>
+ <shadhalostep>0</shadhalostep>
+ <shadow_b sid="blender_shadow_b">0</shadow_b>
+ <shadow_g sid="blender_shadow_g">0</shadow_g>
+ <shadow_r sid="blender_shadow_r">0</shadow_r>
+ <shadspotsize>45</shadspotsize>
+ <sky_colorspace>0</sky_colorspace>
+ <sky_exposure>1</sky_exposure>
+ <skyblendfac>1</skyblendfac>
+ <skyblendtype>1</skyblendtype>
+ <soft>3</soft>
+ <spotblend>0.15</spotblend>
+ <spotsize>75</spotsize>
+ <spread>1</spread>
+ <sun_brightness>1</sun_brightness>
+ <sun_effect_type>0</sun_effect_type>
+ <sun_intensity>1</sun_intensity>
+ <sun_size>1</sun_size>
+ <type>0</type>
+ </technique>
+ </extra>
+ </light>
+ </library_lights>
+ <library_geometries>
+ <geometry id="Cube_002-mesh" name="Cube.002">
+ <mesh>
+ <source id="Cube_002-mesh-positions">
+ <float_array id="Cube_002-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-normals">
+ <float_array id="Cube_002-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-map-0">
+ <float_array id="Cube_002-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_002-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_002-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_002-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ <geometry id="Cube_001-mesh" name="Cube.001">
+ <mesh>
+ <source id="Cube_001-mesh-positions">
+ <float_array id="Cube_001-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-normals">
+ <float_array id="Cube_001-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-map-0">
+ <float_array id="Cube_001-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_001-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_001-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ </library_geometries>
+ <library_animations>
+ <animation id="Cube_location_X">
+ <source id="Cube_location_X-input">
+ <float_array id="Cube_location_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-output">
+ <float_array id="Cube_location_X-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-output-array" count="2" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-interpolation">
+ <Name_array id="Cube_location_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-intangent">
+ <float_array id="Cube_location_X-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-outtangent">
+ <float_array id="Cube_location_X-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_X-sampler">
+ <input semantic="INPUT" source="#Cube_location_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_X-sampler" target="Cube/location.X"/>
+ </animation>
+ <animation id="Cube_location_Y">
+ <source id="Cube_location_Y-input">
+ <float_array id="Cube_location_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-output">
+ <float_array id="Cube_location_Y-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-output-array" count="2" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-interpolation">
+ <Name_array id="Cube_location_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-intangent">
+ <float_array id="Cube_location_Y-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-outtangent">
+ <float_array id="Cube_location_Y-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Y-sampler">
+ <input semantic="INPUT" source="#Cube_location_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Y-sampler" target="Cube/location.Y"/>
+ </animation>
+ <animation id="Cube_location_Z">
+ <source id="Cube_location_Z-input">
+ <float_array id="Cube_location_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-output">
+ <float_array id="Cube_location_Z-output-array" count="2">2.5 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-output-array" count="2" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-interpolation">
+ <Name_array id="Cube_location_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-intangent">
+ <float_array id="Cube_location_Z-intangent-array" count="4">-0.7228892 2.5 1.235444 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-outtangent">
+ <float_array id="Cube_location_Z-outtangent-array" count="4">0.8062225 2.5 2.764556 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Z-sampler">
+ <input semantic="INPUT" source="#Cube_location_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Z-sampler" target="Cube/location.Z"/>
+ </animation>
+ <animation id="Cube_rotation_euler_X">
+ <source id="Cube_rotation_euler_X-input">
+ <float_array id="Cube_rotation_euler_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-output">
+ <float_array id="Cube_rotation_euler_X-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-interpolation">
+ <Name_array id="Cube_rotation_euler_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-intangent">
+ <float_array id="Cube_rotation_euler_X-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-outtangent">
+ <float_array id="Cube_rotation_euler_X-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_X-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_X-sampler" target="Cube/rotationX.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Y">
+ <source id="Cube_rotation_euler_Y-input">
+ <float_array id="Cube_rotation_euler_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-output">
+ <float_array id="Cube_rotation_euler_Y-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-interpolation">
+ <Name_array id="Cube_rotation_euler_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-intangent">
+ <float_array id="Cube_rotation_euler_Y-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-outtangent">
+ <float_array id="Cube_rotation_euler_Y-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Y-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Y-sampler" target="Cube/rotationY.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Z">
+ <source id="Cube_rotation_euler_Z-input">
+ <float_array id="Cube_rotation_euler_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-output">
+ <float_array id="Cube_rotation_euler_Z-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-interpolation">
+ <Name_array id="Cube_rotation_euler_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-intangent">
+ <float_array id="Cube_rotation_euler_Z-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-outtangent">
+ <float_array id="Cube_rotation_euler_Z-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Z-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Z-sampler" target="Cube/rotationZ.ANGLE"/>
+ </animation>
+ <animation id="Cube_scale_X">
+ <source id="Cube_scale_X-input">
+ <float_array id="Cube_scale_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-output">
+ <float_array id="Cube_scale_X-output-array" count="2">1 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-output-array" count="2" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-interpolation">
+ <Name_array id="Cube_scale_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-intangent">
+ <float_array id="Cube_scale_X-intangent-array" count="4">-0.7227162 1 1.235617 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-outtangent">
+ <float_array id="Cube_scale_X-outtangent-array" count="4">0.8060495 1 2.764383 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_X-sampler">
+ <input semantic="INPUT" source="#Cube_scale_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_X-sampler" target="Cube/scale.X"/>
+ </animation>
+ <animation id="Cube_scale_Y">
+ <source id="Cube_scale_Y-input">
+ <float_array id="Cube_scale_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-output">
+ <float_array id="Cube_scale_Y-output-array" count="2">1 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-output-array" count="2" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-interpolation">
+ <Name_array id="Cube_scale_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-intangent">
+ <float_array id="Cube_scale_Y-intangent-array" count="4">-0.7227162 1 1.235617 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-outtangent">
+ <float_array id="Cube_scale_Y-outtangent-array" count="4">0.8060495 1 2.764383 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Y-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Y-sampler" target="Cube/scale.Y"/>
+ </animation>
+ <animation id="Cube_scale_Z">
+ <source id="Cube_scale_Z-input">
+ <float_array id="Cube_scale_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-output">
+ <float_array id="Cube_scale_Z-output-array" count="2">1 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-output-array" count="2" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-interpolation">
+ <Name_array id="Cube_scale_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-intangent">
+ <float_array id="Cube_scale_Z-intangent-array" count="4">-0.7227162 1 1.235617 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-outtangent">
+ <float_array id="Cube_scale_Z-outtangent-array" count="4">0.8060495 1 2.764383 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Z-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Z-sampler" target="Cube/scale.Z"/>
+ </animation>
+ </library_animations>
+ <library_visual_scenes>
+ <visual_scene id="Scene" name="Scene">
+ <node id="Cube_001" type="NODE">
+ <translate sid="location">0 0 0</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">5 5 0.05</scale>
+ <instance_geometry url="#Cube_002-mesh"/>
+ </node>
+ <node id="Cube" type="NODE">
+ <translate sid="location">0 0 2.5</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_geometry url="#Cube_001-mesh"/>
+ </node>
+ <node id="Lamp" type="NODE">
+ <translate sid="location">4.076245 1.005454 5.903862</translate>
+ <rotate sid="rotationZ">0 0 1 106.9363</rotate>
+ <rotate sid="rotationY">0 1 0 3.163708</rotate>
+ <rotate sid="rotationX">1 0 0 37.26105</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_light url="#Lamp-light"/>
+ </node>
+ <node id="Camera" type="NODE">
+ <translate sid="location">7.481132 -6.50764 5.343665</translate>
+ <rotate sid="rotationZ">0 0 1 46.69195</rotate>
+ <rotate sid="rotationY">0 1 0 0.619768</rotate>
+ <rotate sid="rotationX">1 0 0 63.5593</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_camera url="#Camera-camera"/>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Scene"/>
+ </scene>
+</COLLADA> \ No newline at end of file
diff --git a/examples/qt3d/scene_animations/scale_rotate_translate.dae b/examples/qt3d/scene_animations/scale_rotate_translate.dae
new file mode 100644
index 000000000..042ed018b
--- /dev/null
+++ b/examples/qt3d/scene_animations/scale_rotate_translate.dae
@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>Blender User</author>
+ <authoring_tool>Blender 2.62.0 r44136</authoring_tool>
+ </contributor>
+ <created>2012-04-13T14:32:17</created>
+ <modified>2012-04-13T14:32:17</modified>
+ <unit name="meter" meter="1"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_cameras>
+ <camera id="Camera-camera" name="Camera">
+ <optics>
+ <technique_common>
+ <perspective>
+ <xfov sid="xfov">49.13434</xfov>
+ <aspect_ratio>1.777778</aspect_ratio>
+ <znear sid="znear">0.1</znear>
+ <zfar sid="zfar">100</zfar>
+ </perspective>
+ </technique_common>
+ </optics>
+ </camera>
+ </library_cameras>
+ <library_lights>
+ <light id="Lamp-light" name="Lamp">
+ <technique_common>
+ <point>
+ <color sid="color">1 1 1</color>
+ <constant_attenuation>1</constant_attenuation>
+ <linear_attenuation>0</linear_attenuation>
+ <quadratic_attenuation>0.00111109</quadratic_attenuation>
+ </point>
+ </technique_common>
+ <extra>
+ <technique profile="blender">
+ <adapt_thresh>0.000999987</adapt_thresh>
+ <area_shape>0</area_shape>
+ <area_size>1</area_size>
+ <area_sizey>1</area_sizey>
+ <area_sizez>1</area_sizez>
+ <atm_distance_factor>1</atm_distance_factor>
+ <atm_extinction_factor>1</atm_extinction_factor>
+ <atm_turbidity>2</atm_turbidity>
+ <att1>0</att1>
+ <att2>1</att2>
+ <backscattered_light>1</backscattered_light>
+ <bias>1</bias>
+ <blue>1</blue>
+ <buffers>1</buffers>
+ <bufflag>0</bufflag>
+ <bufsize>2880</bufsize>
+ <buftype>2</buftype>
+ <clipend>30.002</clipend>
+ <clipsta>1.000799</clipsta>
+ <compressthresh>0.04999995</compressthresh>
+ <dist sid="blender_dist">29.99998</dist>
+ <energy sid="blender_energy">1</energy>
+ <falloff_type>2</falloff_type>
+ <filtertype>0</filtertype>
+ <flag>0</flag>
+ <gamma sid="blender_gamma">1</gamma>
+ <green>1</green>
+ <halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
+ <horizon_brightness>1</horizon_brightness>
+ <mode>8192</mode>
+ <ray_samp>1</ray_samp>
+ <ray_samp_method>1</ray_samp_method>
+ <ray_samp_type>0</ray_samp_type>
+ <ray_sampy>1</ray_sampy>
+ <ray_sampz>1</ray_sampz>
+ <red>1</red>
+ <samp>3</samp>
+ <shadhalostep>0</shadhalostep>
+ <shadow_b sid="blender_shadow_b">0</shadow_b>
+ <shadow_g sid="blender_shadow_g">0</shadow_g>
+ <shadow_r sid="blender_shadow_r">0</shadow_r>
+ <shadspotsize>45</shadspotsize>
+ <sky_colorspace>0</sky_colorspace>
+ <sky_exposure>1</sky_exposure>
+ <skyblendfac>1</skyblendfac>
+ <skyblendtype>1</skyblendtype>
+ <soft>3</soft>
+ <spotblend>0.15</spotblend>
+ <spotsize>75</spotsize>
+ <spread>1</spread>
+ <sun_brightness>1</sun_brightness>
+ <sun_effect_type>0</sun_effect_type>
+ <sun_intensity>1</sun_intensity>
+ <sun_size>1</sun_size>
+ <type>0</type>
+ </technique>
+ </extra>
+ </light>
+ </library_lights>
+ <library_geometries>
+ <geometry id="Cube_002-mesh" name="Cube.002">
+ <mesh>
+ <source id="Cube_002-mesh-positions">
+ <float_array id="Cube_002-mesh-positions-array" count="24">1.000601 1 -1 1.000601 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1.000601 0.9999995 1 1.0006 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-normals">
+ <float_array id="Cube_002-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.6814e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38347e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-map-0">
+ <float_array id="Cube_002-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_002-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_002-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_002-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ <geometry id="Cube_001-mesh" name="Cube.001">
+ <mesh>
+ <source id="Cube_001-mesh-positions">
+ <float_array id="Cube_001-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-normals">
+ <float_array id="Cube_001-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-map-0">
+ <float_array id="Cube_001-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_001-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_001-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ </library_geometries>
+ <library_animations>
+ <animation id="Cube_location_X">
+ <source id="Cube_location_X-input">
+ <float_array id="Cube_location_X-input-array" count="19">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-input-array" count="19" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-output">
+ <float_array id="Cube_location_X-output-array" count="19">0 2 0 -0.3248718 -0.6679949 -0.9943791 -1.293132 -1.569738 -1.789759 -1.942461 -2 -1.89669 -1.647319 -1.336814 -1.001622 -0.6429761 -0.3335189 -0.09716588 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-output-array" count="19" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-interpolation">
+ <Name_array id="Cube_location_X-interpolation-array" count="19">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-interpolation-array" count="19" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-intangent">
+ <float_array id="Cube_location_X-intangent-array" count="38">-0.3310711 0 0.6258562 2 1.757105 0.5585337 2.076498 -0.1952761 2.2015 -0.5381093 2.326461 -0.8730057 2.451421 -1.181331 2.576365 -1.473124 2.701292 -1.717142 2.826228 -1.901446 2.9512 -2 3.076282 -1.965417 3.20141 -1.756138 3.326479 -1.462134 3.451522 -1.136166 3.576498 -0.7725926 3.701399 -0.4396261 3.826274 -0.1621703 3.951224 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-intangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-outtangent">
+ <float_array id="Cube_location_X-outtangent-array" count="38">0.4144045 0 1.390411 2 2.048579 -0.1117067 2.173502 -0.4544676 2.2985 -0.7978804 2.423539 -1.115752 2.548578 -1.404932 2.673635 -1.666352 2.798708 -1.862377 2.923772 -1.983476 3.0488 -2 3.173717 -1.827964 3.29859 -1.538501 3.423521 -1.211493 3.548478 -0.8670771 3.673502 -0.5133597 3.798601 -0.2274117 3.923726 -0.03216141 4.048776 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-outtangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_X-sampler">
+ <input semantic="INPUT" source="#Cube_location_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_X-sampler" target="Cube/location.X"/>
+ </animation>
+ <animation id="Cube_location_Y">
+ <source id="Cube_location_Y-input">
+ <float_array id="Cube_location_Y-input-array" count="19">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-input-array" count="19" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-output">
+ <float_array id="Cube_location_Y-output-array" count="19">2 0 -2 -1.948142 -1.79288 -1.56575 -1.293132 -0.9912196 -0.6709893 -0.3410397 0 0.3630216 0.7166984 1.042826 1.334604 1.598892 1.806223 1.947618 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-output-array" count="19" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-interpolation">
+ <Name_array id="Cube_location_Y-interpolation-array" count="19">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-interpolation-array" count="19" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-intangent">
+ <float_array id="Cube_location_Y-intangent-array" count="38">-0.3310711 2 0.6272045 0.7617995 1.756126 -2 2.076228 -1.988549 2.201297 -1.867374 2.326367 -1.662967 2.451421 -1.404773 2.576459 -1.112018 2.701483 -0.7971695 2.826501 -0.4712092 2.951531 -0.1365002 3.076543 0.2241055 3.201509 0.5848402 3.326455 0.9228423 3.451407 1.22652 3.576349 1.507113 3.701281 1.738264 3.826224 1.909811 3.951206 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-intangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-outtangent">
+ <float_array id="Cube_location_Y-outtangent-array" count="38">0.4144045 2 1.389004 -0.7949212 2.048775 -2 2.173772 -1.907735 2.298702 -1.718386 2.423633 -1.468533 2.548579 -1.181491 2.673541 -0.8704215 2.798517 -0.5448092 2.923499 -0.2108702 3.048469 0.1365002 3.173457 0.5019378 3.298491 0.8485565 3.423545 1.162811 3.548593 1.442688 3.673651 1.690672 3.798719 1.874181 3.923776 1.985424 4.048794 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-outtangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Y-sampler">
+ <input semantic="INPUT" source="#Cube_location_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Y-sampler" target="Cube/location.Y"/>
+ </animation>
+ <animation id="Cube_location_Z">
+ <source id="Cube_location_Z-input">
+ <float_array id="Cube_location_Z-input-array" count="19">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-input-array" count="19" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-output">
+ <float_array id="Cube_location_Z-output-array" count="19">1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-output-array" count="19" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-interpolation">
+ <Name_array id="Cube_location_Z-interpolation-array" count="19">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-interpolation-array" count="19" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-intangent">
+ <float_array id="Cube_location_Z-intangent-array" count="38">-0.3324777 1 0.6258556 1 1.755993 1 2.076199 1 2.201199 1 2.326199 1 2.451199 1 2.576199 1 2.701199 1 2.826199 1 2.951199 1 3.076199 1 3.201199 1 3.326199 1 3.451199 1 3.576199 1 3.701199 1 3.826199 1 3.951199 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-intangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-outtangent">
+ <float_array id="Cube_location_Z-outtangent-array" count="38">0.415811 1 1.390411 1 2.048801 1 2.173801 1 2.298801 1 2.423801 1 2.548801 1 2.673801 1 2.798801 1 2.923801 1 3.048801 1 3.173801 1 3.298801 1 3.423801 1 3.548801 1 3.673801 1 3.798801 1 3.923801 1 4.048801 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-outtangent-array" count="19" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Z-sampler">
+ <input semantic="INPUT" source="#Cube_location_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Z-sampler" target="Cube/location.Z"/>
+ </animation>
+ <animation id="Cube_rotation_euler_X">
+ <source id="Cube_rotation_euler_X-input">
+ <float_array id="Cube_rotation_euler_X-input-array" count="18">0.04166662 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-output">
+ <float_array id="Cube_rotation_euler_X-output-array" count="18">0 0 4.665797 15.91774 29.91382 45.01158 61.1512 75.06085 85.6594 90.00004 85.34708 74.11523 60.13529 45.04613 28.90539 14.98535 4.361264 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-output-array" count="18" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-interpolation">
+ <Name_array id="Cube_rotation_euler_X-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-intangent">
+ <float_array id="Cube_rotation_euler_X-intangent-array" count="36">-0.7228892 0 1.756015 0 2.076251 1.561887 2.20133 11.00242 2.326372 24.25477 2.451399 38.93888 2.576384 55.30769 2.701322 70.28882 2.826245 82.74594 2.951199 90.00004 3.076251 88.44458 3.201329 79.02354 3.326372 65.78958 3.451399 51.11739 3.576384 34.75112 3.701323 19.76434 3.826245 7.283716 3.951214 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-outtangent">
+ <float_array id="Cube_rotation_euler_X-outtangent-array" count="36">0.8062225 0 2.048797 0 2.173749 7.769707 2.29867 20.83307 2.423628 35.57288 2.548601 51.08428 2.673616 66.99472 2.798678 79.83288 2.923755 88.57287 3.048801 90.00004 3.173749 82.24958 3.298671 69.20693 3.423628 54.48102 3.548601 38.97488 3.673616 23.05966 3.798677 10.20636 3.923755 1.438813 4.048786 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_X-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_X-sampler" target="Cube/rotationX.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Y">
+ <source id="Cube_rotation_euler_Y-input">
+ <float_array id="Cube_rotation_euler_Y-input-array" count="18">0.04166662 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-output">
+ <float_array id="Cube_rotation_euler_Y-output-array" count="18">0 0 4.665797 15.91774 29.91382 45.01158 61.1512 75.06085 85.6594 90.00004 85.34708 74.11523 60.13529 45.04613 28.90539 14.98535 4.361264 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-output-array" count="18" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-interpolation">
+ <Name_array id="Cube_rotation_euler_Y-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-intangent">
+ <float_array id="Cube_rotation_euler_Y-intangent-array" count="36">-0.7228892 0 1.756015 0 2.076251 1.561887 2.20133 11.00242 2.326372 24.25477 2.451399 38.93888 2.576384 55.30769 2.701322 70.28882 2.826245 82.74594 2.951199 90.00004 3.076251 88.44458 3.201329 79.02354 3.326372 65.78958 3.451399 51.11739 3.576384 34.75112 3.701323 19.76434 3.826245 7.283716 3.951214 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-outtangent">
+ <float_array id="Cube_rotation_euler_Y-outtangent-array" count="36">0.8062225 0 2.048797 0 2.173749 7.769707 2.29867 20.83307 2.423628 35.57288 2.548601 51.08428 2.673616 66.99472 2.798678 79.83288 2.923755 88.57287 3.048801 90.00004 3.173749 82.24958 3.298671 69.20693 3.423628 54.48102 3.548601 38.97488 3.673616 23.05966 3.798677 10.20636 3.923755 1.438813 4.048786 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Y-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Y-sampler" target="Cube/rotationY.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Z">
+ <source id="Cube_rotation_euler_Z-input">
+ <float_array id="Cube_rotation_euler_Z-input-array" count="18">0.04166662 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-output">
+ <float_array id="Cube_rotation_euler_Z-output-array" count="18">0 0 4.665797 15.91774 29.91382 45.01158 61.1512 75.06085 85.6594 90.00004 85.34708 74.11523 60.13529 45.04613 28.90539 14.98535 4.361264 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-output-array" count="18" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-interpolation">
+ <Name_array id="Cube_rotation_euler_Z-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-intangent">
+ <float_array id="Cube_rotation_euler_Z-intangent-array" count="36">-0.7228892 0 1.756015 0 2.076251 1.561887 2.20133 11.00242 2.326372 24.25477 2.451399 38.93888 2.576384 55.30769 2.701322 70.28882 2.826245 82.74594 2.951199 90.00004 3.076251 88.44458 3.201329 79.02354 3.326372 65.78958 3.451399 51.11739 3.576384 34.75112 3.701323 19.76434 3.826245 7.283716 3.951214 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-outtangent">
+ <float_array id="Cube_rotation_euler_Z-outtangent-array" count="36">0.8062225 0 2.048797 0 2.173749 7.769707 2.29867 20.83307 2.423628 35.57288 2.548601 51.08428 2.673616 66.99472 2.798678 79.83288 2.923755 88.57287 3.048801 90.00004 3.173749 82.24958 3.298671 69.20693 3.423628 54.48102 3.548601 38.97488 3.673616 23.05966 3.798677 10.20636 3.923755 1.438813 4.048786 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Z-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Z-sampler" target="Cube/rotationZ.ANGLE"/>
+ </animation>
+ <animation id="Cube_scale_X">
+ <source id="Cube_scale_X-input">
+ <float_array id="Cube_scale_X-input-array" count="18">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-output">
+ <float_array id="Cube_scale_X-output-array" count="18">1 0.33 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-output-array" count="18" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-interpolation">
+ <Name_array id="Cube_scale_X-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-intangent">
+ <float_array id="Cube_scale_X-intangent-array" count="36">-0.332319 1 0.6258558 0.33 1.756017 1 2.076199 1 2.201199 1 2.326199 1 2.451199 1 2.576199 1 2.701199 1 2.826199 1 2.951199 1 3.076199 1 3.201199 1 3.326199 1 3.451199 1 3.576199 1 3.701199 1 3.826199 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-outtangent">
+ <float_array id="Cube_scale_X-outtangent-array" count="36">0.4156524 1 1.390411 0.33 2.048797 1 2.173801 1 2.298801 1 2.423801 1 2.548801 1 2.673801 1 2.798801 1 2.923801 1 3.048801 1 3.173801 1 3.298801 1 3.423801 1 3.548801 1 3.673801 1 3.798801 1 3.923801 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_X-sampler">
+ <input semantic="INPUT" source="#Cube_scale_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_X-sampler" target="Cube/scale.X"/>
+ </animation>
+ <animation id="Cube_scale_Y">
+ <source id="Cube_scale_Y-input">
+ <float_array id="Cube_scale_Y-input-array" count="18">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-output">
+ <float_array id="Cube_scale_Y-output-array" count="18">1 0.33 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-output-array" count="18" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-interpolation">
+ <Name_array id="Cube_scale_Y-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-intangent">
+ <float_array id="Cube_scale_Y-intangent-array" count="36">-0.332319 1 0.6258558 0.33 1.756017 1 2.076199 1 2.201199 1 2.326199 1 2.451199 1 2.576199 1 2.701199 1 2.826199 1 2.951199 1 3.076199 1 3.201199 1 3.326199 1 3.451199 1 3.576199 1 3.701199 1 3.826199 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-outtangent">
+ <float_array id="Cube_scale_Y-outtangent-array" count="36">0.4156524 1 1.390411 0.33 2.048797 1 2.173801 1 2.298801 1 2.423801 1 2.548801 1 2.673801 1 2.798801 1 2.923801 1 3.048801 1 3.173801 1 3.298801 1 3.423801 1 3.548801 1 3.673801 1 3.798801 1 3.923801 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Y-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Y-sampler" target="Cube/scale.Y"/>
+ </animation>
+ <animation id="Cube_scale_Z">
+ <source id="Cube_scale_Z-input">
+ <float_array id="Cube_scale_Z-input-array" count="18">0.04166662 1 2 2.125 2.25 2.375 2.5 2.625 2.75 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-input-array" count="18" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-output">
+ <float_array id="Cube_scale_Z-output-array" count="18">1 0.33 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-output-array" count="18" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-interpolation">
+ <Name_array id="Cube_scale_Z-interpolation-array" count="18">BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-interpolation-array" count="18" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-intangent">
+ <float_array id="Cube_scale_Z-intangent-array" count="36">-0.332319 1 0.6258558 0.33 1.756017 1 2.076199 1 2.201199 1 2.326199 1 2.451199 1 2.576199 1 2.701199 1 2.826199 1 2.951199 1 3.076199 1 3.201199 1 3.326199 1 3.451199 1 3.576199 1 3.701199 1 3.826199 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-intangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-outtangent">
+ <float_array id="Cube_scale_Z-outtangent-array" count="36">0.4156524 1 1.390411 0.33 2.048797 1 2.173801 1 2.298801 1 2.423801 1 2.548801 1 2.673801 1 2.798801 1 2.923801 1 3.048801 1 3.173801 1 3.298801 1 3.423801 1 3.548801 1 3.673801 1 3.798801 1 3.923801 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-outtangent-array" count="18" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Z-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Z-sampler" target="Cube/scale.Z"/>
+ </animation>
+ </library_animations>
+ <library_visual_scenes>
+ <visual_scene id="Scene" name="Scene">
+ <node id="Cube_001" type="NODE">
+ <translate sid="location">0 0 0</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">3 3 0.05</scale>
+ <instance_geometry url="#Cube_002-mesh"/>
+ </node>
+ <node id="Cube" type="NODE">
+ <translate sid="location">0 2 1</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_geometry url="#Cube_001-mesh"/>
+ </node>
+ <node id="Lamp" type="NODE">
+ <translate sid="location">4.076245 1.005454 5.903862</translate>
+ <rotate sid="rotationZ">0 0 1 106.9363</rotate>
+ <rotate sid="rotationY">0 1 0 3.163708</rotate>
+ <rotate sid="rotationX">1 0 0 37.26105</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_light url="#Lamp-light"/>
+ </node>
+ <node id="Camera" type="NODE">
+ <translate sid="location">7.481132 -6.50764 5.343665</translate>
+ <rotate sid="rotationZ">0 0 1 46.69195</rotate>
+ <rotate sid="rotationY">0 1 0 0.619768</rotate>
+ <rotate sid="rotationX">1 0 0 63.5593</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_camera url="#Camera-camera"/>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Scene"/>
+ </scene>
+</COLLADA> \ No newline at end of file
diff --git a/examples/qt3d/scene_animations/scene_animations.cpp b/examples/qt3d/scene_animations/scene_animations.cpp
new file mode 100644
index 000000000..aa074cadb
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations.cpp
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "scene_animations.h"
+#include "qglmaterialcollection.h"
+#include "qgltexture2d.h"
+#include "qglmaterial.h"
+#include "qglscenenode.h"
+#include "qgllightmodel.h"
+#include "qglabstractscene.h"
+
+#include <QtGui/qmatrix4x4.h>
+
+#include <QPropertyAnimation>
+#include <QtCore/qmath.h>
+#include <QTimer>
+
+AnimationsView::AnimationsView(QWindow *parent)
+ : QGLView(parent)
+ , m_pScene(0)
+ , m_pTexture(0)
+ , m_bPaused(false)
+{
+ loadAssets();
+ QObject::connect(m_pScene,SIGNAL(animationUpdated()),this,SLOT(animationUpdated()));
+ QList<QGLSceneAnimation *> anims = m_pScene->animations();
+ for (int i=0; i<anims.size(); ++i) {
+ QGLSceneAnimation* pAnim = anims.at(i);
+ pAnim->play();
+ }
+
+ QTimer::singleShot(500+(rand()%1500),this,SLOT(timerEvent()));
+
+ camera()->setCenter(QVector3D(0, 2, 0));
+ camera()->setEye(QVector3D(12, 24, 40));
+}
+
+AnimationsView::~AnimationsView()
+{
+ m_pTexture->cleanupResources();
+ delete m_pScene;
+}
+
+void AnimationsView::animationUpdated()
+{
+ update();
+}
+
+void AnimationsView::timerEvent()
+{
+ QList<QGLSceneAnimation *> anims = m_pScene->animations();
+ m_bPaused = !m_bPaused;
+ if (m_bPaused) {
+ for (int i=0; i<anims.size(); ++i) {
+ QGLSceneAnimation* pAnim = anims.at(i);
+ pAnim->pause(true);
+ }
+ } else {
+ for (int i=0; i<anims.size(); ++i) {
+ QGLSceneAnimation* pAnim = anims.at(i);
+ pAnim->pause(false);
+ }
+ }
+ QTimer::singleShot(500+(rand()%1500),this,SLOT(timerEvent()));
+}
+
+void AnimationsView::paintGL(QGLPainter *painter)
+{
+ m_pScene->mainNode()->draw(painter);
+}
+
+void FixNodesRecursive(int matIndex, QGLSceneNode* pNode)
+{
+ if (pNode) {
+ pNode->setMaterialIndex(matIndex);
+ pNode->setEffect(QGL::FlatReplaceTexture2D);
+ foreach (QGLSceneNode* pCh, pNode->children()) {
+ FixNodesRecursive(matIndex, pCh);
+ }
+ }
+}
+
+void AnimationsView::loadAssets()
+{
+ {
+ m_pScene = QGLAbstractScene::loadScene(QLatin1String(":/models/scale_rotate_translate.dae"));
+ Q_ASSERT(m_pScene!=0);
+ QGLMaterial *mat = new QGLMaterial;
+ mat->setAmbientColor(Qt::lightGray);
+ mat->setDiffuseColor(Qt::lightGray);
+ QUrl url;
+ url.setPath(QLatin1String(":/images/stonewal.jpg"));
+ url.setScheme(QLatin1String("file"));
+ mat->setTextureUrl(url);
+ m_pTexture = mat->texture();
+ Q_ASSERT(m_pTexture!=0);
+ QGLSceneNode* pSceneRoot = m_pScene->mainNode();
+ int matIndex = pSceneRoot->palette()->addMaterial(mat);
+ pSceneRoot->setMaterialIndex(matIndex);
+ pSceneRoot->setEffect(QGL::FlatReplaceTexture2D);
+ FixNodesRecursive(matIndex,pSceneRoot);
+ }
+}
diff --git a/examples/qt3d/scene_animations/scene_animations.h b/examples/qt3d/scene_animations/scene_animations.h
new file mode 100644
index 000000000..7a04f7199
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LOAD_MODEL_H
+#define LOAD_MODEL_H
+
+#include "qglview.h"
+
+QT_BEGIN_NAMESPACE
+class QGLAbstractScene;
+QT_END_NAMESPACE
+
+class AnimationsView : public QGLView
+{
+ Q_OBJECT
+public:
+ AnimationsView(QWindow *parent = 0);
+ ~AnimationsView();
+
+public Q_SLOTS:
+ void animationUpdated();
+ void timerEvent();
+
+protected:
+ void paintGL(QGLPainter *painter);
+
+private:
+ void loadAssets();
+
+ QGLAbstractScene* m_pScene;
+ QGLTexture2D* m_pTexture;
+
+ bool m_bPaused;
+};
+
+#endif
diff --git a/examples/qt3d/scene_animations/scene_animations.pro b/examples/qt3d/scene_animations/scene_animations.pro
new file mode 100644
index 000000000..75bd10158
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations.pro
@@ -0,0 +1,17 @@
+TEMPLATE = app
+TARGET = scene_animations
+CONFIG += qt warn_on
+
+QT += 3d
+
+include(../../../pkg.pri)
+
+SOURCES = scene_animations.cpp \
+ scene_animations_main.cpp
+HEADERS = scene_animations.h
+RESOURCES += scene_animations.qrc
+
+OTHER_FILES += \
+ scene_animations.rc
+
+RC_FILE = scene_animations.rc
diff --git a/examples/qt3d/scene_animations/scene_animations.qrc b/examples/qt3d/scene_animations/scene_animations.qrc
new file mode 100644
index 000000000..b5471f1d0
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations.qrc
@@ -0,0 +1,14 @@
+<RCC>
+ <qresource prefix="/images">
+ <file>stonewal.jpg</file>
+ </qresource>
+ <qresource prefix="/models">
+ <file>cube_2rotations_angles_text.x</file>
+ <file>cube_rotated.dae</file>
+ <file>brick.dae</file>
+ <file>scale.dae</file>
+ <file>rotate.dae</file>
+ <file>translate.dae</file>
+ <file>scale_rotate_translate.dae</file>
+ </qresource>
+</RCC>
diff --git a/examples/qt3d/scene_animations/scene_animations.rc b/examples/qt3d/scene_animations/scene_animations.rc
new file mode 100644
index 000000000..b40ecdc12
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "qt3d.ico"
diff --git a/examples/qt3d/scene_animations/scene_animations_main.cpp b/examples/qt3d/scene_animations/scene_animations_main.cpp
new file mode 100644
index 000000000..498faa743
--- /dev/null
+++ b/examples/qt3d/scene_animations/scene_animations_main.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+
+#include "scene_animations.h"
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+ AnimationsView view;
+
+ if (view.stereoType() != QGLView::RedCyanAnaglyph)
+ view.camera()->setEyeSeparation(0.3f);
+ QStringList args = QCoreApplication::arguments();
+ int w_pos = args.indexOf("-width");
+ int h_pos = args.indexOf("-height");
+ if (w_pos >= 0 && h_pos >= 0)
+ {
+ bool ok = true;
+ int w = args.at(w_pos + 1).toInt(&ok);
+ if (!ok)
+ {
+ qWarning() << "Could not parse width argument:" << args;
+ return 1;
+ }
+ int h = args.at(h_pos + 1).toInt(&ok);
+ if (!ok)
+ {
+ qWarning() << "Could not parse height argument:" << args;
+ return 1;
+ }
+ view.resize(w, h);
+ }
+ else
+ {
+ view.resize(800, 600);
+ }
+ view.show();
+
+ return app.exec();
+}
diff --git a/examples/qt3d/scene_animations/stonewal.jpg b/examples/qt3d/scene_animations/stonewal.jpg
new file mode 100644
index 000000000..226672a29
--- /dev/null
+++ b/examples/qt3d/scene_animations/stonewal.jpg
Binary files differ
diff --git a/examples/qt3d/scene_animations/translate.dae b/examples/qt3d/scene_animations/translate.dae
new file mode 100644
index 000000000..aaced419f
--- /dev/null
+++ b/examples/qt3d/scene_animations/translate.dae
@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>Blender User</author>
+ <authoring_tool>Blender 2.62.0 r44136</authoring_tool>
+ </contributor>
+ <created>2012-04-13T13:21:22</created>
+ <modified>2012-04-13T13:21:22</modified>
+ <unit name="meter" meter="1"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_cameras>
+ <camera id="Camera-camera" name="Camera">
+ <optics>
+ <technique_common>
+ <perspective>
+ <xfov sid="xfov">49.13434</xfov>
+ <aspect_ratio>1.777778</aspect_ratio>
+ <znear sid="znear">0.1</znear>
+ <zfar sid="zfar">100</zfar>
+ </perspective>
+ </technique_common>
+ </optics>
+ </camera>
+ </library_cameras>
+ <library_lights>
+ <light id="Lamp-light" name="Lamp">
+ <technique_common>
+ <point>
+ <color sid="color">1 1 1</color>
+ <constant_attenuation>1</constant_attenuation>
+ <linear_attenuation>0</linear_attenuation>
+ <quadratic_attenuation>0.00111109</quadratic_attenuation>
+ </point>
+ </technique_common>
+ <extra>
+ <technique profile="blender">
+ <adapt_thresh>0.000999987</adapt_thresh>
+ <area_shape>0</area_shape>
+ <area_size>1</area_size>
+ <area_sizey>1</area_sizey>
+ <area_sizez>1</area_sizez>
+ <atm_distance_factor>1</atm_distance_factor>
+ <atm_extinction_factor>1</atm_extinction_factor>
+ <atm_turbidity>2</atm_turbidity>
+ <att1>0</att1>
+ <att2>1</att2>
+ <backscattered_light>1</backscattered_light>
+ <bias>1</bias>
+ <blue>1</blue>
+ <buffers>1</buffers>
+ <bufflag>0</bufflag>
+ <bufsize>2880</bufsize>
+ <buftype>2</buftype>
+ <clipend>30.002</clipend>
+ <clipsta>1.000799</clipsta>
+ <compressthresh>0.04999995</compressthresh>
+ <dist sid="blender_dist">29.99998</dist>
+ <energy sid="blender_energy">1</energy>
+ <falloff_type>2</falloff_type>
+ <filtertype>0</filtertype>
+ <flag>0</flag>
+ <gamma sid="blender_gamma">1</gamma>
+ <green>1</green>
+ <halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
+ <horizon_brightness>1</horizon_brightness>
+ <mode>8192</mode>
+ <ray_samp>1</ray_samp>
+ <ray_samp_method>1</ray_samp_method>
+ <ray_samp_type>0</ray_samp_type>
+ <ray_sampy>1</ray_sampy>
+ <ray_sampz>1</ray_sampz>
+ <red>1</red>
+ <samp>3</samp>
+ <shadhalostep>0</shadhalostep>
+ <shadow_b sid="blender_shadow_b">0</shadow_b>
+ <shadow_g sid="blender_shadow_g">0</shadow_g>
+ <shadow_r sid="blender_shadow_r">0</shadow_r>
+ <shadspotsize>45</shadspotsize>
+ <sky_colorspace>0</sky_colorspace>
+ <sky_exposure>1</sky_exposure>
+ <skyblendfac>1</skyblendfac>
+ <skyblendtype>1</skyblendtype>
+ <soft>3</soft>
+ <spotblend>0.15</spotblend>
+ <spotsize>75</spotsize>
+ <spread>1</spread>
+ <sun_brightness>1</sun_brightness>
+ <sun_effect_type>0</sun_effect_type>
+ <sun_intensity>1</sun_intensity>
+ <sun_size>1</sun_size>
+ <type>0</type>
+ </technique>
+ </extra>
+ </light>
+ </library_lights>
+ <library_geometries>
+ <geometry id="Cube_002-mesh" name="Cube.002">
+ <mesh>
+ <source id="Cube_002-mesh-positions">
+ <float_array id="Cube_002-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-normals">
+ <float_array id="Cube_002-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_002-mesh-map-0">
+ <float_array id="Cube_002-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_002-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_002-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_002-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_002-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ <geometry id="Cube_001-mesh" name="Cube.001">
+ <mesh>
+ <source id="Cube_001-mesh-positions">
+ <float_array id="Cube_001-mesh-positions-array" count="24">1 1 -1 1 -1 -1 -1 -0.9999998 -1 -0.9999997 1 -1 1 0.9999995 1 0.9999993 -1.000001 1 -1 -0.9999997 1 -1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-normals">
+ <float_array id="Cube_001-mesh-normals-array" count="18">0 0 -1 0 0 1 1 -2.98023e-7 0 -2.68221e-7 -1 -1.19209e-7 -1 2.23517e-7 -1.3411e-7 2.38419e-7 1 2.08616e-7</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-normals-array" count="6" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_001-mesh-map-0">
+ <float_array id="Cube_001-mesh-map-0-array" count="48">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_001-mesh-map-0-array" count="24" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Cube_001-mesh-vertices">
+ <input semantic="POSITION" source="#Cube_001-mesh-positions"/>
+ </vertices>
+ <polylist count="6">
+ <input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
+ <vcount>4 4 4 4 4 4 </vcount>
+ <p>0 0 0 1 0 1 2 0 2 3 0 3 4 1 4 7 1 5 6 1 6 5 1 7 0 2 8 4 2 9 5 2 10 1 2 11 1 3 12 5 3 13 6 3 14 2 3 15 2 4 16 6 4 17 7 4 18 3 4 19 4 5 20 0 5 21 3 5 22 7 5 23</p>
+ </polylist>
+ </mesh>
+ <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
+ </geometry>
+ </library_geometries>
+ <library_animations>
+ <animation id="Cube_location_X">
+ <source id="Cube_location_X-input">
+ <float_array id="Cube_location_X-input-array" count="5">0.04166662 1 2 3 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-input-array" count="5" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-output">
+ <float_array id="Cube_location_X-output-array" count="5">0 0 2 0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-output-array" count="5" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-interpolation">
+ <Name_array id="Cube_location_X-interpolation-array" count="5">BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-interpolation-array" count="5" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-intangent">
+ <float_array id="Cube_location_X-intangent-array" count="10">-0.3324777 0 0.62618 0 1.609588 2 2.609927 0 3.609589 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-intangent-array" count="5" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_X-outtangent">
+ <float_array id="Cube_location_X-outtangent-array" count="10">0.415811 0 1.390073 0 2.390412 2 3.390073 0 4.390411 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_X-outtangent-array" count="5" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_X-sampler">
+ <input semantic="INPUT" source="#Cube_location_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_X-sampler" target="Cube/location.X"/>
+ </animation>
+ <animation id="Cube_location_Y">
+ <source id="Cube_location_Y-input">
+ <float_array id="Cube_location_Y-input-array" count="5">0.04166662 1 2 3 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-input-array" count="5" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-output">
+ <float_array id="Cube_location_Y-output-array" count="5">0 2 0 -2 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-output-array" count="5" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-interpolation">
+ <Name_array id="Cube_location_Y-interpolation-array" count="5">BEZIER BEZIER BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-interpolation-array" count="5" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-intangent">
+ <float_array id="Cube_location_Y-intangent-array" count="10">-0.3310711 0 0.6258562 2 1.610937 0.7781259 2.609588 -2 3.610937 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-intangent-array" count="5" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Y-outtangent">
+ <float_array id="Cube_location_Y-outtangent-array" count="10">0.4144045 0 1.390411 2 2.389063 -0.7781259 3.390411 -2 4.389063 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Y-outtangent-array" count="5" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Y-sampler">
+ <input semantic="INPUT" source="#Cube_location_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Y-sampler" target="Cube/location.Y"/>
+ </animation>
+ <animation id="Cube_location_Z">
+ <source id="Cube_location_Z-input">
+ <float_array id="Cube_location_Z-input-array" count="3">0.04166662 2 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-input-array" count="3" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-output">
+ <float_array id="Cube_location_Z-output-array" count="3">2.5 2.5 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-output-array" count="3" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-interpolation">
+ <Name_array id="Cube_location_Z-interpolation-array" count="3">BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-interpolation-array" count="3" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-intangent">
+ <float_array id="Cube_location_Z-intangent-array" count="6">-0.7228892 2.5 1.235444 2.5 3.219177 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-intangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_location_Z-outtangent">
+ <float_array id="Cube_location_Z-outtangent-array" count="6">0.8062225 2.5 2.780823 2.5 4.780823 2.5</float_array>
+ <technique_common>
+ <accessor source="#Cube_location_Z-outtangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_location_Z-sampler">
+ <input semantic="INPUT" source="#Cube_location_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_location_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_location_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_location_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_location_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_location_Z-sampler" target="Cube/location.Z"/>
+ </animation>
+ <animation id="Cube_rotation_euler_X">
+ <source id="Cube_rotation_euler_X-input">
+ <float_array id="Cube_rotation_euler_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-output">
+ <float_array id="Cube_rotation_euler_X-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-interpolation">
+ <Name_array id="Cube_rotation_euler_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-intangent">
+ <float_array id="Cube_rotation_euler_X-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_X-outtangent">
+ <float_array id="Cube_rotation_euler_X-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_X-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_X-sampler" target="Cube/rotationX.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Y">
+ <source id="Cube_rotation_euler_Y-input">
+ <float_array id="Cube_rotation_euler_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-output">
+ <float_array id="Cube_rotation_euler_Y-output-array" count="2">0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-output-array" count="2" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-interpolation">
+ <Name_array id="Cube_rotation_euler_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-intangent">
+ <float_array id="Cube_rotation_euler_Y-intangent-array" count="4">-0.7228892 0 1.235444 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Y-outtangent">
+ <float_array id="Cube_rotation_euler_Y-outtangent-array" count="4">0.8062225 0 2.764556 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Y-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Y-sampler" target="Cube/rotationY.ANGLE"/>
+ </animation>
+ <animation id="Cube_rotation_euler_Z">
+ <source id="Cube_rotation_euler_Z-input">
+ <float_array id="Cube_rotation_euler_Z-input-array" count="3">0.04166662 2 4</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-input-array" count="3" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-output">
+ <float_array id="Cube_rotation_euler_Z-output-array" count="3">0 0 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-output-array" count="3" stride="1">
+ <param name="ANGLE" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-interpolation">
+ <Name_array id="Cube_rotation_euler_Z-interpolation-array" count="3">BEZIER BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-interpolation-array" count="3" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-intangent">
+ <float_array id="Cube_rotation_euler_Z-intangent-array" count="6">-0.7228892 0 1.235444 0 3.219177 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-intangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_rotation_euler_Z-outtangent">
+ <float_array id="Cube_rotation_euler_Z-outtangent-array" count="6">0.8062225 0 2.780823 0 4.780823 0</float_array>
+ <technique_common>
+ <accessor source="#Cube_rotation_euler_Z-outtangent-array" count="3" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_rotation_euler_Z-sampler">
+ <input semantic="INPUT" source="#Cube_rotation_euler_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_rotation_euler_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_rotation_euler_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_rotation_euler_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_rotation_euler_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_rotation_euler_Z-sampler" target="Cube/rotationZ.ANGLE"/>
+ </animation>
+ <animation id="Cube_scale_X">
+ <source id="Cube_scale_X-input">
+ <float_array id="Cube_scale_X-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-output">
+ <float_array id="Cube_scale_X-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-output-array" count="2" stride="1">
+ <param name="X" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-interpolation">
+ <Name_array id="Cube_scale_X-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-intangent">
+ <float_array id="Cube_scale_X-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_X-outtangent">
+ <float_array id="Cube_scale_X-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_X-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_X-sampler">
+ <input semantic="INPUT" source="#Cube_scale_X-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_X-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_X-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_X-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_X-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_X-sampler" target="Cube/scale.X"/>
+ </animation>
+ <animation id="Cube_scale_Y">
+ <source id="Cube_scale_Y-input">
+ <float_array id="Cube_scale_Y-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-output">
+ <float_array id="Cube_scale_Y-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-output-array" count="2" stride="1">
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-interpolation">
+ <Name_array id="Cube_scale_Y-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-intangent">
+ <float_array id="Cube_scale_Y-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Y-outtangent">
+ <float_array id="Cube_scale_Y-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Y-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Y-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Y-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Y-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Y-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Y-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Y-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Y-sampler" target="Cube/scale.Y"/>
+ </animation>
+ <animation id="Cube_scale_Z">
+ <source id="Cube_scale_Z-input">
+ <float_array id="Cube_scale_Z-input-array" count="2">0.04166662 2</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-input-array" count="2" stride="1">
+ <param name="TIME" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-output">
+ <float_array id="Cube_scale_Z-output-array" count="2">1 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-output-array" count="2" stride="1">
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-interpolation">
+ <Name_array id="Cube_scale_Z-interpolation-array" count="2">BEZIER BEZIER</Name_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-interpolation-array" count="2" stride="1">
+ <param name="INTERPOLATION" type="name"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-intangent">
+ <float_array id="Cube_scale_Z-intangent-array" count="4">-0.7228892 1 1.235444 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-intangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Cube_scale_Z-outtangent">
+ <float_array id="Cube_scale_Z-outtangent-array" count="4">0.8062225 1 2.764556 1</float_array>
+ <technique_common>
+ <accessor source="#Cube_scale_Z-outtangent-array" count="2" stride="2">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <sampler id="Cube_scale_Z-sampler">
+ <input semantic="INPUT" source="#Cube_scale_Z-input"/>
+ <input semantic="OUTPUT" source="#Cube_scale_Z-output"/>
+ <input semantic="INTERPOLATION" source="#Cube_scale_Z-interpolation"/>
+ <input semantic="IN_TANGENT" source="#Cube_scale_Z-intangent"/>
+ <input semantic="OUT_TANGENT" source="#Cube_scale_Z-outtangent"/>
+ </sampler>
+ <channel source="#Cube_scale_Z-sampler" target="Cube/scale.Z"/>
+ </animation>
+ </library_animations>
+ <library_visual_scenes>
+ <visual_scene id="Scene" name="Scene">
+ <node id="Cube_001" type="NODE">
+ <translate sid="location">0 0 0</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">5 5 0.05</scale>
+ <instance_geometry url="#Cube_002-mesh"/>
+ </node>
+ <node id="Cube" type="NODE">
+ <translate sid="location">0 0 2.5</translate>
+ <rotate sid="rotationZ">0 0 1 0</rotate>
+ <rotate sid="rotationY">0 1 0 0</rotate>
+ <rotate sid="rotationX">1 0 0 0</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_geometry url="#Cube_001-mesh"/>
+ </node>
+ <node id="Lamp" type="NODE">
+ <translate sid="location">4.076245 1.005454 5.903862</translate>
+ <rotate sid="rotationZ">0 0 1 106.9363</rotate>
+ <rotate sid="rotationY">0 1 0 3.163708</rotate>
+ <rotate sid="rotationX">1 0 0 37.26105</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_light url="#Lamp-light"/>
+ </node>
+ <node id="Camera" type="NODE">
+ <translate sid="location">7.481132 -6.50764 5.343665</translate>
+ <rotate sid="rotationZ">0 0 1 46.69195</rotate>
+ <rotate sid="rotationY">0 1 0 0.619768</rotate>
+ <rotate sid="rotationX">1 0 0 63.5593</rotate>
+ <scale sid="scale">1 1 1</scale>
+ <instance_camera url="#Camera-camera"/>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Scene"/>
+ </scene>
+</COLLADA> \ No newline at end of file
diff --git a/src/imports/threed/viewport.cpp b/src/imports/threed/viewport.cpp
index e81c0fe34..c3496ffe0 100644
--- a/src/imports/threed/viewport.cpp
+++ b/src/imports/threed/viewport.cpp
@@ -1819,13 +1819,13 @@ void Viewport::itemChange(QQuickItem::ItemChange change, const ItemChangeData &v
setItemViewport(item3d);
}
}
- if (change == ItemSceneChange && value.canvas != d->canvas)
+ if (change == ItemSceneChange && value.window != d->canvas)
{
if (d->canvas)
{
d->canvas->disconnect(this);
}
- d->canvas = value.canvas;
+ d->canvas = value.window;
d->directRenderInitialized = false;
if (d->canvas)
{
diff --git a/src/threed/scene/qglabstractscene.cpp b/src/threed/scene/qglabstractscene.cpp
index 9e0d141c8..2bb9885a9 100644
--- a/src/threed/scene/qglabstractscene.cpp
+++ b/src/threed/scene/qglabstractscene.cpp
@@ -168,12 +168,31 @@ class QGLAbstractScenePrivate
{
public:
QGLAbstractScenePrivate()
- : picking(false), nextPickId(-1), pickNodesDirty(true) {}
+ : picking(false), nextPickId(-1), pickNodesDirty(true), m_bFirstProcess(true) {}
bool picking;
int nextPickId;
QList<QGLPickNode*> pickNodes;
QSet<QGLSceneNode*> pickable;
bool pickNodesDirty;
+
+ bool m_bFirstProcess;
+ QList<QGLSceneAnimation *> m_animations;
+ std::vector<std::vector<QGLSceneNode*> > m_affectedNodes;
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform> m_defaultTransformations;
+
+ struct NodeIndex
+ {
+ QGLSceneNode* m_pNode;
+ int m_Index;
+ bool operator < (const NodeIndex& other) const {
+ if (m_pNode != other.m_pNode)
+ return m_pNode < other.m_pNode;
+ else
+ return m_Index < other.m_Index;
+ }
+ };
+ QArray<NodeIndex> m_NodeIndices;
+ QArray<QGLSceneAnimation::NodeTransform> m_TransformsBuffer;
};
bool QGLAbstractScene::m_bFormatListReady = false;
@@ -353,12 +372,147 @@ QObject *QGLAbstractScene::object(const QString& name) const
/*!
Returns a list of animations.
-
- The default implementation returns empty list.
*/
QList<QGLSceneAnimation *> QGLAbstractScene::animations() const
{
- return QList<QGLSceneAnimation *>();
+ return getAnimations();
+}
+
+/*!
+ \internal
+*/
+QList<QGLSceneAnimation *>& QGLAbstractScene::getAnimations() const
+{
+ return d_ptr->m_animations;
+}
+
+/*!
+ \internal
+*/
+QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>& QGLAbstractScene::getDefaultTransformations() const
+{
+ return d_ptr->m_defaultTransformations;
+}
+
+void CollectNodesRecursive(QGLSceneNode* pNode, QList<QGLSceneNode*>& rNodes) {
+ if (pNode) {
+ rNodes.append(pNode);
+ foreach (QGLSceneNode* pN, pNode->children()) {
+ CollectNodesRecursive(pN,rNodes);
+ }
+ }
+}
+
+/*!
+ \internal
+*/
+void QGLAbstractScene::processAnimations()
+{
+ if (d_ptr->m_bFirstProcess) {
+ d_ptr->m_bFirstProcess = false;
+
+ QList<QGLSceneNode*> Nodes;
+ CollectNodesRecursive(mainNode(), Nodes);
+
+ int maximumNodesCount = 0;
+ d_ptr->m_affectedNodes.resize(d_ptr->m_animations.count());
+ for (int i=0; i<d_ptr->m_animations.count(); ++i) {
+ QGLSceneAnimation* pAnimation = d_ptr->m_animations[i];
+ std::vector<QGLSceneNode*>& rNodesForThisAnimation = d_ptr->m_affectedNodes[i];
+
+ QList<QString> AffectedNodes = pAnimation->affectedNodes();
+ rNodesForThisAnimation.resize(AffectedNodes.count());
+ maximumNodesCount += AffectedNodes.count();
+
+ for (int an=0; an<AffectedNodes.count(); ++an) {
+ QGLSceneNode* pNode = 0;
+ for (int nn=0; nn<Nodes.count(); ++nn) {
+ if (AffectedNodes.at(an) == Nodes.at(nn)->objectName()) {
+ pNode = Nodes.at(nn);
+ break;
+ }
+ }
+ Q_ASSERT(pNode!=0);
+ rNodesForThisAnimation[an] = pNode;
+ }
+ }
+ maximumNodesCount += getDefaultTransformations().size();
+ d_ptr->m_NodeIndices.resize(maximumNodesCount);
+ d_ptr->m_TransformsBuffer.resize(maximumNodesCount);
+ }
+
+ int nReportedPositions = 0;
+ for ( QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>::const_iterator It=d_ptr->m_defaultTransformations.begin(); It!=d_ptr->m_defaultTransformations.end(); ++It,++nReportedPositions) {
+ d_ptr->m_NodeIndices[nReportedPositions].m_pNode = It.key();
+ d_ptr->m_NodeIndices[nReportedPositions].m_Index = -1;
+ }
+ for (int i=0; i<d_ptr->m_animations.count(); ++i) {
+ QGLSceneAnimation* pAnimation = d_ptr->m_animations[i];
+
+ QList<QGLSceneAnimation::NodeTransform> transforms = pAnimation->transformations();
+ Q_ASSERT(transforms.size()==0 || transforms.size()==d_ptr->m_affectedNodes[i].size());
+ if (transforms.size()>0) {
+ for (int j=0; j<transforms.size(); ++j,++nReportedPositions) {
+ d_ptr->m_NodeIndices[nReportedPositions].m_pNode = d_ptr->m_affectedNodes[i][j];
+ d_ptr->m_NodeIndices[nReportedPositions].m_Index = nReportedPositions;
+ d_ptr->m_TransformsBuffer[nReportedPositions] = transforms.at(j);
+ }
+ }
+ }
+ if (nReportedPositions>0) {
+ QGLAbstractScenePrivate::NodeIndex* pBegin = &(d_ptr->m_NodeIndices[0]);
+ QGLAbstractScenePrivate::NodeIndex* pEnd = pBegin + nReportedPositions;
+ std::sort(pBegin,pEnd);
+ }
+
+ // iterate sorted array, blend transforms, get default transforms if needed, assign transforms to nodes
+ for (int index=0; index<nReportedPositions; ) {
+ Q_ASSERT(index==0 || d_ptr->m_NodeIndices[index].m_pNode!=d_ptr->m_NodeIndices[index-1].m_pNode);
+ Q_ASSERT(d_ptr->m_NodeIndices[index].m_Index == -1);
+ QGLSceneNode* pNode = d_ptr->m_NodeIndices[index].m_pNode;
+ int iEnd=index+1;
+ for (; iEnd<nReportedPositions && d_ptr->m_NodeIndices[iEnd].m_pNode==pNode; ++iEnd) {}
+ int nElementsForThisNode = iEnd-index;
+ QGLSceneAnimation::NodeTransform transform;
+ if (nElementsForThisNode==1) {
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>::const_iterator It=getDefaultTransformations().find(pNode);
+ Q_ASSERT(It!=getDefaultTransformations().end());
+ transform = It.value();
+ } else if (nElementsForThisNode==2) {
+ Q_ASSERT(d_ptr->m_NodeIndices[index ].m_Index == -1);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+1].m_Index >= 0);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+1].m_Index < nReportedPositions);
+ transform = d_ptr->m_TransformsBuffer[ d_ptr->m_NodeIndices[index+1].m_Index ];
+ } else if (nElementsForThisNode==3) {
+ Q_ASSERT(d_ptr->m_NodeIndices[index ].m_Index == -1);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+1].m_Index >= 0);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+1].m_Index < nReportedPositions);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+2].m_Index >= 0);
+ Q_ASSERT(d_ptr->m_NodeIndices[index+2].m_Index < nReportedPositions);
+ const QGLSceneAnimation::NodeTransform& transform1 = d_ptr->m_TransformsBuffer[ d_ptr->m_NodeIndices[index+1].m_Index ];
+ const QGLSceneAnimation::NodeTransform& transform2 = d_ptr->m_TransformsBuffer[ d_ptr->m_NodeIndices[index+2].m_Index ];
+ transform.m_Scale = 0.5*(transform1.m_Scale + transform2.m_Scale);
+ transform.m_Translate = 0.5*(transform1.m_Translate + transform2.m_Translate);
+ transform.m_Rotate = QQuaternion::slerp(transform1.m_Rotate,transform2.m_Rotate,0.5).normalized();
+ } else {
+ //TODO: extend to this case
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>::const_iterator It=getDefaultTransformations().find(pNode);
+ Q_ASSERT(It!=getDefaultTransformations().end());
+ transform = It.value();
+ }
+ QMatrix4x4 nodeMatrix;
+ if (!transform.m_Translate.isNull())
+ nodeMatrix.translate(transform.m_Translate);
+ if (!transform.m_Scale.isNull())
+ nodeMatrix.scale(transform.m_Scale);
+ if (!transform.m_Rotate.isNull())
+ nodeMatrix.rotate(transform.m_Rotate);
+ pNode->setLocalTransform(nodeMatrix);
+
+ index = iEnd;
+ }
+
+ emit animationUpdated();
}
/*!
diff --git a/src/threed/scene/qglabstractscene.h b/src/threed/scene/qglabstractscene.h
index cfbabd76d..fe919f690 100644
--- a/src/threed/scene/qglabstractscene.h
+++ b/src/threed/scene/qglabstractscene.h
@@ -79,7 +79,7 @@ public:
virtual QObject *object(const QString& name) const;
virtual QGLSceneNode *mainNode() const = 0;
- virtual QList<QGLSceneAnimation *> animations() const;
+ QList<QGLSceneAnimation *> animations() const;
static QGLAbstractScene *loadScene
(const QUrl& url, const QString& format = QString(),
@@ -100,8 +100,16 @@ public:
signals:
void sceneUpdated();
+public Q_SLOTS:
+ void processAnimations();
+
+Q_SIGNALS:
+ void animationUpdated();
+
protected:
void childEvent(QChildEvent * event);
+ QList<QGLSceneAnimation *>& getAnimations() const;
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>& getDefaultTransformations() const;
private:
QScopedPointer<QGLAbstractScenePrivate> d_ptr;
diff --git a/src/threed/scene/qglsceneanimation.cpp b/src/threed/scene/qglsceneanimation.cpp
index 0ab06019f..822046491 100644
--- a/src/threed/scene/qglsceneanimation.cpp
+++ b/src/threed/scene/qglsceneanimation.cpp
@@ -72,7 +72,7 @@ QGLSceneAnimation::QGLSceneAnimation(QObject *parent) :
{
}
-QGLSceneAnimation::QGLSceneAnimation(const QString &name, QObject *parent) :
+QGLSceneAnimation::QGLSceneAnimation(QObject *parent, const QString &name) :
QObject(parent)
,d_ptr(new QGLSceneAnimationPrivate())
{
@@ -90,4 +90,52 @@ QString QGLSceneAnimation::name() const
return d->m_name;
}
+qreal QGLSceneAnimation::duration() const
+{
+ return 0.0;
+}
+
+qreal QGLSceneAnimation::position() const
+{
+ return 0.0;
+}
+
+void QGLSceneAnimation::setPosition(qreal)
+{
+}
+
+bool QGLSceneAnimation::loop() const
+{
+ return false;
+}
+
+void QGLSceneAnimation::setLoop(bool)
+{
+}
+
+QList<QString> QGLSceneAnimation::affectedNodes() const
+{
+ return QList<QString>();
+}
+
+QList<QGLSceneAnimation::NodeTransform> QGLSceneAnimation::transformations() const
+{
+ return QList<QGLSceneAnimation::NodeTransform>();
+}
+
+void QGLSceneAnimation::play()
+{
+ qDebug("QGLSceneAnimation::play()");
+}
+
+void QGLSceneAnimation::stop()
+{
+ qDebug("QGLSceneAnimation::stop()");
+}
+
+void QGLSceneAnimation::pause(bool val)
+{
+ qDebug("QGLSceneAnimation::pause( %d )", val);
+}
+
QT_END_NAMESPACE
diff --git a/src/threed/scene/qglsceneanimation.h b/src/threed/scene/qglsceneanimation.h
index cc735dc75..3777fb5e5 100644
--- a/src/threed/scene/qglsceneanimation.h
+++ b/src/threed/scene/qglsceneanimation.h
@@ -44,6 +44,8 @@
#include "qt3dglobal.h"
#include <QtCore/qobject.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qquaternion.h>
QT_BEGIN_HEADER
@@ -59,14 +61,44 @@ class Q_QT3D_EXPORT QGLSceneAnimation : public QObject
Q_DECLARE_PRIVATE(QGLSceneAnimation)
Q_PROPERTY(QString name READ name DESIGNABLE false)
+ Q_PROPERTY(qreal duration READ duration DESIGNABLE false)
+ Q_PROPERTY(qreal position READ position WRITE setPosition NOTIFY positionChanged DESIGNABLE false)
+ Q_PROPERTY(bool loop READ loop WRITE setLoop NOTIFY loopChanged DESIGNABLE false)
public:
explicit QGLSceneAnimation(QObject *parent = 0);
- explicit QGLSceneAnimation(const QString &name, QObject *parent = 0);
+ explicit QGLSceneAnimation(QObject *parent, const QString &name);
virtual ~QGLSceneAnimation();
QString name() const;
+ virtual qreal duration() const;
+
+ virtual qreal position() const;
+ virtual void setPosition(qreal pos);
+
+ virtual bool loop() const;
+ virtual void setLoop(bool l);
+
+ virtual QList<QString> affectedNodes() const;
+ struct NodeTransform
+ {
+ QVector3D m_Scale;
+ QQuaternion m_Rotate;
+ QVector3D m_Translate;
+ };
+ virtual QList<NodeTransform> transformations() const;
+
+public Q_SLOTS:
+ virtual void play();
+ virtual void stop();
+ virtual void pause(bool);
+
+Q_SIGNALS:
+ void positionChanged();
+ void loopChanged();
+ void animationCycleFinished();
+
private:
Q_DISABLE_COPY(QGLSceneAnimation)
QScopedPointer<QGLSceneAnimationPrivate> d_ptr;
diff --git a/src/threed/scene_ai/qaianimation.cpp b/src/threed/scene_ai/qaianimation.cpp
new file mode 100644
index 000000000..2950fb6e0
--- /dev/null
+++ b/src/threed/scene_ai/qaianimation.cpp
@@ -0,0 +1,431 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaianimation.h"
+#include "qaianimation_p.h"
+
+
+//#define Q_DEBUG_ANIMATIONS 1
+
+
+QT_BEGIN_NAMESPACE
+
+template <typename T>
+T Lerp(const T& t1, const T& t2, qreal t)
+{
+ Q_ASSERT(t>=0.0 && t<=1.0);
+ return t1*(1.0-t) + t2*t;
+}
+
+template <>
+QQuaternion Lerp<QQuaternion>(const QQuaternion& t1, const QQuaternion& t2, qreal t)
+{
+ Q_ASSERT(t>=0.0 && t<=1.0);
+ return QQuaternion::slerp(t1,t2,t).normalized();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------
+
+QAiAnimationPrivate::QAiAnimationPrivate(QObject* pParent) :
+ QObject(pParent)
+ ,m_bValid(false)
+ ,m_bActive(false)
+ ,m_bPaused(false)
+ ,m_Duration(0)
+ ,m_bLoop(true)
+ ,m_Position(0)
+ ,m_bPositionDirty(true)
+ ,m_pPropertyAnim(0)
+{}
+
+QAiAnimationPrivate::~QAiAnimationPrivate()
+{}
+
+qreal QAiAnimationPrivate::position() const
+{
+ return m_Position;
+}
+
+void QAiAnimationPrivate::setPosition(qreal pos)
+{
+ m_Position = pos;
+ m_bPositionDirty = true;
+ emit positionChanged();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------
+
+QAiAnimation::QAiAnimation(QObject *parent) :
+ QGLSceneAnimation(parent)
+{
+ d_ptr = new QAiAnimationPrivate(this);
+ QObject::connect(d_ptr,SIGNAL(positionChanged()),this,SIGNAL(positionChanged()));
+}
+
+QAiAnimation::QAiAnimation(QObject *parent, const QString &name) :
+ QGLSceneAnimation(parent,name)
+{
+ d_ptr = new QAiAnimationPrivate(this);
+ QObject::connect(d_ptr,SIGNAL(positionChanged()),this,SIGNAL(positionChanged()));
+}
+
+QAiAnimation::~QAiAnimation()
+{
+}
+
+qreal QAiAnimation::duration() const
+{
+ return d_ptr->m_Duration;
+}
+
+qreal QAiAnimation::position() const
+{
+ return d_ptr->m_Position;
+}
+
+void QAiAnimation::setPosition(qreal pos)
+{
+ d_ptr->m_Position = AdjustPosition(pos);
+ d_ptr->m_bPositionDirty = true;
+ if (d_ptr->m_bValid && d_ptr->m_bActive) {
+ emit positionChanged();
+ }
+}
+
+bool QAiAnimation::loop() const
+{
+ return d_ptr->m_bLoop;
+}
+
+void QAiAnimation::setLoop(bool l)
+{
+ d_ptr->m_bLoop = l;
+ d_ptr->m_pPropertyAnim->setLoopCount( d_ptr->m_bLoop?-1:0 );
+ emit loopChanged();
+}
+
+QList<QString> QAiAnimation::affectedNodes() const
+{
+ return d_ptr->m_AffectedNodes;
+}
+
+QList<QGLSceneAnimation::NodeTransform> QAiAnimation::transformations() const
+{
+ if (d_ptr->m_bValid && d_ptr->m_bActive) {
+ if (d_ptr->m_bPositionDirty) {
+ d_ptr->m_bPositionDirty = false;
+ if (d_ptr->m_Position<0.0 || d_ptr->m_Position>d_ptr->m_Duration) {
+ for (int i=0; i<d_ptr->m_TransformTracks.size(); ++i) {
+ Q_ASSERT(d_ptr->m_TransformTracks.at(i).m_BeforeBegin==TB_DEFAULT);
+ Q_ASSERT(d_ptr->m_TransformTracks.at(i).m_AfterEnd==TB_DEFAULT);
+ d_ptr->m_Transformations[i] = d_ptr->m_DefaultTransformations.at(i);
+ }
+ } else {
+ for (int i=0; i<d_ptr->m_TransformTracks.size(); ++i) {
+ const TransformTrack& rTrack = d_ptr->m_TransformTracks.at(i);
+ QGLSceneAnimation::NodeTransform& rTransform = d_ptr->m_Transformations[i];
+ rTransform.m_Scale = rTrack.m_ScaleTrack.GetValue(d_ptr->m_Position);
+ rTransform.m_Rotate = rTrack.m_RotateTrack.GetValue(d_ptr->m_Position);
+ rTransform.m_Translate = rTrack.m_TranslateTrack.GetValue(d_ptr->m_Position);
+ }
+ }
+ }
+ return d_ptr->m_Transformations;
+ } else {
+ return QList<QGLSceneAnimation::NodeTransform>();
+ }
+}
+
+template<typename T>
+void GetMinMaxTime(int size, T* pKeys, double& rMin, double& rMax)
+{
+ Q_ASSERT(pKeys!=0);
+ rMin = 1E9;
+ rMax = -1E9;
+ for (int i=0; i<size; ++i) {
+ if (rMin > pKeys[i].mTime)
+ rMin = pKeys[i].mTime;
+ if (rMax < pKeys[i].mTime)
+ rMax = pKeys[i].mTime;
+ }
+}
+
+void DumpAnimation(aiAnimation* pAnim)
+{
+#ifdef Q_DEBUG_ANIMATIONS
+ if (pAnim) {
+ qDebug("Animation:");
+ qDebug(" name = '%s'",pAnim->mName.data);
+ qDebug(" channels = %d",pAnim->mNumChannels);
+ for (unsigned int ch=0; ch<pAnim->mNumChannels; ++ch) {
+ qDebug(" channel %d:",ch);
+ aiNodeAnim* pNodeAnim = pAnim->mChannels[ch];
+ Q_ASSERT(pNodeAnim);
+ qDebug(" affected node = '%s'",pNodeAnim->mNodeName.data);
+ qDebug(" scale keys = %d",pNodeAnim->mNumScalingKeys);
+ double timeMin, timeMax;
+ GetMinMaxTime(pNodeAnim->mNumScalingKeys, pNodeAnim->mScalingKeys, timeMin, timeMax);
+ qDebug(" scale keys time = { %f .. %f }",timeMin,timeMax);
+ qDebug(" rotation keys = %d",pNodeAnim->mNumRotationKeys);
+ GetMinMaxTime(pNodeAnim->mNumRotationKeys, pNodeAnim->mRotationKeys, timeMin, timeMax);
+ qDebug(" rotation keys time = { %f .. %f }",timeMin,timeMax);
+ qDebug(" position keys = %d",pNodeAnim->mNumPositionKeys);
+ GetMinMaxTime(pNodeAnim->mNumPositionKeys, pNodeAnim->mPositionKeys, timeMin, timeMax);
+ qDebug(" position keys time = { %f .. %f }",timeMin,timeMax);
+ qDebug(" pre state = %d",pNodeAnim->mPreState);
+ qDebug(" post state = %d",pNodeAnim->mPostState);
+ Q_ASSERT(pNodeAnim->mPreState==aiAnimBehaviour_DEFAULT && pNodeAnim->mPostState==aiAnimBehaviour_DEFAULT);
+ }
+ }
+#else
+ Q_UNUSED(pAnim);
+#endif
+}
+
+void QAiAnimation::loadData(aiAnimation* pSrcAnim, const QMap<QString,aiMatrix4x4>& rDefaultTransforms, QMap<QString,QGLSceneAnimation::NodeTransform>& rDefaultTransformsRaw)
+{
+ Q_ASSERT(pSrcAnim);
+ DumpAnimation(pSrcAnim);
+ double timeMin = 1E9;
+ double timeMax = -1E9;
+ for (unsigned int ch=0; ch<pSrcAnim->mNumChannels; ++ch) {
+ aiNodeAnim* pNodeAnim = pSrcAnim->mChannels[ch];
+ Q_ASSERT(pNodeAnim);
+
+ QString NN(QLatin1String(pNodeAnim->mNodeName.data));
+ d_ptr->m_AffectedNodes.append(NN);
+
+ QGLSceneAnimation::NodeTransform transform;
+ QMap<QString,aiMatrix4x4>::const_iterator It = rDefaultTransforms.find(NN);
+ Q_ASSERT(It != rDefaultTransforms.end());
+ aiQuaternion rotation;
+ aiVector3D position;
+ aiVector3D scale;
+ It.value().Decompose(scale, rotation, position);
+ transform.m_Scale = QVector3D(scale.x,scale.y, scale.z);
+ transform.m_Translate = QVector3D(position.x, position.y, position.z);
+ transform.m_Rotate = QQuaternion(rotation.w, rotation.x, rotation.y, rotation.z);
+ d_ptr->m_DefaultTransformations.append(transform);
+ d_ptr->m_Transformations.append(transform);
+ rDefaultTransformsRaw.insert(NN,transform);
+
+ d_ptr->m_TransformTracks.append(TransformTrack());
+ TransformTrack& rTrack = d_ptr->m_TransformTracks.back();
+
+ Q_ASSERT(pNodeAnim->mNumScalingKeys > 0);
+ rTrack.m_ScaleTrack.m_Times.resize(pNodeAnim->mNumScalingKeys);
+ rTrack.m_ScaleTrack.m_Values.resize(pNodeAnim->mNumScalingKeys);
+ for (unsigned int i=0; i<pNodeAnim->mNumScalingKeys; ++i) {
+ rTrack.m_ScaleTrack.m_Times[i] = pNodeAnim->mScalingKeys[i].mTime;
+ rTrack.m_ScaleTrack.m_Values[i] = QVector3D(pNodeAnim->mScalingKeys[i].mValue.x,pNodeAnim->mScalingKeys[i].mValue.y,pNodeAnim->mScalingKeys[i].mValue.z);
+ if (timeMin > pNodeAnim->mScalingKeys[i].mTime)
+ timeMin = pNodeAnim->mScalingKeys[i].mTime;
+ if (timeMax < pNodeAnim->mScalingKeys[i].mTime)
+ timeMax = pNodeAnim->mScalingKeys[i].mTime;
+ }
+
+ Q_ASSERT(pNodeAnim->mNumRotationKeys > 0);
+ rTrack.m_RotateTrack.m_Times.resize(pNodeAnim->mNumRotationKeys);
+ rTrack.m_RotateTrack.m_Values.resize(pNodeAnim->mNumRotationKeys);
+ for (unsigned int i=0; i<pNodeAnim->mNumRotationKeys; ++i) {
+ rTrack.m_RotateTrack.m_Times[i] = pNodeAnim->mRotationKeys[i].mTime;
+ QQuaternion qq(pNodeAnim->mRotationKeys[i].mValue.w,pNodeAnim->mRotationKeys[i].mValue.x,pNodeAnim->mRotationKeys[i].mValue.y,pNodeAnim->mRotationKeys[i].mValue.z);
+ rTrack.m_RotateTrack.m_Values[i] = qq;
+ if (timeMin > pNodeAnim->mRotationKeys[i].mTime)
+ timeMin = pNodeAnim->mRotationKeys[i].mTime;
+ if (timeMax < pNodeAnim->mRotationKeys[i].mTime)
+ timeMax = pNodeAnim->mRotationKeys[i].mTime;
+ }
+
+ Q_ASSERT(pNodeAnim->mNumPositionKeys > 0);
+ rTrack.m_TranslateTrack.m_Times.resize(pNodeAnim->mNumPositionKeys);
+ rTrack.m_TranslateTrack.m_Values.resize(pNodeAnim->mNumPositionKeys);
+ for (unsigned int i=0; i<pNodeAnim->mNumPositionKeys; ++i) {
+ rTrack.m_TranslateTrack.m_Times[i] = pNodeAnim->mPositionKeys[i].mTime;
+ rTrack.m_TranslateTrack.m_Values[i] = QVector3D(pNodeAnim->mPositionKeys[i].mValue.x,pNodeAnim->mPositionKeys[i].mValue.y,pNodeAnim->mPositionKeys[i].mValue.z);
+ if (timeMin > pNodeAnim->mPositionKeys[i].mTime)
+ timeMin = pNodeAnim->mPositionKeys[i].mTime;
+ if (timeMax < pNodeAnim->mPositionKeys[i].mTime)
+ timeMax = pNodeAnim->mPositionKeys[i].mTime;
+ }
+
+ Q_ASSERT(pNodeAnim->mPreState==aiAnimBehaviour_DEFAULT && pNodeAnim->mPostState==aiAnimBehaviour_DEFAULT);
+ rTrack.m_BeforeBegin = TB_DEFAULT;
+ rTrack.m_AfterEnd = TB_DEFAULT;
+ }
+ Q_ASSERT(d_ptr->m_AffectedNodes.size() == d_ptr->m_TransformTracks.size());
+ Q_ASSERT(d_ptr->m_AffectedNodes.size() == d_ptr->m_DefaultTransformations.size());
+ Q_ASSERT(d_ptr->m_AffectedNodes.size() == d_ptr->m_Transformations.size());
+ qreal duration = timeMax-timeMin;
+ d_ptr->m_bValid = (duration > 0.000001);
+ if (d_ptr->m_bValid) {
+ qreal timeShift = -timeMin;
+ timeMax = -1E9;
+ for (int tr=0; tr<d_ptr->m_TransformTracks.size(); ++tr) {
+ TransformTrack& rTrack = d_ptr->m_TransformTracks[tr];
+ // fix scale
+ if (rTrack.m_ScaleTrack.m_Times.size() == 1) {
+ rTrack.m_ScaleTrack.m_bConst = true;
+ } else {
+ rTrack.m_ScaleTrack.m_bConst = false;
+ for (int t=0; t<rTrack.m_ScaleTrack.m_Times.size(); ++t) {
+ rTrack.m_ScaleTrack.m_Times[t] += timeShift;
+ Q_ASSERT(rTrack.m_ScaleTrack.m_Times[t] >= 0.0);
+ if (timeMax < rTrack.m_ScaleTrack.m_Times[t])
+ timeMax = rTrack.m_ScaleTrack.m_Times[t];
+ }
+ Q_ASSERT(rTrack.m_ScaleTrack.m_Times[0] >= 0.0);
+ Q_ASSERT(rTrack.m_ScaleTrack.m_Times[0] < 0.00001);
+ Q_ASSERT(qAbs((rTrack.m_ScaleTrack.m_Times.last()/duration)-1.0) < 0.00001);
+ }
+ // fix rotation
+ if (rTrack.m_RotateTrack.m_Times.size() == 1) {
+ rTrack.m_RotateTrack.m_bConst = true;
+ } else {
+ rTrack.m_RotateTrack.m_bConst = false;
+ for (int t=0; t<rTrack.m_RotateTrack.m_Times.size(); ++t) {
+ rTrack.m_RotateTrack.m_Times[t] += timeShift;
+ Q_ASSERT(rTrack.m_RotateTrack.m_Times[t] >= 0.0);
+ if (timeMax < rTrack.m_RotateTrack.m_Times[t])
+ timeMax = rTrack.m_RotateTrack.m_Times[t];
+ }
+ Q_ASSERT(rTrack.m_RotateTrack.m_Times[0] >= 0.0);
+ Q_ASSERT(rTrack.m_RotateTrack.m_Times[0] < 0.00001);
+ Q_ASSERT(qAbs((rTrack.m_RotateTrack.m_Times.last()/duration)-1.0) < 0.00001);
+ }
+ // fix translation
+ if (rTrack.m_TranslateTrack.m_Times.size() == 1) {
+ rTrack.m_TranslateTrack.m_bConst = true;
+ } else {
+ rTrack.m_TranslateTrack.m_bConst = false;
+ for (int t=0; t<rTrack.m_TranslateTrack.m_Times.size(); ++t) {
+ rTrack.m_TranslateTrack.m_Times[t] += timeShift;
+ Q_ASSERT(rTrack.m_TranslateTrack.m_Times[t] >= 0.0);
+ if (timeMax < rTrack.m_TranslateTrack.m_Times[t])
+ timeMax = rTrack.m_TranslateTrack.m_Times[t];
+ }
+ Q_ASSERT(rTrack.m_TranslateTrack.m_Times[0] >= 0.0);
+ Q_ASSERT(rTrack.m_TranslateTrack.m_Times[0] < 0.00001);
+ Q_ASSERT(qAbs((rTrack.m_TranslateTrack.m_Times.last()/duration)-1.0) < 0.00001);
+ }
+ }
+ Q_ASSERT(qAbs((timeMax/duration)-1.0) < 0.00001);
+ }
+ d_ptr->m_Duration = duration;
+
+ Q_ASSERT(d_ptr->m_pPropertyAnim==0);
+ d_ptr->m_pPropertyAnim = new QPropertyAnimation(d_ptr,"position",d_ptr);
+ d_ptr->m_pPropertyAnim->setStartValue(0.0f);
+ d_ptr->m_pPropertyAnim->setEndValue(d_ptr->m_Duration);
+ d_ptr->m_pPropertyAnim->setDuration(int(d_ptr->m_Duration*1000.0));
+ d_ptr->m_pPropertyAnim->setLoopCount(-1);
+}
+
+void QAiAnimation::play()
+{
+ if (d_ptr->m_bValid) {
+ bool bWasActive = d_ptr->m_bActive;
+ bool bWasPaused = d_ptr->m_bPaused;
+ d_ptr->m_bActive = true;
+ d_ptr->m_bPaused = false;
+ if (!bWasActive || bWasPaused) {
+ d_ptr->m_bPositionDirty = true;
+ emit positionChanged();
+ }
+ d_ptr->m_pPropertyAnim->start();
+ }
+}
+
+void QAiAnimation::stop()
+{
+ if (d_ptr->m_bValid) {
+ d_ptr->m_bActive = false;
+ d_ptr->m_pPropertyAnim->stop();
+ emit positionChanged();
+ }
+}
+
+void QAiAnimation::pause(bool val)
+{
+ if (d_ptr->m_bValid) {
+ bool bWasPaused = d_ptr->m_bPaused;
+ d_ptr->m_bPaused = val;
+ if (d_ptr->m_bPaused)
+ d_ptr->m_pPropertyAnim->pause();
+ else
+ d_ptr->m_pPropertyAnim->resume();
+ if (d_ptr->m_bActive && !d_ptr->m_bPaused && bWasPaused) {
+ d_ptr->m_bPositionDirty = true;
+ emit positionChanged();
+ }
+ }
+}
+
+qreal QAiAnimation::AdjustPosition(qreal newPos)
+{
+ if (d_ptr->m_bLoop) {
+ if (newPos>d_ptr->m_Duration) {
+ int n = int(newPos/d_ptr->m_Duration);
+ newPos -= qreal(n);
+ if (newPos<0.0)
+ return 0.0;
+ else if (newPos>d_ptr->m_Duration)
+ return d_ptr->m_Duration;
+ else
+ return newPos;
+ } else if (newPos<0.0) {
+ int n = int(newPos/d_ptr->m_Duration);
+ newPos -= qreal(n-1);
+ if (newPos<0.0)
+ return 0.0;
+ else if (newPos>d_ptr->m_Duration)
+ return d_ptr->m_Duration;
+ else
+ return newPos;
+ } else {
+ return newPos;
+ }
+ } else {
+ return newPos;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/threed/scene_ai/qaianimation.h b/src/threed/scene_ai/qaianimation.h
new file mode 100644
index 000000000..19da46630
--- /dev/null
+++ b/src/threed/scene_ai/qaianimation.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QAIANIMATION_H
+#define QAIANIMATION_H
+
+#include "qglsceneanimation.h"
+#include "aiScene.h"
+
+#include <QtCore/qmap.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QAiAnimationPrivate;
+
+class QAiAnimation : public QGLSceneAnimation
+{
+public:
+ explicit QAiAnimation(QObject *parent = 0);
+ explicit QAiAnimation(QObject *parent, const QString &name);
+ ~QAiAnimation();
+
+ qreal duration() const;
+
+ qreal position() const;
+ void setPosition(qreal pos);
+
+ bool loop() const;
+ void setLoop(bool l);
+
+ QList<QString> affectedNodes() const;
+ QList<NodeTransform> transformations() const;
+
+ void loadData(aiAnimation* pSrcAnim, const QMap<QString,aiMatrix4x4>& rDefaultTransforms, QMap<QString,QGLSceneAnimation::NodeTransform>& rDefaultTransformsRaw);
+
+public Q_SLOTS:
+ void play();
+ void stop();
+ void pause(bool);
+
+private:
+ Q_DISABLE_COPY(QAiAnimation)
+ QAiAnimationPrivate* d_ptr;
+
+ qreal AdjustPosition(qreal newPos);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+
+#endif // QAIANIMATION_H
diff --git a/src/threed/scene_ai/qaianimation_p.h b/src/threed/scene_ai/qaianimation_p.h
new file mode 100644
index 000000000..e47d8d0df
--- /dev/null
+++ b/src/threed/scene_ai/qaianimation_p.h
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAIANIMATION_P_H
+#define QAIANIMATION_P_H
+
+#include "qt3dglobal.h"
+#include "qglsceneanimation.h"
+#include <QtCore/qobject.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qquaternion.h>
+#include <qarray.h>
+#include <QPropertyAnimation>
+
+QT_BEGIN_NAMESPACE
+
+enum TerminalBehaviour {
+ TB_DEFAULT,
+ TB_CONSTANT,
+ TB_LINEAR,
+ TB_REPEAT
+};
+
+template <typename T>
+struct ValueTrack
+{
+ ValueTrack() : m_bConst(false) {}
+ QArray<qreal> m_Times;
+ QArray<T> m_Values;
+ bool m_bConst;
+ T GetValue(qreal t) const
+ {
+ if (m_bConst) {
+ Q_ASSERT(m_Times.size()==1 && m_Values.size()==1);
+ return m_Values[0];
+ } else {
+ Q_ASSERT(m_Times.size()>=2 && m_Times.size()==m_Values.size());
+ Q_ASSERT(m_Times.first()>=0.0 && m_Times.first()<0.00001);
+ Q_ASSERT(t<=m_Times.last());
+ unsigned int iFirst = 0;
+ unsigned int iLast = m_Times.size()-1;
+ for (;iLast-iFirst>1;) {
+ unsigned int iProbe = (iLast+iFirst)/2;
+ Q_ASSERT(iProbe!=iFirst && iProbe!=iLast);
+ if (t<=m_Times[iProbe])
+ iLast = iProbe;
+ else if (t>=m_Times[iProbe])
+ iFirst = iProbe;
+ }
+// if (iLast-iFirst!=1) {
+// qDebug("n times = %d",m_Times.size());
+// qDebug("n values = %d",m_Values.size());
+// qDebug("[%f .. %f .. %f]",m_Times.first(),t,m_Times.last());
+// qDebug("iFirst = %d",iFirst);
+// qDebug("times[%d] = %f",iFirst,m_Times[iFirst]);
+// qDebug("iLast = %d",iLast);
+// qDebug("times[%d] = %f",iLast,m_Times[iLast]);
+// }
+ Q_ASSERT(iLast-iFirst==1);
+ Q_ASSERT(m_Times[iFirst]<=t && t<=m_Times[iLast]);
+ return Lerp( m_Values[iFirst],
+ m_Values[iLast],
+ (t-m_Times[iFirst])/(m_Times[iLast]-m_Times[iFirst]) );
+ }
+ }
+};
+
+struct TransformTrack
+{
+ TerminalBehaviour m_BeforeBegin;
+ TerminalBehaviour m_AfterEnd;
+ ValueTrack<QVector3D> m_ScaleTrack;
+ ValueTrack<QQuaternion> m_RotateTrack;
+ ValueTrack<QVector3D> m_TranslateTrack;
+};
+
+class QAiAnimationPrivate : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal position READ position WRITE setPosition)
+public:
+ QAiAnimationPrivate(QObject* pParent);
+ ~QAiAnimationPrivate();
+
+ qreal position() const;
+ void setPosition(qreal pos);
+
+ bool m_bValid;
+
+ bool m_bActive;
+ bool m_bPaused;
+
+ qreal m_Duration;
+ bool m_bLoop;
+ qreal m_Position;
+ bool m_bPositionDirty;
+
+ QList<QString> m_AffectedNodes;
+ QList<QGLSceneAnimation::NodeTransform> m_DefaultTransformations;
+ QList<TransformTrack> m_TransformTracks;
+ QList<QGLSceneAnimation::NodeTransform> m_Transformations;
+
+ QPropertyAnimation* m_pPropertyAnim;
+
+Q_SIGNALS:
+ void positionChanged();
+};
+
+QT_END_NAMESPACE
+
+#endif // QAIANIMATION_P_H
diff --git a/src/threed/scene_ai/qailoader.cpp b/src/threed/scene_ai/qailoader.cpp
index 14871aa02..fca0fa68a 100644
--- a/src/threed/scene_ai/qailoader.cpp
+++ b/src/threed/scene_ai/qailoader.cpp
@@ -43,6 +43,7 @@
#include "qaiscenehandler.h"
#include "qaiscene.h"
#include "qaimesh.h"
+#include "qaianimation.h"
#include "qgeometrydata.h"
#include "qgltwosidedmaterial.h"
@@ -192,32 +193,24 @@ inline static QMatrix4x4 getNodeMatrix(aiNode *node)
void QAiLoader::loadNodes(aiNode *nodeList, QGLSceneNode *parentNode)
{
- QMap<aiNode *, QGLSceneNode *>::const_iterator it = m_nodeMap.constFind(nodeList);
- QGLSceneNode *node = 0;
- if (it == m_nodeMap.constEnd()) // not found
+ QGLSceneNode* node = new QGLSceneNode(parentNode);
+ m_nodes.append(node);
+ QString name = QString::fromUtf8(nodeList->mName.data, int(nodeList->mName.length));
+ if (name.isEmpty())
+ name = QString(QLatin1String("aiNode %1")).arg(m_nodes.size());
+ node->setObjectName(name);
+ m_defaultTransforms.insert(name,nodeList->mTransformation);
+
+ QMatrix4x4 mat = getNodeMatrix(nodeList);
+ if (!mat.isIdentity())
+ node->setLocalTransform(mat);
+ for (unsigned int i = 0; i < nodeList->mNumChildren; ++i)
+ loadNodes(nodeList->mChildren[i], node);
+ for (unsigned int i = 0; i < nodeList->mNumMeshes; ++i)
{
- node = new QGLSceneNode(parentNode);
- m_nodes.append(node);
- QString name = QString::fromUtf8(nodeList->mName.data, int(nodeList->mName.length));
- if (name.isEmpty())
- name = QString(QLatin1String("aiNode %1")).arg(m_nodes.size());
- node->setObjectName(name);
- QMatrix4x4 mat = getNodeMatrix(nodeList);
- if (!mat.isIdentity())
- node->setLocalTransform(mat);
- for (unsigned int i = 0; i < nodeList->mNumChildren; ++i)
- loadNodes(nodeList->mChildren[i], node);
- for (unsigned int i = 0; i < nodeList->mNumMeshes; ++i)
- {
- int n = nodeList->mMeshes[i];
- if (n < m_meshes.size())
- node->addNode(m_meshes.at(n));
- }
- }
- else
- {
- node = it.value();
- parentNode->addNode(node);
+ int n = nodeList->mMeshes[i];
+ if (n < m_meshes.size())
+ node->addNode(m_meshes.at(n));
}
}
@@ -250,12 +243,8 @@ QGLSceneNode *QAiLoader::loadMeshes()
name = name.mid(pos+1);
m_root->setObjectName(name);
- // if scene has a node heierarchy replace the naive heierarchy with that
- if (m_scene->mRootNode->mNumChildren > 0 && m_scene->mRootNode->mChildren)
- {
- m_root->removeNodes(m_root->children());
- loadNodes(m_scene->mRootNode, m_root);
- }
+ m_root->removeNodes(m_root->children());
+ loadNodes(m_scene->mRootNode, m_root);
setEffectRecursive(m_root);
@@ -316,15 +305,43 @@ QList<QGLSceneAnimation *> QAiLoader::loadAnimations()
{
Q_ASSERT(m_scene);
m_animations.clear();
+ m_AnimatedNodesDefaultTransforms.clear();
for (unsigned int i=0; i<m_scene->mNumAnimations; ++i) {
- m_animations.append( new QGLSceneAnimation( QLatin1String(m_scene->mAnimations[i]->mName.data), 0 ) );
+ aiAnimation* pSrcAnim = m_scene->mAnimations[i];
+ Q_ASSERT(pSrcAnim!=0);
+ QAiAnimation* pNewAnimation = new QAiAnimation(0, QString(QLatin1String(pSrcAnim->mName.data)));
+ pNewAnimation->loadData(pSrcAnim,m_defaultTransforms,m_AnimatedNodesDefaultTransforms);
+ m_animations.append(pNewAnimation);
}
return m_animations;
}
/*!
+ TODO: docs
+ */
+QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform> QAiLoader::loadDefaultTransformations()
+{
+ QMap<QString,QGLSceneNode*> nodes;
+ foreach (QGLSceneNode* pNode, m_nodes) {
+ QString name = pNode->objectName();
+ if (name.length()>0) {
+ nodes.insert(name,pNode);
+ }
+ }
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform> result;
+ typedef QMap<QString,QGLSceneAnimation::NodeTransform>::const_iterator UberIterator;
+ for (UberIterator It=m_AnimatedNodesDefaultTransforms.begin(); It!=m_AnimatedNodesDefaultTransforms.end(); ++It) {
+ QMap<QString,QGLSceneNode*>::const_iterator ItNode = nodes.find(It.key());
+ Q_ASSERT(ItNode != nodes.end());
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>::iterator res = result.insert(ItNode.value(),It.value());
+ Q_ASSERT(res != result.end());
+ }
+ return result;
+}
+
+/*!
\internal
Search for a resource based on the given \a path.
diff --git a/src/threed/scene_ai/qailoader.h b/src/threed/scene_ai/qailoader.h
index 988ba224e..12c1999ac 100644
--- a/src/threed/scene_ai/qailoader.h
+++ b/src/threed/scene_ai/qailoader.h
@@ -49,6 +49,7 @@
#include "aiScene.h"
#include "qglbuilder.h"
+#include "qglsceneanimation.h"
struct aiMaterial;
@@ -58,7 +59,7 @@ class QAiMesh;
class QAiScene;
class QGLSceneNode;
class QAiSceneHandler;
-class QGLSceneAnimation;
+//class QGLSceneAnimation;
class QGLMaterial;
class QAiLoader
@@ -68,6 +69,7 @@ public:
~QAiLoader();
QGLSceneNode *loadMeshes();
QList<QGLSceneAnimation *> loadAnimations();
+ QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform> loadDefaultTransformations();
private:
friend class QAiScene;
@@ -86,9 +88,12 @@ private:
QGLSceneNode *m_root;
QAiSceneHandler *m_handler;
QList<QGLSceneNode *> m_nodes;
+
+ QMap<QString,aiMatrix4x4> m_defaultTransforms;
+ QMap<QString,QGLSceneAnimation::NodeTransform> m_AnimatedNodesDefaultTransforms;
+
QList<QGLMaterial *> m_materials;
QList<QGLSceneNode *> m_meshes;
- QMap<aiNode *, QGLSceneNode *> m_nodeMap;
QMap<QGLSceneNode *, int> m_refCounts;
QList<QGLSceneAnimation *> m_animations;
bool m_hasTextures;
diff --git a/src/threed/scene_ai/qaiscene.cpp b/src/threed/scene_ai/qaiscene.cpp
index 5634855f9..e87c19921 100644
--- a/src/threed/scene_ai/qaiscene.cpp
+++ b/src/threed/scene_ai/qaiscene.cpp
@@ -62,6 +62,47 @@ QT_BEGIN_NAMESPACE
The QAiScene object takes ownership of the \a file.
*/
+
+const int g_MaxLevel = 16;
+char g_Buffer[1 + g_MaxLevel*2];
+void DumpSceneNode(int level, QGLSceneNode* pNode)
+{
+ if (pNode) {
+ if (level > g_MaxLevel)
+ level = g_MaxLevel;
+ memset(g_Buffer,' ',level*2);
+ g_Buffer[level*2] = '\0';
+ qDebug("%snode(%p) name='%s'",g_Buffer,pNode,pNode->objectName().toLatin1().constData());
+ if (!pNode->localTransform().isIdentity()) {
+ qDebug("%s transform",g_Buffer);
+ }
+ if (pNode->count() > 0) {
+ qDebug("%s geometry",g_Buffer);
+ }
+ foreach (QGLSceneNode* pChild, pNode->children()) {
+ DumpSceneNode(level+1, pChild);
+ }
+ }
+}
+
+void DumpAnimations(const QList<QGLSceneAnimation *>& rAnimations)
+{
+ foreach (QGLSceneAnimation* pAnim, rAnimations) {
+ qDebug("animation '%s':",pAnim->name().toLatin1().constData());
+ QList<QString> nodes = pAnim->affectedNodes();
+ foreach (QString node, nodes) {
+ qDebug(" affects node '%s'",node.toLatin1().constData());
+ }
+ }
+}
+
+void DumpDefaultTransforms(const QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>& rDefaultTransforms)
+{
+ for (QMap<QGLSceneNode*,QGLSceneAnimation::NodeTransform>::const_iterator It=rDefaultTransforms.begin(); It!=rDefaultTransforms.end(); ++It) {
+ qDebug("got default transform for node '%s'",It.key()->objectName().toLatin1().constData());
+ }
+}
+
QAiScene::QAiScene(const aiScene *scene, QAiSceneHandler *handler)
: QGLAbstractScene(0)
{
@@ -70,7 +111,18 @@ QAiScene::QAiScene(const aiScene *scene, QAiSceneHandler *handler)
QAiLoader loader(scene, handler);
m_root = loader.loadMeshes();
m_root->setParent(this);
- m_animations = loader.loadAnimations();
+ getAnimations() = loader.loadAnimations();
+ getDefaultTransformations() = loader.loadDefaultTransformations();
+ foreach (QGLSceneAnimation* pAnim, getAnimations()) {
+ pAnim->setParent(this);
+ QObject::connect(pAnim,SIGNAL(positionChanged()),this,SLOT(processAnimations()));
+ }
+ qDebug("=======================================");
+ qDebug("loaded scene:");
+ DumpSceneNode(1,m_root);
+ DumpAnimations(getAnimations());
+ DumpDefaultTransforms(getDefaultTransformations());
+ qDebug("=======================================");
m_aiLoader = 0;
}
@@ -182,9 +234,4 @@ void QAiScene::loadScene(const aiScene *scene)
emit sceneUpdated();
}
-QList<QGLSceneAnimation *> QAiScene::animations() const
-{
- return m_animations;
-}
-
QT_END_NAMESPACE
diff --git a/src/threed/scene_ai/qaiscene.h b/src/threed/scene_ai/qaiscene.h
index e1543a595..7c43d4be1 100644
--- a/src/threed/scene_ai/qaiscene.h
+++ b/src/threed/scene_ai/qaiscene.h
@@ -69,7 +69,6 @@ public:
QList<QObject *> objects() const;
QGLSceneNode *mainNode() const;
- QList<QGLSceneAnimation *> animations() const;
private:
QAiLoader * aiLoader() const;
QList<QGLSceneAnimation *> m_animations;
diff --git a/src/threed/scene_ai/scene_ai.pri b/src/threed/scene_ai/scene_ai.pri
index 794d990f6..1573e09da 100644
--- a/src/threed/scene_ai/scene_ai.pri
+++ b/src/threed/scene_ai/scene_ai.pri
@@ -1,6 +1,8 @@
INCLUDEPATH += $$PWD
VPATH += $$PWD
HEADERS += \
+ scene_ai/qaianimation.h \
+ scene_ai/qaianimation_p.h \
scene_ai/qaiscenehandler.h \
scene_ai/qaiscene.h \
scene_ai/qaimesh.h \
@@ -8,6 +10,7 @@ HEADERS += \
scene_ai/ailoaderiosystem.h \
scene_ai/ailoaderiostream.h
SOURCES += \
+ scene_ai/qaianimation.cpp \
scene_ai/qaiscenehandler.cpp \
scene_ai/qaiscene.cpp \
scene_ai/qaimesh.cpp \