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);
 	LockGuard lock(m_mtx);
 	while(patchIt < patchEnd)
 	while(patchIt < patchEnd)
 	{
 	{
-		const U32 patchDwords = U32(patchEnd - patchIt);
+		const U32 patchDwords = min(kDwordsPerPatch, U32(patchEnd - patchIt));
 
 
 		PatchHeader& header = *m_crntFramePatchHeaders.emplaceBack(frameCpuPool);
 		PatchHeader& header = *m_crntFramePatchHeaders.emplaceBack(frameCpuPool);
 		ANKI_ASSERT(((patchDwords - 1) & 0b111111) == (patchDwords - 1));
 		ANKI_ASSERT(((patchDwords - 1) & 0b111111) == (patchDwords - 1));
@@ -182,8 +182,8 @@ void GpuSceneMicroPatcher::newCopy(StackMemoryPool& frameCpuPool, PtrSize gpuSce
 		m_crntFramePatchData.resize(frameCpuPool, srcOffset + patchDwords);
 		m_crntFramePatchData.resize(frameCpuPool, srcOffset + patchDwords);
 		memcpy(&m_crntFramePatchData[srcOffset], patchIt, patchDwords * 4);
 		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=\""));
 		ANKI_CHECK(file.writeText("boneTransform=\""));
 		Mat4 btrf(&boneMats[i][0]);
 		Mat4 btrf(&boneMats[i][0]);
 		btrf.transpose();
 		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("\" "));
 		ANKI_CHECK(file.writeText("\" "));
 
 
 		// Transform
 		// Transform
 		Transform trf;
 		Transform trf;
 		ANKI_CHECK(getNodeTransform(boneNode, trf));
 		ANKI_CHECK(getNodeTransform(boneNode, trf));
-		Mat4 mat{trf};
+		Mat3x4 mat(trf);
 		ANKI_CHECK(file.writeText("transform=\""));
 		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]));
 			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)
 	ANKI_ENABLE_METHOD(kTRowCount == 3 && kTColumnCount == 4)
 	explicit constexpr TMat(const TMat<T, 4, 4>& m4)
 	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)
 	ANKI_ENABLE_METHOD(kTRowCount == 3 && kTColumnCount == 4)

+ 6 - 6
AnKi/Resource/SkeletonResource.h

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

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

@@ -27,8 +27,7 @@ SkinComponent::~SkinComponent()
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_animationTrfs.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)
 Error SkinComponent::loadSkeletonResource(CString fname)
@@ -39,19 +38,16 @@ Error SkinComponent::loadSkeletonResource(CString fname)
 	m_boneTrfs[0].destroy(m_node->getMemoryPool());
 	m_boneTrfs[0].destroy(m_node->getMemoryPool());
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_boneTrfs[1].destroy(m_node->getMemoryPool());
 	m_animationTrfs.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
 	// Create
 	const U32 boneCount = m_skeleton->getBones().getSize();
 	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});
 	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;
 	return Error::kNone;
 }
 }
@@ -188,11 +184,22 @@ Error SkinComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 		m_crntBoneTrfs = m_crntBoneTrfs ^ 1;
 		m_crntBoneTrfs = m_crntBoneTrfs ^ 1;
 
 
 		// Walk the bone hierarchy to add additional transforms
 		// 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);
 		const Vec4 e(kEpsilonf, kEpsilonf, kEpsilonf, 0.0f);
 		m_boneBoundingVolume.setMin(minExtend - e);
 		m_boneBoundingVolume.setMin(minExtend - e);
 		m_boneBoundingVolume.setMax(maxExtend + 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
 	else
 	{
 	{
@@ -204,25 +211,25 @@ Error SkinComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 	return Error::kNone;
 	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)
 							   Vec4& minExtend, Vec4& maxExtend)
 {
 {
-	Mat4 outMat;
+	Mat3x4 outMat;
 
 
 	if(bonesAnimated.get(bone.getIndex()))
 	if(bonesAnimated.get(bone.getIndex()))
 	{
 	{
 		const Trf& t = m_animationTrfs[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
 	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
 	// 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());
 	minExtend = minExtend.min(bonePos.xyz0());
 	maxExtend = maxExtend.max(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);
 	void playAnimation(U32 track, AnimationResourcePtr anim, const AnimationPlayInfo& info);
 
 
-	ConstWeakArray<Mat4> getBoneTransforms() const
+	ConstWeakArray<Mat3x4> getBoneTransforms() const
 	{
 	{
 		return m_boneTrfs[m_crntBoneTrfs];
 		return m_boneTrfs[m_crntBoneTrfs];
 	}
 	}
 
 
-	ConstWeakArray<Mat4> getPreviousFrameBoneTransforms() const
+	ConstWeakArray<Mat3x4> getPreviousFrameBoneTransforms() const
 	{
 	{
 		return m_boneTrfs[m_prevBoneTrfs];
 		return m_boneTrfs[m_prevBoneTrfs];
 	}
 	}
@@ -76,6 +76,11 @@ public:
 		return m_skeleton.isCreated();
 		return m_skeleton.isCreated();
 	}
 	}
 
 
+	U32 getBoneTransformsGpuSceneOffset() const
+	{
+		return U32(m_boneTransformsGpuSceneOffset.m_offset);
+	}
+
 private:
 private:
 	class Track
 	class Track
 	{
 	{
@@ -98,7 +103,7 @@ private:
 
 
 	SceneNode* m_node;
 	SceneNode* m_node;
 	SkeletonResourcePtr m_skeleton;
 	SkeletonResourcePtr m_skeleton;
-	Array<DynamicArray<Mat4>, 2> m_boneTrfs;
+	Array<DynamicArray<Mat3x4>, 2> m_boneTrfs;
 	DynamicArray<Trf> m_animationTrfs;
 	DynamicArray<Trf> m_animationTrfs;
 	Aabb m_boneBoundingVolume = Aabb(Vec3(-1.0f), Vec3(1.0f));
 	Aabb m_boneBoundingVolume = Aabb(Vec3(-1.0f), Vec3(1.0f));
 	Array<Track, kMaxAnimationTracks> m_tracks;
 	Array<Track, kMaxAnimationTracks> m_tracks;
@@ -106,12 +111,11 @@ private:
 	U8 m_crntBoneTrfs = 0;
 	U8 m_crntBoneTrfs = 0;
 	U8 m_prevBoneTrfs = 1;
 	U8 m_prevBoneTrfs = 1;
 
 
-	SegregatedListsGpuMemoryPoolToken m_crntBoneTransformsGpuSceneOffset;
-	SegregatedListsGpuMemoryPoolToken m_prevBoneTransformsGpuSceneOffset;
+	SegregatedListsGpuMemoryPoolToken m_boneTransformsGpuSceneOffset;
 
 
 	Error update(SceneComponentUpdateInfo& info, Bool& updated);
 	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);
 					Vec4& maxExtend);
 };
 };
 /// @}
 /// @}

+ 11 - 4
AnKi/Scene/ModelNode.cpp

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

+ 17 - 14
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -102,32 +102,35 @@ struct FragOut
 
 
 #pragma anki start vert
 #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];
 	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
 #if ANKI_BONES
 void skinning(UnpackedMeshVertex vert, GpuSceneRenderable renderable, inout Vec3 pos, inout Vec3 prevPos,
 void skinning(UnpackedMeshVertex vert, GpuSceneRenderable renderable, inout Vec3 pos, inout Vec3 prevPos,
 			  inout RVec3 normal, inout RVec4 tangent)
 			  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)
 	[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
 #	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;
 	return m;
 }
 }
 
 
+#	if !ANKI_FORCE_FULL_FP_PRECISION
 RMat3 constructMatrixColumns(RVec3 c0, RVec3 c1, RVec3 c2)
 RMat3 constructMatrixColumns(RVec3 c0, RVec3 c1, RVec3 c2)
 {
 {
 	RMat3 m;
 	RMat3 m;
@@ -316,6 +317,7 @@ RMat3 constructMatrixColumns(RVec3 c0, RVec3 c1, RVec3 c2)
 	m.m_row2 = RVec3(c0.z, c1.z, c2.z);
 	m.m_row2 = RVec3(c0.z, c1.z, c2.z);
 	return m;
 	return m;
 }
 }
+#	endif
 
 
 Vec3 mul(Mat3 m, Vec3 v)
 Vec3 mul(Mat3 m, Vec3 v)
 {
 {
@@ -325,6 +327,7 @@ Vec3 mul(Mat3 m, Vec3 v)
 	return Vec3(a, b, c);
 	return Vec3(a, b, c);
 }
 }
 
 
+#	if !ANKI_FORCE_FULL_FP_PRECISION
 RVec3 mul(RMat3 m, RVec3 v)
 RVec3 mul(RMat3 m, RVec3 v)
 {
 {
 	const RF32 a = dot(m.m_row0, 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);
 	const RF32 c = dot(m.m_row2, v);
 	return RVec3(a, b, c);
 	return RVec3(a, b, c);
 }
 }
+#	endif
 
 
 Vec4 mul(Mat4 m, Vec4 v)
 Vec4 mul(Mat4 m, Vec4 v)
 {
 {

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

@@ -17,9 +17,9 @@ struct GpuSceneRenderable
 	U32 m_uniformsOffset;
 	U32 m_uniformsOffset;
 	U32 m_geometryOffset;
 	U32 m_geometryOffset;
 	U32 m_boneTransformsOffset;
 	U32 m_boneTransformsOffset;
-	U32 m_previousBoneTransformsOffset;
 	U32 m_padding0;
 	U32 m_padding0;
 	U32 m_padding1;
 	U32 m_padding1;
+	U32 m_padding2;
 };
 };
 static_assert(sizeof(GpuSceneRenderable) == sizeof(Vec4) * 2);
 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/TonemappingFunctions.hlsl>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 
 
-#define ENABLE_SSGI true
+#define ENABLE_SSGI false
 #define ENABLE_PROBES true
 #define ENABLE_PROBES true
 #define REMOVE_FIREFLIES false
 #define REMOVE_FIREFLIES false
 #define REPROJECT_LIGHTBUFFER 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
 	// Sample
 	RF32 weight = kEpsilonRF32;
 	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)
 	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" ?>
 <?xml version="1.0" encoding="UTF-8" ?>
 <skeleton>
 <skeleton>
 	<bones>
 	<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>
 	</bones>
 </skeleton>
 </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 scene = getSceneGraph()
 local events = getEventManager()
 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