Browse Source

Fix bugs related to skined meshes

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
4d12c24981

+ 3 - 3
AnKi/Core/GpuMemoryPools.cpp

@@ -168,7 +168,7 @@ void GpuSceneMicroPatcher::newCopy(StackMemoryPool& frameCpuPool, PtrSize gpuSce
 	LockGuard lock(m_mtx);
 	while(patchIt < patchEnd)
 	{
-		const U32 patchDwords = U32(patchEnd - patchIt);
+		const U32 patchDwords = min(kDwordsPerPatch, U32(patchEnd - patchIt));
 
 		PatchHeader& header = *m_crntFramePatchHeaders.emplaceBack(frameCpuPool);
 		ANKI_ASSERT(((patchDwords - 1) & 0b111111) == (patchDwords - 1));
@@ -182,8 +182,8 @@ void GpuSceneMicroPatcher::newCopy(StackMemoryPool& frameCpuPool, PtrSize gpuSce
 		m_crntFramePatchData.resize(frameCpuPool, srcOffset + patchDwords);
 		memcpy(&m_crntFramePatchData[srcOffset], patchIt, patchDwords * 4);
 
-		patchIt += kDwordsPerPatch;
-		gpuSceneDestDwordOffset += kDwordsPerPatch;
+		patchIt += patchDwords;
+		gpuSceneDestDwordOffset += patchDwords;
 	}
 }
 

+ 5 - 4
AnKi/Importer/GltfImporter.cpp

@@ -961,18 +961,19 @@ Error GltfImporter::writeSkeleton(const cgltf_skin& skin) const
 		ANKI_CHECK(file.writeText("boneTransform=\""));
 		Mat4 btrf(&boneMats[i][0]);
 		btrf.transpose();
-		for(U32 j = 0; j < 16; j++)
+		const Mat3x4 btrf3x4(btrf);
+		for(U32 j = 0; j < 12; j++)
 		{
-			ANKI_CHECK(file.writeTextf("%f ", btrf[j]));
+			ANKI_CHECK(file.writeTextf("%f ", btrf3x4[j]));
 		}
 		ANKI_CHECK(file.writeText("\" "));
 
 		// Transform
 		Transform trf;
 		ANKI_CHECK(getNodeTransform(boneNode, trf));
-		Mat4 mat{trf};
+		Mat3x4 mat(trf);
 		ANKI_CHECK(file.writeText("transform=\""));
-		for(U j = 0; j < 16; j++)
+		for(U j = 0; j < 12; j++)
 		{
 			ANKI_CHECK(file.writeTextf("%f ", mat[j]));
 		}

+ 4 - 13
AnKi/Math/Mat.h

@@ -193,19 +193,10 @@ public:
 	ANKI_ENABLE_METHOD(kTRowCount == 3 && kTColumnCount == 4)
 	explicit constexpr TMat(const TMat<T, 4, 4>& m4)
 	{
-		auto& m = *this;
-		m(0, 0) = m4(0, 0);
-		m(0, 1) = m4(0, 1);
-		m(0, 2) = m4(0, 2);
-		m(0, 3) = m4(0, 3);
-		m(1, 0) = m4(1, 0);
-		m(1, 1) = m4(1, 1);
-		m(1, 2) = m4(1, 2);
-		m(1, 3) = m4(1, 3);
-		m(2, 0) = m4(2, 0);
-		m(2, 1) = m4(2, 1);
-		m(2, 2) = m4(2, 2);
-		m(2, 3) = m4(2, 3);
+		ANKI_ASSERT(m4(3, 0) == T(0) && m4(3, 1) == T(0) && m4(3, 2) == T(0) && m4(3, 3) == T(1));
+		m_rows[0] = m4.getRow(0);
+		m_rows[1] = m4.getRow(1);
+		m_rows[2] = m4.getRow(2);
 	}
 
 	ANKI_ENABLE_METHOD(kTRowCount == 3 && kTColumnCount == 4)

+ 6 - 6
AnKi/Resource/SkeletonResource.h

@@ -31,12 +31,12 @@ public:
 		return m_name;
 	}
 
-	const Mat4& getTransform() const
+	const Mat3x4& getTransform() const
 	{
 		return m_transform;
 	}
 
-	const Mat4& getVertexTransform() const
+	const Mat3x4& getVertexTransform() const
 	{
 		return m_vertTrf;
 	}
@@ -59,8 +59,8 @@ public:
 private:
 	String m_name; ///< The name of the bone
 
-	Mat4 m_transform; ///< See the class notes.
-	Mat4 m_vertTrf;
+	Mat3x4 m_transform; ///< See the class notes.
+	Mat3x4 m_vertTrf;
 
 	U32 m_idx;
 
@@ -83,8 +83,8 @@ private:
 /// 	<bones>
 /// 		<bone>
 /// 			<name>X</name>
-/// 			<transform>16 floats</transform>
-/// 			<boneTransform>16 floats</boneTransform>
+/// 			<transform>12 floats</transform>
+/// 			<boneTransform>12 floats</boneTransform>
 /// 			[<parent>bone_name</parent>]
 /// 		<bone>
 ///         ...

+ 24 - 17
AnKi/Scene/Components/SkinComponent.cpp

@@ -27,8 +27,7 @@ SkinComponent::~SkinComponent()
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_animationTrfs.destroy(m_node->getMemoryPool());
 
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_crntBoneTransformsGpuSceneOffset);
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_prevBoneTransformsGpuSceneOffset);
+	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_boneTransformsGpuSceneOffset);
 }
 
 Error SkinComponent::loadSkeletonResource(CString fname)
@@ -39,19 +38,16 @@ Error SkinComponent::loadSkeletonResource(CString fname)
 	m_boneTrfs[0].destroy(m_node->getMemoryPool());
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_animationTrfs.destroy(m_node->getMemoryPool());
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_crntBoneTransformsGpuSceneOffset);
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_prevBoneTransformsGpuSceneOffset);
+	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->free(m_boneTransformsGpuSceneOffset);
 
 	// Create
 	const U32 boneCount = m_skeleton->getBones().getSize();
-	m_boneTrfs[0].create(m_node->getMemoryPool(), boneCount, Mat4::getIdentity());
-	m_boneTrfs[1].create(m_node->getMemoryPool(), boneCount, Mat4::getIdentity());
+	m_boneTrfs[0].create(m_node->getMemoryPool(), boneCount, Mat3x4::getIdentity());
+	m_boneTrfs[1].create(m_node->getMemoryPool(), boneCount, Mat3x4::getIdentity());
 	m_animationTrfs.create(m_node->getMemoryPool(), boneCount, {Vec3(0.0f), Quat::getIdentity(), 1.0f});
 
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->allocate(sizeof(Mat4) * boneCount, 4,
-																  m_crntBoneTransformsGpuSceneOffset);
-	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->allocate(sizeof(Mat4) * boneCount, 4,
-																  m_prevBoneTransformsGpuSceneOffset);
+	getExternalSubsystems(*m_node).m_gpuSceneMemoryPool->allocate(sizeof(Mat4) * boneCount * 2, 4,
+																  m_boneTransformsGpuSceneOffset);
 
 	return Error::kNone;
 }
@@ -188,11 +184,22 @@ Error SkinComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 		m_crntBoneTrfs = m_crntBoneTrfs ^ 1;
 
 		// Walk the bone hierarchy to add additional transforms
-		visitBones(m_skeleton->getRootBone(), Mat4::getIdentity(), bonesAnimated, minExtend, maxExtend);
+		visitBones(m_skeleton->getRootBone(), Mat3x4::getIdentity(), bonesAnimated, minExtend, maxExtend);
 
 		const Vec4 e(kEpsilonf, kEpsilonf, kEpsilonf, 0.0f);
 		m_boneBoundingVolume.setMin(minExtend - e);
 		m_boneBoundingVolume.setMax(maxExtend + e);
+
+		// Update the GPU scene
+		const U32 boneCount = m_skeleton->getBones().getSize();
+		DynamicArrayRaii<Mat3x4> trfs(info.m_framePool, boneCount * 2);
+		for(U32 i = 0; i < boneCount; ++i)
+		{
+			trfs[i * 2 + 0] = getBoneTransforms()[i];
+			trfs[i * 2 + 1] = getPreviousFrameBoneTransforms()[i];
+		}
+		info.m_gpuSceneMicroPatcher->newCopy(*info.m_framePool, m_boneTransformsGpuSceneOffset.m_offset,
+											 trfs.getSizeInBytes(), trfs.getBegin());
 	}
 	else
 	{
@@ -204,25 +211,25 @@ Error SkinComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 	return Error::kNone;
 }
 
-void SkinComponent::visitBones(const Bone& bone, const Mat4& parentTrf, const BitSet<128>& bonesAnimated,
+void SkinComponent::visitBones(const Bone& bone, const Mat3x4& parentTrf, const BitSet<128>& bonesAnimated,
 							   Vec4& minExtend, Vec4& maxExtend)
 {
-	Mat4 outMat;
+	Mat3x4 outMat;
 
 	if(bonesAnimated.get(bone.getIndex()))
 	{
 		const Trf& t = m_animationTrfs[bone.getIndex()];
-		outMat = parentTrf * Mat4(t.m_translation.xyz1(), Mat3(t.m_rotation), t.m_scale);
+		outMat = parentTrf.combineTransformations(Mat3x4(t.m_translation.xyz(), Mat3(t.m_rotation), t.m_scale));
 	}
 	else
 	{
-		outMat = parentTrf * bone.getTransform();
+		outMat = parentTrf.combineTransformations(bone.getTransform());
 	}
 
-	m_boneTrfs[m_crntBoneTrfs][bone.getIndex()] = outMat * bone.getVertexTransform();
+	m_boneTrfs[m_crntBoneTrfs][bone.getIndex()] = outMat.combineTransformations(bone.getVertexTransform());
 
 	// Update volume
-	const Vec4 bonePos = outMat * Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+	const Vec3 bonePos = outMat * Vec4(0.0f, 0.0f, 0.0f, 1.0f);
 	minExtend = minExtend.min(bonePos.xyz0());
 	maxExtend = maxExtend.max(bonePos.xyz0());
 

+ 10 - 6
AnKi/Scene/Components/SkinComponent.h

@@ -51,12 +51,12 @@ public:
 
 	void playAnimation(U32 track, AnimationResourcePtr anim, const AnimationPlayInfo& info);
 
-	ConstWeakArray<Mat4> getBoneTransforms() const
+	ConstWeakArray<Mat3x4> getBoneTransforms() const
 	{
 		return m_boneTrfs[m_crntBoneTrfs];
 	}
 
-	ConstWeakArray<Mat4> getPreviousFrameBoneTransforms() const
+	ConstWeakArray<Mat3x4> getPreviousFrameBoneTransforms() const
 	{
 		return m_boneTrfs[m_prevBoneTrfs];
 	}
@@ -76,6 +76,11 @@ public:
 		return m_skeleton.isCreated();
 	}
 
+	U32 getBoneTransformsGpuSceneOffset() const
+	{
+		return U32(m_boneTransformsGpuSceneOffset.m_offset);
+	}
+
 private:
 	class Track
 	{
@@ -98,7 +103,7 @@ private:
 
 	SceneNode* m_node;
 	SkeletonResourcePtr m_skeleton;
-	Array<DynamicArray<Mat4>, 2> m_boneTrfs;
+	Array<DynamicArray<Mat3x4>, 2> m_boneTrfs;
 	DynamicArray<Trf> m_animationTrfs;
 	Aabb m_boneBoundingVolume = Aabb(Vec3(-1.0f), Vec3(1.0f));
 	Array<Track, kMaxAnimationTracks> m_tracks;
@@ -106,12 +111,11 @@ private:
 	U8 m_crntBoneTrfs = 0;
 	U8 m_prevBoneTrfs = 1;
 
-	SegregatedListsGpuMemoryPoolToken m_crntBoneTransformsGpuSceneOffset;
-	SegregatedListsGpuMemoryPoolToken m_prevBoneTransformsGpuSceneOffset;
+	SegregatedListsGpuMemoryPoolToken m_boneTransformsGpuSceneOffset;
 
 	Error update(SceneComponentUpdateInfo& info, Bool& updated);
 
-	void visitBones(const Bone& bone, const Mat4& parentTrf, const BitSet<128, U8>& bonesAnimated, Vec4& minExtend,
+	void visitBones(const Bone& bone, const Mat3x4& parentTrf, const BitSet<128, U8>& bonesAnimated, Vec4& minExtend,
 					Vec4& maxExtend);
 };
 /// @}

+ 11 - 4
AnKi/Scene/ModelNode.cpp

@@ -163,6 +163,7 @@ void ModelNode::initRenderComponents()
 {
 	const ModelComponent& modelc = getFirstComponentOfType<ModelComponent>();
 	const ModelResourcePtr& model = modelc.getModelResource();
+	const SkinComponent& skinc = getFirstComponentOfType<SkinComponent>();
 
 	ANKI_ASSERT(modelc.getModelResource()->getModelPatches().getSize() == countComponentsOfType<RenderComponent>());
 	ANKI_ASSERT(modelc.getModelResource()->getModelPatches().getSize() == m_renderProxies.getSize());
@@ -199,6 +200,11 @@ void ModelNode::initRenderComponents()
 		renderable.m_uniformsOffset = getFirstComponentOfType<ModelComponent>().getUniformsGpuSceneOffset(patchIdx);
 		renderable.m_geometryOffset =
 			getFirstComponentOfType<ModelComponent>().getMeshViewsGpuSceneOffset() + sizeof(GpuSceneMesh) * patchIdx;
+		if(skinc.isEnabled())
+		{
+			renderable.m_boneTransformsOffset = skinc.getBoneTransformsGpuSceneOffset();
+		}
+
 		getExternalSubsystems().m_gpuSceneMicroPatcher->newCopy(getFrameMemoryPool(), rc.getGpuSceneViewOffset(),
 																sizeof(renderable), &renderable);
 
@@ -316,12 +322,13 @@ void ModelNode::draw(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData
 				ANKI_ASSERT(bone.getIndex() == i);
 				const Vec4 point(0.0f, 0.0f, 0.0f, 1.0f);
 				const Bone* parent = bone.getParent();
-				Mat4 m = (parent)
-							 ? skinc.getBoneTransforms()[parent->getIndex()] * parent->getVertexTransform().getInverse()
-							 : Mat4::getIdentity();
+				Mat4 m = (parent) ? Mat4(skinc.getBoneTransforms()[parent->getIndex()], Vec4(0.0f, 0.0f, 0.0f, 1.0f))
+										* Mat4(parent->getVertexTransform(), Vec4(0.0f, 0.0f, 0.0f, 1.0f)).getInverse()
+								  : Mat4::getIdentity();
 				const Vec3 a = (m * point).xyz();
 
-				m = skinc.getBoneTransforms()[i] * bone.getVertexTransform().getInverse();
+				m = Mat4(skinc.getBoneTransforms()[i], Vec4(0.0f, 0.0f, 0.0f, 1.0f))
+					* Mat4(bone.getVertexTransform(), Vec4(0.0f, 0.0f, 0.0f, 1.0f)).getInverse();
 				const Vec3 b = (m * point).xyz();
 
 				lines.emplaceBack(a);

+ 17 - 14
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -102,32 +102,35 @@ struct FragOut
 
 #pragma anki start vert
 
-Mat3x4 loadBoneTransform(UnpackedMeshVertex vert, GpuSceneRenderable renderable, U32 index)
+struct Mat3x4_2
 {
-	const U32 boneIdx = vert.m_boneIndices[index];
-	U32 byteOffset = renderable.m_boneTransformsOffset;
-	byteOffset += boneIdx * sizeof(Mat3x4);
-	return g_gpuScene.Load<Mat3x4>(byteOffset);
-}
+	Mat3x4 m_a;
+	Mat3x4 m_b;
+};
 
-Mat3x4 loadPreviousBoneTransform(UnpackedMeshVertex vert, GpuSceneRenderable renderable, U32 index)
+Mat3x4_2 loadBoneTransforms(UnpackedMeshVertex vert, GpuSceneRenderable renderable, U32 index)
 {
 	const U32 boneIdx = vert.m_boneIndices[index];
-	U32 byteOffset = renderable.m_previousBoneTransformsOffset;
-	byteOffset += boneIdx * sizeof(Mat3x4);
-	return g_gpuScene.Load<Mat3x4>(byteOffset);
+	U32 byteOffset = renderable.m_boneTransformsOffset;
+	byteOffset += boneIdx * sizeof(Mat3x4) * 2;
+	return g_gpuScene.Load<Mat3x4_2>(byteOffset);
 }
 
 #if ANKI_BONES
 void skinning(UnpackedMeshVertex vert, GpuSceneRenderable renderable, inout Vec3 pos, inout Vec3 prevPos,
 			  inout RVec3 normal, inout RVec4 tangent)
 {
-	Mat3x4 skinMat = loadBoneTransform(vert, renderable, 0) * vert.m_boneWeights[0];
-	Mat3x4 prevSkinMat = loadPreviousBoneTransform(vert, renderable, 0) * vert.m_boneWeights[0];
+	Mat3x4_2 mats = loadBoneTransforms(vert, renderable, 0);
+
+	Mat3x4 skinMat = mats.m_a * vert.m_boneWeights[0];
+	Mat3x4 prevSkinMat = mats.m_b * vert.m_boneWeights[0];
+
 	[unroll] for(U32 i = 1u; i < 4u; ++i)
 	{
-		skinMat = skinMat + loadBoneTransform(vert, renderable, i) * vert.m_boneWeights[i];
-		prevSkinMat = prevSkinMat + loadPreviousBoneTransform(vert, renderable, i) * vert.m_boneWeights[i];
+		mats = loadBoneTransforms(vert, renderable, i);
+
+		skinMat = skinMat + mats.m_a * vert.m_boneWeights[i];
+		prevSkinMat = prevSkinMat + mats.m_b * vert.m_boneWeights[i];
 	}
 
 #	if ANKI_TECHNIQUE == ANKI_RENDERING_TECHNIQUE_GBUFFER

+ 4 - 0
AnKi/Shaders/Include/Common.h

@@ -308,6 +308,7 @@ Mat3 constructMatrixColumns(Vec3 c0, Vec3 c1, Vec3 c2)
 	return m;
 }
 
+#	if !ANKI_FORCE_FULL_FP_PRECISION
 RMat3 constructMatrixColumns(RVec3 c0, RVec3 c1, RVec3 c2)
 {
 	RMat3 m;
@@ -316,6 +317,7 @@ RMat3 constructMatrixColumns(RVec3 c0, RVec3 c1, RVec3 c2)
 	m.m_row2 = RVec3(c0.z, c1.z, c2.z);
 	return m;
 }
+#	endif
 
 Vec3 mul(Mat3 m, Vec3 v)
 {
@@ -325,6 +327,7 @@ Vec3 mul(Mat3 m, Vec3 v)
 	return Vec3(a, b, c);
 }
 
+#	if !ANKI_FORCE_FULL_FP_PRECISION
 RVec3 mul(RMat3 m, RVec3 v)
 {
 	const RF32 a = dot(m.m_row0, v);
@@ -332,6 +335,7 @@ RVec3 mul(RMat3 m, RVec3 v)
 	const RF32 c = dot(m.m_row2, v);
 	return RVec3(a, b, c);
 }
+#	endif
 
 Vec4 mul(Mat4 m, Vec4 v)
 {

+ 1 - 1
AnKi/Shaders/Include/GpuSceneTypes.h

@@ -17,9 +17,9 @@ struct GpuSceneRenderable
 	U32 m_uniformsOffset;
 	U32 m_geometryOffset;
 	U32 m_boneTransformsOffset;
-	U32 m_previousBoneTransformsOffset;
 	U32 m_padding0;
 	U32 m_padding1;
+	U32 m_padding2;
 };
 static_assert(sizeof(GpuSceneRenderable) == sizeof(Vec4) * 2);
 

+ 1 - 1
AnKi/Shaders/IndirectDiffuse.hlsl

@@ -13,7 +13,7 @@
 #include <AnKi/Shaders/TonemappingFunctions.hlsl>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
-#define ENABLE_SSGI true
+#define ENABLE_SSGI false
 #define ENABLE_PROBES true
 #define REMOVE_FIREFLIES false
 #define REPROJECT_LIGHTBUFFER false

+ 1 - 1
AnKi/Shaders/IndirectDiffuseDenoise.hlsl

@@ -61,7 +61,7 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 
 	// Sample
 	RF32 weight = kEpsilonRF32;
-	RVec3 color = Vec3(0.0, 0.0, 0.0);
+	Vec3 color = Vec3(0.0, 0.0, 0.0); // Keep it full precision because it may go to inf
 
 	for(F32 i = -g_uniforms.m_sampleCountDiv2; i <= g_uniforms.m_sampleCountDiv2; i += 1.0)
 	{

+ 10 - 10
Samples/SkeletalAnimation/Assets/Armature.002_9ddcea0a08bd9d11.ankiskel

@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <skeleton>
 	<bones>
-		<bone name="Body" boneTransform="-0.000000 0.000000 -1.000000 -0.000000 -0.000000 -1.000000 -0.000000 3.786524 -1.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 1.000000 " transform="-0.000000 -0.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 3.786523 -1.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmL1" parent="Body" boneTransform="-0.765200 -0.643793 -0.000001 1.614215 0.643792 -0.765200 0.000000 3.557550 -0.000001 -0.000000 1.000000 -0.000001 -0.000000 0.000000 -0.000000 1.000000 " transform="0.000001 -0.000001 -1.000000 0.000000 0.643793 0.765200 0.000000 0.025066 0.765200 -0.643793 0.000001 1.055127 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmL2" parent="ArmL1" boneTransform="-0.766045 -0.642788 -0.000001 0.672452 0.642788 -0.766045 0.000000 3.558436 -0.000001 -0.000000 1.000000 -0.000001 -0.000000 0.000000 -0.000000 1.000000 " transform="0.999999 0.001312 0.000000 0.937093 -0.001312 0.999999 -0.000000 0.000000 -0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="PinceR" parent="ArmL2" boneTransform="-0.766044 -0.642788 -0.000001 -0.305710 0.642788 -0.766044 0.000000 3.692573 -0.000001 -0.000000 1.000000 -0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="1.000000 -0.000000 -0.000000 0.978164 0.000000 1.000000 0.000000 -0.134138 0.000000 -0.000000 1.000000 0.000001 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap3" parent="Body" boneTransform="0.000000 -1.000000 -0.000000 3.306338 -1.000000 -0.000000 0.000003 -0.000001 -0.000003 0.000000 -1.000000 0.831319 -0.000000 0.000000 -0.000000 1.000000 " transform="0.000000 -0.000003 1.000000 -0.831320 1.000000 0.000000 -0.000000 0.480187 -0.000000 1.000000 0.000003 -0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap2" parent="Body" boneTransform="-0.000000 -1.000000 0.000000 3.306337 -0.500003 -0.000000 -0.866024 0.000003 0.866024 -0.000000 -0.500002 -0.831319 0.000000 0.000000 -0.000000 1.000000 " transform="-0.000000 0.866024 0.500002 0.415660 1.000000 0.000000 0.000000 0.480187 0.000000 0.500002 -0.866024 -0.719945 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap1" parent="Body" boneTransform="0.000000 -1.000000 -0.000000 3.306337 0.866025 0.000000 0.500001 0.831319 -0.500001 -0.000000 0.866025 0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="0.000000 -0.500001 -0.866025 0.415660 1.000000 -0.000000 0.000000 0.480187 -0.000000 -0.866025 0.500001 0.719944 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmR1" parent="Body" boneTransform="0.765200 -0.643793 -0.000000 1.614215 0.643793 0.765200 0.000001 -3.557551 -0.000000 -0.000001 1.000000 0.000002 -0.000000 0.000000 -0.000000 1.000000 " transform="0.000000 -0.000001 -1.000000 -0.000000 0.643793 -0.765200 0.000001 0.025066 -0.765200 -0.643793 0.000000 -1.055127 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmR2" parent="ArmR1" boneTransform="0.766045 -0.642788 -0.000000 0.672452 0.642788 0.766045 0.000001 -3.558437 -0.000000 -0.000001 1.000000 0.000002 -0.000000 0.000000 -0.000000 1.000000 " transform="0.999999 -0.001313 -0.000000 0.937092 0.001313 0.999999 0.000000 -0.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="PinceL" parent="ArmR2" boneTransform="0.766045 -0.642788 0.000000 -0.305712 0.642788 0.766045 0.000000 -3.692573 -0.000000 0.000000 1.000000 0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="1.000000 0.000000 -0.000001 0.978164 -0.000000 1.000000 0.000000 0.134136 0.000001 -0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 " />
+		<bone name="Body" boneTransform="-0.000000 0.000000 -1.000000 -0.000000 -0.000000 -1.000000 -0.000000 3.786524 -1.000000 0.000000 0.000000 -0.000000 " transform="-0.000000 -0.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 3.786523 -1.000000 -0.000000 -0.000000 0.000000 " />
+		<bone name="ArmL1" parent="Body" boneTransform="-0.765200 -0.643793 -0.000001 1.614215 0.643792 -0.765200 0.000000 3.557550 -0.000001 -0.000000 1.000000 -0.000001 " transform="0.000001 -0.000001 -1.000000 0.000000 0.643793 0.765200 0.000000 0.025066 0.765200 -0.643793 0.000001 1.055127 " />
+		<bone name="ArmL2" parent="ArmL1" boneTransform="-0.766045 -0.642788 -0.000001 0.672452 0.642788 -0.766045 0.000000 3.558436 -0.000001 -0.000000 1.000000 -0.000001 " transform="0.999999 0.001312 0.000000 0.937093 -0.001312 0.999999 -0.000000 0.000000 -0.000000 0.000000 1.000000 0.000000 " />
+		<bone name="PinceR" parent="ArmL2" boneTransform="-0.766044 -0.642788 -0.000001 -0.305710 0.642788 -0.766044 0.000000 3.692573 -0.000001 -0.000000 1.000000 -0.000000 " transform="1.000000 -0.000000 -0.000000 0.978164 0.000000 1.000000 0.000000 -0.134138 0.000000 -0.000000 1.000000 0.000001 " />
+		<bone name="Flap3" parent="Body" boneTransform="0.000000 -1.000000 -0.000000 3.306338 -1.000000 -0.000000 0.000003 -0.000001 -0.000003 0.000000 -1.000000 0.831319 " transform="0.000000 -0.000003 1.000000 -0.831320 1.000000 0.000000 -0.000000 0.480187 -0.000000 1.000000 0.000003 -0.000000 " />
+		<bone name="Flap2" parent="Body" boneTransform="-0.000000 -1.000000 0.000000 3.306337 -0.500003 -0.000000 -0.866024 0.000003 0.866024 -0.000000 -0.500002 -0.831319 " transform="-0.000000 0.866024 0.500002 0.415660 1.000000 0.000000 0.000000 0.480187 0.000000 0.500002 -0.866024 -0.719945 " />
+		<bone name="Flap1" parent="Body" boneTransform="0.000000 -1.000000 -0.000000 3.306337 0.866025 0.000000 0.500001 0.831319 -0.500001 -0.000000 0.866025 0.000000 " transform="0.000000 -0.500001 -0.866025 0.415660 1.000000 -0.000000 0.000000 0.480187 -0.000000 -0.866025 0.500001 0.719944 " />
+		<bone name="ArmR1" parent="Body" boneTransform="0.765200 -0.643793 -0.000000 1.614215 0.643793 0.765200 0.000001 -3.557551 -0.000000 -0.000001 1.000000 0.000002 " transform="0.000000 -0.000001 -1.000000 -0.000000 0.643793 -0.765200 0.000001 0.025066 -0.765200 -0.643793 0.000000 -1.055127 " />
+		<bone name="ArmR2" parent="ArmR1" boneTransform="0.766045 -0.642788 -0.000000 0.672452 0.642788 0.766045 0.000001 -3.558437 -0.000000 -0.000001 1.000000 0.000002 " transform="0.999999 -0.001313 -0.000000 0.937092 0.001313 0.999999 0.000000 -0.000000 0.000000 -0.000000 1.000000 0.000000 " />
+		<bone name="PinceL" parent="ArmR2" boneTransform="0.766045 -0.642788 0.000000 -0.305712 0.642788 0.766045 0.000000 -3.692573 -0.000000 0.000000 1.000000 0.000000 " transform="1.000000 0.000000 -0.000001 0.978164 -0.000000 1.000000 0.000000 0.134136 0.000001 -0.000000 1.000000 0.000000 " />
 	</bones>
 </skeleton>

BIN
Samples/SkeletalAnimation/Assets/Mesh_e891faf0733c881d.ankimesh


+ 1 - 1
Samples/SkeletalAnimation/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: C:\Users\godli\src\anki\out\build\x64-Release\Bin\GltfImporter.exe droid.gltf C:/Users/godli/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets -import-textures 1 -v
+-- Generated by: C:\Users\godli\src\anki\out\build\x64-Debug\Bin\GltfImporter.exe droid.gltf C:/Users/godli/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets -v
 local scene = getSceneGraph()
 local events = getEventManager()
 

BIN
Samples/SkeletalAnimation/Assets/room.001_82c13d2071184ecf.ankimesh


BIN
Samples/SkeletalAnimation/Assets/room.002_9aeac5bb7f16c0a7.ankimesh


BIN
Samples/SkeletalAnimation/Assets/room.003_225a06b3faa52c4c.ankimesh


BIN
Samples/SkeletalAnimation/Assets/room_bb0180d3054a4db3.ankimesh