Browse Source

Change the way cascade distances are calculated

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
2bb77070a2
58 changed files with 572 additions and 746 deletions
  1. 0 1
      AnKi/Importer/GltfImporter.cpp
  2. 5 3
      AnKi/Renderer/ClusterBinning.cpp
  3. 1 3
      AnKi/Renderer/RenderQueue.h
  4. 2 1
      AnKi/Renderer/ShadowMapping.cpp
  5. 1 1
      AnKi/Renderer/TraditionalDeferredShading.cpp
  6. 6 1
      AnKi/Scene/CameraNode.cpp
  7. 11 0
      AnKi/Scene/Common.h
  8. 52 0
      AnKi/Scene/Components/FrustumComponent.cpp
  9. 106 94
      AnKi/Scene/Components/FrustumComponent.h
  10. 6 4
      AnKi/Scene/Components/LightComponent.cpp
  11. 5 2
      AnKi/Scene/ConfigVars.defs.h
  12. 10 4
      AnKi/Scene/GlobalIlluminationProbeNode.cpp
  13. 8 1
      AnKi/Scene/ReflectionProbeNode.cpp
  14. 5 2
      AnKi/Scene/Visibility.cpp
  15. 66 58
      AnKi/Script/Scene.cpp
  16. 5 3
      AnKi/Script/Scene.xml
  17. 51 51
      AnKi/ShaderCompiler/ShaderProgramParser.cpp
  18. 0 12
      AnKi/Shaders/Common.glsl
  19. 0 30
      AnKi/Shaders/Include/ClusteredShadingFunctions.h
  20. 50 50
      AnKi/Shaders/Include/ClusteredShadingTypes.h
  21. 22 5
      AnKi/Shaders/Include/Common.h
  22. 12 12
      AnKi/Shaders/Include/ModelTypes.h
  23. 40 24
      AnKi/Shaders/LightFunctions.glsl
  24. 1 1
      AnKi/Shaders/LightShading.ankiprog
  25. 1 1
      AnKi/Shaders/RtShadowsRayGen.ankiprog
  26. 52 17
      AnKi/Shaders/ShadowmapsResolve.glsl
  27. 0 1
      AnKi/Shaders/VolumetricFogAccumulation.ankiprog
  28. 4 4
      AnKi/Shaders/VolumetricLightingAccumulation.ankiprog
  29. 0 2
      Samples/PhysicsPlayground/Assets/Scene.lua
  30. 0 2
      Samples/SimpleScene/Assets/Scene.lua
  31. 8 8
      Samples/SkeletalAnimation/Assets/Armature.002_9ddcea0a08bd9d11.ankiskel
  32. 0 105
      Samples/SkeletalAnimation/Assets/ArmatureAction.001_ed176268e078c4cc.ankianim
  33. 0 15
      Samples/SkeletalAnimation/Assets/Armature_de7b8c5e15ab3f1c.ankiskel
  34. 0 16
      Samples/SkeletalAnimation/Assets/CameraAction_59f70a6275119751.ankianim
  35. 0 10
      Samples/SkeletalAnimation/Assets/Cube.001Action_55146e55435d9487.ankianim
  36. 0 10
      Samples/SkeletalAnimation/Assets/CubeAction_cc97b6f981ce5033.ankianim
  37. BIN
      Samples/SkeletalAnimation/Assets/Drone_diff.ankitex
  38. BIN
      Samples/SkeletalAnimation/Assets/Drone_normal.ankitex
  39. BIN
      Samples/SkeletalAnimation/Assets/Drone_roughness.ankitex
  40. 0 10
      Samples/SkeletalAnimation/Assets/FireAction_8ff669cf4772f835.ankianim
  41. 0 10
      Samples/SkeletalAnimation/Assets/FireBisAction_e3f9104496e07f9b.ankianim
  42. 0 10
      Samples/SkeletalAnimation/Assets/FireTertAction_e587bc6a414ddf8f.ankianim
  43. 0 10
      Samples/SkeletalAnimation/Assets/LampAction_351580a78ce0a468.ankianim
  44. 0 37
      Samples/SkeletalAnimation/Assets/Robot_a9af3c46eb28a7d4.ankimtl
  45. 5 18
      Samples/SkeletalAnimation/Assets/Scene.lua
  46. 0 10
      Samples/SkeletalAnimation/Assets/droid.001Action_b8b4c8d9e4cfaa52.ankianim
  47. BIN
      Samples/SkeletalAnimation/Assets/droid_30559463d0f81c57.ankimesh
  48. 0 8
      Samples/SkeletalAnimation/Assets/droid_Robot_7a560a2f010dcbd0.ankimdl
  49. 31 31
      Samples/SkeletalAnimation/Assets/float.001_ccb9eb33e30c8fa4.ankianim
  50. 0 10
      Samples/SkeletalAnimation/Assets/room.001Action_da34129e49687cba.ankianim
  51. 0 10
      Samples/SkeletalAnimation/Assets/room.002Action_90df7d371bb35e9f.ankianim
  52. 0 10
      Samples/SkeletalAnimation/Assets/room.003Action_5d16e3632dd1d1bf.ankianim
  53. 1 1
      Samples/SkeletalAnimation/Assets/room.blue_21e71ba855d95ca2.ankimtl
  54. 1 1
      Samples/SkeletalAnimation/Assets/room.green_c7dc339831ac73a2.ankimtl
  55. 1 1
      Samples/SkeletalAnimation/Assets/room.red_4176c8682cee36ac.ankimtl
  56. 0 10
      Samples/SkeletalAnimation/Assets/roomAction_be82826f0266aef7.ankianim
  57. 3 3
      Samples/SkeletalAnimation/Assets/wave_6cf284ed471bff3b.ankianim
  58. 0 2
      Samples/Sponza/Assets/Scene.lua

+ 0 - 1
AnKi/Importer/GltfImporter.cpp

@@ -1086,7 +1086,6 @@ Error GltfImporter::writeCamera(const cgltf_node& node,
 
 	ANKI_CHECK(m_sceneFile.writeTextf("frustumc:setPerspective(%f, %f, getMainRenderer():getAspectRatio() * %f, %f)\n",
 									  cam.znear, cam.zfar, cam.yfov, cam.yfov));
-	ANKI_CHECK(m_sceneFile.writeText("frustumc:setShadowCascadesDistancePower(1.5)\n"));
 
 	return Error::kNone;
 }

+ 5 - 3
AnKi/Renderer/ClusterBinning.cpp

@@ -459,11 +459,13 @@ void ClusterBinning::writeClustererBuffersTask()
 			const DirectionalLightQueueElement& in = rqueue.m_directionalLight;
 
 			out.m_diffuseColor = in.m_diffuseColor;
-			out.m_cascadeCount = in.m_shadowCascadeCount;
+			out.m_shadowCascadeCount = in.m_shadowCascadeCount;
 			out.m_direction = in.m_direction;
 			out.m_active = 1;
-			out.m_effectiveShadowDistance = in.m_effectiveShadowDistance;
-			out.m_shadowCascadesDistancePower = in.m_shadowCascadesDistancePower;
+			for(U32 i = 0; i < kMaxShadowCascades; ++i)
+			{
+				out.m_shadowCascadeDistances[i] = in.m_shadowCascadesDistances[i];
+			}
 			out.m_shadowLayer = (in.hasShadow()) ? in.m_shadowLayer : kMaxU32;
 
 			for(U cascade = 0; cascade < in.m_shadowCascadeCount; ++cascade)

+ 1 - 3
AnKi/Renderer/RenderQueue.h

@@ -170,8 +170,7 @@ public:
 	U64 m_uuid; ///< Zero means that there is no dir light
 	Vec3 m_diffuseColor;
 	Vec3 m_direction;
-	F32 m_effectiveShadowDistance;
-	F32 m_shadowCascadesDistancePower;
+	Array<F32, kMaxShadowCascades> m_shadowCascadesDistances;
 	U8 m_shadowCascadeCount; ///< Zero means that it doesn't cast any shadows.
 	U8 m_shadowLayer; ///< Renderer internal.
 
@@ -425,7 +424,6 @@ public:
 	F32 m_cameraFar;
 	F32 m_cameraFovX;
 	F32 m_cameraFovY;
-	F32 m_effectiveShadowDistance;
 
 	FillCoverageBufferCallback m_fillCoverageBufferCallback = nullptr;
 	void* m_fillCoverageBufferCallbackUserData = nullptr;

+ 2 - 1
AnKi/Renderer/ShadowMapping.cpp

@@ -312,7 +312,8 @@ void ShadowMapping::processLights(RenderingContext& ctx, U32& threadCountForPass
 				drawcallCounts[activeCascades] = 1; // Doesn't matter
 
 				// Change the quality per cascade
-				hierarchies[activeCascades] = (cascade <= 1) ? (kTileAllocHierarchyCount - 1) : (hierarchies[0] - 1);
+				hierarchies[activeCascades] =
+					(cascade <= 1) ? (kTileAllocHierarchyCount - 1) : (kTileAllocHierarchyCount - 2);
 				renderQueueElementsLods[activeCascades] = (cascade == 0) ? 0 : (kMaxLodCount - 1);
 
 				++activeCascades;

+ 1 - 1
AnKi/Renderer/TraditionalDeferredShading.cpp

@@ -195,7 +195,7 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 		if(info.m_directionalLight->m_shadowCascadeCount > 0)
 		{
 			unis->m_effectiveShadowDistance =
-				info.m_directionalLight->m_shadowRenderQueues[0]->m_effectiveShadowDistance;
+				info.m_directionalLight->m_shadowCascadesDistances[info.m_directionalLight->m_shadowCascadeCount - 1];
 		}
 		else
 		{

+ 6 - 1
AnKi/Scene/CameraNode.cpp

@@ -65,7 +65,12 @@ void CameraNode::initCommon(FrustumType frustumType)
 	frc->setLodDistance(0, getConfig().getLod0MaxDistance());
 	frc->setLodDistance(1, getConfig().getLod1MaxDistance());
 	frc->setShadowCascadeCount(getConfig().getSceneShadowCascadeCount());
-	frc->setEffectiveShadowDistance(getConfig().getSceneShadowEffectiveDistance());
+
+	static_assert(kMaxShadowCascades == 4);
+	frc->setShadowCascadeDistance(0, getConfig().getSceneShadowCascade0Distance());
+	frc->setShadowCascadeDistance(1, getConfig().getSceneShadowCascade1Distance());
+	frc->setShadowCascadeDistance(2, getConfig().getSceneShadowCascade2Distance());
+	frc->setShadowCascadeDistance(3, getConfig().getSceneShadowCascade3Distance());
 
 	// Extended frustum for RT
 	if(getSceneGraph().getGrManager().getDeviceCapabilities().m_rayTracingEnabled

+ 11 - 0
AnKi/Scene/Common.h

@@ -7,6 +7,7 @@
 
 #include <AnKi/Util/String.h>
 #include <AnKi/Scene/Forward.h>
+#include <functional>
 
 namespace anki {
 
@@ -17,6 +18,16 @@ namespace anki {
 #define ANKI_SCENE_LOGE(...) ANKI_LOG("SCEN", kError, __VA_ARGS__)
 #define ANKI_SCENE_LOGW(...) ANKI_LOG("SCEN", kWarning, __VA_ARGS__)
 #define ANKI_SCENE_LOGF(...) ANKI_LOG("SCEN", kFatal, __VA_ARGS__)
+
+#define ANKI_SCENE_ASSERT(expression) \
+	ANKI_LIKELY(std::invoke([&]() -> Bool { \
+		const Bool ok = (expression); \
+		if(ANKI_UNLIKELY(!ok)) \
+		{ \
+			ANKI_SCENE_LOGE("Expression failed: " #expression); \
+		} \
+		return ok; \
+	}))
 /// @}
 
 } // end namespace anki

+ 52 - 0
AnKi/Scene/Components/FrustumComponent.cpp

@@ -16,12 +16,19 @@ FrustumComponent::FrustumComponent(SceneNode* node)
 	, m_node(node)
 	, m_shapeMarkedForUpdate(true)
 	, m_trfMarkedForUpdate(true)
+	, m_miscMarkedForUpdate(true)
 {
 	ANKI_ASSERT(&m_perspective.m_far == &m_ortho.m_far);
 	ANKI_ASSERT(node);
 
 	// Set some default values
 	setFrustumType(FrustumType::kPerspective);
+	for(U i = 0; i < m_misc.m_maxLodDistances.getSize(); ++i)
+	{
+		const F32 dist = (m_common.m_far - m_common.m_near) / F32(kMaxLodCount + 1);
+		m_misc.m_maxLodDistances[i] = m_common.m_near + dist * F32(i + 1);
+	}
+
 	updateInternal();
 }
 
@@ -52,6 +59,12 @@ Bool FrustumComponent::updateInternal()
 	{
 		updated = true;
 
+		// Fix user data
+		if(!ANKI_SCENE_ASSERT(m_common.m_far - m_common.m_near > 1.0_cm))
+		{
+			setFrustumType(m_frustumType);
+		}
+
 		if(m_frustumType == FrustumType::kPerspective)
 		{
 			m_projMat = Mat4::calculatePerspectiveProjectionMatrix(m_perspective.m_fovX, m_perspective.m_fovY,
@@ -109,12 +122,51 @@ Bool FrustumComponent::updateInternal()
 		m_viewMat = Mat3x4(m_trf.getInverse());
 	}
 
+	// Fixup the misc data
+	if(m_miscMarkedForUpdate)
+	{
+		updated = true;
+		const F32 frustumFraction = (m_common.m_far - m_common.m_near) / 100.0f;
+
+		for(U32 i = 0; i < m_misc.m_shadowCascadeCount; ++i)
+		{
+			if(!ANKI_SCENE_ASSERT(m_misc.m_shadowCascadeDistances[i] > m_common.m_near
+								  && m_misc.m_shadowCascadeDistances[i] <= m_common.m_far))
+			{
+				m_misc.m_shadowCascadeDistances[i] =
+					clamp(m_misc.m_shadowCascadeDistances[i], m_common.m_near + kEpsilonf, m_common.m_far);
+			}
+
+			if(i != 0
+			   && !ANKI_SCENE_ASSERT(m_misc.m_shadowCascadeDistances[i - 1] < m_misc.m_shadowCascadeDistances[i]))
+			{
+				m_misc.m_shadowCascadeDistances[i] = m_misc.m_shadowCascadeDistances[i - 1] + frustumFraction;
+			}
+		}
+
+		for(U32 i = 0; i < m_misc.m_maxLodDistances.getSize(); ++i)
+		{
+			if(!ANKI_SCENE_ASSERT(m_misc.m_maxLodDistances[i] > m_common.m_near
+								  && m_misc.m_maxLodDistances[i] <= m_common.m_far))
+			{
+				m_misc.m_maxLodDistances[i] =
+					clamp(m_misc.m_maxLodDistances[i], m_common.m_near + kEpsilonf, m_common.m_far);
+			}
+
+			if(i != 0 && !ANKI_SCENE_ASSERT(m_misc.m_maxLodDistances[i - 1] < m_misc.m_maxLodDistances[i]))
+			{
+				m_misc.m_maxLodDistances[i] = m_misc.m_maxLodDistances[i - 1] + frustumFraction;
+			}
+		}
+	}
+
 	// Updates that are affected by transform & shape updates
 	if(updated)
 	{
 		m_viewProjMat = m_projMat * Mat4(m_viewMat, Vec4(0.0f, 0.0f, 0.0f, 1.0f));
 		m_shapeMarkedForUpdate = false;
 		m_trfMarkedForUpdate = false;
+		m_miscMarkedForUpdate = false;
 
 		if(m_frustumType == FrustumType::kPerspective)
 		{

+ 106 - 94
AnKi/Scene/Components/FrustumComponent.h

@@ -12,7 +12,7 @@
 #include <AnKi/Collision/ConvexHullShape.h>
 #include <AnKi/Collision/Plane.h>
 #include <AnKi/Resource/Common.h>
-#include <AnKi/Shaders/Include/ClusteredShadingFunctions.h>
+#include <AnKi/Shaders/Include/Common.h>
 
 namespace anki {
 
@@ -76,52 +76,55 @@ public:
 	{
 		ANKI_ASSERT(type >= FrustumType::kFirst && type < FrustumType::kCount);
 		m_frustumType = type;
+		setNear(kDefaultNear);
+		setFar(kDefaultFar);
 		if(m_frustumType == FrustumType::kPerspective)
 		{
-			setPerspective(0.1f, 100.0f, toRad(45.0f), toRad(45.0f));
+			setFovX(kDefaultFovAngle);
+			setFovY(kDefaultFovAngle);
 		}
 		else
 		{
-			setOrthographic(0.1f, 100.0f, 5.0f, -5.0f, 5.0f, -5.0f);
+			setLeft(-5.0f);
+			setRight(5.0f);
+			setBottom(-1.0f);
+			setTop(1.0f);
 		}
 	}
 
-	FrustumType getFrustumType() const
-	{
-		ANKI_ASSERT(m_frustumType != FrustumType::kCount);
-		return m_frustumType;
-	}
-
 	void setPerspective(F32 near, F32 far, F32 fovX, F32 fovY)
 	{
-		ANKI_ASSERT(near > 0.0f && far > 0.0f && near < far);
-		ANKI_ASSERT(fovX > 0.0f && fovY > 0.0f && fovX < kPi && fovY < kPi);
 		ANKI_ASSERT(m_frustumType == FrustumType::kPerspective);
-		m_perspective.m_near = near;
-		m_perspective.m_far = far;
-		m_perspective.m_fovX = fovX;
-		m_perspective.m_fovY = fovY;
-		m_shapeMarkedForUpdate = true;
+		setNear(near);
+		setFar(far);
+		setFovX(fovX);
+		setFovY(fovY);
 	}
 
 	void setOrthographic(F32 near, F32 far, F32 right, F32 left, F32 top, F32 bottom)
 	{
-		ANKI_ASSERT(near > 0.0f && far > 0.0f && near < far);
-		ANKI_ASSERT(right > left && top > bottom);
 		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		m_ortho.m_near = near;
-		m_ortho.m_far = far;
-		m_ortho.m_right = right;
-		m_ortho.m_left = left;
-		m_ortho.m_top = top;
-		m_ortho.m_bottom = bottom;
-		m_shapeMarkedForUpdate = true;
+		setNear(near);
+		setFar(far);
+		setLeft(left);
+		setRight(right);
+		setTop(top);
+		setBottom(bottom);
+	}
+
+	FrustumType getFrustumType() const
+	{
+		ANKI_ASSERT(m_frustumType != FrustumType::kCount);
+		return m_frustumType;
 	}
 
 	void setNear(F32 near)
 	{
-		m_common.m_near = near;
-		m_shapeMarkedForUpdate = true;
+		if(ANKI_SCENE_ASSERT(near > 0.0f))
+		{
+			m_common.m_near = near;
+			m_shapeMarkedForUpdate = true;
+		}
 	}
 
 	F32 getNear() const
@@ -131,8 +134,11 @@ public:
 
 	void setFar(F32 far)
 	{
-		m_common.m_far = far;
-		m_shapeMarkedForUpdate = true;
+		if(ANKI_SCENE_ASSERT(far > 0.0f))
+		{
+			m_common.m_far = far;
+			m_shapeMarkedForUpdate = true;
+		}
 	}
 
 	F32 getFar() const
@@ -142,76 +148,88 @@ public:
 
 	void setFovX(F32 fovx)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kPerspective);
-		m_shapeMarkedForUpdate = true;
-		m_perspective.m_fovX = fovx;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kPerspective)
+		   && ANKI_SCENE_ASSERT(fovx > 0.0f && fovx < kPi))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_perspective.m_fovX = fovx;
+		}
 	}
 
 	F32 getFovX() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kPerspective);
-		return m_perspective.m_fovX;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kPerspective)) ? m_perspective.m_fovX : 0.0f;
 	}
 
 	void setFovY(F32 fovy)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kPerspective);
-		m_shapeMarkedForUpdate = true;
-		m_perspective.m_fovY = fovy;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kPerspective)
+		   && ANKI_SCENE_ASSERT(fovy > 0.0f && fovy < kPi))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_perspective.m_fovY = fovy;
+		}
 	}
 
 	F32 getFovY() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kPerspective);
-		return m_perspective.m_fovY;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kPerspective)) ? m_perspective.m_fovY : 0.0f;
 	}
 
 	F32 getLeft() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		return m_ortho.m_left;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic)) ? m_ortho.m_left : 0.0f;
 	}
 
 	void setLeft(F32 value)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		m_ortho.m_left = value;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_ortho.m_left = value;
+		}
 	}
 
 	F32 getRight() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		return m_ortho.m_right;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic)) ? m_ortho.m_right : 0.0f;
 	}
 
 	void setRight(F32 value)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		m_ortho.m_right = value;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_ortho.m_right = value;
+		}
 	}
 
 	F32 getTop() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		return m_ortho.m_top;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic)) ? m_ortho.m_top : 0.0f;
 	}
 
 	void setTop(F32 value)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		m_ortho.m_top = value;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_ortho.m_top = value;
+		}
 	}
 
 	F32 getBottom() const
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		return m_ortho.m_bottom;
+		return (ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic)) ? m_ortho.m_bottom : 0.0f;
 	}
 
 	void setBottom(F32 value)
 	{
-		ANKI_ASSERT(m_frustumType == FrustumType::kOrthographic);
-		m_ortho.m_bottom = value;
+		if(ANKI_SCENE_ASSERT(m_frustumType == FrustumType::kOrthographic))
+		{
+			m_shapeMarkedForUpdate = true;
+			m_ortho.m_bottom = value;
+		}
 	}
 
 	const Transform& getWorldTransform() const
@@ -311,46 +329,26 @@ public:
 		}
 	}
 
-	/// Set how far to render shadows for this frustum or set to negative if you want to use the m_frustun's far.
-	void setEffectiveShadowDistance(F32 distance)
+	void setShadowCascadeDistance(U32 cascade, F32 distance)
 	{
-		m_effectiveShadowDistance = distance;
+		m_misc.m_shadowCascadeDistances[cascade] = distance;
+		m_miscMarkedForUpdate = true;
 	}
 
-	/// How far to render shadows for this frustum.
-	F32 getEffectiveShadowDistance() const
+	F32 getShadowCascadeDistance(U32 cascade) const
 	{
-		const F32 distance = (m_effectiveShadowDistance <= 0.0f) ? m_common.m_far : m_effectiveShadowDistance;
-		return clamp(m_common.m_near, m_common.m_far, distance);
-	}
-
-	/// See computeShadowCascadeDistance()
-	void setShadowCascadesDistancePower(F32 power)
-	{
-		ANKI_ASSERT(power >= 1.0f);
-		m_shadowCascadesDistancePower = power;
-	}
-
-	/// See computeShadowCascadeDistance()
-	F32 getShadowCascadesDistancePower() const
-	{
-		return m_shadowCascadesDistancePower;
-	}
-
-	F32 computeShadowCascadeDistance(U32 cascadeIdx) const
-	{
-		return anki::computeShadowCascadeDistance(cascadeIdx, m_shadowCascadesDistancePower,
-												  getEffectiveShadowDistance(), getShadowCascadeCount());
+		return m_misc.m_shadowCascadeDistances[cascade];
 	}
 
 	[[nodiscard]] U32 getShadowCascadeCount() const
 	{
-		return m_shadowCascadeCount;
+		return m_misc.m_shadowCascadeCount;
 	}
 
 	void setShadowCascadeCount(U32 count)
 	{
-		m_shadowCascadeCount = U8(min(count, kMaxShadowCascades));
+		m_misc.m_shadowCascadeCount = U8(count);
+		m_miscMarkedForUpdate = true;
 	}
 
 	const ConvexHullShape& getPerspectiveBoundingShapeWorldSpace() const
@@ -373,15 +371,24 @@ public:
 	/// Set the lod distance. It doesn't interact with the far plane.
 	void setLodDistance(U32 lod, F32 maxDistance)
 	{
-		ANKI_ASSERT(maxDistance > 0.0f);
-		m_maxLodDistances[lod] = maxDistance;
+		m_misc.m_maxLodDistances[lod] = maxDistance;
+		m_miscMarkedForUpdate = true;
+	}
+
+	void setLodDistances(const Array<F32, kMaxLodCount>& distances)
+	{
+		for(U i = 0; i < m_misc.m_maxLodDistances.getSize(); ++i)
+		{
+			ANKI_ASSERT(distances[i] > m_common.m_near && distances[i] <= m_common.m_far);
+			m_misc.m_maxLodDistances[i] = distances[i];
+		}
 	}
 
 	/// See setLodDistance.
 	F32 getLodDistance(U32 lod) const
 	{
-		ANKI_ASSERT(m_maxLodDistances[lod] > 0.0f);
-		return m_maxLodDistances[lod];
+		ANKI_ASSERT(m_misc.m_maxLodDistances[lod] > 0.0f);
+		return m_misc.m_maxLodDistances[lod];
 	}
 
 private:
@@ -413,6 +420,10 @@ private:
 		Obb m_obbW; ///< Including shape
 	};
 
+	static constexpr F32 kDefaultNear = 0.1f;
+	static constexpr F32 kDefaultFar = 100.0f;
+	static constexpr F32 kDefaultFovAngle = toRad(45.0f);
+
 	SceneNode* m_node;
 
 	FrustumType m_frustumType = FrustumType::kCount;
@@ -438,15 +449,15 @@ private:
 	Array<Mat4, kPrevMatrixHistory> m_prevProjMats = {Mat4::getIdentity(), Mat4::getIdentity()};
 	Array<Mat4, kPrevMatrixHistory> m_prevViewProjMats = {Mat4::getIdentity(), Mat4::getIdentity()};
 
-	/// How far to render shadows for this frustum. If negative it's the m_frustum's far.
-	F32 m_effectiveShadowDistance = -1.0f;
-
-	/// Defines the the rate of the cascade distances
-	F32 m_shadowCascadesDistancePower = 1.0f;
+	class
+	{
+	public:
+		Array<F32, kMaxShadowCascades> m_shadowCascadeDistances = {};
 
-	Array<F32, kMaxLodCount - 1> m_maxLodDistances = {};
+		Array<F32, kMaxLodCount - 1> m_maxLodDistances = {};
 
-	U8 m_shadowCascadeCount = 0;
+		U8 m_shadowCascadeCount = 0;
+	} m_misc; ///< Misc stuff that this component just holds.
 
 	class
 	{
@@ -459,6 +470,7 @@ private:
 	FrustumComponentVisibilityTestFlag m_flags = FrustumComponentVisibilityTestFlag::kNone;
 	Bool m_shapeMarkedForUpdate : 1;
 	Bool m_trfMarkedForUpdate : 1;
+	Bool m_miscMarkedForUpdate : 1;
 
 	Bool updateInternal();
 };

+ 6 - 4
AnKi/Scene/Components/LightComponent.cpp

@@ -82,8 +82,10 @@ void LightComponent::setupDirectionalLightQueueElement(const FrustumComponent& f
 	el.m_uuid = m_uuid;
 	el.m_diffuseColor = m_diffColor.xyz();
 	el.m_direction = -m_worldtransform.getRotation().getZAxis().xyz();
-	el.m_effectiveShadowDistance = frustumComp.getEffectiveShadowDistance();
-	el.m_shadowCascadesDistancePower = frustumComp.getShadowCascadesDistancePower();
+	for(U32 i = 0; i < shadowCascadeCount; ++i)
+	{
+		el.m_shadowCascadesDistances[i] = frustumComp.getShadowCascadeDistance(i);
+	}
 	el.m_shadowCascadeCount = U8(shadowCascadeCount);
 	el.m_shadowLayer = kMaxU8;
 
@@ -120,9 +122,9 @@ void LightComponent::setupDirectionalLightQueueElement(const FrustumComponent& f
 			// --------------------------> x
 			//           |
 			// The square distance of A-C is equal to B-C. Solve the equation to find the z.
-			const F32 f = frustumComp.computeShadowCascadeDistance(i); // Cascade far
+			const F32 f = frustumComp.getShadowCascadeDistance(i); // Cascade far
 			const F32 n =
-				(i == 0) ? frustumComp.getNear() : frustumComp.computeShadowCascadeDistance(i - 1); // Cascade near
+				(i == 0) ? frustumComp.getNear() : frustumComp.getShadowCascadeDistance(i - 1); // Cascade near
 			const F32 a = f * tan(fovY / 2.0f) * fovX / fovY;
 			const F32 b = n * tan(fovY / 2.0f) * fovX / fovY;
 			const F32 z = (b * b + n * n - a * a - f * f) / (2.0f * (f - n));

+ 5 - 2
AnKi/Scene/ConfigVars.defs.h

@@ -7,10 +7,13 @@ ANKI_CONFIG_VAR_GROUP(SCENE)
 
 ANKI_CONFIG_VAR_F32(Lod0MaxDistance, 20.0f, 1.0f, kMaxF32, "Distance that will be used to calculate the LOD 0")
 ANKI_CONFIG_VAR_F32(Lod1MaxDistance, 40.0f, 2.0f, kMaxF32, "Distance that will be used to calculate the LOD 1")
+
 ANKI_CONFIG_VAR_U8(SceneShadowCascadeCount, (ANKI_PLATFORM_MOBILE) ? 2 : kMaxShadowCascades, 1, kMaxShadowCascades,
 				   "Max number of shadow cascades for directional lights")
-ANKI_CONFIG_VAR_F32(SceneShadowEffectiveDistance, (ANKI_PLATFORM_MOBILE) ? 80.0f : 200.0f, 10.0f, 2000.0f,
-					"The distance where shadows are calculated")
+ANKI_CONFIG_VAR_F32(SceneShadowCascade0Distance, 18.0, 1.0, kMaxF32, "The distance of the 1st cascade")
+ANKI_CONFIG_VAR_F32(SceneShadowCascade1Distance, 40.0, 1.0, kMaxF32, "The distance of the 2nd cascade")
+ANKI_CONFIG_VAR_F32(SceneShadowCascade2Distance, 80.0, 1.0, kMaxF32, "The distance of the 3rd cascade")
+ANKI_CONFIG_VAR_F32(SceneShadowCascade3Distance, 200.0, 1.0, kMaxF32, "The distance of the 4th cascade")
 
 ANKI_CONFIG_VAR_U32(SceneOctreeMaxDepth, 5, 2, 10, "The max depth of the octree")
 ANKI_CONFIG_VAR_F32(SceneEarlyZDistance, (ANKI_PLATFORM_MOBILE) ? 0.0f : 10.0f, 0.0f, kMaxF32,

+ 10 - 4
AnKi/Scene/GlobalIlluminationProbeNode.cpp

@@ -90,7 +90,7 @@ GlobalIlluminationProbeNode::GlobalIlluminationProbeNode(SceneGraph* scene, CStr
 
 	// The frustum components
 	constexpr F32 ang = toRad(90.0f);
-	const F32 zNear = kClusterObjectFrustumNearPlane;
+	constexpr F32 zNear = kClusterObjectFrustumNearPlane;
 
 	Mat3 rot;
 	rot = Mat3(Euler(0.0f, -kPi / 2.0f, 0.0f)) * Mat3(Euler(0.0f, 0.0f, kPi));
@@ -113,11 +113,11 @@ GlobalIlluminationProbeNode::GlobalIlluminationProbeNode(SceneGraph* scene, CStr
 
 		FrustumComponent* frc = newComponent<FrustumComponent>();
 		frc->setFrustumType(FrustumType::kPerspective);
-		const F32 tempEffectiveDistance = 1.0f;
-		frc->setPerspective(zNear, tempEffectiveDistance, ang, ang);
+		frc->setPerspective(zNear, 10.0f, ang, ang);
+		frc->setLodDistances({1.0f, 2.0f, 3.0f});
 		frc->setWorldTransform(m_cubeFaceTransforms[i]);
 		frc->setEnabledVisibilityTests(FrustumComponentVisibilityTestFlag::kNone);
-		frc->setEffectiveShadowDistance(getConfig().getSceneReflectionProbeShadowEffectiveDistance());
+		frc->setShadowCascadeDistance(0, 10.0f);
 		frc->setShadowCascadeCount(1);
 	}
 
@@ -159,6 +159,12 @@ void GlobalIlluminationProbeNode::onShapeUpdateOrProbeNeedsRendering()
 
 			frc.setWorldTransform(trf);
 			frc.setFar(effectiveDistance);
+			frc.setShadowCascadeDistance(
+				0, min(effectiveDistance, getConfig().getSceneReflectionProbeShadowEffectiveDistance()));
+
+			// Add something to avoid complains
+			frc.setLodDistances(
+				{frc.getNear() + kEpsilonf, frc.getNear() + 2.0f * kEpsilonf, frc.getNear() + 3.0f * kEpsilonf});
 			++count;
 		});
 

+ 8 - 1
AnKi/Scene/ReflectionProbeNode.cpp

@@ -105,9 +105,10 @@ ReflectionProbeNode::ReflectionProbeNode(SceneGraph* scene, CString name)
 		FrustumComponent* frc = newComponent<FrustumComponent>();
 		frc->setFrustumType(FrustumType::kPerspective);
 		frc->setPerspective(kClusterObjectFrustumNearPlane, 10.0f, ang, ang);
+		frc->setLodDistances({1.0f, 2.0f, 3.0f});
 		frc->setWorldTransform(m_frustumTransforms[i]);
 		frc->setEnabledVisibilityTests(FrustumComponentVisibilityTestFlag::kNone);
-		frc->setEffectiveShadowDistance(getConfig().getSceneReflectionProbeShadowEffectiveDistance());
+		frc->setShadowCascadeDistance(0, 10.0f);
 		frc->setShadowCascadeCount(1);
 	}
 
@@ -159,6 +160,12 @@ void ReflectionProbeNode::onShapeUpdate(ReflectionProbeComponent& reflc)
 	// Update frustum components
 	iterateComponentsOfType<FrustumComponent>([&](FrustumComponent& frc) {
 		frc.setFar(effectiveDistance);
+		frc.setShadowCascadeDistance(
+			0, min(effectiveDistance, getConfig().getSceneReflectionProbeShadowEffectiveDistance()));
+
+		// Add something to avoid complains
+		frc.setLodDistances(
+			{frc.getNear() + kEpsilonf, frc.getNear() + 2.0f * kEpsilonf, frc.getNear() + 3.0f * kEpsilonf});
 	});
 
 	// Update the spatial comp

+ 5 - 2
AnKi/Scene/Visibility.cpp

@@ -107,7 +107,6 @@ void VisibilityContext::submitNewWork(const FrustumComponent& frc, const Frustum
 	{
 		rqueue.m_cameraFovX = rqueue.m_cameraFovY = 0.0f;
 	}
-	rqueue.m_effectiveShadowDistance = frc.getEffectiveShadowDistance();
 
 	StackMemoryPool& pool = m_scene->getFrameMemoryPool();
 
@@ -414,7 +413,11 @@ void VisibilityTestTask::test(ThreadHive& hive, U32 taskId)
 				const Plane& nearPlane = primaryFrc.getViewPlanes()[FrustumPlaneType::kNear];
 				const F32 distFromFrustum = max(0.0f, testPlane(nearPlane, spatialc->getAabbWorldSpace()));
 
-				castsShadow = distFromFrustum < primaryFrc.getEffectiveShadowDistance();
+				const F32 shadowEffectiveDistance =
+					(primaryFrc.getShadowCascadeCount() > 0)
+						? primaryFrc.getShadowCascadeDistance(primaryFrc.getShadowCascadeCount() - 1)
+						: primaryFrc.getFar();
+				castsShadow = distFromFrustum < shadowEffectiveDistance;
 			}
 
 			switch(lc->getLightComponentType())

+ 66 - 58
AnKi/Script/Scene.cpp

@@ -62,7 +62,7 @@ using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	-8739932090814685424, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(),
+	2932583432340840328, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(),
 	nullptr, nullptr};
 
 template<>
@@ -182,7 +182,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
-	-7706209051073311304, "WeakArrayBodyComponentPtr",
+	7416622643466936580, "WeakArrayBodyComponentPtr",
 	LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 
 template<>
@@ -301,7 +301,7 @@ static inline void wrapWeakArrayBodyComponentPtr(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMoveComponent = {-8687627984466261764, "MoveComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoMoveComponent = {-1620086387227254862, "MoveComponent",
 														LuaUserData::computeSizeForGarbageCollected<MoveComponent>(),
 														nullptr, nullptr};
 
@@ -699,7 +699,7 @@ static inline void wrapMoveComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {7365641557642621447, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-4595315366869427277, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(),
 														 nullptr, nullptr};
 
@@ -1263,7 +1263,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {5204471888737717555, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {740153017412343544, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(),
 														 nullptr, nullptr};
 
@@ -1467,7 +1467,7 @@ static inline void wrapDecalComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {
-	3129239218800905411, "LensFlareComponent", LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(),
+	-2298395752528036249, "LensFlareComponent", LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(),
 	nullptr, nullptr};
 
 template<>
@@ -1639,7 +1639,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-2321292920370861788, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {5546317979946767184, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(),
 														nullptr, nullptr};
 
@@ -1812,7 +1812,7 @@ static inline void wrapBodyComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {
-	8727234490176981006, "TriggerComponent", LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr,
+	2156310951712001431, "TriggerComponent", LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr,
 	nullptr};
 
 template<>
@@ -1976,7 +1976,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {
-	-1966916321067375525, "FogDensityComponent", LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(),
+	5865180144883120478, "FogDensityComponent", LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(),
 	nullptr, nullptr};
 
 template<>
@@ -2180,7 +2180,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoFrustumComponent = {
-	-1191485642898408008, "FrustumComponent", LuaUserData::computeSizeForGarbageCollected<FrustumComponent>(), nullptr,
+	7838666232094395179, "FrustumComponent", LuaUserData::computeSizeForGarbageCollected<FrustumComponent>(), nullptr,
 	nullptr};
 
 template<>
@@ -2253,14 +2253,14 @@ static int wrapFrustumComponentsetPerspective(lua_State* l)
 	return 0;
 }
 
-/// Pre-wrap method FrustumComponent::setShadowCascadesDistancePower.
-static inline int pwrapFrustumComponentsetShadowCascadesDistancePower(lua_State* l)
+/// Pre-wrap method FrustumComponent::setShadowCascadeDistance.
+static inline int pwrapFrustumComponentsetShadowCascadeDistance(lua_State* l)
 {
 	[[maybe_unused]] LuaUserData* ud;
 	[[maybe_unused]] void* voidp;
 	[[maybe_unused]] PtrSize size;
 
-	if(ANKI_UNLIKELY(LuaBinder::checkArgsCount(l, 2)))
+	if(ANKI_UNLIKELY(LuaBinder::checkArgsCount(l, 3)))
 	{
 		return -1;
 	}
@@ -2274,22 +2274,28 @@ static inline int pwrapFrustumComponentsetShadowCascadesDistancePower(lua_State*
 	FrustumComponent* self = ud->getData<FrustumComponent>();
 
 	// Pop arguments
-	F32 arg0;
+	U32 arg0;
 	if(ANKI_UNLIKELY(LuaBinder::checkNumber(l, 2, arg0)))
 	{
 		return -1;
 	}
 
+	F32 arg1;
+	if(ANKI_UNLIKELY(LuaBinder::checkNumber(l, 3, arg1)))
+	{
+		return -1;
+	}
+
 	// Call the method
-	self->setShadowCascadesDistancePower(arg0);
+	self->setShadowCascadeDistance(arg0, arg1);
 
 	return 0;
 }
 
-/// Wrap method FrustumComponent::setShadowCascadesDistancePower.
-static int wrapFrustumComponentsetShadowCascadesDistancePower(lua_State* l)
+/// Wrap method FrustumComponent::setShadowCascadeDistance.
+static int wrapFrustumComponentsetShadowCascadeDistance(lua_State* l)
 {
-	int res = pwrapFrustumComponentsetShadowCascadesDistancePower(l);
+	int res = pwrapFrustumComponentsetShadowCascadeDistance(l);
 	if(res >= 0)
 	{
 		return res;
@@ -2299,8 +2305,8 @@ static int wrapFrustumComponentsetShadowCascadesDistancePower(lua_State* l)
 	return 0;
 }
 
-/// Pre-wrap method FrustumComponent::setEffectiveShadowDistance.
-static inline int pwrapFrustumComponentsetEffectiveShadowDistance(lua_State* l)
+/// Pre-wrap method FrustumComponent::getShadowCascadeDistance.
+static inline int pwrapFrustumComponentgetShadowCascadeDistance(lua_State* l)
 {
 	[[maybe_unused]] LuaUserData* ud;
 	[[maybe_unused]] void* voidp;
@@ -2320,22 +2326,25 @@ static inline int pwrapFrustumComponentsetEffectiveShadowDistance(lua_State* l)
 	FrustumComponent* self = ud->getData<FrustumComponent>();
 
 	// Pop arguments
-	F32 arg0;
+	U32 arg0;
 	if(ANKI_UNLIKELY(LuaBinder::checkNumber(l, 2, arg0)))
 	{
 		return -1;
 	}
 
 	// Call the method
-	self->setEffectiveShadowDistance(arg0);
+	F32 ret = self->getShadowCascadeDistance(arg0);
 
-	return 0;
+	// Push return value
+	lua_pushnumber(l, lua_Number(ret));
+
+	return 1;
 }
 
-/// Wrap method FrustumComponent::setEffectiveShadowDistance.
-static int wrapFrustumComponentsetEffectiveShadowDistance(lua_State* l)
+/// Wrap method FrustumComponent::getShadowCascadeDistance.
+static int wrapFrustumComponentgetShadowCascadeDistance(lua_State* l)
 {
-	int res = pwrapFrustumComponentsetEffectiveShadowDistance(l);
+	int res = pwrapFrustumComponentgetShadowCascadeDistance(l);
 	if(res >= 0)
 	{
 		return res;
@@ -2350,14 +2359,13 @@ static inline void wrapFrustumComponent(lua_State* l)
 {
 	LuaBinder::createClass(l, &luaUserDataTypeInfoFrustumComponent);
 	LuaBinder::pushLuaCFuncMethod(l, "setPerspective", wrapFrustumComponentsetPerspective);
-	LuaBinder::pushLuaCFuncMethod(l, "setShadowCascadesDistancePower",
-								  wrapFrustumComponentsetShadowCascadesDistancePower);
-	LuaBinder::pushLuaCFuncMethod(l, "setEffectiveShadowDistance", wrapFrustumComponentsetEffectiveShadowDistance);
+	LuaBinder::pushLuaCFuncMethod(l, "setShadowCascadeDistance", wrapFrustumComponentsetShadowCascadeDistance);
+	LuaBinder::pushLuaCFuncMethod(l, "getShadowCascadeDistance", wrapFrustumComponentgetShadowCascadeDistance);
 	lua_settop(l, 0);
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	-1018126859883492712, "GlobalIlluminationProbeComponent",
+	8598207783043270175, "GlobalIlluminationProbeComponent",
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr, nullptr};
 
 template<>
@@ -2604,7 +2612,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	-927979292880454957, "ReflectionProbeComponent",
+	2833571482117312123, "ReflectionProbeComponent",
 	LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 template<>
@@ -2720,7 +2728,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	-6511516637176772129, "ParticleEmitterComponent",
+	-6166671610891958399, "ParticleEmitterComponent",
 	LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 template<>
@@ -2794,7 +2802,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterComponent = {
-	7059837890409742045, "GpuParticleEmitterComponent",
+	6131347001832418908, "GpuParticleEmitterComponent",
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterComponent>(), nullptr, nullptr};
 
 template<>
@@ -2867,7 +2875,7 @@ static inline void wrapGpuParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-3624966836559375132, "ModelComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {5260828216114469509, "ModelComponent",
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(),
 														 nullptr, nullptr};
 
@@ -2940,7 +2948,7 @@ static inline void wrapModelComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {-8546506900929446763, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {2239714295110433902, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(),
 														nullptr, nullptr};
 
@@ -3014,7 +3022,7 @@ static inline void wrapSkinComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {
-	-5875722332241774365, "SkyboxComponent", LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr,
+	-5753471164249885311, "SkyboxComponent", LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr,
 	nullptr};
 
 template<>
@@ -3316,7 +3324,7 @@ static inline void wrapSkyboxComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {
-	-5266826471794230711, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(), nullptr, nullptr};
+	-296763319637754850, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneNode>()
@@ -4261,7 +4269,7 @@ static inline void wrapSceneNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoModelNode = {
-	-8050065867798521056, "ModelNode", LuaUserData::computeSizeForGarbageCollected<ModelNode>(), nullptr, nullptr};
+	809850193274775486, "ModelNode", LuaUserData::computeSizeForGarbageCollected<ModelNode>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ModelNode>()
@@ -4324,7 +4332,7 @@ static inline void wrapModelNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoPerspectiveCameraNode = {
-	4225474333355308316, "PerspectiveCameraNode", LuaUserData::computeSizeForGarbageCollected<PerspectiveCameraNode>(),
+	-1537597433130477556, "PerspectiveCameraNode", LuaUserData::computeSizeForGarbageCollected<PerspectiveCameraNode>(),
 	nullptr, nullptr};
 
 template<>
@@ -4387,7 +4395,7 @@ static inline void wrapPerspectiveCameraNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoPointLightNode = {-476103666317335701, "PointLightNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoPointLightNode = {-29245873346871954, "PointLightNode",
 														 LuaUserData::computeSizeForGarbageCollected<PointLightNode>(),
 														 nullptr, nullptr};
 
@@ -4451,7 +4459,7 @@ static inline void wrapPointLightNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSpotLightNode = {-9028941236445099739, "SpotLightNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoSpotLightNode = {-6340019612898178938, "SpotLightNode",
 														LuaUserData::computeSizeForGarbageCollected<SpotLightNode>(),
 														nullptr, nullptr};
 
@@ -4516,7 +4524,7 @@ static inline void wrapSpotLightNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoDirectionalLightNode = {
-	-5885044536233253731, "DirectionalLightNode", LuaUserData::computeSizeForGarbageCollected<DirectionalLightNode>(),
+	-650419786319643186, "DirectionalLightNode", LuaUserData::computeSizeForGarbageCollected<DirectionalLightNode>(),
 	nullptr, nullptr};
 
 template<>
@@ -4580,7 +4588,7 @@ static inline void wrapDirectionalLightNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoStaticCollisionNode = {
-	-3321869028945608148, "StaticCollisionNode", LuaUserData::computeSizeForGarbageCollected<StaticCollisionNode>(),
+	-3227727713593992698, "StaticCollisionNode", LuaUserData::computeSizeForGarbageCollected<StaticCollisionNode>(),
 	nullptr, nullptr};
 
 template<>
@@ -4644,7 +4652,7 @@ static inline void wrapStaticCollisionNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterNode = {
-	7361250518817995771, "ParticleEmitterNode", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterNode>(),
+	6918622436947614437, "ParticleEmitterNode", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterNode>(),
 	nullptr, nullptr};
 
 template<>
@@ -4708,7 +4716,7 @@ static inline void wrapParticleEmitterNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterNode = {
-	-2839508838597227498, "GpuParticleEmitterNode",
+	-6059315858530946064, "GpuParticleEmitterNode",
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterNode>(), nullptr, nullptr};
 
 template<>
@@ -4772,7 +4780,7 @@ static inline void wrapGpuParticleEmitterNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeNode = {
-	-5375614308316633893, "ReflectionProbeNode", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeNode>(),
+	512701379852882043, "ReflectionProbeNode", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeNode>(),
 	nullptr, nullptr};
 
 template<>
@@ -4836,7 +4844,7 @@ static inline void wrapReflectionProbeNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoDecalNode = {
-	5640592796414838784, "DecalNode", LuaUserData::computeSizeForGarbageCollected<DecalNode>(), nullptr, nullptr};
+	5216427613143872435, "DecalNode", LuaUserData::computeSizeForGarbageCollected<DecalNode>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<DecalNode>()
@@ -4899,7 +4907,7 @@ static inline void wrapDecalNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerNode = {
-	6454325227279593862, "TriggerNode", LuaUserData::computeSizeForGarbageCollected<TriggerNode>(), nullptr, nullptr};
+	5997852190170793979, "TriggerNode", LuaUserData::computeSizeForGarbageCollected<TriggerNode>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<TriggerNode>()
@@ -4961,7 +4969,7 @@ static inline void wrapTriggerNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityNode = {-2016225087705583098, "FogDensityNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityNode = {-6018324113689458139, "FogDensityNode",
 														 LuaUserData::computeSizeForGarbageCollected<FogDensityNode>(),
 														 nullptr, nullptr};
 
@@ -5026,7 +5034,7 @@ static inline void wrapFogDensityNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeNode = {
-	881842436982629931, "GlobalIlluminationProbeNode",
+	-4557094370355935221, "GlobalIlluminationProbeNode",
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeNode>(), nullptr, nullptr};
 
 template<>
@@ -5090,7 +5098,7 @@ static inline void wrapGlobalIlluminationProbeNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxNode = {
-	-2160062479151552786, "SkyboxNode", LuaUserData::computeSizeForGarbageCollected<SkyboxNode>(), nullptr, nullptr};
+	-487731404906855306, "SkyboxNode", LuaUserData::computeSizeForGarbageCollected<SkyboxNode>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SkyboxNode>()
@@ -5153,7 +5161,7 @@ static inline void wrapSkyboxNode(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {
-	1565953082694138001, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(), nullptr, nullptr};
+	-3165171856408475527, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneGraph>()
@@ -6058,7 +6066,7 @@ static inline void wrapSceneGraph(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {-127482733468747645, "Event",
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {-327249927871287227, "Event",
 												LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
 
 template<>
@@ -6124,7 +6132,7 @@ static inline void wrapEvent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {
-	-1511364883147733152, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(), nullptr, nullptr};
+	5617532305066010971, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightEvent>()
@@ -6243,7 +6251,7 @@ static inline void wrapLightEvent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {
-	-577692491395731788, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(), nullptr, nullptr};
+	7471457449365359232, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ScriptEvent>()
@@ -6259,7 +6267,7 @@ static inline void wrapScriptEvent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {
-	3496086456905036915, "JitterMoveEvent", LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr,
+	-3678566306512249386, "JitterMoveEvent", LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr,
 	nullptr};
 
 template<>
@@ -6334,7 +6342,7 @@ static inline void wrapJitterMoveEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-1032810681493696534, "AnimationEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-6310232758572032520, "AnimationEvent",
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(),
 														 nullptr, nullptr};
 
@@ -6352,7 +6360,7 @@ static inline void wrapAnimationEvent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {
-	330041233457660952, "EventManager", LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
+	7795657307788131623, "EventManager", LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<EventManager>()

+ 5 - 3
AnKi/Script/Scene.xml

@@ -295,15 +295,17 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 						<arg>F32</arg>
 					</args>
 				</method>
-				<method name="setShadowCascadesDistancePower">
+				<method name="setShadowCascadeDistance">
 					<args>
+						<arg>U32</arg>
 						<arg>F32</arg>
 					</args>
 				</method>
-				<method name="setEffectiveShadowDistance">
+				<method name="getShadowCascadeDistance">
 					<args>
-						<arg>F32</arg>
+						<arg>U32</arg>
 					</args>
+					<return>F32</return>
 				</method>
 			</methods>
 		</class>

+ 51 - 51
AnKi/ShaderCompiler/ShaderProgramParser.cpp

@@ -63,7 +63,7 @@ inline constexpr char kShaderHeader[] = R"(#version 460 core
 #extension GL_EXT_nonuniform_qualifier : enable
 #extension GL_EXT_scalar_block_layout : enable
 
-#define ANKI_MAX_BINDLESS_TEXTURES %uu
+#define kMaxBindlessTextures %uu
 #define kMaxBindlessReadonlyTextureBuffers %uu
 
 #if defined(ANKI_RAY_GEN_SHADER) || defined(ANKI_ANY_HIT_SHADER) || defined(ANKI_CLOSEST_HIT_SHADER) || defined(ANKI_MISS_SHADER) || defined(ANKI_INTERSECTION_SHADER) || defined(ANKI_CALLABLE_SHADER)
@@ -71,112 +71,112 @@ inline constexpr char kShaderHeader[] = R"(#version 460 core
 #endif
 
 #define ANKI_BINDLESS_SET(s) \
-	layout(set = s, binding = 0) uniform utexture2D u_bindlessTextures2dU32[ANKI_MAX_BINDLESS_TEXTURES]; \
-	layout(set = s, binding = 0) uniform itexture2D u_bindlessTextures2dI32[ANKI_MAX_BINDLESS_TEXTURES]; \
-	layout(set = s, binding = 0) uniform texture2D u_bindlessTextures2dF32[ANKI_MAX_BINDLESS_TEXTURES]; \
-	layout(set = s, binding = 0) uniform texture2DArray u_bindlessTextures2dArrayF32[ANKI_MAX_BINDLESS_TEXTURES]; \
+	layout(set = s, binding = 0) uniform utexture2D u_bindlessTextures2dU32[kMaxBindlessTextures]; \
+	layout(set = s, binding = 0) uniform itexture2D u_bindlessTextures2dI32[kMaxBindlessTextures]; \
+	layout(set = s, binding = 0) uniform texture2D u_bindlessTextures2dF32[kMaxBindlessTextures]; \
+	layout(set = s, binding = 0) uniform texture2DArray u_bindlessTextures2dArrayF32[kMaxBindlessTextures]; \
 	layout(set = s, binding = 1) uniform textureBuffer u_bindlessTextureBuffers[kMaxBindlessReadonlyTextureBuffers];
 
 #define F32 float
-#define _ANKI_SIZEOF_float 4u
+const uint kSizeof_float = 4u;
 #define Vec2 vec2
-#define _ANKI_SIZEOF_vec2 8u
+const uint kSizeof_vec2 = 8u;
 #define Vec3 vec3
-#define _ANKI_SIZEOF_vec3 12u
+const uint kSizeof_vec3 = 12u;
 #define Vec4 vec4
-#define _ANKI_SIZEOF_vec4 16u
+const uint kSizeof_vec4 = 16u;
 
 #define F16 float16_t
-#define _ANKI_SIZEOF_float16_t 2u
+const uint kSizeof_float16_t = 2u;
 #define HVec2 f16vec2
-#define _ANKI_SIZEOF_f16vec2 4u
+const uint kSizeof_f16vec2 = 4u;
 #define HVec3 f16vec3
-#define _ANKI_SIZEOF_f16vec3 6u
+const uint kSizeof_f16vec3 = 6u;
 #define HVec4 f16vec4
-#define _ANKI_SIZEOF_f16vec4 8u
+const uint kSizeof_f16vec4 = 8u;
 
 #define U8 uint8_t
-#define _ANKI_SIZEOF_uint8_t 1u
+const uint kSizeof_uint8_t = 1u;
 #define U8Vec2 u8vec2
-#define _ANKI_SIZEOF_u8vec2 2u
+const uint kSizeof_u8vec2 = 2u;
 #define U8Vec3 u8vec3
-#define _ANKI_SIZEOF_u8vec3 3u
+const uint kSizeof_u8vec3 = 3u;
 #define U8Vec4 u8vec4
-#define _ANKI_SIZEOF_u8vec4 4u
+const uint kSizeof_u8vec4 = 4u;
 
 #define I8 int8_t
-#define _ANKI_SIZEOF_int8_t 1u
+const uint kSizeof_int8_t = 1u;
 #define I8Vec2 i8vec2
-#define _ANKI_SIZEOF_i8vec2 2u
+const uint kSizeof_i8vec2 = 2u;
 #define I8Vec3 i8vec3
-#define _ANKI_SIZEOF_i8vec3 3u
+const uint kSizeof_i8vec3 = 3u;
 #define I8Vec4 i8vec4
-#define _ANKI_SIZEOF_i8vec4 4u
+const uint kSizeof_i8vec4 = 4u;
 
 #define U16 uint16_t
-#define _ANKI_SIZEOF_uint16_t 2u
+const uint kSizeof_uint16_t = 2u;
 #define U16Vec2 u16vec2
-#define _ANKI_SIZEOF_u16vec2 4u
+const uint kSizeof_u16vec2 = 4u;
 #define U16Vec3 u16vec3
-#define _ANKI_SIZEOF_u16vec3 6u
+const uint kSizeof_u16vec3 = 6u;
 #define U16Vec4 u16vec4
-#define _ANKI_SIZEOF_u16vec4 8u
+const uint kSizeof_u16vec4 = 8u;
 
 #define I16 int16_t
-#define _ANKI_SIZEOF_int16_t 2u
+const uint kSizeof_int16_t = 2u;
 #define I16Vec2 i16vec2
-#define _ANKI_SIZEOF_i16vec2 4u
+const uint kSizeof_i16vec2 = 4u;
 #define I16Vec3 i16vec3
-#define _ANKI_SIZEOF_i16vec3 6u
+const uint kSizeof_i16vec3 = 6u;
 #define i16Vec4 i16vec4
-#define _ANKI_SIZEOF_i16vec4 8u
+const uint kSizeof_i16vec4 = 8u;
 
 #define U32 uint
-#define _ANKI_SIZEOF_uint 4u
+const uint kSizeof_uint = 4u;
 #define UVec2 uvec2
-#define _ANKI_SIZEOF_uvec2 8u
+const uint kSizeof_uvec2 = 8u;
 #define UVec3 uvec3
-#define _ANKI_SIZEOF_uvec3 12u
+const uint kSizeof_uvec3 = 12u;
 #define UVec4 uvec4
-#define _ANKI_SIZEOF_uvec4 16u
+const uint kSizeof_uvec4 = 16u;
 
 #define I32 int
-#define _ANKI_SIZEOF_int 4u
+const uint kSizeof_int = 4u;
 #define IVec2 ivec2
-#define _ANKI_SIZEOF_ivec2 8u
+const uint kSizeof_ivec2 = 8u;
 #define IVec3 ivec3
-#define _ANKI_SIZEOF_ivec3 12u
+const uint kSizeof_ivec3 = 12u;
 #define IVec4 ivec4
-#define _ANKI_SIZEOF_ivec4 16u
+const uint kSizeof_ivec4 = 16u;
 
 #if ANKI_SUPPORTS_64BIT
 #	define U64 uint64_t
-#	define _ANKI_SIZEOF_uint64_t 8u
+const uint kSizeof_uint64_t = 8u;
 #	define U64Vec2 u64vec2
-#	define _ANKI_SIZEOF_u64vec2 16u
+const uint kSizeof_u64vec2 = 16u;
 #	define U64Vec3 u64vec3
-#	define _ANKI_SIZEOF_u64vec3 24u
+const uint kSizeof_u64vec3 = 24u;
 #	define U64Vec4 u64vec4
-#	define _ANKI_SIZEOF_u64vec4 32u
+const uint kSizeof_u64vec4 = 32u;
 
 #	define I64 int64_t
-#	define _ANKI_SIZEOF_int64_t 8u
+const uint kSizeof_int64_t = 8u;
 #	define I64Vec2 i64vec2
-#	define _ANKI_SIZEOF_i64vec2 16u
+const uint kSizeof_i64vec2 = 16u;
 #	define I64Vec3 i64vec3
-#	define _ANKI_SIZEOF_i64vec3 24u
+const uint kSizeof_i64vec3 = 24u;
 #	define I64Vec4 i64vec4
-#	define _ANKI_SIZEOF_i64vec4 32u
+const uint kSizeof_i64vec4 = 32u;
 #endif
 
 #define Mat3 mat3
-#define _ANKI_SIZEOF_mat3 36u
+const uint kSizeof_mat3 = 36u;
 
 #define Mat4 mat4
-#define _ANKI_SIZEOF_mat4 64u
+const uint kSizeof_mat4 = 64u;
 
 #define Mat3x4 mat4x3 // GLSL has the column number first and then the rows
-#define _ANKI_SIZEOF_mat3x4 48u
+const uint kSizeof_mat3x4 = 48u;
 
 #define Bool bool
 
@@ -185,13 +185,13 @@ inline constexpr char kShaderHeader[] = R"(#version 460 core
 #else
 #	define Address UVec2
 #endif
-#define _ANKI_SIZEOF_Address 8u
+const uint kSizeof_Address = 8u;
 
 #define _ANKI_CONCATENATE(a, b) a##b
 #define ANKI_CONCATENATE(a, b) _ANKI_CONCATENATE(a, b)
 
-#define ANKI_SIZEOF(type) _ANKI_CONCATENATE(_ANKI_SIZEOF_, type)
-#define ANKI_ALIGNOF(type) _ANKI_CONCATENATE(_ANKI_ALIGNOF_, type)
+#define ANKI_SIZEOF(type) _ANKI_CONCATENATE(kSizeof_, type)
+#define ANKI_ALIGNOF(type) _ANKI_CONCATENATE(kAlignof_, type)
 
 #define _ANKI_SCONST_X(type, n, id) \
 	layout(constant_id = id) const type n = type(1); \

+ 0 - 12
AnKi/Shaders/Common.glsl

@@ -10,18 +10,6 @@
 #include <AnKi/Shaders/Include/Common.h>
 #include <AnKi/Shaders/TextureFunctions.glsl>
 
-// Constants
-const F32 kEpsilonf = 0.000001;
-const F16 kEpsilonf16 = 0.0001hf; // Divisions by this should be OK according to http://weitz.de/ieee/
-const ANKI_RP F32 kEpsilonRp = F32(kEpsilonf16);
-
-const U32 kMaxU32 = 0xFFFFFFFFu;
-const F32 kMaxF32 = 3.402823e+38;
-const F16 kMaxF16 = 65504.0hf;
-const F16 kMinF16 = 0.00006104hf;
-
-const F32 kPi = 3.14159265358979323846;
-
 // Macros
 #define UV_TO_NDC(x_) ((x_)*2.0 - 1.0)
 #define NDC_TO_UV(x_) ((x_)*0.5 + 0.5)

+ 0 - 30
AnKi/Shaders/Include/ClusteredShadingFunctions.h

@@ -1,30 +0,0 @@
-// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma once
-
-#include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
-
-ANKI_BEGIN_NAMESPACE
-
-// Compute the far plane of a shadow cascade. "p" is the power that defines the distance curve.
-// "effectiveShadowDistance" is the far plane of the last cascade.
-ANKI_SHADER_FUNC_INLINE F32 computeShadowCascadeDistance(U32 cascadeIdx, F32 p, F32 effectiveShadowDistance,
-														 U32 shadowCascadeCount)
-{
-	return pow((F32(cascadeIdx) + 1.0f) / F32(shadowCascadeCount), p) * effectiveShadowDistance;
-}
-
-// The reverse of computeShadowCascadeDistance().
-ANKI_SHADER_FUNC_INLINE U32 computeShadowCascadeIndex(F32 distance, F32 p, F32 effectiveShadowDistance,
-													  U32 shadowCascadeCount)
-{
-	const F32 shadowCascadeCountf = F32(shadowCascadeCount);
-	F32 idx = pow(distance / effectiveShadowDistance, 1.0f / p) * shadowCascadeCountf;
-	idx = min(idx, shadowCascadeCountf - 1.0f);
-	return U32(idx);
-}
-
-ANKI_END_NAMESPACE

+ 50 - 50
AnKi/Shaders/Include/ClusteredShadingTypes.h

@@ -12,32 +12,31 @@
 ANKI_BEGIN_NAMESPACE
 
 // Enum of clusterer object types
-const U32 kClusterObjectTypePointLight = 0u;
-const U32 kClusterObjectTypeSpotLight = 1u;
-const U32 kClusterObjectTypeDecal = 2u;
-const U32 kClusterObjectTypeFogDensityVolume = 3u;
-const U32 kClusterObjectTypeReflectionProbe = 4u;
-const U32 kClusterObjectTypeGlobalIlluminationProbe = 5u;
-const U32 kClusterObjectTypeCount = 6u; ///< Point and spot lights, refl and GI probes, decals and fog volumes.
+constexpr U32 kClusterObjectTypePointLight = 0u;
+constexpr U32 kClusterObjectTypeSpotLight = 1u;
+constexpr U32 kClusterObjectTypeDecal = 2u;
+constexpr U32 kClusterObjectTypeFogDensityVolume = 3u;
+constexpr U32 kClusterObjectTypeReflectionProbe = 4u;
+constexpr U32 kClusterObjectTypeGlobalIlluminationProbe = 5u;
+constexpr U32 kClusterObjectTypeCount = 6u; ///< Point and spot lights, refl and GI probes, decals and fog volumes.
 
 // Limits
 #if ANKI_CLUSTERED_SHADING_USE_64BIT
-const U32 kMaxVisiblePointLights = 64u;
-const U32 kMaxVisibleSpotLights = 64u;
-const U32 kMaxVisibleDecals = 64u;
+constexpr U32 kMaxVisiblePointLights = 64u;
+constexpr U32 kMaxVisibleSpotLights = 64u;
+constexpr U32 kMaxVisibleDecals = 64u;
 #else
-const U32 kMaxVisiblePointLights = 32u;
-const U32 kMaxVisibleSpotLights = 32u;
-const U32 kMaxVisibleDecals = 32u;
+constexpr U32 kMaxVisiblePointLights = 32u;
+constexpr U32 kMaxVisibleSpotLights = 32u;
+constexpr U32 kMaxVisibleDecals = 32u;
 #endif
-const U32 kMaxVisibleFogDensityVolumes = 16u;
-const U32 kMaxVisibleReflectionProbes = 16u;
-const U32 kMaxVisibleGlobalIlluminationProbes = 8u;
+constexpr U32 kMaxVisibleFogDensityVolumes = 16u;
+constexpr U32 kMaxVisibleReflectionProbes = 16u;
+constexpr U32 kMaxVisibleGlobalIlluminationProbes = 8u;
 
 // Other consts
-const ANKI_RP F32 kClusterObjectFrustumNearPlane = 0.1f / 4.0f; ///< Near plane of various clusterer object frustums.
-const U32 kMaxShadowCascades = 4u;
-const ANKI_RP F32 kSubsurfaceMin = 0.01f;
+constexpr ANKI_RP F32 kClusterObjectFrustumNearPlane = 0.1f / 4.0f; ///< Near plane of all clusterer object frustums.
+constexpr ANKI_RP F32 kSubsurfaceMin = 0.01f;
 
 /// Point light.
 struct PointLight
@@ -54,8 +53,8 @@ struct PointLight
 
 	Vec4 m_shadowAtlasTileOffsets[6u]; ///< It's a array of Vec2 but because of padding round it up.
 };
-const U32 _ANKI_SIZEOF_PointLight = 9u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(PointLight) == _ANKI_SIZEOF_PointLight);
+constexpr U32 kSizeof_PointLight = 9u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(PointLight) == kSizeof_PointLight);
 
 /// Spot light.
 struct SpotLight
@@ -78,8 +77,8 @@ struct SpotLight
 
 	Mat4 m_textureMatrix;
 };
-const U32 _ANKI_SIZEOF_SpotLight = 12u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(SpotLight) == _ANKI_SIZEOF_SpotLight);
+constexpr U32 kSizeof_SpotLight = 12u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(SpotLight) == kSizeof_SpotLight);
 
 /// Spot light for binning. This is the same structure as SpotLight (same signature) but it's used for binning.
 struct SpotLightBinning
@@ -99,28 +98,29 @@ struct SpotLightBinning
 
 	Mat4 m_textureMatrix;
 };
-const U32 _ANKI_SIZEOF_SpotLightBinning = _ANKI_SIZEOF_SpotLight;
-ANKI_SHADER_STATIC_ASSERT(sizeof(SpotLightBinning) == _ANKI_SIZEOF_SpotLightBinning);
+constexpr U32 kSizeof_SpotLightBinning = kSizeof_SpotLight;
+ANKI_SHADER_STATIC_ASSERT(sizeof(SpotLightBinning) == kSizeof_SpotLightBinning);
 ANKI_SHADER_STATIC_ASSERT(sizeof(SpotLight) == sizeof(SpotLightBinning));
 
 /// Directional light (sun).
 struct DirectionalLight
 {
 	ANKI_RP Vec3 m_diffuseColor;
-	U32 m_cascadeCount; ///< If it's zero then it doesn't cast shadow.
+	U32 m_shadowCascadeCount; ///< If it's zero then it doesn't cast shadow.
 
 	ANKI_RP Vec3 m_direction;
 	U32 m_active;
 
-	ANKI_RP F32 m_effectiveShadowDistance;
-	ANKI_RP F32 m_shadowCascadesDistancePower;
+	Vec4 m_shadowCascadeDistances;
+
+	Vec3 m_padding0;
 	U32 m_shadowLayer; ///< Shadow layer used in RT shadows. Also used to show that it doesn't cast shadow.
-	U32 m_padding0;
 
 	Mat4 m_textureMatrices[kMaxShadowCascades];
 };
-const U32 _ANKI_SIZEOF_DirectionalLight = 3u * ANKI_SIZEOF(Vec4) + kMaxShadowCascades * ANKI_SIZEOF(Mat4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(DirectionalLight) == _ANKI_SIZEOF_DirectionalLight);
+constexpr U32 kSizeof_DirectionalLight = 4u * ANKI_SIZEOF(Vec4) + kMaxShadowCascades * ANKI_SIZEOF(Mat4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(DirectionalLight) == kSizeof_DirectionalLight);
+ANKI_SHADER_STATIC_ASSERT(kMaxShadowCascades == 4u); // Because m_shadowCascadeDistances is a Vec4
 
 /// Representation of a reflection probe.
 struct ReflectionProbe
@@ -134,8 +134,8 @@ struct ReflectionProbe
 	Vec3 m_aabbMax;
 	F32 m_padding1;
 };
-const U32 _ANKI_SIZEOF_ReflectionProbe = 3u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(ReflectionProbe) == _ANKI_SIZEOF_ReflectionProbe);
+constexpr U32 kSizeof_ReflectionProbe = 3u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(ReflectionProbe) == kSizeof_ReflectionProbe);
 
 /// Decal.
 struct Decal
@@ -153,8 +153,8 @@ struct Decal
 	Vec3 m_obbExtend;
 	F32 m_padding0;
 };
-const U32 _ANKI_SIZEOF_Decal = 4u * ANKI_SIZEOF(Vec4) + 2u * ANKI_SIZEOF(Mat4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(Decal) == _ANKI_SIZEOF_Decal);
+constexpr U32 kSizeof_Decal = 4u * ANKI_SIZEOF(Vec4) + 2u * ANKI_SIZEOF(Mat4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(Decal) == kSizeof_Decal);
 
 /// Fog density volume.
 struct FogDensityVolume
@@ -165,8 +165,8 @@ struct FogDensityVolume
 	Vec3 m_aabbMaxOrSphereRadiusSquared;
 	ANKI_RP F32 m_density;
 };
-const U32 _ANKI_SIZEOF_FogDensityVolume = 2u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(FogDensityVolume) == _ANKI_SIZEOF_FogDensityVolume);
+constexpr U32 kSizeof_FogDensityVolume = 2u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(FogDensityVolume) == kSizeof_FogDensityVolume);
 
 /// Global illumination probe
 struct GlobalIlluminationProbe
@@ -183,8 +183,8 @@ struct GlobalIlluminationProbe
 	ANKI_RP F32 m_fadeDistance;
 	F32 m_padding2;
 };
-const U32 _ANKI_SIZEOF_GlobalIlluminationProbe = 3u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(GlobalIlluminationProbe) == _ANKI_SIZEOF_GlobalIlluminationProbe);
+constexpr U32 kSizeof_GlobalIlluminationProbe = 3u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(GlobalIlluminationProbe) == kSizeof_GlobalIlluminationProbe);
 
 /// Common matrices.
 struct CommonMatrices
@@ -210,14 +210,14 @@ struct CommonMatrices
 
 	/// To unproject to view space. Jitter not considered.
 	/// @code
-	/// const F32 z = m_unprojectionParameters.z / (m_unprojectionParameters.w + depth);
-	/// const Vec2 xy = ndc * m_unprojectionParameters.xy * z;
+	/// F32 z = m_unprojectionParameters.z / (m_unprojectionParameters.w + depth);
+	/// Vec2 xy = ndc * m_unprojectionParameters.xy * z;
 	/// pos = Vec3(xy, z);
 	/// @endcode
 	Vec4 m_unprojectionParameters;
 };
-const U32 _ANKI_SIZEOF_CommonMatrices = 43u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(CommonMatrices) == _ANKI_SIZEOF_CommonMatrices);
+constexpr U32 kSizeof_CommonMatrices = 43u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(CommonMatrices) == kSizeof_CommonMatrices);
 
 /// Common uniforms for light shading passes.
 struct ClusteredShadingUniforms
@@ -251,9 +251,9 @@ struct ClusteredShadingUniforms
 	/// This are some additive counts used to map a flat index to the index of the specific object.
 	UVec4 m_objectCountsUpTo[kClusterObjectTypeCount];
 };
-const U32 _ANKI_SIZEOF_ClusteredShadingUniforms = (6u + kClusterObjectTypeCount) * ANKI_SIZEOF(Vec4)
-												  + 2u * ANKI_SIZEOF(CommonMatrices) + ANKI_SIZEOF(DirectionalLight);
-ANKI_SHADER_STATIC_ASSERT(sizeof(ClusteredShadingUniforms) == _ANKI_SIZEOF_ClusteredShadingUniforms);
+constexpr U32 kSizeof_ClusteredShadingUniforms = (6u + kClusterObjectTypeCount) * ANKI_SIZEOF(Vec4)
+												 + 2u * ANKI_SIZEOF(CommonMatrices) + ANKI_SIZEOF(DirectionalLight);
+ANKI_SHADER_STATIC_ASSERT(sizeof(ClusteredShadingUniforms) == kSizeof_ClusteredShadingUniforms);
 
 // Define the type of some cluster object masks
 #if !defined(__cplusplus)
@@ -292,11 +292,11 @@ struct Cluster
 };
 
 #if ANKI_CLUSTERED_SHADING_USE_64BIT
-const U32 _ANKI_SIZEOF_Cluster = 3u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(Cluster) == _ANKI_SIZEOF_Cluster);
+constexpr U32 kSizeof_Cluster = 3u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(Cluster) == kSizeof_Cluster);
 #else
-const U32 _ANKI_SIZEOF_Cluster = 2u * ANKI_SIZEOF(Vec4);
-ANKI_SHADER_STATIC_ASSERT(sizeof(Cluster) == _ANKI_SIZEOF_Cluster);
+constexpr U32 kSizeof_Cluster = 2u * ANKI_SIZEOF(Vec4);
+ANKI_SHADER_STATIC_ASSERT(sizeof(Cluster) == kSizeof_Cluster);
 #endif
 
 ANKI_END_NAMESPACE

+ 22 - 5
AnKi/Shaders/Include/Common.h

@@ -68,18 +68,35 @@ ANKI_END_NAMESPACE
 #	define ScalarVec4 Vec4
 #	define ScalarMat3x4 Mat3x4
 #	define ScalarMat4 Mat4
+
+#	define constexpr const
 #endif
 
 //
-// Various
+// Constants
 //
 ANKI_BEGIN_NAMESPACE
 
+#if !defined(__cplusplus)
+constexpr F32 kEpsilonf = 0.000001f;
+constexpr F16 kEpsilonhf = 0.0001hf; // Divisions by this should be OK according to http://weitz.de/ieee/
+constexpr ANKI_RP F32 kEpsilonRp = F32(kEpsilonhf);
+
+constexpr U32 kMaxU32 = 0xFFFFFFFFu;
+constexpr F32 kMaxF32 = 3.402823e+38;
+constexpr F16 kMaxF16 = 65504.0hf;
+constexpr F16 kMinF16 = 0.00006104hf;
+
+constexpr F32 kPi = 3.14159265358979323846f;
+#endif
+
 /// The renderer will group drawcalls into instances up to this number.
-const U32 kMaxInstanceCount = 64u;
-const U32 kMaxLodCount = 3u;
+constexpr U32 kMaxInstanceCount = 64u;
+
+constexpr U32 kMaxLodCount = 3u;
+constexpr U32 kMaxShadowCascades = 4u;
 
-const F32 kShadowsPolygonOffsetFactor = 1.25f;
-const F32 kShadowsPolygonOffsetUnits = 2.75f;
+constexpr F32 kShadowsPolygonOffsetFactor = 1.25f;
+constexpr F32 kShadowsPolygonOffsetUnits = 2.75f;
 
 ANKI_END_NAMESPACE

+ 12 - 12
AnKi/Shaders/Include/ModelTypes.h

@@ -70,9 +70,9 @@ struct MainVertex
 	Vec2 m_uv0;
 };
 
-const U32 _ANKI_SIZEOF_MainVertex = 4u * 4u;
-const U32 _ANKI_ALIGNOF_MainVertex = 4u;
-ANKI_SHADER_STATIC_ASSERT(_ANKI_SIZEOF_MainVertex == sizeof(MainVertex));
+const U32 kSizeof_MainVertex = 4u * 4u;
+const U32 kAlignof_MainVertex = 4u;
+ANKI_SHADER_STATIC_ASSERT(kSizeof_MainVertex == sizeof(MainVertex));
 
 /// The vertex that contains the bone influences.
 struct BoneInfoVertex
@@ -81,9 +81,9 @@ struct BoneInfoVertex
 	U8Vec4 m_boneWeights;
 };
 
-const U32 _ANKI_SIZEOF_BoneInfoVertex = 8u;
-const U32 _ANKI_ALIGNOF_BoneInfoVertex = 1u;
-ANKI_SHADER_STATIC_ASSERT(_ANKI_SIZEOF_BoneInfoVertex == sizeof(BoneInfoVertex));
+const U32 kSizeof_BoneInfoVertex = 8u;
+const U32 kAlignof_BoneInfoVertex = 1u;
+ANKI_SHADER_STATIC_ASSERT(kSizeof_BoneInfoVertex == sizeof(BoneInfoVertex));
 
 /// A structure that contains all the info of a geometry.
 struct MeshGpuDescriptor
@@ -100,9 +100,9 @@ struct MeshGpuDescriptor
 	Vec3 m_aabbMax;
 };
 
-const U32 _ANKI_SIZEOF_MeshGpuDescriptor = 4u * ANKI_SIZEOF(UVec2) + 8u * ANKI_SIZEOF(F32);
-const U32 _ANKI_ALIGNOF_MeshGpuDescriptor = 8u;
-ANKI_SHADER_STATIC_ASSERT(_ANKI_SIZEOF_MeshGpuDescriptor == sizeof(MeshGpuDescriptor));
+const U32 kSizeof_MeshGpuDescriptor = 4u * ANKI_SIZEOF(UVec2) + 8u * ANKI_SIZEOF(F32);
+const U32 kAlignof_MeshGpuDescriptor = 8u;
+ANKI_SHADER_STATIC_ASSERT(kSizeof_MeshGpuDescriptor == sizeof(MeshGpuDescriptor));
 
 #if defined(__cplusplus)
 enum class TextureChannelId : U8
@@ -145,9 +145,9 @@ struct MaterialGpuDescriptor
 	F32 m_metalness;
 };
 
-const U32 _ANKI_SIZEOF_MaterialGpuDescriptor = 8u * ANKI_SIZEOF(U16) + 3u * ANKI_SIZEOF(Vec3) + 2u * ANKI_SIZEOF(F32);
-const U32 _ANKI_ALIGNOF_MaterialGpuDescriptor = 4u;
-ANKI_SHADER_STATIC_ASSERT(_ANKI_SIZEOF_MaterialGpuDescriptor == sizeof(MaterialGpuDescriptor));
+const U32 kSizeof_MaterialGpuDescriptor = 8u * ANKI_SIZEOF(U16) + 3u * ANKI_SIZEOF(Vec3) + 2u * ANKI_SIZEOF(F32);
+const U32 kAlignof_MaterialGpuDescriptor = 4u;
+ANKI_SHADER_STATIC_ASSERT(kSizeof_MaterialGpuDescriptor == sizeof(MaterialGpuDescriptor));
 
 struct ModelGpuDescriptor
 {

+ 40 - 24
AnKi/Shaders/LightFunctions.glsl

@@ -438,30 +438,6 @@ ANKI_RP Vec3 sampleGlobalIllumination(const Vec3 worldPos, const Vec3 normal, co
 	return irradiance;
 }
 
-U32 computeShadowCascadeIndex(F32 distance, F32 p, F32 effectiveShadowDistance, U32 shadowCascadeCount)
-{
-	const F32 shadowCascadeCountf = F32(shadowCascadeCount);
-	F32 idx = pow(distance / effectiveShadowDistance, 1.0f / p) * shadowCascadeCountf;
-	idx = min(idx, shadowCascadeCountf - 1.0f);
-	return U32(idx);
-}
-
-/// Bring the indices of the closest cascades and a factor to blend them. To visualize what's going on go to
-/// https://www.desmos.com/calculator/dwlbq2j55i
-UVec2 computeShadowCascadeIndex2(F32 distance, F32 p, F32 effectiveShadowDistance, U32 shadowCascadeCount,
-								 out F32 blendFactor)
-{
-	const F32 shadowCascadeCountf = F32(shadowCascadeCount);
-	const F32 idx = pow(distance / effectiveShadowDistance, 1.0f / p) * shadowCascadeCountf;
-
-	const U32 cascadeA = min(U32(idx), shadowCascadeCount - 1u);
-	const U32 cascadeB = min(cascadeA + 1u, shadowCascadeCount - 1u);
-
-	blendFactor = pow(fract(idx), 24.0);
-
-	return UVec2(cascadeA, cascadeB);
-}
-
 /// To play with it use https://www.shadertoy.com/view/sttSDf
 /// http://jcgt.org/published/0007/04/01/paper.pdf by Eric Heitz
 /// Input v: view direction
@@ -514,3 +490,43 @@ Vec3 sampleReflectionVector(Vec3 viewDir, Vec3 normal, F32 roughness, Vec2 unifo
 	// Transform reflected_direction back to the initial space.
 	return tbn * reflectedDirTbn;
 }
+
+/// Get the index of the cascade given the distance from zero.
+U32 computeShadowCascadeIndex(F32 distance, Vec4 cascadeDistances, U32 shadowCascadeCount)
+{
+	U32 cascade;
+	if(distance < cascadeDistances[0u])
+	{
+		cascade = 0u;
+	}
+	else if(distance < cascadeDistances[1u])
+	{
+		cascade = 1u;
+	}
+	else if(distance < cascadeDistances[2u])
+	{
+		cascade = 2u;
+	}
+	else
+	{
+		cascade = 3u;
+	}
+
+	return min(shadowCascadeCount - 1u, cascade);
+}
+
+/// Bring the indices of the closest cascades and a factor to blend them. To visualize what's going on go to:
+/// https://www.desmos.com/calculator/g1ibye6ebg
+UVec2 computeShadowCascadeIndex2(F32 distance, Vec4 cascadeDistances, U32 shadowCascadeCount, out ANKI_RP F32 factor)
+{
+	const U32 cascade = computeShadowCascadeIndex(distance, cascadeDistances, shadowCascadeCount);
+	const U32 nextCascade = min(cascade + 1u, shadowCascadeCount - 1u);
+
+	const F32 minDist = (cascade == 0u) ? 0.0f : cascadeDistances[cascade - 1u];
+	const F32 maxDist = cascadeDistances[cascade];
+
+	factor = (distance - minDist) / max(kEpsilonf, maxDist - minDist);
+	factor = pow(factor, 16.0f);
+
+	return UVec2(cascade, nextCascade);
+}

+ 1 - 1
AnKi/Shaders/LightShading.ankiprog

@@ -96,7 +96,7 @@ void main()
 	if(dirLight.m_active != 0u)
 	{
 		ANKI_RP F32 shadowFactor;
-		if(dirLight.m_cascadeCount > 0u)
+		if(dirLight.m_shadowCascadeCount > 0u)
 		{
 #if USE_SHADOW_LAYERS
 			shadowFactor = resolvedSm[dirLight.m_shadowLayer];

+ 1 - 1
AnKi/Shaders/RtShadowsRayGen.ankiprog

@@ -103,7 +103,7 @@ void main()
 
 	// Dir light
 	const DirectionalLight dirLight = u_clusteredShading.m_directionalLight;
-	ANKI_BRANCH if(dirLight.m_active != 0u && dirLight.m_cascadeCount > 0u)
+	ANKI_BRANCH if(dirLight.m_active != 0u && dirLight.m_shadowCascadeCount > 0u)
 	{
 		for(I32 i = 0; i < RAYS_PER_PIXEL; ++i)
 		{

+ 52 - 17
AnKi/Shaders/ShadowmapsResolve.glsl

@@ -16,6 +16,8 @@ ANKI_SPECIALIZATION_CONSTANT_U32(kTileSize, 5u);
 #define CLUSTERED_SHADING_CLUSTERS_BINDING 4u
 #include <AnKi/Shaders/ClusteredShadingCommon.glsl>
 
+#define DEBUG_CASCADES 0
+
 layout(set = 0, binding = 5) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 6) uniform samplerShadow u_linearAnyClampShadowSampler;
 layout(set = 0, binding = 7) uniform sampler u_trilinearRepeatSampler;
@@ -31,6 +33,35 @@ layout(location = 0) in Vec2 in_uv;
 layout(location = 0) out Vec4 out_color;
 #endif
 
+Vec3 computeDebugShadowCascadeColor(U32 cascade)
+{
+	if(cascade == 0u)
+	{
+		return Vec3(0.0f, 1.0f, 0.0f);
+	}
+	else if(cascade == 1u)
+	{
+		return Vec3(0.0f, 0.0f, 1.0f);
+	}
+	else if(cascade == 2u)
+	{
+		return Vec3(0.0f, 1.0f, 1.0f);
+	}
+	else
+	{
+		return Vec3(1.0f, 0.0f, 0.0f);
+	}
+}
+
+void writeOutputColor(ANKI_RP Vec4 shadowFactors)
+{
+#if defined(ANKI_COMPUTE_SHADER)
+	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy), shadowFactors);
+#else
+	out_color = shadowFactors;
+#endif
+}
+
 void main()
 {
 #if defined(ANKI_COMPUTE_SHADER)
@@ -65,24 +96,33 @@ void main()
 
 	// Layers
 	U32 shadowCasterCountPerFragment = 0u;
-	const U32 maxShadowCastersPerFragment = 4u;
-	ANKI_RP F32 shadowFactors[maxShadowCastersPerFragment] = F32[](0.0, 0.0, 0.0, 0.0);
+	const U32 kMaxShadowCastersPerFragment = 4u;
+	ANKI_RP Vec4 shadowFactors = Vec4(0.0f);
 
 	// Dir light
 	const DirectionalLight dirLight = u_clusteredShading.m_directionalLight;
-	if(dirLight.m_active != 0u && dirLight.m_cascadeCount > 0u)
+	if(dirLight.m_active != 0u && dirLight.m_shadowCascadeCount > 0u)
 	{
 		const ANKI_RP F32 positiveZViewSpace =
 			testPlanePoint(u_clusteredShading.m_nearPlaneWSpace.xyz, u_clusteredShading.m_nearPlaneWSpace.w, worldPos)
 			+ u_clusteredShading.m_near;
 
+		const F32 lastCascadeDistance = dirLight.m_shadowCascadeDistances[dirLight.m_shadowCascadeCount - 1u];
 		ANKI_RP F32 shadowFactor;
-		if(positiveZViewSpace < dirLight.m_effectiveShadowDistance)
+		if(positiveZViewSpace < lastCascadeDistance)
 		{
-			F32 cascadeBlendFactor;
-			const UVec2 cascadeIndices = computeShadowCascadeIndex2(
-				positiveZViewSpace, dirLight.m_shadowCascadesDistancePower, dirLight.m_effectiveShadowDistance,
-				dirLight.m_cascadeCount, cascadeBlendFactor);
+			ANKI_RP F32 cascadeBlendFactor;
+			const UVec2 cascadeIndices =
+				computeShadowCascadeIndex2(positiveZViewSpace, dirLight.m_shadowCascadeDistances,
+										   dirLight.m_shadowCascadeCount, cascadeBlendFactor);
+
+#if DEBUG_CASCADES
+			const Vec3 debugColorA = computeDebugShadowCascadeColor(cascadeIndices[0]);
+			const Vec3 debugColorB = computeDebugShadowCascadeColor(cascadeIndices[1]);
+			const Vec3 debugColor = mix(debugColorA, debugColorB, cascadeBlendFactor);
+			writeOutputColor(Vec4(debugColor, 0.0f));
+			return;
+#endif
 
 #if PCF
 			const F32 shadowFactorCascadeA = computeShadowFactorDirLightPcf(
@@ -111,7 +151,7 @@ void main()
 				shadowFactor = mix(shadowFactorCascadeA, shadowFactorCascadeB, cascadeBlendFactor);
 			}
 
-			ANKI_RP F32 distanceFadeFactor = saturate(positiveZViewSpace / dirLight.m_effectiveShadowDistance);
+			ANKI_RP F32 distanceFadeFactor = saturate(positiveZViewSpace / lastCascadeDistance);
 			distanceFadeFactor = pow(distanceFadeFactor, 8.0);
 			shadowFactor += distanceFadeFactor;
 		}
@@ -142,7 +182,7 @@ void main()
 			const ANKI_RP F32 shadowFactor =
 				computeShadowFactorPointLight(light, frag2Light, u_shadowAtlasTex, u_linearAnyClampShadowSampler);
 #endif
-			shadowFactors[min(maxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
+			shadowFactors[min(kMaxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
 		}
 	}
 
@@ -162,15 +202,10 @@ void main()
 			const ANKI_RP F32 shadowFactor =
 				computeShadowFactorSpotLight(light, worldPos, u_shadowAtlasTex, u_linearAnyClampShadowSampler);
 #endif
-			shadowFactors[min(maxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
+			shadowFactors[min(kMaxShadowCastersPerFragment - 1u, shadowCasterCountPerFragment++)] = shadowFactor;
 		}
 	}
 
 	// Store
-#if defined(ANKI_COMPUTE_SHADER)
-	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy),
-			   Vec4(shadowFactors[0], shadowFactors[1], shadowFactors[2], shadowFactors[3]));
-#else
-	out_color = Vec4(shadowFactors[0], shadowFactors[1], shadowFactors[2], shadowFactors[3]);
-#endif
+	writeOutputColor(shadowFactors);
 }

+ 0 - 1
AnKi/Shaders/VolumetricFogAccumulation.ankiprog

@@ -9,7 +9,6 @@ ANKI_SPECIALIZATION_CONSTANT_U32(kZSplitCount, 4u);
 
 #pragma anki start comp
 
-#include <AnKi/Shaders/Include/ClusteredShadingFunctions.h>
 #include <AnKi/Shaders/Include/MiscRendererTypes.h>
 #include <AnKi/Shaders/Common.glsl>
 

+ 4 - 4
AnKi/Shaders/VolumetricLightingAccumulation.ankiprog

@@ -109,11 +109,11 @@ Vec4 accumulateLightsAndFog(Cluster cluster, Vec3 worldPos, F32 negativeZViewSpa
 		F32 factor = phaseFunction(viewDir, dirLight.m_direction, kPhaseFunctionAnisotropy);
 
 #if ENABLE_SHADOWS
-		if(dirLight.m_cascadeCount > 0u && negativeZViewSpace < dirLight.m_effectiveShadowDistance)
+		if(dirLight.m_shadowCascadeCount > 0u
+		   && negativeZViewSpace < dirLight.m_shadowCascadeDistances[dirLight.m_shadowCascadeCount - 1u])
 		{
-			const U32 cascadeIdx =
-				computeShadowCascadeIndex(negativeZViewSpace, dirLight.m_shadowCascadesDistancePower,
-										  dirLight.m_effectiveShadowDistance, dirLight.m_cascadeCount);
+			const U32 cascadeIdx = computeShadowCascadeIndex(negativeZViewSpace, dirLight.m_shadowCascadeDistances,
+															 dirLight.m_shadowCascadeCount);
 
 			factor *= computeShadowFactorDirLight(dirLight, cascadeIdx, worldPos, u_shadowAtlasTex,
 												  u_linearAnyClampShadowSampler);

+ 0 - 2
Samples/PhysicsPlayground/Assets/Scene.lua

@@ -337,8 +337,6 @@ node = scene:newPerspectiveCameraNode("Camera_Orientation")
 scene:setActiveCameraNode(node:getSceneNodeBase())
 frustumc = node:getSceneNodeBase():getFrustumComponent()
 frustumc:setPerspective(0.100000, 500.000000, getMainRenderer():getAspectRatio() * 0.750416, 0.750416)
-frustumc:setShadowCascadesDistancePower(1.5)
-frustumc:setEffectiveShadowDistance(100.000000)
 trf = Transform.new()
 trf:setOrigin(Vec4.new(7.481132, 7.870111, 6.507640, 0))
 rot = Mat3x4.new()

+ 0 - 2
Samples/SimpleScene/Assets/Scene.lua

@@ -86,8 +86,6 @@ node = scene:newPerspectiveCameraNode("Camera")
 scene:setActiveCameraNode(node:getSceneNodeBase())
 frustumc = node:getSceneNodeBase():getFrustumComponent()
 frustumc:setPerspective(0.100000, 500.000000, getMainRenderer():getAspectRatio() * 1.024779, 1.024779)
-frustumc:setShadowCascadesDistancePower(1.5)
-frustumc:setEffectiveShadowDistance(100.000000)
 trf = Transform.new()
 trf:setOrigin(Vec4.new(0.217066, 6.668793, 17.325689, 0))
 rot = Mat3x4.new()

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

@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <skeleton>
 	<bones>
-		<bone name="Body" boneTransform="-0.000000 0.000000 -1.000000 -0.000000 -0.000000 -1.000000 -0.000000 3.786524 -1.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 1.000000 " transform="-0.000000 -0.000000 -1.000000 -0.036258 -0.000000 -1.000000 0.000000 3.786523 -1.000000 0.000000 0.000000 0.070229 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.035125 -0.054510 -0.997895 0.000005 0.860321 0.509748 0.002438 0.025070 0.508542 -0.858595 0.064801 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.953409 -0.299885 0.032885 0.937085 0.298847 0.953730 0.033020 0.000005 -0.041265 -0.021654 0.998914 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 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.217251 0.894560 0.390595 0.415657 0.866976 0.007022 -0.498300 0.480190 -0.448502 0.446893 -0.774037 -0.719946 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.415664 1.000000 -0.000000 0.000000 0.480184 -0.000000 -0.866025 0.500001 0.719943 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.414406 -0.492556 0.765282 -0.000000 -0.492683 0.585593 0.643696 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.821940 0.569425 -0.013064 0.937093 -0.555697 0.806734 0.200949 -0.000000 0.124965 -0.157908 0.979515 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="0.951945 -0.302854 -0.045618 0.978164 0.302265 0.953025 -0.019457 0.134136 0.049368 0.004734 0.998769 -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 " />
 	</bones>
 </skeleton>

+ 0 - 105
Samples/SkeletalAnimation/Assets/ArmatureAction.001_ed176268e078c4cc.ankianim

@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="ArmL2">
-			<positionKeys>
-				<key time="0.000000">-0.000000 0.525459 -0.000000</key>
-				<key time="0.833333">-0.000000 0.525459 -0.000000</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="Body">
-			<positionKeys>
-				<key time="0.000000">-0.000000 0.102511 0.000000</key>
-				<key time="0.833333">-0.000000 0.102511 0.000000</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="Flap3">
-			<positionKeys>
-				<key time="0.000000">0.188032 0.528233 -0.426542</key>
-				<key time="0.833333">0.188032 0.528233 -0.426542</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="PinceR">
-			<positionKeys>
-				<key time="0.000000">0.000000 0.553622 -0.000000</key>
-				<key time="0.833333">0.000000 0.553622 -0.000000</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="ArmL1">
-			<positionKeys>
-				<key time="0.000000">0.541376 0.783434 0.238654</key>
-				<key time="0.833333">0.541376 0.783434 0.238654</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="ArmR2">
-			<positionKeys>
-				<key time="0.000000">0.000000 0.525458 -0.000000</key>
-				<key time="0.833333">0.000000 0.525458 -0.000000</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="Flap1">
-			<positionKeys>
-				<key time="0.000000">0.275380 0.528233 0.376112</key>
-				<key time="0.833333">0.275380 0.528233 0.376112</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="PinceL">
-			<positionKeys>
-				<key time="0.000000">-0.000000 0.553622 -0.000000</key>
-				<key time="0.833333">-0.000000 0.553622 -0.000000</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="Flap2">
-			<positionKeys>
-				<key time="0.000000">-0.463412 0.528233 0.050431</key>
-				<key time="0.833333">-0.463412 0.528233 0.050431</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-		<channel name="ArmR1">
-			<positionKeys>
-				<key time="0.000000">-0.541375 0.783433 -0.238654</key>
-				<key time="0.833333">-0.541375 0.783433 -0.238654</key>
-			</positionKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-				<key time="0.833333">1.000000</key>
-			</scaleKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 15
Samples/SkeletalAnimation/Assets/Armature_de7b8c5e15ab3f1c.ankiskel

@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<skeleton>
-	<bones>
-		<bone name="Body" boneTransform="-0.915035 0.000000 0.403374 -0.000000 0.000000 1.000000 -0.000000 -0.102511 -0.403374 0.000000 -0.915035 0.000000 -0.000000 -0.000000 -0.000000 1.000000 " transform="-0.915035 0.000000 -0.403374 -0.000000 0.000000 1.000000 -0.000000 0.102511 0.403374 -0.000000 -0.915035 0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmL1" parent="Body" boneTransform="-0.643793 0.765200 -0.000001 -1.058821 -0.765200 -0.643793 -0.000001 0.117639 -0.000001 0.000000 1.000000 -0.000001 0.000000 0.000000 -0.000000 1.000000 " transform="0.589093 0.700185 0.403375 0.541376 0.765200 -0.643793 0.000000 0.783434 0.259690 0.308662 -0.915035 0.238654 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmL2" parent="ArmL1" boneTransform="-0.532753 0.846271 0.000000 -0.992877 -0.846271 -0.532753 -0.000000 -0.549194 0.000000 -0.000000 1.000000 0.000000 0.000000 0.000000 -0.000000 1.000000 " transform="0.990549 0.137161 -0.000001 -0.000000 -0.137161 0.990549 -0.000000 0.525459 0.000001 0.000000 1.000000 -0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="PinceR" parent="ArmL2" boneTransform="-0.722195 0.691690 -0.000001 -1.230821 -0.691690 -0.722195 0.000000 -0.828907 -0.000001 0.000001 1.000000 -0.000001 -0.000000 0.000000 -0.000000 1.000000 " transform="0.970108 -0.242673 0.000001 0.000000 0.242673 0.970108 -0.000000 0.553622 -0.000001 0.000000 1.000000 -0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap3" parent="Body" boneTransform="-0.000110 -1.000000 -0.000000 0.630743 -0.000793 -0.000000 1.000000 -0.466148 -1.000000 0.000110 -0.000793 0.000301 0.000000 0.000000 -0.000000 1.000000 " transform="0.000100 0.404099 0.914715 0.188032 -1.000000 -0.000000 0.000109 0.528233 0.000044 -0.914715 0.404099 -0.426542 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap2" parent="Body" boneTransform="0.000000 -1.000000 0.000000 0.630743 0.834634 0.000000 -0.550806 -0.465317 0.550806 0.000000 0.834633 -0.027827 -0.000000 0.000000 -0.000000 1.000000 " transform="-0.000000 -0.985900 -0.167337 -0.463412 -1.000000 0.000000 0.000000 0.528233 -0.000000 0.167337 -0.985900 0.050431 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="Flap1" parent="Body" boneTransform="0.000001 -1.000000 -0.000001 0.630744 -0.820004 0.000000 -0.572358 -0.464434 0.572358 0.000002 -0.820004 0.039936 -0.000000 0.000000 -0.000000 1.000000 " transform="-0.000001 0.519458 -0.854496 0.275380 -1.000000 0.000000 0.000002 0.528233 0.000001 0.854496 0.519458 0.376112 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmR1" parent="Body" boneTransform="-0.643793 -0.765200 0.000000 1.058821 0.765200 -0.643793 -0.000000 0.117638 0.000000 0.000000 1.000000 -0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="0.589093 -0.700185 0.403374 -0.541375 -0.765200 -0.643793 -0.000000 0.783433 0.259689 -0.308662 -0.915035 -0.238654 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="ArmR2" parent="ArmR1" boneTransform="-0.532753 -0.846271 0.000000 0.992877 0.846271 -0.532753 -0.000000 -0.549193 0.000000 0.000000 1.000000 -0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="0.990549 -0.137160 0.000000 0.000000 0.137160 0.990549 -0.000000 0.525458 -0.000000 0.000000 1.000000 -0.000000 0.000000 0.000000 0.000000 1.000000 " />
-		<bone name="PinceL" parent="ArmR2" boneTransform="-0.742509 -0.669835 0.000000 1.255003 0.669835 -0.742509 0.000000 -0.791816 -0.000000 0.000000 1.000000 -0.000000 -0.000000 0.000000 -0.000000 1.000000 " transform="0.962436 0.271507 0.000000 -0.000000 -0.271507 0.962436 -0.000000 0.553622 -0.000000 0.000000 1.000000 -0.000000 0.000000 0.000000 0.000000 1.000000 " />
-	</bones>
-</skeleton>

+ 0 - 16
Samples/SkeletalAnimation/Assets/CameraAction_59f70a6275119751.ankianim

@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="Camera">
-			<positionKeys>
-				<key time="0.000000">5.526846 8.527484 -6.015655</key>
-			</positionKeys>
-			<rotationKeys>
-				<key time="0.000000">0.188035 0.809169 -0.497781 0.249204</key>
-			</rotationKeys>
-			<scaleKeys>
-				<key time="0.000000">1.000000</key>
-			</scaleKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/Cube.001Action_55146e55435d9487.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="Cube.001">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/CubeAction_cc97b6f981ce5033.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="Cube">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

BIN
Samples/SkeletalAnimation/Assets/Drone_diff.ankitex


BIN
Samples/SkeletalAnimation/Assets/Drone_normal.ankitex


BIN
Samples/SkeletalAnimation/Assets/Drone_roughness.ankitex


+ 0 - 10
Samples/SkeletalAnimation/Assets/FireAction_8ff669cf4772f835.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="Fire">
-			<rotationKeys>
-				<key time="0.000000">0.500000 -0.500000 -0.500000 0.500000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/FireBisAction_e3f9104496e07f9b.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="FireBis">
-			<rotationKeys>
-				<key time="0.000000">0.500000 -0.500000 -0.500000 0.500000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/FireTertAction_e587bc6a414ddf8f.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="FireTert">
-			<rotationKeys>
-				<key time="0.000000">0.500000 -0.500000 -0.500000 0.500000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/LampAction_351580a78ce0a468.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="Lamp">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 37
Samples/SkeletalAnimation/Assets/Robot_a9af3c46eb28a7d4.ankimtl

@@ -1,37 +0,0 @@
-<?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>
-
-	<inputs>
-		
-		<input name="m_diffColor" value="0.588000 0.588000 0.588000"/>
-		<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_emission" value="0.000000 0.000000 0.000000"/>
-		<input name="m_subsurface" value="0.000000"/>
-		
-	</inputs>
-</material>

+ 5 - 18
Samples/SkeletalAnimation/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- 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
+-- 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 -optimize-animations 1
 local scene = getSceneGraph()
 local events = getEventManager()
 
@@ -45,18 +45,7 @@ trf:setRotation(rot)
 trf:setScale(9.000000)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
-node = scene:newModelNode("droid")
-node:getSceneNodeBase():getModelComponent():loadModelResource("Assets/droid_Robot_7a560a2f010dcbd0.ankimdl")
-node:getSceneNodeBase():getSkinComponent():loadSkeletonResource("Assets/Armature_de7b8c5e15ab3f1c.ankiskel")
-trf = Transform.new()
-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)
-node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
-
-node = scene:newPointLightNode("Lamp_Orientation")
+node = scene:newPointLightNode("Lamp")
 lcomp = node:getSceneNodeBase():getLightComponent()
 lcomp:setDiffuseColor(Vec4.new(100.000000, 100.000000, 100.000000, 1))
 lcomp:setShadowEnabled(1)
@@ -64,17 +53,15 @@ lcomp:setRadius(100.000000)
 trf = Transform.new()
 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)
+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)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
-node = scene:newPerspectiveCameraNode("Camera_Orientation")
+node = scene:newPerspectiveCameraNode("Camera")
 scene:setActiveCameraNode(node:getSceneNodeBase())
 frustumc = node:getSceneNodeBase():getFrustumComponent()
-frustumc:setPerspective(0.100000, 100.000000, getMainRenderer():getAspectRatio() * 0.750416, 0.750416)
-frustumc:setShadowCascadesDistancePower(1.5)
-frustumc:setEffectiveShadowDistance(100.000000)
+frustumc:setPerspective(0.100000, 200.000000, getMainRenderer():getAspectRatio() * 0.750416, 0.750416)
 trf = Transform.new()
 trf:setOrigin(Vec4.new(5.526846, 8.527484, -6.015655, 0))
 rot = Mat3x4.new()

+ 0 - 10
Samples/SkeletalAnimation/Assets/droid.001Action_b8b4c8d9e4cfaa52.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="droid.001">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

BIN
Samples/SkeletalAnimation/Assets/droid_30559463d0f81c57.ankimesh


+ 0 - 8
Samples/SkeletalAnimation/Assets/droid_Robot_7a560a2f010dcbd0.ankimdl

@@ -1,8 +0,0 @@
-<model>
-	<modelPatches>
-		<modelPatch>
-			<mesh>Assets/droid_30559463d0f81c57.ankimesh</mesh>
-			<material>Assets/Robot_a9af3c46eb28a7d4.ankimtl</material>
-		</modelPatch>
-	</modelPatches>
-</model>

+ 31 - 31
Samples/SkeletalAnimation/Assets/float.001_ccb9eb33e30c8fa4.ankianim

@@ -40,7 +40,7 @@
 				<key time="1.000000">-0.013873 0.045103 0.296742 0.953791</key>
 				<key time="1.033333">-0.013978 0.046506 0.302994 0.951755</key>
 				<key time="1.066667">-0.014105 0.047849 0.308933 0.949775</key>
-				<key time="1.100000">-0.014254 0.049122 0.314517 0.947873</key>
+				<key time="1.100000">-0.014254 0.049122 0.314516 0.947873</key>
 				<key time="1.133333">-0.014429 0.050311 0.319698 0.946073</key>
 				<key time="1.166667">-0.014630 0.051405 0.324435 0.944397</key>
 				<key time="1.200000">-0.014861 0.052392 0.328681 0.942869</key>
@@ -72,7 +72,7 @@
 				<key time="2.066667">-0.031332 0.012207 0.148789 0.988297</key>
 				<key time="2.133333">-0.028396 0.013307 0.149243 0.988303</key>
 				<key time="2.200000">-0.025388 0.014433 0.149707 0.988299</key>
-				<key time="2.266667">-0.022452 0.015533 0.150158 0.988285</key>
+				<key time="2.266667">-0.022452 0.015533 0.150157 0.988285</key>
 				<key time="2.300000">-0.021055 0.016056 0.150371 0.988275</key>
 				<key time="2.333333">-0.019729 0.016552 0.150574 0.988263</key>
 				<key time="2.366667">-0.018493 0.017015 0.150763 0.988251</key>
@@ -90,19 +90,19 @@
 				<key time="0.000000">-0.036258 3.786523 0.070229</key>
 				<key time="0.066667">-0.036258 3.801466 0.070229</key>
 				<key time="0.133333">-0.036258 3.842028 0.070229</key>
-				<key time="0.266667">-0.036258 3.974385 0.070229</key>
+				<key time="0.266667">-0.036258 3.974386 0.070229</key>
 				<key time="0.400000">-0.036258 4.132361 0.070229</key>
 				<key time="0.533333">-0.036258 4.264719 0.070229</key>
-				<key time="0.600000">-0.036258 4.305280 0.070229</key>
+				<key time="0.600000">-0.036258 4.305281 0.070229</key>
 				<key time="0.666667">-0.036258 4.320224 0.070229</key>
-				<key time="0.800000">-0.036258 4.290236 0.070229</key>
+				<key time="0.800000">-0.036258 4.290237 0.070229</key>
 				<key time="1.000000">-0.036258 4.235033 0.070229</key>
-				<key time="1.066667">-0.036258 4.251730 0.070229</key>
+				<key time="1.066667">-0.036258 4.251731 0.070229</key>
 				<key time="1.266667">-0.036258 4.378891 0.070229</key>
 				<key time="1.333333">-0.036258 4.395588 0.070229</key>
 				<key time="1.600000">-0.036258 4.328062 0.070229</key>
 				<key time="2.133333">-0.036258 4.320224 0.070229</key>
-				<key time="2.266667">-0.036258 4.307793 0.070229</key>
+				<key time="2.266667">-0.036258 4.307794 0.070229</key>
 				<key time="2.333333">-0.036258 4.222786 0.070229</key>
 				<key time="2.466667">-0.036258 3.946914 0.070229</key>
 				<key time="2.533333">-0.036258 3.833036 0.070229</key>
@@ -212,7 +212,7 @@
 				<key time="0.433333">-0.372229 -0.557440 0.407047 0.620499</key>
 				<key time="0.466667">-0.374688 -0.554542 0.410546 0.619310</key>
 				<key time="0.500000">-0.376732 -0.552110 0.413459 0.618303</key>
-				<key time="0.533333">-0.378287 -0.550247 0.415676 0.617528</key>
+				<key time="0.533333">-0.378287 -0.550247 0.415676 0.617527</key>
 				<key time="0.566667">-0.379277 -0.549056 0.417088 0.617029</key>
 				<key time="0.600000">-0.379624 -0.548637 0.417583 0.616853</key>
 				<key time="0.633333">-0.378890 -0.549562 0.416360 0.617308</key>
@@ -239,7 +239,7 @@
 				<key time="1.333333">-0.286137 -0.646723 0.263367 0.656135</key>
 				<key time="1.366667">-0.285387 -0.647414 0.262078 0.656296</key>
 				<key time="1.400000">-0.284962 -0.647810 0.261340 0.656385</key>
-				<key time="1.433333">-0.284827 -0.647937 0.261104 0.656412</key>
+				<key time="1.433333">-0.284827 -0.647936 0.261104 0.656412</key>
 				<key time="1.466667">-0.288164 -0.644777 0.266457 0.655915</key>
 				<key time="1.500000">-0.296907 -0.636279 0.280528 0.654446</key>
 				<key time="1.533333">-0.309121 -0.623855 0.300302 0.651973</key>
@@ -285,7 +285,7 @@
 				<key time="0.000000">0.086756 0.188718 0.000642 0.978191</key>
 				<key time="0.033333">0.086561 0.189061 -0.000947 0.978142</key>
 				<key time="0.066667">0.086006 0.190032 -0.005471 0.977988</key>
-				<key time="0.100000">0.085131 0.191549 -0.012570 0.977703</key>
+				<key time="0.100000">0.085131 0.191549 -0.012569 0.977703</key>
 				<key time="0.133333">0.083975 0.193524 -0.021883 0.977250</key>
 				<key time="0.166667">0.082580 0.195868 -0.033047 0.976588</key>
 				<key time="0.200000">0.080985 0.198493 -0.045696 0.975681</key>
@@ -365,8 +365,8 @@
 		</channel>
 		<channel name="Flap1">
 			<positionKeys>
-				<key time="0.000000">0.415664 0.480184 0.719943</key>
-				<key time="2.600000">0.415664 0.480184 0.719943</key>
+				<key time="0.000000">0.415664 0.480183 0.719943</key>
+				<key time="2.600000">0.415664 0.480183 0.719943</key>
 			</positionKeys>
 			<rotationKeys>
 				<key time="0.000000">-0.353553 -0.353553 0.612373 0.612373</key>
@@ -380,12 +380,12 @@
 				<key time="0.266667">-0.320203 -0.365192 0.641509 0.593777</key>
 				<key time="0.300000">-0.313161 -0.367503 0.647378 0.589724</key>
 				<key time="0.333333">-0.305942 -0.369821 0.653295 0.585523</key>
-				<key time="0.366667">-0.298691 -0.372098 0.659140 0.581259</key>
+				<key time="0.366667">-0.298691 -0.372097 0.659140 0.581259</key>
 				<key time="0.400000">-0.291554 -0.374289 0.664796 0.577019</key>
 				<key time="0.433333">-0.284680 -0.376353 0.670155 0.572895</key>
 				<key time="0.466667">-0.278218 -0.378253 0.675114 0.568983</key>
 				<key time="0.500000">-0.272319 -0.379953 0.679575 0.565381</key>
-				<key time="0.533333">-0.267133 -0.381421 0.683445 0.562193</key>
+				<key time="0.533333">-0.267134 -0.381421 0.683445 0.562193</key>
 				<key time="0.566667">-0.262812 -0.382625 0.686634 0.559519</key>
 				<key time="0.600000">-0.259507 -0.383535 0.689051 0.557464</key>
 				<key time="0.633333">-0.257369 -0.384118 0.690604 0.556130</key>
@@ -408,7 +408,7 @@
 				<key time="1.233333">-0.372106 -0.315917 0.595469 0.638083</key>
 				<key time="1.266667">-0.373594 -0.314531 0.601148 0.632549</key>
 				<key time="1.300000">-0.371240 -0.316634 0.600786 0.633230</key>
-				<key time="1.333333">-0.367090 -0.319916 0.598157 0.636481</key>
+				<key time="1.333333">-0.367090 -0.319917 0.598157 0.636481</key>
 				<key time="1.366667">-0.361428 -0.324127 0.593544 0.641885</key>
 				<key time="1.400000">-0.354537 -0.329007 0.587226 0.649017</key>
 				<key time="1.433333">-0.346705 -0.334297 0.579484 0.657450</key>
@@ -422,14 +422,14 @@
 				<key time="1.700000">-0.286169 -0.365135 0.505017 0.727834</key>
 				<key time="1.733333">-0.281718 -0.366187 0.497979 0.733866</key>
 				<key time="1.766667">-0.277974 -0.366769 0.491662 0.739243</key>
-				<key time="1.800000">-0.274878 -0.366954 0.486044 0.744008</key>
+				<key time="1.800000">-0.274878 -0.366954 0.486044 0.744009</key>
 				<key time="1.833333">-0.272371 -0.366813 0.481100 0.748201</key>
 				<key time="1.866667">-0.270394 -0.366414 0.476805 0.751854</key>
 				<key time="1.900000">-0.268885 -0.365824 0.473131 0.754997</key>
 				<key time="1.933333">-0.267783 -0.365109 0.470048 0.757656</key>
 				<key time="1.966667">-0.267025 -0.364332 0.467527 0.759854</key>
 				<key time="2.000000">-0.266548 -0.363557 0.465537 0.761613</key>
-				<key time="2.033333">-0.266290 -0.362846 0.464046 0.762951</key>
+				<key time="2.033333">-0.266289 -0.362846 0.464046 0.762951</key>
 				<key time="2.066667">-0.266185 -0.362262 0.463022 0.763887</key>
 				<key time="2.100000">-0.266169 -0.361866 0.462432 0.764436</key>
 				<key time="2.133333">-0.266179 -0.361721 0.462243 0.764616</key>
@@ -497,7 +497,7 @@
 				<key time="1.000000">0.657821 0.660877 0.095076 0.348530</key>
 				<key time="1.033333">0.661998 0.648105 0.077006 0.368495</key>
 				<key time="1.066667">0.665722 0.633989 0.057976 0.389245</key>
-				<key time="1.100000">0.668539 0.619893 0.040145 0.408873</key>
+				<key time="1.100000">0.668539 0.619893 0.040145 0.408874</key>
 				<key time="1.133333">0.670247 0.607406 0.025668 0.425638</key>
 				<key time="1.166667">0.670834 0.598248 0.016665 0.437954</key>
 				<key time="1.200000">0.670335 0.594144 0.015217 0.444312</key>
@@ -533,13 +533,13 @@
 				<key time="2.200000">0.673531 0.655358 0.075862 0.333327</key>
 				<key time="2.233333">0.678053 0.651782 0.063108 0.333829</key>
 				<key time="2.266667">0.682299 0.648202 0.050759 0.334253</key>
-				<key time="2.300000">0.686238 0.644673 0.038958 0.334601</key>
+				<key time="2.300000">0.686238 0.644672 0.038958 0.334601</key>
 				<key time="2.333333">0.689841 0.641251 0.027841 0.334877</key>
 				<key time="2.366667">0.693085 0.637998 0.017546 0.335088</key>
 				<key time="2.400000">0.695952 0.634977 0.008205 0.335242</key>
 				<key time="2.433333">0.698425 0.632253 -0.000050 0.335350</key>
 				<key time="2.466667">0.700489 0.629888 -0.007090 0.335420</key>
-				<key time="2.500000">0.702129 0.627947 -0.012788 0.335462</key>
+				<key time="2.500000">0.702128 0.627947 -0.012788 0.335462</key>
 				<key time="2.533333">0.703328 0.626490 -0.017016 0.335485</key>
 				<key time="2.566667">0.704067 0.625577 -0.019648 0.335495</key>
 				<key time="2.600000">0.704320 0.625261 -0.020554 0.335498</key>
@@ -557,12 +557,12 @@
 				<key time="0.133333">-0.594868 -0.382204 0.595529 0.381310</key>
 				<key time="0.166667">-0.594543 -0.382645 0.595834 0.380897</key>
 				<key time="0.200000">-0.594058 -0.383303 0.596288 0.380282</key>
-				<key time="0.233333">-0.593379 -0.384220 0.596921 0.379422</key>
+				<key time="0.233333">-0.593380 -0.384220 0.596921 0.379422</key>
 				<key time="0.266667">-0.592474 -0.385439 0.597761 0.378277</key>
 				<key time="0.300000">-0.591308 -0.387002 0.598835 0.376803</key>
 				<key time="0.333333">-0.589845 -0.388950 0.600172 0.374959</key>
 				<key time="0.366667">-0.588050 -0.391324 0.601795 0.372700</key>
-				<key time="0.400000">-0.585883 -0.394164 0.603730 0.369982</key>
+				<key time="0.400000">-0.585883 -0.394163 0.603730 0.369982</key>
 				<key time="0.433333">-0.583304 -0.397506 0.605997 0.366760</key>
 				<key time="0.466667">-0.580272 -0.401389 0.608616 0.362985</key>
 				<key time="0.500000">-0.576742 -0.405845 0.611602 0.358611</key>
@@ -572,15 +572,15 @@
 				<key time="0.633333">-0.556603 -0.430251 0.627340 0.333950</key>
 				<key time="0.666667">-0.549964 -0.438378 0.631872 0.325735</key>
 				<key time="0.700000">-0.543133 -0.446746 0.636218 0.317254</key>
-				<key time="0.733333">-0.536522 -0.454789 0.640157 0.309047</key>
-				<key time="0.766667">-0.530568 -0.461958 0.643498 0.301667</key>
+				<key time="0.733333">-0.536522 -0.454789 0.640157 0.309046</key>
+				<key time="0.766667">-0.530569 -0.461958 0.643498 0.301667</key>
 				<key time="0.800000">-0.525733 -0.467723 0.646073 0.295685</key>
-				<key time="0.833333">-0.522489 -0.471565 0.647733 0.291676</key>
+				<key time="0.833333">-0.522488 -0.471565 0.647733 0.291676</key>
 				<key time="0.866667">-0.521305 -0.472963 0.648323 0.290213</key>
 				<key time="0.900000">-0.523004 -0.471505 0.648030 0.290185</key>
 				<key time="0.933333">-0.527773 -0.467387 0.647186 0.290095</key>
 				<key time="0.966667">-0.535112 -0.460976 0.645829 0.289934</key>
-				<key time="1.000000">-0.544508 -0.452636 0.643985 0.289684</key>
+				<key time="1.000000">-0.544508 -0.452635 0.643985 0.289684</key>
 				<key time="1.033333">-0.555446 -0.442732 0.641682 0.289330</key>
 				<key time="1.066667">-0.567415 -0.431650 0.638966 0.288863</key>
 				<key time="1.100000">-0.579914 -0.419791 0.635900 0.288282</key>
@@ -589,16 +589,16 @@
 				<key time="1.200000">-0.615894 -0.383908 0.625674 0.286044</key>
 				<key time="1.233333">-0.625949 -0.373382 0.622417 0.285256</key>
 				<key time="1.266667">-0.634389 -0.364367 0.619538 0.284537</key>
-				<key time="1.300000">-0.640857 -0.357342 0.617239 0.283948</key>
+				<key time="1.300000">-0.640857 -0.357342 0.617239 0.283947</key>
 				<key time="1.333333">-0.645003 -0.352784 0.615721 0.283552</key>
 				<key time="1.366667">-0.646470 -0.351162 0.615176 0.283409</key>
 				<key time="1.400000">-0.644114 -0.355087 0.616832 0.280266</key>
 				<key time="1.433333">-0.637791 -0.365392 0.621103 0.271925</key>
 				<key time="1.466667">-0.628582 -0.379837 0.626902 0.260005</key>
-				<key time="1.500000">-0.617650 -0.396195 0.633194 0.246176</key>
+				<key time="1.500000">-0.617650 -0.396196 0.633195 0.246176</key>
 				<key time="1.533333">-0.606337 -0.412309 0.639096 0.232194</key>
 				<key time="1.566667">-0.596173 -0.426142 0.643916 0.219893</key>
-				<key time="1.600000">-0.588827 -0.435790 0.647138 0.211145</key>
+				<key time="1.600000">-0.588827 -0.435790 0.647138 0.211144</key>
 				<key time="1.633333">-0.586008 -0.439419 0.648319 0.207817</key>
 				<key time="1.666667">-0.586671 -0.438757 0.648003 0.208333</key>
 				<key time="1.700000">-0.588529 -0.436867 0.647115 0.209817</key>
@@ -606,7 +606,7 @@
 				<key time="1.766667">-0.595026 -0.429975 0.643976 0.215315</key>
 				<key time="1.800000">-0.599259 -0.425252 0.641895 0.219137</key>
 				<key time="1.833333">-0.603878 -0.419866 0.639587 0.223546</key>
-				<key time="1.866667">-0.608685 -0.413960 0.637143 0.228450</key>
+				<key time="1.866667">-0.608684 -0.413960 0.637143 0.228450</key>
 				<key time="1.900000">-0.613486 -0.407682 0.634657 0.233755</key>
 				<key time="1.933333">-0.618094 -0.401179 0.632230 0.239374</key>
 				<key time="1.966667">-0.622329 -0.394606 0.629968 0.245219</key>
@@ -627,7 +627,7 @@
 				<key time="2.466667">-0.602381 -0.376894 0.599701 0.368030</key>
 				<key time="2.500000">-0.599480 -0.378811 0.597865 0.373742</key>
 				<key time="2.533333">-0.597211 -0.380347 0.596445 0.378058</key>
-				<key time="2.566667">-0.595735 -0.381370 0.595531 0.380788</key>
+				<key time="2.566667">-0.595735 -0.381370 0.595531 0.380789</key>
 				<key time="2.600000">-0.595209 -0.381741 0.595209 0.381742</key>
 			</rotationKeys>
 		</channel>

+ 0 - 10
Samples/SkeletalAnimation/Assets/room.001Action_da34129e49687cba.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="room.001">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/room.002Action_90df7d371bb35e9f.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="room.002">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 0 - 10
Samples/SkeletalAnimation/Assets/room.003Action_5d16e3632dd1d1bf.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="room.003">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 1 - 1
Samples/SkeletalAnimation/Assets/room.blue_21e71ba855d95ca2.ankimtl

@@ -25,7 +25,7 @@
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.000000 0.000000 1.000000"/>
+		<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"/>

+ 1 - 1
Samples/SkeletalAnimation/Assets/room.green_c7dc339831ac73a2.ankimtl

@@ -25,7 +25,7 @@
 
 	<inputs>
 		
-		<input name="m_diffColor" value="0.000000 1.000000 0.000000"/>
+		<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"/>

+ 1 - 1
Samples/SkeletalAnimation/Assets/room.red_4176c8682cee36ac.ankimtl

@@ -25,7 +25,7 @@
 
 	<inputs>
 		
-		<input name="m_diffColor" value="1.000000 0.000000 0.000000"/>
+		<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"/>

+ 0 - 10
Samples/SkeletalAnimation/Assets/roomAction_be82826f0266aef7.ankianim

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<animation>
-	<channels>
-		<channel name="room">
-			<rotationKeys>
-				<key time="0.000000">0.000000 0.000000 -0.000000 1.000000</key>
-			</rotationKeys>
-		</channel>
-	</channels>
-</animation>

+ 3 - 3
Samples/SkeletalAnimation/Assets/wave_6cf284ed471bff3b.ankianim

@@ -3,8 +3,8 @@
 	<channels>
 		<channel name="ArmR2">
 			<positionKeys>
-				<key time="0.000000">0.937093 -0.000000 0.000000</key>
-				<key time="0.766667">0.937093 -0.000000 0.000000</key>
+				<key time="0.000000">0.937092 -0.000000 0.000000</key>
+				<key time="0.766667">0.937092 -0.000000 0.000000</key>
 			</positionKeys>
 			<rotationKeys>
 				<key time="0.000000">-0.094460 -0.036333 -0.296159 0.949762</key>
@@ -24,7 +24,7 @@
 				<key time="0.466667">-0.023463 -0.006786 -0.094562 0.995219</key>
 				<key time="0.500000">-0.030970 -0.009903 -0.115942 0.992724</key>
 				<key time="0.533333">-0.040263 -0.013764 -0.142390 0.988896</key>
-				<key time="0.566667">-0.050613 -0.018067 -0.171816 0.983662</key>
+				<key time="0.566667">-0.050613 -0.018068 -0.171816 0.983662</key>
 				<key time="0.600000">-0.061274 -0.022503 -0.202098 0.977188</key>
 				<key time="0.633333">-0.071507 -0.026764 -0.231136 0.969921</key>
 				<key time="0.666667">-0.080600 -0.030553 -0.256914 0.962583</key>

+ 0 - 2
Samples/Sponza/Assets/Scene.lua

@@ -108,8 +108,6 @@ node = scene:newPerspectiveCameraNode("Camera.001_Orientation")
 scene:setActiveCameraNode(node:getSceneNodeBase())
 frustumc = node:getSceneNodeBase():getFrustumComponent()
 frustumc:setPerspective(0.100000, 100.000000, getMainRenderer():getAspectRatio() * 1.024779, 1.024779)
-frustumc:setShadowCascadesDistancePower(1.5)
-frustumc:setEffectiveShadowDistance(100.000000)
 trf = Transform.new()
 trf:setOrigin(Vec4.new(17.666607, 11.278920, 1.745400, 0))
 rot = Mat3x4.new()