Browse Source

Make scales non-uniform and fix a lot of bugs

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
12e84bc869
48 changed files with 415 additions and 405 deletions
  1. 2 1
      AnKi/Collision/Cone.h
  2. 2 1
      AnKi/Collision/Plane.cpp
  3. 2 1
      AnKi/Collision/Sphere.h
  4. 6 4
      AnKi/Gr/CMakeLists.txt
  5. 4 0
      AnKi/Gr/RenderGraph.h
  6. 6 0
      AnKi/Gr/RenderGraph.inl.h
  7. 2 0
      AnKi/Gr/Vulkan/GrManagerImpl.cpp
  8. 9 16
      AnKi/Importer/GltfImporter.cpp
  9. 2 2
      AnKi/Math/Mat.h
  10. 33 18
      AnKi/Math/Transform.h
  11. 1 1
      AnKi/Physics/Common.h
  12. 1 1
      AnKi/Physics/PhysicsPlayerController.cpp
  13. 15 8
      AnKi/Renderer/Dbg.cpp
  14. 1 0
      AnKi/Renderer/ForwardShading.cpp
  15. 2 1
      AnKi/Renderer/IndirectDiffuseProbes.cpp
  16. 9 7
      AnKi/Renderer/ProbeReflections.cpp
  17. 2 1
      AnKi/Renderer/ShadowMapping.cpp
  18. 1 1
      AnKi/Renderer/Utils/GpuVisibility.cpp
  19. 1 1
      AnKi/Scene/Components/LightComponent.cpp
  20. 1 1
      AnKi/Scene/Components/ParticleEmitterComponent.cpp
  21. 1 1
      AnKi/Scene/Events/AnimationEvent.cpp
  22. 1 1
      AnKi/Scene/RenderStateBucket.cpp
  23. 2 2
      AnKi/Scene/SceneNode.h
  24. 24 12
      AnKi/Script/Math.cpp
  25. 3 3
      AnKi/Script/Math.xml
  26. 37 29
      AnKi/Script/Scene.cpp
  27. 4 4
      AnKi/Script/Scene.xml
  28. 6 5
      AnKi/Shaders/GpuVisibility.ankiprog
  29. 6 6
      Samples/PhysicsPlayground/Main.cpp
  30. BIN
      Samples/SimpleScene/Assets/CornellBox.blend
  31. BIN
      Samples/SimpleScene/Assets/Mesh_6.001_2550937d23ca3066.ankimesh
  32. 1 1
      Samples/SimpleScene/Assets/Mesh_6.001_shortBox_4122029d89b53875.ankimdl
  33. BIN
      Samples/SimpleScene/Assets/Mesh_7.001_95b61c94f8a0ad1c.ankimesh
  34. 1 1
      Samples/SimpleScene/Assets/Mesh_7.001_tallBox_287bd3c185e6905a.ankimdl
  35. 20 20
      Samples/SimpleScene/Assets/Scene.lua
  36. BIN
      Samples/SkeletalAnimation/Assets/Mesh_e891faf0733c881d.ankimesh
  37. 18 26
      Samples/SkeletalAnimation/Assets/Robot.001_851820527fac54db.ankimtl
  38. 10 10
      Samples/SkeletalAnimation/Assets/Scene.lua
  39. BIN
      Samples/SkeletalAnimation/Assets/room.001_82c13d2071184ecf.ankimesh
  40. BIN
      Samples/SkeletalAnimation/Assets/room.002_9aeac5bb7f16c0a7.ankimesh
  41. BIN
      Samples/SkeletalAnimation/Assets/room.003_225a06b3faa52c4c.ankimesh
  42. 16 26
      Samples/SkeletalAnimation/Assets/room.blue_21e71ba855d95ca2.ankimtl
  43. 16 26
      Samples/SkeletalAnimation/Assets/room.green_c7dc339831ac73a2.ankimtl
  44. 16 26
      Samples/SkeletalAnimation/Assets/room.red_4176c8682cee36ac.ankimtl
  45. BIN
      Samples/SkeletalAnimation/Assets/room_bb0180d3054a4db3.ankimesh
  46. 16 26
      Samples/SkeletalAnimation/Assets/room_bb0180d3054a4db3.ankimtl
  47. 113 113
      Samples/Sponza/Assets/Scene.lua
  48. 2 2
      Tests/Gr/Gr.cpp

+ 2 - 1
AnKi/Collision/Cone.h

@@ -100,7 +100,8 @@ public:
 		Cone out;
 		out.m_origin = transform.transform(m_origin);
 		out.m_dir = (transform.getRotation() * m_dir.xyz0()).xyz0();
-		out.m_length *= transform.getScale();
+		ANKI_ASSERT(transform.hasUniformScale());
+		out.m_length *= transform.getScale().x();
 		return out;
 	}
 

+ 2 - 1
AnKi/Collision/Plane.cpp

@@ -46,7 +46,8 @@ Plane Plane::getTransformed(const Transform& trf) const
 	Mat3x4 rot = trf.getRotation();
 	rot.transposeRotationPart();
 	Vec4 newTrans(rot * trf.getOrigin(), 0.0f);
-	plane.m_offset = m_offset * trf.getScale() + newTrans.dot(m_normal);
+	ANKI_ASSERT(trf.hasUniformScale());
+	plane.m_offset = m_offset * trf.getScale().x() + newTrans.dot(m_normal);
 
 	return plane;
 }

+ 2 - 1
AnKi/Collision/Sphere.h

@@ -96,7 +96,8 @@ public:
 		check();
 		Sphere out;
 		out.m_center = transform.transform(m_center);
-		out.m_radius = m_radius * transform.getScale();
+		ANKI_ASSERT(transform.hasUniformScale());
+		out.m_radius = m_radius * transform.getScale().x();
 		return out;
 	}
 

+ 6 - 4
AnKi/Gr/CMakeLists.txt

@@ -1,4 +1,6 @@
-set(common_sources
+set(common_sources Common.cpp)
+
+set(backend_sources
 	Common.cpp
 	GrObject.cpp
 	RenderGraph.cpp
@@ -7,7 +9,7 @@ set(common_sources
 	Utils/Functions.cpp
 	Utils/SegregatedListsGpuMemoryPool.cpp)
 
-set(common_headers
+set(backend_headers
 	AccelerationStructure.h
 	Buffer.h
 	CommandBuffer.h
@@ -35,7 +37,7 @@ set(common_headers
 	Utils/SegregatedListsGpuMemoryPool.h)
 
 if(VULKAN)
-	set(backend_sources
+	set(backend_sources  ${backend_sources}
 		Vulkan/AccelerationStructure.cpp
 		Vulkan/AccelerationStructureImpl.cpp
 		Vulkan/Buffer.cpp
@@ -78,7 +80,7 @@ if(VULKAN)
 		Vulkan/GrUpscaler.cpp
 		Vulkan/GrUpscalerImpl.cpp)
 
-	set(backend_headers
+	set(backend_headers ${backend_headers}
 		Vulkan/AccelerationStructureImpl.h
 		Vulkan/BufferImpl.h
 		Vulkan/CommandBufferFactory.h

+ 4 - 0
AnKi/Gr/RenderGraph.h

@@ -104,6 +104,10 @@ public:
 		ANKI_ASSERT(m_hash == 0);
 		ANKI_ASSERT(m_usage == TextureUsageBit::kNone && "No need to supply the usage. RenderGraph will find out");
 		m_hash = computeHash();
+		// Append the name to the hash because there might be RTs with the same properties and thus the same hash. We can't have different Rt
+		// descriptors with the same hash
+		ANKI_ASSERT(getName().getLength() > 0);
+		m_hash = appendHash(getName().cstr(), getName().getLength(), m_hash);
 	}
 
 private:

+ 6 - 0
AnKi/Gr/RenderGraph.inl.h

@@ -301,6 +301,12 @@ inline RenderTargetHandle RenderGraphDescription::newRenderTarget(const RenderTa
 {
 	ANKI_ASSERT(initInf.m_hash && "Forgot to call RenderTargetDescription::bake");
 	ANKI_ASSERT(initInf.m_usage == TextureUsageBit::kNone && "Don't need to supply the usage. Render grap will find it");
+
+	for([[maybe_unused]] auto it : m_renderTargets)
+	{
+		ANKI_ASSERT(it.m_hash != initInf.m_hash && "There is another RT descriptor with the same hash. Rendergraph's RT recycler will get confused");
+	}
+
 	RT& rt = *m_renderTargets.emplaceBack();
 	rt.m_initInfo = initInf;
 	rt.m_hash = initInf.m_hash;

+ 2 - 0
AnKi/Gr/Vulkan/GrManagerImpl.cpp

@@ -1147,6 +1147,8 @@ Error GrManagerImpl::initDevice()
 			return Error::kFunctionFailed;
 		}
 
+		meshShadersFeatures.multiviewMeshShader = false;
+		meshShadersFeatures.primitiveFragmentShadingRateMeshShader = false;
 		meshShadersFeatures.pNext = const_cast<void*>(ci.pNext);
 		ci.pNext = &meshShadersFeatures;
 

+ 9 - 16
AnKi/Importer/GltfImporter.cpp

@@ -122,16 +122,9 @@ static Error getNodeTransform(const cgltf_node& node, Transform& trf)
 	Vec3 scale;
 	getNodeTransform(node, tsl, rot, scale);
 
-	const F32 scaleEpsilon = 0.01f;
-	if(absolute(scale[0] - scale[1]) > scaleEpsilon || absolute(scale[0] - scale[2]) > scaleEpsilon)
-	{
-		ANKI_IMPORTER_LOGE("Expecting uniform scale");
-		return Error::kUserData;
-	}
-
 	trf.setOrigin(tsl.xyz0());
 	trf.setRotation(Mat3x4(Vec3(0.0f), rot));
-	trf.setScale(scale[0]);
+	trf.setScale(scale);
 
 	return Error::kNone;
 }
@@ -631,7 +624,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 
 		Transform localTrf;
 		ANKI_CHECK(getNodeTransform(node, localTrf));
-		localTrf.setScale(1.0f); // Remove scale
+		localTrf.setScale(Vec4(1.0f, 1.0f, 1.0f, 0.0f)); // Remove scale
 		ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 	}
 	else if(node.camera)
@@ -645,7 +638,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 
 		Transform localTrf;
 		ANKI_CHECK(getNodeTransform(node, localTrf));
-		localTrf.setScale(1.0f); // Remove scale
+		localTrf.setScale(Vec4(1.0f, 1.0f, 1.0f, 0.0f)); // Remove scale
 		ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 	}
 	else if(node.mesh)
@@ -666,7 +659,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 		if(extraFound)
 		{
 			Bool gpuParticles = false;
-			ANKI_CHECK(getExtra(extras, "particles", extraValueBool, extraFound));
+			ANKI_CHECK(getExtra(extras, "gpu_particles", extraValueBool, extraFound));
 			if(extraFound)
 			{
 				gpuParticles = extraValueBool;
@@ -773,7 +766,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			ANKI_CHECK(m_sceneFile.writeText("comp = node:newReflectionProbeComponent()\n"));
 			ANKI_CHECK(m_sceneFile.writeTextf("comp:setBoxVolumeSize(Vec3.new(%f, %f, %f))\n", boxSize.x(), boxSize.y(), boxSize.z()));
 
-			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), 1.0f);
+			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
 		else if(stringsExist(extras, {"gi_probe"}))
@@ -801,7 +794,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 				ANKI_CHECK(m_sceneFile.writeTextf("comp:setCellSize(%f)\n", extraValuef));
 			}
 
-			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), 1.0f);
+			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
 		else if(stringsExist(extras, {"decal"}))
@@ -831,7 +824,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			Mat3 rot;
 			Vec3 scale;
 			getNodeTransform(node, tsl, rot, scale);
-			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), 1.0f);
+			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
 		else
@@ -896,7 +889,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 		Mat3 rot;
 		Vec3 scale;
 		getNodeTransform(node, tsl, rot, scale);
-		nodeTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), scale.x());
+		nodeTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), scale.xyz0());
 	}
 	for(cgltf_node* const* c = node.children; c < node.children + node.children_count; ++c)
 	{
@@ -919,7 +912,7 @@ Error GltfImporter::writeTransform(const Transform& trf)
 	}
 	ANKI_CHECK(m_sceneFile.writeText("trf:setRotation(rot)\n"));
 
-	ANKI_CHECK(m_sceneFile.writeTextf("trf:setScale(%f)\n", trf.getScale()));
+	ANKI_CHECK(m_sceneFile.writeTextf("trf:setScale(Vec4.new(%f, %f, %f, 0))\n", trf.getScale().x(), trf.getScale().y(), trf.getScale().z()));
 
 	ANKI_CHECK(m_sceneFile.writeText("node:setLocalTransform(trf)\n"));
 

+ 2 - 2
AnKi/Math/Mat.h

@@ -156,7 +156,7 @@ public:
 	}
 
 	explicit constexpr TMat(const TTransform<T>& t) requires(kSize == 16)
-		: TMat(t.getOrigin().xyz(), t.getRotation().getRotationPart(), TVec<T, 3>(t.getScale()))
+		: TMat(t.getOrigin().xyz(), t.getRotation().getRotationPart(), t.getScale().xyz())
 	{
 	}
 
@@ -230,7 +230,7 @@ public:
 	}
 
 	explicit constexpr TMat(const TTransform<T>& t) requires(kSize == 12)
-		: TMat(t.getOrigin().xyz(), t.getRotation().getRotationPart(), TVec<T, 3>(t.getScale()))
+		: TMat(t.getOrigin().xyz(), t.getRotation().getRotationPart(), t.getScale().xyz())
 	{
 	}
 	/// @}

+ 33 - 18
AnKi/Math/Transform.h

@@ -22,7 +22,7 @@ public:
 	constexpr TTransform()
 		: m_origin(T(0))
 		, m_rotation(TMat<T, 3, 4>::getIdentity())
-		, m_scale(T(1))
+		, m_scale(T(1), T(1), T(1), T(0))
 	{
 	}
 
@@ -40,23 +40,26 @@ public:
 		const TVec<T, 3> s1 = m4.getColumn(1).xyz();
 		const TVec<T, 3> s2 = m4.getColumn(2).xyz();
 
-		const TVec<T, 3> scales(s0.getLength(), s1.getLength(), s2.getLength());
-		[[maybe_unused]] const T E = T(0.001);
-		ANKI_ASSERT(isZero(scales.x() - scales.y(), E) && isZero(scales.y() - scales.z(), E) && "Expecting uniform scale");
+		m_scale = TVec<T, 4>(s0.getLength(), s1.getLength(), s2.getLength(), T(0));
 
-		m_rotation.setColumns(s0 / scales.x(), s1 / scales.x(), s2 / scales.x(), TVec<T, 3>(T(0)));
+		m_rotation.setColumns(s0 / m_scale.x(), s1 / m_scale.x(), s2 / m_scale.x(), TVec<T, 3>(T(0)));
 		m_origin = m4.getTranslationPart().xyz0();
-		m_scale = scales.x();
 		check();
 	}
 
-	TTransform(const TVec<T, 4>& origin, const TMat<T, 3, 4>& rotation, const T scale)
+	TTransform(const TVec<T, 4>& origin, const TMat<T, 3, 4>& rotation, const TVec<T, 4>& scale)
 		: m_origin(origin)
 		, m_rotation(rotation)
 		, m_scale(scale)
 	{
 		check();
 	}
+
+	TTransform(const TVec<T, 3>& origin, const TMat<T, 3, 3>& rotation, const TVec<T, 3>& scale)
+		: TTransform(origin.xyz0(), TMat<T, 3, 4>(TVec<T, 3>(T(0)), rotation), scale.xyz0())
+	{
+		check();
+	}
 	/// @}
 
 	/// @name Accessors
@@ -93,16 +96,22 @@ public:
 		m_rotation.setTranslationPart(TVec<T, 3>(T(0)));
 	}
 
-	[[nodiscard]] T getScale() const
+	[[nodiscard]] const TVec<T, 4>& getScale() const
 	{
 		return m_scale;
 	}
 
-	void setScale(const T s)
+	void setScale(const TVec<T, 4>& s)
 	{
 		m_scale = s;
 		check();
 	}
+
+	void setScale(const TVec<T, 3>& s)
+	{
+		m_scale = s.xyz0();
+		check();
+	}
 	/// @}
 
 	/// @name Operators with same type
@@ -136,7 +145,7 @@ public:
 
 	[[nodiscard]] static TTransform getIdentity()
 	{
-		return TTransform(TVec<T, 4>(T(0)), TMat<T, 3, 4>::getIdentity(), T(1));
+		return TTransform(TVec<T, 4>(T(0)), TMat<T, 3, 4>::getIdentity(), TVec<T, 4>(T(1), T(1), T(1), T(0)));
 	}
 
 	/// @copybrief combineTTransformations
@@ -157,12 +166,12 @@ public:
 	/// Get the inverse transformation. Its faster that inverting a Mat4
 	[[nodiscard]] TTransform getInverse() const
 	{
-		check();
 		TTransform o;
 		o.m_rotation = m_rotation;
 		o.m_rotation.transposeRotationPart();
-		o.m_scale = T(1) / m_scale;
+		o.m_scale = T(1) / m_scale.xyz1();
 		o.m_origin = -(o.m_rotation * (o.m_scale * m_origin)).xyz0();
+		check();
 		return o;
 	}
 
@@ -177,7 +186,7 @@ public:
 	[[nodiscard]] TVec<T, 3> transform(const TVec<T, 3>& b) const
 	{
 		check();
-		return (m_rotation.getRotationPart() * (b * m_scale)) + m_origin.xyz();
+		return (m_rotation.getRotationPart() * (b * m_scale.xyz())) + m_origin.xyz();
 	}
 
 	/// Transform a TVec4. SIMD optimized
@@ -202,19 +211,24 @@ public:
 	[[nodiscard]] String toString() const requires(std::is_floating_point<T>::value)
 	{
 		String str;
-		String b = m_origin.toString();
+		String b = String("origin: ") + m_origin.toString();
 		str += b;
-		str += "\n";
+		str += "\nrotation:\n";
 
 		b = m_rotation.toString();
 		str += b;
 		str += "\n";
 
-		b = String().sprintf("%f", m_scale);
+		b = String().sprintf("scale: %f %f %f", m_scale.x(), m_scale.y(), m_scale.z());
 		str += b;
 
 		return str;
 	}
+
+	Bool hasUniformScale() const
+	{
+		return m_scale.x() == m_scale.y() && m_scale.x() == m_scale.z();
+	}
 	/// @}
 
 private:
@@ -222,13 +236,14 @@ private:
 	/// @{
 	TVec<T, 4> m_origin; ///< The rotation
 	TMat<T, 3, 4> m_rotation; ///< The translation
-	T m_scale; ///< The uniform scaling
+	TVec<T, 4> m_scale; ///< The scaling
 	/// @}
 
 	void check() const
 	{
 		ANKI_ASSERT(m_origin.w() == T(0));
-		ANKI_ASSERT(m_scale > T(0));
+		using TT = TVec<T, 3>;
+		ANKI_ASSERT(m_scale.w() == T(0) && m_scale.xyz() > TT(T(0)));
 	}
 };
 

+ 1 - 1
AnKi/Physics/Common.h

@@ -138,7 +138,7 @@ ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(PhysicsMaterialBit)
 	Transform out;
 	out.setRotation(toAnki(t.getBasis()));
 	out.setOrigin(Vec4(toAnki(t.getOrigin()), 0.0f));
-	out.setScale(1.0f);
+	out.setScale(Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 	return out;
 }
 /// @}

+ 1 - 1
AnKi/Physics/PhysicsPlayerController.cpp

@@ -11,7 +11,7 @@ namespace anki {
 PhysicsPlayerController::PhysicsPlayerController(const PhysicsPlayerControllerInitInfo& init)
 	: PhysicsFilteredObject(kClassType)
 {
-	const btTransform trf = toBt(Transform(init.m_position.xyz0(), Mat3x4::getIdentity(), 1.0f));
+	const btTransform trf = toBt(Transform(init.m_position.xyz0(), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 
 	m_convexShape.init(init.m_outerRadius, init.m_height);
 

+ 15 - 8
AnKi/Renderer/Dbg.cpp

@@ -209,14 +209,17 @@ void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
 	{
 		const U32 allAabbCount = GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getElementCount();
 
-		cmdb.bindUavBuffer(0, 2, GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferOffsetRange());
+		if(allAabbCount)
+		{
+			cmdb.bindUavBuffer(0, 2, GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferOffsetRange());
 
-		BufferOffsetRange indicesBuff;
-		BufferHandle dep;
-		getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
-		cmdb.bindUavBuffer(0, 3, indicesBuff);
+			BufferOffsetRange indicesBuff;
+			BufferHandle dep;
+			getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
+			cmdb.bindUavBuffer(0, 3, indicesBuff);
 
-		cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
+			cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
+		}
 	}
 
 	// Draw non-renderables
@@ -262,8 +265,12 @@ void Dbg::populateRenderGraph(RenderingContext& ctx)
 	BufferHandle dep;
 	getRenderer().getGBuffer().getVisibleAabbsBuffer(indicesBuff, dep);
 	pass.newBufferDependency(dep, BufferUsageBit::kUavGeometryRead);
-	getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
-	pass.newBufferDependency(dep, BufferUsageBit::kUavGeometryRead);
+
+	if(GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getElementCount())
+	{
+		getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
+		pass.newBufferDependency(dep, BufferUsageBit::kUavGeometryRead);
+	}
 }
 
 } // end namespace anki

+ 1 - 0
AnKi/Renderer/ForwardShading.cpp

@@ -23,6 +23,7 @@ namespace anki {
 
 void ForwardShading::populateRenderGraph(RenderingContext& ctx)
 {
+	m_runCtx = {};
 	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
 
 	const Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};

+ 2 - 1
AnKi/Renderer/IndirectDiffuseProbes.cpp

@@ -206,7 +206,8 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 			Frustum frustum;
 			{
 				frustum.setPerspective(kClusterObjectFrustumNearPlane, probeToRefresh->getRenderRadius(), kPi / 2.0f, kPi / 2.0f);
-				frustum.setWorldTransform(Transform(cellCenter.xyz0(), Frustum::getOmnidirectionalFrustumRotations()[f], 1.0f));
+				frustum.setWorldTransform(
+					Transform(cellCenter.xyz0(), Frustum::getOmnidirectionalFrustumRotations()[f], Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 				frustum.update();
 
 				Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};

+ 9 - 7
AnKi/Renderer/ProbeReflections.cpp

@@ -181,12 +181,15 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
 
 	RenderGraphDescription& rgraph = rctx.m_renderGraphDescr;
 
+	const LightComponent* dirLightc = SceneGraph::getSingleton().getDirectionalLight();
+	const Bool doShadows = dirLightc && dirLightc->getShadowEnabled();
+
 	// Create render targets now to save memory
-	RenderTargetHandle probeTexture = rgraph.importRenderTarget(&probeToRefresh->getReflectionTexture(), TextureUsageBit::kNone);
+	const RenderTargetHandle probeTexture = rgraph.importRenderTarget(&probeToRefresh->getReflectionTexture(), TextureUsageBit::kNone);
 	m_runCtx.m_probeTex = probeTexture;
-	BufferHandle irradianceDiceValuesBuffHandle = rgraph.importBuffer(m_irradiance.m_diceValuesBuff.get(), BufferUsageBit::kNone);
-	RenderTargetHandle gbufferDepthRt = rgraph.newRenderTarget(m_gbuffer.m_depthRtDescr);
-	RenderTargetHandle shadowMapRt = rgraph.newRenderTarget(m_shadowMapping.m_rtDescr);
+	const BufferHandle irradianceDiceValuesBuffHandle = rgraph.importBuffer(m_irradiance.m_diceValuesBuff.get(), BufferUsageBit::kNone);
+	const RenderTargetHandle gbufferDepthRt = rgraph.newRenderTarget(m_gbuffer.m_depthRtDescr);
+	const RenderTargetHandle shadowMapRt = (doShadows) ? rgraph.newRenderTarget(m_shadowMapping.m_rtDescr) : RenderTargetHandle();
 
 	Array<RenderTargetHandle, kGBufferColorRenderTargetCount> gbufferColorRts;
 	for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
@@ -202,7 +205,8 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
 		Frustum frustum;
 		{
 			frustum.setPerspective(kClusterObjectFrustumNearPlane, probeToRefresh->getRenderRadius(), kPi / 2.0f, kPi / 2.0f);
-			frustum.setWorldTransform(Transform(probeToRefresh->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[f], 1.0f));
+			frustum.setWorldTransform(
+				Transform(probeToRefresh->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[f], Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 			frustum.update();
 
 			Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
@@ -287,8 +291,6 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
 		}
 
 		// Shadow visibility. Optional
-		const LightComponent* dirLightc = SceneGraph::getSingleton().getDirectionalLight();
-		const Bool doShadows = dirLightc && dirLightc->getShadowEnabled();
 		GpuVisibilityOutput shadowVisOut;
 		GpuMeshletVisibilityOutput shadowMeshletVisOut;
 		Mat4 cascadeViewProjMat;

+ 2 - 1
AnKi/Renderer/ShadowMapping.cpp

@@ -386,7 +386,8 @@ void ShadowMapping::processLights(RenderingContext& ctx)
 				Frustum frustum;
 				frustum.init(FrustumType::kPerspective);
 				frustum.setPerspective(kClusterObjectFrustumNearPlane, lightc->getRadius(), kPi / 2.0f, kPi / 2.0f);
-				frustum.setWorldTransform(Transform(lightc->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[face], 1.0f));
+				frustum.setWorldTransform(
+					Transform(lightc->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[face], Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 				frustum.update();
 
 				GpuMeshletVisibilityOutput meshletVisOut;

+ 1 - 1
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -302,7 +302,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 	if(in.m_gatherAabbIndices)
 	{
 		out.m_visibleAaabbIndicesBuffer =
-			allocateTransientGpuMem(RenderStateBucketContainer::getSingleton().getBucketsActiveUserCount(in.m_technique) * sizeof(U32));
+			allocateTransientGpuMem((RenderStateBucketContainer::getSingleton().getBucketsActiveUserCount(in.m_technique) + 1) * sizeof(U32));
 	}
 
 	// Set instance sub-ranges

+ 1 - 1
AnKi/Scene/Components/LightComponent.cpp

@@ -287,7 +287,7 @@ void LightComponent::computeCascadeFrustums(const Frustum& primaryFrustum, Const
 			rot.setZAxis(zAxis);
 			rot.setTranslationPart(Vec3(0.0f));
 
-			const Transform cascadeTransform(eye.xyz0(), rot, 1.0f);
+			const Transform cascadeTransform(eye.xyz0(), rot, Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 			const Mat4 cascadeViewMat = Mat4(cascadeTransform.getInverse());
 
 			// Projection

+ 1 - 1
AnKi/Scene/Components/ParticleEmitterComponent.cpp

@@ -182,7 +182,7 @@ public:
 		Vec3 pos = getRandom(props.m_particle.m_minStartingPosition, props.m_particle.m_maxStartingPosition);
 		pos = trf.transform(pos);
 
-		m_body->setTransform(Transform(pos.xyz0(), trf.getRotation(), 1.0f));
+		m_body->setTransform(Transform(pos.xyz0(), trf.getRotation(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 		m_crntPosition = pos;
 	}
 

+ 1 - 1
AnKi/Scene/Events/AnimationEvent.cpp

@@ -50,7 +50,7 @@ Error AnimationEvent::update([[maybe_unused]] Second prevUpdateTime, Second crnt
 	// trf.setOrigin(Vec4(0.0f));
 	trf.setRotation(Mat3x4(Vec3(0.0f), rot));
 	// trf.setRotation(Mat3x4::getIdentity());
-	trf.setScale(scale);
+	trf.setScale(Vec4(scale, scale, scale, 0.0f));
 
 	m_associatedNodes[0]->setLocalTransform(trf);
 

+ 1 - 1
AnKi/Scene/RenderStateBucket.cpp

@@ -56,7 +56,7 @@ RenderStateBucketIndex RenderStateBucketContainer::addUser(const RenderStateInfo
 			if(buckets[i].m_userCount == 1)
 			{
 				ANKI_ASSERT(!buckets[i].m_program.isCreated());
-				ANKI_ASSERT(buckets[i].m_lod0MeshletGroupCount == meshletGroupCount && buckets[i].m_lod0MeshletGroupCount == lod0MeshletCount);
+				ANKI_ASSERT(buckets[i].m_lod0MeshletGroupCount == meshletGroupCount && buckets[i].m_lod0MeshletCount == lod0MeshletCount);
 				buckets[i].m_program = state.m_program;
 				++m_activeBucketCount[technique];
 

+ 2 - 2
AnKi/Scene/SceneNode.h

@@ -289,13 +289,13 @@ public:
 		return m_ltrf.getRotation();
 	}
 
-	void setLocalScale(F32 x)
+	void setLocalScale(const Vec4& x)
 	{
 		m_ltrf.setScale(x);
 		m_localTransformDirty = true;
 	}
 
-	F32 getLocalScale() const
+	const Vec4& getLocalScale() const
 	{
 		return m_ltrf.getScale();
 	}

+ 24 - 12
AnKi/Script/Math.cpp

@@ -26,7 +26,7 @@ static void deserializeVec2(const void* data, LuaUserData& self)
 	obj->deserialize(data);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoVec2 = {2841503007170002590, "Vec2", LuaUserData::computeSizeForGarbageCollected<Vec2>(), serializeVec2,
+LuaUserDataTypeInfo luaUserDataTypeInfoVec2 = {594303304060146034, "Vec2", LuaUserData::computeSizeForGarbageCollected<Vec2>(), serializeVec2,
 											   deserializeVec2};
 
 template<>
@@ -1035,7 +1035,7 @@ static void deserializeVec3(const void* data, LuaUserData& self)
 	obj->deserialize(data);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoVec3 = {-8987088827578326891, "Vec3", LuaUserData::computeSizeForGarbageCollected<Vec3>(), serializeVec3,
+LuaUserDataTypeInfo luaUserDataTypeInfoVec3 = {5669632566763941038, "Vec3", LuaUserData::computeSizeForGarbageCollected<Vec3>(), serializeVec3,
 											   deserializeVec3};
 
 template<>
@@ -2180,7 +2180,7 @@ static void deserializeVec4(const void* data, LuaUserData& self)
 	obj->deserialize(data);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoVec4 = {-1904445195878410002, "Vec4", LuaUserData::computeSizeForGarbageCollected<Vec4>(), serializeVec4,
+LuaUserDataTypeInfo luaUserDataTypeInfoVec4 = {-7510298399639860788, "Vec4", LuaUserData::computeSizeForGarbageCollected<Vec4>(), serializeVec4,
 											   deserializeVec4};
 
 template<>
@@ -3411,7 +3411,7 @@ static inline void wrapVec4(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMat3 = {-6370653520286654332, "Mat3", LuaUserData::computeSizeForGarbageCollected<Mat3>(), nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoMat3 = {-8522796721639548452, "Mat3", LuaUserData::computeSizeForGarbageCollected<Mat3>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Mat3>()
@@ -3797,7 +3797,7 @@ static inline void wrapMat3(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMat3x4 = {-1491362470876046537, "Mat3x4", LuaUserData::computeSizeForGarbageCollected<Mat3x4>(), nullptr,
+LuaUserDataTypeInfo luaUserDataTypeInfoMat3x4 = {6107000574328002637, "Mat3x4", LuaUserData::computeSizeForGarbageCollected<Mat3x4>(), nullptr,
 												 nullptr};
 
 template<>
@@ -4202,7 +4202,7 @@ static inline void wrapMat3x4(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoTransform = {-1850302193838084739, "Transform", LuaUserData::computeSizeForGarbageCollected<Transform>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoTransform = {-1440284075251026678, "Transform", LuaUserData::computeSizeForGarbageCollected<Transform>(),
 													nullptr, nullptr};
 
 template<>
@@ -4266,12 +4266,15 @@ static inline int pwrapTransformCtor1(lua_State* l)
 	Mat3x4* iarg1 = ud->getData<Mat3x4>();
 	Mat3x4 arg1(*iarg1);
 
-	F32 arg2;
-	if(LuaBinder::checkNumber(l, 3, arg2)) [[unlikely]]
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec4;
+	if(LuaBinder::checkUserData(l, 3, luaUserDataTypeInfoVec4, ud)) [[unlikely]]
 	{
 		return -1;
 	}
 
+	Vec4* iarg2 = ud->getData<Vec4>();
+	Vec4 arg2(*iarg2);
+
 	// Create user data
 	size = LuaUserData::computeSizeForGarbageCollected<Transform>();
 	voidp = lua_newuserdata(l, size);
@@ -4602,10 +4605,16 @@ static inline int pwrapTransformgetScale(lua_State* l)
 	Transform* self = ud->getData<Transform>();
 
 	// Call the method
-	F32 ret = self->getScale();
+	Vec4 ret = self->getScale();
 
 	// Push return value
-	lua_pushnumber(l, lua_Number(ret));
+	size = LuaUserData::computeSizeForGarbageCollected<Vec4>();
+	voidp = lua_newuserdata(l, size);
+	luaL_setmetatable(l, "Vec4");
+	ud = static_cast<LuaUserData*>(voidp);
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec4;
+	ud->initGarbageCollected(&luaUserDataTypeInfoVec4);
+	::new(ud->getData<Vec4>()) Vec4(std::move(ret));
 
 	return 1;
 }
@@ -4644,12 +4653,15 @@ static inline int pwrapTransformsetScale(lua_State* l)
 	Transform* self = ud->getData<Transform>();
 
 	// Pop arguments
-	F32 arg0;
-	if(LuaBinder::checkNumber(l, 2, arg0)) [[unlikely]]
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec4;
+	if(LuaBinder::checkUserData(l, 2, luaUserDataTypeInfoVec4, ud)) [[unlikely]]
 	{
 		return -1;
 	}
 
+	Vec4* iarg0 = ud->getData<Vec4>();
+	const Vec4& arg0(*iarg0);
+
 	// Call the method
 	self->setScale(arg0);
 

+ 3 - 3
AnKi/Script/Math.xml

@@ -470,7 +470,7 @@ namespace anki {]]></head>
 					<args>
 						<arg>Vec4</arg>
 						<arg>Mat3x4</arg>
-						<arg>F32</arg>
+						<arg>Vec4</arg>
 					</args>
 				</constructor>
 			</constructors>
@@ -497,11 +497,11 @@ namespace anki {]]></head>
 					</args>
 				</method>
 				<method name="getScale">
-					<return>F32</return>
+					<return>Vec4</return>
 				</method>
 				<method name="setScale">
 					<args>
-						<arg>F32</arg>
+						<arg>const Vec4&amp;</arg>
 					</args>
 				</method>
 			</methods>

+ 37 - 29
AnKi/Script/Scene.cpp

@@ -61,7 +61,7 @@ static EventManager* getEventManager(lua_State* l)
 using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-885021943768989307, "LightComponentType", 0, nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {1918372895594684481, "LightComponentType", 0, nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightComponentType>()
@@ -97,7 +97,7 @@ static inline void wrapLightComponentType(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	-8864757075459251556, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
+	-8393853726430350519, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArraySceneNodePtr>()
@@ -216,7 +216,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
-	-6416821202790667006, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
+	-1025709696283503968, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArrayBodyComponentPtr>()
@@ -334,7 +334,7 @@ static inline void wrapWeakArrayBodyComponentPtr(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-1248882138008092218, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-3675274546931224198, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(), nullptr, nullptr};
 
 template<>
@@ -945,7 +945,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-7053311132600625275, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-2073814368319048649, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(), nullptr, nullptr};
 
 template<>
@@ -1117,7 +1117,7 @@ static inline void wrapDecalComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-6126765841561229872, "LensFlareComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {5474230361879199779, "LensFlareComponent",
 															 LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(), nullptr, nullptr};
 
 template<>
@@ -1280,7 +1280,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-2675105803575253943, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-2846863010728672642, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(), nullptr, nullptr};
 
 template<>
@@ -1433,7 +1433,7 @@ static inline void wrapBodyComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {-7285899701541304050, "TriggerComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {4126023717417036406, "TriggerComponent",
 														   LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr, nullptr};
 
 template<>
@@ -1596,7 +1596,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {-2750867585902730421, "FogDensityComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {-8065432833529453691, "FogDensityComponent",
 															  LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(), nullptr, nullptr};
 
 template<>
@@ -1799,7 +1799,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {5174533843768029813, "CameraComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {-1108575505958935399, "CameraComponent",
 														  LuaUserData::computeSizeForGarbageCollected<CameraComponent>(), nullptr, nullptr};
 
 template<>
@@ -1881,8 +1881,8 @@ static inline void wrapCameraComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	-1065384978556751245, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(),
-	nullptr, nullptr};
+	8571128079366460170, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr,
+	nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<GlobalIlluminationProbeComponent>()
@@ -2128,7 +2128,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	2405181644341355052, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
+	2942902628021820888, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ReflectionProbeComponent>()
@@ -2243,7 +2243,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	-253597322000071618, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
+	1295664338858625731, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ParticleEmitterComponent>()
@@ -2305,7 +2305,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-4403902270999293821, "ModelComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-3217880167307335193, "ModelComponent",
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(), nullptr, nullptr};
 
 template<>
@@ -2368,7 +2368,7 @@ static inline void wrapModelComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {8389361332600700112, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {-1893988325997574862, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(), nullptr, nullptr};
 
 template<>
@@ -2431,7 +2431,7 @@ static inline void wrapSkinComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {-8681371155253449152, "SkyboxComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {-4950185802732061592, "SkyboxComponent",
 														  LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr, nullptr};
 
 template<>
@@ -2882,7 +2882,7 @@ static inline void wrapSkyboxComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {-8010702667117825592, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {-8850241204806571619, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
 													nullptr, nullptr};
 
 template<>
@@ -3232,12 +3232,15 @@ static inline int pwrapSceneNodesetLocalScale(lua_State* l)
 	SceneNode* self = ud->getData<SceneNode>();
 
 	// Pop arguments
-	F32 arg0;
-	if(LuaBinder::checkNumber(l, 2, arg0)) [[unlikely]]
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec4;
+	if(LuaBinder::checkUserData(l, 2, luaUserDataTypeInfoVec4, ud)) [[unlikely]]
 	{
 		return -1;
 	}
 
+	Vec4* iarg0 = ud->getData<Vec4>();
+	const Vec4& arg0(*iarg0);
+
 	// Call the method
 	self->setLocalScale(arg0);
 
@@ -3278,10 +3281,14 @@ static inline int pwrapSceneNodegetLocalScale(lua_State* l)
 	SceneNode* self = ud->getData<SceneNode>();
 
 	// Call the method
-	F32 ret = self->getLocalScale();
+	const Vec4& ret = self->getLocalScale();
 
 	// Push return value
-	lua_pushnumber(l, lua_Number(ret));
+	voidp = lua_newuserdata(l, sizeof(LuaUserData));
+	ud = static_cast<LuaUserData*>(voidp);
+	luaL_setmetatable(l, "Vec4");
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec4;
+	ud->initPointed(&luaUserDataTypeInfoVec4, &ret);
 
 	return 1;
 }
@@ -4712,7 +4719,7 @@ static inline void wrapSceneNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {-5322229350784875449, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {-4636742016121079003, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
 													 nullptr, nullptr};
 
 template<>
@@ -4898,7 +4905,8 @@ static inline void wrapSceneGraph(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {1485192924185736197, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {-1645267055986152358, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr,
+												nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Event>()
@@ -4962,7 +4970,7 @@ static inline void wrapEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {-3564993186665272650, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {6526760604254386170, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
 													 nullptr, nullptr};
 
 template<>
@@ -5081,7 +5089,7 @@ static inline void wrapLightEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-8069052670469915022, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-6276976464258063819, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
 													  nullptr, nullptr};
 
 template<>
@@ -5097,7 +5105,7 @@ static inline void wrapScriptEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {7671805760892542220, "JitterMoveEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {-5524576077885319542, "JitterMoveEvent",
 														  LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr, nullptr};
 
 template<>
@@ -5172,7 +5180,7 @@ static inline void wrapJitterMoveEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-1166819361716118098, "AnimationEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-3440619397170119690, "AnimationEvent",
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(), nullptr, nullptr};
 
 template<>
@@ -5188,7 +5196,7 @@ static inline void wrapAnimationEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-481329727758819632, "EventManager",
+LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-3352184178300328573, "EventManager",
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 
 template<>

+ 4 - 4
AnKi/Script/Scene.xml

@@ -70,7 +70,7 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 			<enumerant name="kDirectional"/>
 		</enum>
 	</enums>
-	
+
 	<classes>
 		<!-- Other -->
 		<class name="WeakArraySceneNodePtr">
@@ -416,11 +416,11 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 				</method>
 				<method name="setLocalScale">
 					<args>
-						<arg>F32</arg>
+						<arg>const Vec4&amp;</arg>
 					</args>
 				</method>
 				<method name="getLocalScale">
-					<return>F32</return>
+					<return>const Vec4&amp;</return>
 				</method>
 				<method name="setLocalTransform">
 					<args>
@@ -430,7 +430,7 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 				<method name="getLocalTransform">
 					<return>const Transform&amp;</return>
 				</method>
-				
+
 				<method name="newComponent&lt;LightComponent&gt;" alias="newLightComponent">
 					<return>LightComponent*</return>
 				</method>

+ 6 - 5
AnKi/Shaders/GpuVisibility.ankiprog

@@ -260,13 +260,14 @@ struct DrawIndirectArgsWithPadding
 #if HASH_VISIBLES
 	// Update the renderables hash
 	{
+		// Transform a random point as a way to get a feel for the transform
 		const Mat3x4 trf = g_gpuScene.Load<Mat3x4>(renderable.m_worldTransformsOffset);
-		const Vec3 pos = trf.getTranslationPart();
-		const UVec3 posu = UVec3(asuint(pos.x), asuint(pos.y), asuint(pos.z));
+		const Vec3 pt = mul(trf, Vec4(1503.98f, 2006.8f, -1400.16f, 1.0f));
+		const UVec3 ptu = UVec3(asuint(pt.x), asuint(pt.y), asuint(pt.z));
 
-		U32 hash = posu.x;
-		hash ^= posu.y;
-		hash ^= posu.z;
+		U32 hash = ptu.x;
+		hash ^= ptu.y;
+		hash ^= ptu.z;
 		hash ^= renderable.m_uuid;
 
 		InterlockedXor(g_hash[0].m_renderablesHash, hash);

+ 6 - 6
Samples/PhysicsPlayground/Main.cpp

@@ -116,7 +116,7 @@ Error MyApp::sampleExtraInit()
 	if(1)
 	{
 		SceneNode& cam = SceneGraph::getSingleton().getActiveCameraNode();
-		cam.setLocalTransform(Transform(Vec4(0.0, 2.0, 5.0, 0.0), Mat3x4::getIdentity(), 1.0));
+		cam.setLocalTransform(Transform(Vec4(0.0, 2.0, 5.0, 0.0), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 
 		SceneNode* player;
 		ANKI_CHECK(SceneGraph::getSingleton().newSceneNode("player", player));
@@ -136,7 +136,7 @@ Error MyApp::sampleExtraInit()
 
 		BodyComponent* bodyc = monkey->newComponent<BodyComponent>();
 		bodyc->loadMeshResource("Assets/Suzanne_e3526e1428c0763c.ankimesh");
-		bodyc->teleportTo(Transform(Vec4(-0.0f, 4.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), 1.0f));
+		bodyc->teleportTo(Transform(Vec4(-0.0f, 4.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 		bodyc->setMass(2.0f);
 
 		JointComponent* jointc = monkey->newComponent<JointComponent>();
@@ -154,7 +154,7 @@ Error MyApp::sampleExtraInit()
 			ANKI_CHECK(SceneGraph::getSingleton().newSceneNode(String().sprintf("monkey_chain%u", i).toCString(), monkey));
 			monkey->newComponent<ModelComponent>()->loadModelResource("Assets/Suzanne_dynamic_36043dae41fe12d5.ankimdl");
 
-			Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), 1.0f);
+			Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0, 1.0, 1.0, 0.0));
 			trf.setOrigin(trf.getOrigin() - Vec4(0.0f, F32(i) * 1.25f, 0.0f, 0.0f));
 			// trf.getOrigin().x() -= i * 0.25f;
 
@@ -187,7 +187,7 @@ Error MyApp::sampleExtraInit()
 		ANKI_CHECK(SceneGraph::getSingleton().newSceneNode("trigger", node));
 		TriggerComponent* triggerc = node->newComponent<TriggerComponent>();
 		triggerc->setSphereVolumeRadius(1.8f);
-		node->setLocalTransform(Transform(Vec4(1.0f, 0.5f, 0.0f, 0.0f), Mat3x4::getIdentity(), 1.0f));
+		node->setLocalTransform(Transform(Vec4(1.0f, 0.5f, 0.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 	}
 
 	Input::getSingleton().lockCursor(true);
@@ -299,7 +299,7 @@ Error MyApp::userMainLoop(Bool& quit, [[maybe_unused]] Second elapsedTime)
 			rot.reorthogonalize();
 
 			// Update move
-			player.setLocalTransform(Transform(origin, rot, 1.0));
+			player.setLocalTransform(Transform(origin, rot, Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 		}
 
 		const F32 speed = 0.5;
@@ -381,7 +381,7 @@ Error MyApp::userMainLoop(Bool& quit, [[maybe_unused]] Second elapsedTime)
 			rot.setYAxis(yAxis);
 			rot.setZAxis(zAxis);
 
-			Transform trf(ray.m_hitPosition.xyz0(), rot, 1.0f);
+			Transform trf(ray.m_hitPosition.xyz0(), rot, Vec4(1.0f, 1.0f, 1.0f, 0.0f));
 
 			// Create an obj
 			static U32 id = 0;

BIN
Samples/SimpleScene/Assets/CornellBox.blend


BIN
Samples/SimpleScene/Assets/Mesh_6.001_2550937d23ca3066.ankimesh


+ 1 - 1
Samples/SimpleScene/Assets/Mesh_6_shortBox_6c09f7141caa6339.ankimdl → Samples/SimpleScene/Assets/Mesh_6.001_shortBox_4122029d89b53875.ankimdl

@@ -1,7 +1,7 @@
 <model>
 	<modelPatches>
 		<modelPatch>
-			<mesh>Assets/Mesh_6_a078cf217893be6f.ankimesh</mesh>
+			<mesh>Assets/Mesh_6.001_2550937d23ca3066.ankimesh</mesh>
 			<material>Assets/shortBox_122467965d493dab.ankimtl</material>
 		</modelPatch>
 	</modelPatches>

BIN
Samples/SimpleScene/Assets/Mesh_7.001_95b61c94f8a0ad1c.ankimesh


+ 1 - 1
Samples/SimpleScene/Assets/Mesh_7_tallBox_e327ec5ce1a1e7eb.ankimdl → Samples/SimpleScene/Assets/Mesh_7.001_tallBox_287bd3c185e6905a.ankimdl

@@ -1,7 +1,7 @@
 <model>
 	<modelPatches>
 		<modelPatch>
-			<mesh>Assets/Mesh_7_4b76b132380d8a62.ankimesh</mesh>
+			<mesh>Assets/Mesh_7.001_95b61c94f8a0ad1c.ankimesh</mesh>
 			<material>Assets/tallBox_15316a0c94bdf7f6.ankimtl</material>
 		</modelPatch>
 	</modelPatches>

+ 20 - 20
Samples/SimpleScene/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: C:\src\anki\out\build\x64-Debug\Binaries\GltfImporter.exe CornellBox.gltf .. -rpath Assets -texrpath Assets -v -j 0
+-- Generated by: C:\src\anki\out\build\x64-Debug\Binaries\GltfImporter.exe CornellBox.gltf .. -rpath Assets -texrpath Assets -v -j 0 -light-scale 0.01839878467931728
 local scene = getSceneGraph()
 local events = getEventManager()
 
@@ -9,7 +9,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Mesh_1")
@@ -19,7 +19,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Mesh_2")
@@ -29,7 +29,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Mesh_3")
@@ -39,7 +39,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Mesh_4")
@@ -49,7 +49,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Mesh_5")
@@ -59,27 +59,27 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
-node = scene:newSceneNode("Mesh_6")
-node:newModelComponent():loadModelResource("Assets/Mesh_6_shortBox_6c09f7141caa6339.ankimdl")
+node = scene:newSceneNode("Mesh_7")
+node:newModelComponent():loadModelResource("Assets/Mesh_7.001_tallBox_287bd3c185e6905a.ankimdl")
 trf = Transform.new()
-trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
+trf:setOrigin(Vec4.new(-1.675000, 3.600000, -1.450001, 0))
 rot = Mat3x4.new()
-rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
+rot:setAll(0.958636, 0.000000, 0.284634, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, -0.284634, 0.000000, 0.958636, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
-node = scene:newSceneNode("Mesh_7")
-node:newModelComponent():loadModelResource("Assets/Mesh_7_tallBox_e327ec5ce1a1e7eb.ankimdl")
+node = scene:newSceneNode("Mesh_6")
+node:newModelComponent():loadModelResource("Assets/Mesh_6.001_shortBox_4122029d89b53875.ankimdl")
 trf = Transform.new()
-trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
+trf:setOrigin(Vec4.new(1.637500, 1.800000, 1.862499, 0))
 rot = Mat3x4.new()
-rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
+rot:setAll(0.966822, 0.000000, -0.255450, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.255450, 0.000000, 0.966822, 0.000000)
 trf:setRotation(rot)
-trf:setScale(5.000000)
+trf:setScale(Vec4.new(5.000000, 5.000000, 5.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Camera")
@@ -91,7 +91,7 @@ trf:setOrigin(Vec4.new(0.217066, 6.668793, 17.325689, 0))
 rot = Mat3x4.new()
 rot:setAll(0.999854, -0.000334, 0.017085, 0.000000, -0.001690, 0.992972, 0.118341, 0.000000, -0.017005, -0.118352, 0.992826, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Point")
@@ -105,7 +105,7 @@ trf:setOrigin(Vec4.new(0.000000, 8.913514, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Cube.011")
@@ -116,5 +116,5 @@ trf:setOrigin(Vec4.new(-0.064907, 4.847455, -0.144611, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)

BIN
Samples/SkeletalAnimation/Assets/Mesh_e891faf0733c881d.ankimesh


+ 18 - 26
Samples/SkeletalAnimation/Assets/Robot.001_851820527fac54db.ankimtl

@@ -1,36 +1,28 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<shaderPrograms>
-		<shaderProgram name="GBufferGeneric">
-			<mutation>
-				<mutator name="DIFFUSE_TEX" value="1"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="1"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="1"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</shaderProgram>
-		
-		<shaderProgram name="RtShadowsHit">
-			<mutation>
-				<mutator name="ALPHA_TEXTURE" value="0"/>
-			</mutation>
-		</shaderProgram>
-
-	</shaderPrograms>
+	<shaderProgram name="GBufferGeneric">
+		<mutation>
+			<mutator name="DIFFUSE_TEX" value="1"/>
+			<mutator name="SPECULAR_TEX" value="0"/>
+			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
+			<mutator name="NORMAL_TEX" value="1"/>
+			<mutator name="PARALLAX" value="0"/>
+			<mutator name="EMISSIVE_TEX" value="0"/>
+			<mutator name="ALPHA_TEST" value="0"/>
+		</mutation>
+	</shaderProgram>
 
 	<inputs>
 		
-		<input name="m_diffTex" value="Assets/Drone_diff.ankitex"/>
-		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="m_roughnessTex" value="Assets/Drone_roughness.ankitex"/>
-		<input name="m_metallic" value="1.000000"/>
+		<input name="m_diffuseTex" value="Assets/Drone_diff.ankitex"/>
+		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
+		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
+		<input name="m_roughnessMetalnessTex" value="Assets/Drone_roughness.ankitex"/>
+		<input name="m_roughnessScale" value="1.000000"/>
+		<input name="m_metalnessScale" value="1.000000"/>
 		<input name="m_normalTex" value="Assets/Drone_normal.ankitex"/>
-		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
+		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 	</inputs>

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

@@ -1,4 +1,4 @@
--- Generated by: C:\src\anki\out\build\x64-Release\Binaries\GltfImporter.exe E:/etc/blender/characters/animated_droid/gltf/droid.gltf C:/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets -v
+-- Generated by: C:\src\anki\out\build\x64-Debug\Binaries\GltfImporter.exe droid.gltf C:/src/anki/Samples/SkeletalAnimation/Assets/ -rpath Assets -texrpath Assets -v
 local scene = getSceneGraph()
 local events = getEventManager()
 
@@ -10,7 +10,7 @@ trf:setOrigin(Vec4.new(0.000000, 0.000000, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Cube")
@@ -21,7 +21,7 @@ trf:setOrigin(Vec4.new(0.000000, 11.057286, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Cube.001")
@@ -32,7 +32,7 @@ trf:setOrigin(Vec4.new(0.000000, 11.057286, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("room")
@@ -42,7 +42,7 @@ trf:setOrigin(Vec4.new(0.000000, 11.142166, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(9.000000)
+trf:setScale(Vec4.new(9.000000, 9.000000, 9.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Lamp")
@@ -56,7 +56,7 @@ trf:setOrigin(Vec4.new(4.076245, 5.903862, -1.005454, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000000, -1.000000, -0.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("Camera")
@@ -68,7 +68,7 @@ trf:setOrigin(Vec4.new(5.526846, 8.527484, -6.015655, 0))
 rot = Mat3x4.new()
 rot:setAll(-0.805081, -0.216096, 0.552401, 0.000000, 0.056206, 0.899296, 0.433714, 0.000000, -0.590496, 0.380223, -0.711860, 0.000000)
 trf:setRotation(rot)
-trf:setScale(1.000000)
+trf:setScale(Vec4.new(1.000000, 1.000000, 1.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("room.001")
@@ -78,7 +78,7 @@ trf:setOrigin(Vec4.new(0.000000, 11.142166, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(9.000000)
+trf:setScale(Vec4.new(9.000000, 9.000000, 9.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("room.002")
@@ -88,7 +88,7 @@ trf:setOrigin(Vec4.new(0.000000, 11.142166, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(9.000000)
+trf:setScale(Vec4.new(9.000000, 9.000000, 9.000000, 0))
 node:setLocalTransform(trf)
 
 node = scene:newSceneNode("room.003")
@@ -98,5 +98,5 @@ trf:setOrigin(Vec4.new(0.000000, 11.142166, 0.000000, 0))
 rot = Mat3x4.new()
 rot:setAll(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000)
 trf:setRotation(rot)
-trf:setScale(9.000000)
+trf:setScale(Vec4.new(9.000000, 9.000000, 9.000000, 0))
 node:setLocalTransform(trf)

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


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


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


+ 16 - 26
Samples/SkeletalAnimation/Assets/room.blue_21e71ba855d95ca2.ankimtl

@@ -1,36 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<shaderPrograms>
-		<shaderProgram name="GBufferGeneric">
-			<mutation>
-				<mutator name="DIFFUSE_TEX" value="0"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</shaderProgram>
-		
-		<shaderProgram name="RtShadowsHit">
-			<mutation>
-				<mutator name="ALPHA_TEXTURE" value="0"/>
-			</mutation>
-		</shaderProgram>
-
-	</shaderPrograms>
+	<shaderProgram name="GBufferGeneric">
+		<mutation>
+			<mutator name="DIFFUSE_TEX" value="0"/>
+			<mutator name="SPECULAR_TEX" value="0"/>
+			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
+			<mutator name="NORMAL_TEX" value="0"/>
+			<mutator name="PARALLAX" value="0"/>
+			<mutator name="EMISSIVE_TEX" value="0"/>
+			<mutator name="ALPHA_TEST" value="0"/>
+		</mutation>
+	</shaderProgram>
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.000000 0.000000 0.500000"/>
-		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="m_roughness" value="0.500000"/>
-		<input name="m_metallic" value="0.000000"/>
+		<input name="m_diffuseScale" value="0.000000 0.000000 0.500000 1.000000"/>
+		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
+		<input name="m_roughnessScale" value="0.500000"/>
+		<input name="m_metalnessScale" value="0.000000"/>
 		
-		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
+		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 	</inputs>

+ 16 - 26
Samples/SkeletalAnimation/Assets/room.green_c7dc339831ac73a2.ankimtl

@@ -1,36 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<shaderPrograms>
-		<shaderProgram name="GBufferGeneric">
-			<mutation>
-				<mutator name="DIFFUSE_TEX" value="0"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</shaderProgram>
-		
-		<shaderProgram name="RtShadowsHit">
-			<mutation>
-				<mutator name="ALPHA_TEXTURE" value="0"/>
-			</mutation>
-		</shaderProgram>
-
-	</shaderPrograms>
+	<shaderProgram name="GBufferGeneric">
+		<mutation>
+			<mutator name="DIFFUSE_TEX" value="0"/>
+			<mutator name="SPECULAR_TEX" value="0"/>
+			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
+			<mutator name="NORMAL_TEX" value="0"/>
+			<mutator name="PARALLAX" value="0"/>
+			<mutator name="EMISSIVE_TEX" value="0"/>
+			<mutator name="ALPHA_TEST" value="0"/>
+		</mutation>
+	</shaderProgram>
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.000000 0.500000 0.000000"/>
-		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="m_roughness" value="0.500000"/>
-		<input name="m_metallic" value="0.000000"/>
+		<input name="m_diffuseScale" value="0.000000 0.500000 0.000000 1.000000"/>
+		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
+		<input name="m_roughnessScale" value="0.500000"/>
+		<input name="m_metalnessScale" value="0.000000"/>
 		
-		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
+		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 	</inputs>

+ 16 - 26
Samples/SkeletalAnimation/Assets/room.red_4176c8682cee36ac.ankimtl

@@ -1,36 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<shaderPrograms>
-		<shaderProgram name="GBufferGeneric">
-			<mutation>
-				<mutator name="DIFFUSE_TEX" value="0"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</shaderProgram>
-		
-		<shaderProgram name="RtShadowsHit">
-			<mutation>
-				<mutator name="ALPHA_TEXTURE" value="0"/>
-			</mutation>
-		</shaderProgram>
-
-	</shaderPrograms>
+	<shaderProgram name="GBufferGeneric">
+		<mutation>
+			<mutator name="DIFFUSE_TEX" value="0"/>
+			<mutator name="SPECULAR_TEX" value="0"/>
+			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
+			<mutator name="NORMAL_TEX" value="0"/>
+			<mutator name="PARALLAX" value="0"/>
+			<mutator name="EMISSIVE_TEX" value="0"/>
+			<mutator name="ALPHA_TEST" value="0"/>
+		</mutation>
+	</shaderProgram>
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.500000 0.000000 0.000000"/>
-		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="m_roughness" value="0.500000"/>
-		<input name="m_metallic" value="0.000000"/>
+		<input name="m_diffuseScale" value="0.500000 0.000000 0.000000 1.000000"/>
+		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
+		<input name="m_roughnessScale" value="0.500000"/>
+		<input name="m_metalnessScale" value="0.000000"/>
 		
-		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
+		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 	</inputs>

BIN
Samples/SkeletalAnimation/Assets/room_bb0180d3054a4db3.ankimesh


+ 16 - 26
Samples/SkeletalAnimation/Assets/room_bb0180d3054a4db3.ankimtl

@@ -1,36 +1,26 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!-- This file is auto generated by ImporterMaterial.cpp -->
 <material shadows="1">
-	<shaderPrograms>
-		<shaderProgram name="GBufferGeneric">
-			<mutation>
-				<mutator name="DIFFUSE_TEX" value="0"/>
-				<mutator name="SPECULAR_TEX" value="0"/>
-				<mutator name="ROUGHNESS_TEX" value="0"/>
-				<mutator name="METAL_TEX" value="0"/>
-				<mutator name="NORMAL_TEX" value="0"/>
-				<mutator name="PARALLAX" value="0"/>
-				<mutator name="EMISSIVE_TEX" value="0"/>
-				<mutator name="ALPHA_TEST" value="0"/>
-			</mutation>
-		</shaderProgram>
-		
-		<shaderProgram name="RtShadowsHit">
-			<mutation>
-				<mutator name="ALPHA_TEXTURE" value="0"/>
-			</mutation>
-		</shaderProgram>
-
-	</shaderPrograms>
+	<shaderProgram name="GBufferGeneric">
+		<mutation>
+			<mutator name="DIFFUSE_TEX" value="0"/>
+			<mutator name="SPECULAR_TEX" value="0"/>
+			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
+			<mutator name="NORMAL_TEX" value="0"/>
+			<mutator name="PARALLAX" value="0"/>
+			<mutator name="EMISSIVE_TEX" value="0"/>
+			<mutator name="ALPHA_TEST" value="0"/>
+		</mutation>
+	</shaderProgram>
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.613641 0.750176 0.800000"/>
-		<input name="m_specColor" value="0.040000 0.040000 0.040000"/>
-		<input name="m_roughness" value="0.500000"/>
-		<input name="m_metallic" value="0.000000"/>
+		<input name="m_diffuseScale" value="0.613641 0.750176 0.800000 1.000000"/>
+		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
+		<input name="m_roughnessScale" value="0.500000"/>
+		<input name="m_metalnessScale" value="0.000000"/>
 		
-		<input name="m_emission" value="0.000000 0.000000 0.000000"/>
+		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
 		
 	</inputs>

File diff suppressed because it is too large
+ 113 - 113
Samples/Sponza/Assets/Scene.lua


+ 2 - 2
Tests/Gr/Gr.cpp

@@ -2669,8 +2669,8 @@ void main()
 		HighRezTimer timer;
 		timer.start();
 
-		const Vec4 cameraPos = {0.0f, 0.0f, 3.0f, 0.0f};
-		const Mat4 viewMat = Mat4{Transform{cameraPos, Mat3x4::getIdentity(), 1.0f}}.getInverse();
+		const Vec4 cameraPos(0.0f, 0.0f, 3.0f, 0.0f);
+		const Mat4 viewMat = Mat4(cameraPos.xyz(), Mat3::getIdentity(), Vec3(1.0f)).getInverse();
 		const Mat4 projMat = Mat4::calculatePerspectiveProjectionMatrix(toRad(90.0f), toRad(90.0f), 0.01f, 1000.0f);
 
 		CommandBufferInitInfo cinit;

Some files were not shown because too many files changed in this diff