Browse Source

GLTF importer additions

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
310d225e14

+ 171 - 110
AnKi/Importer/GltfImporter.cpp

@@ -149,6 +149,109 @@ static Bool stringsExist(const ImporterHashMap<CString, ImporterString>& map, co
 	return false;
 }
 
+static Error getExtra(const ImporterHashMap<CString, ImporterString>& extras, CString name, F32& val, Bool& found)
+{
+	found = false;
+	ImporterHashMap<CString, ImporterString>::ConstIterator it = extras.find(name);
+
+	if(it != extras.getEnd())
+	{
+		const Error err = it->toNumber(val);
+		if(err)
+		{
+			ANKI_IMPORTER_LOGE("Failed to parse %s with value: %s", name.cstr(), it->cstr());
+			return err;
+		}
+
+		found = true;
+	}
+
+	return Error::kNone;
+}
+
+static Error getExtra(const ImporterHashMap<CString, ImporterString>& extras, CString name, ImporterString& val, Bool& found)
+{
+	found = false;
+	ImporterHashMap<CString, ImporterString>::ConstIterator it = extras.find(name);
+
+	if(it != extras.getEnd())
+	{
+		val = *it;
+		found = true;
+	}
+
+	return Error::kNone;
+}
+
+static Error getExtra(const ImporterHashMap<CString, ImporterString>& extras, CString name, Bool& val, Bool& found)
+{
+	found = false;
+	ImporterHashMap<CString, ImporterString>::ConstIterator it = extras.find(name);
+
+	if(it != extras.getEnd())
+	{
+		if(*it == "true")
+		{
+			val = true;
+		}
+		else if(*it == "false")
+		{
+			val = false;
+		}
+		else
+		{
+			U32 valu;
+			const Error err = it->toNumber(valu);
+			if(err || valu != 0 || valu != 1)
+			{
+				ANKI_IMPORTER_LOGE("Failed to parse %s with value: %s", name.cstr(), it->cstr());
+				return err;
+			}
+
+			val = valu != 0;
+		}
+
+		found = true;
+	}
+
+	return Error::kNone;
+}
+
+static Error getExtra(const ImporterHashMap<CString, ImporterString>& extras, CString name, Vec3& val, Bool& found)
+{
+	found = false;
+	ImporterHashMap<CString, ImporterString>::ConstIterator it = extras.find(name);
+
+	if(it != extras.getEnd())
+	{
+		ImporterStringList tokens;
+		tokens.splitString(*it, ' ');
+		if(tokens.getSize() != 3)
+		{
+			ANKI_IMPORTER_LOGE("Error parsing %s with value: %s", name.cstr(), it->cstr());
+			return Error::kUserData;
+		}
+
+		U count = 0;
+		for(auto& token : tokens)
+		{
+			F32 f;
+			const Error err = token.toNumber(f);
+			if(err)
+			{
+				ANKI_IMPORTER_LOGE("Error parsing %s with value: %s", name.cstr(), it->cstr());
+				return Error::kUserData;
+			}
+
+			val[count++] = f;
+		}
+
+		found = true;
+	}
+
+	return Error::kNone;
+}
+
 GltfImporter::GltfImporter()
 {
 }
@@ -553,16 +656,20 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 		ANKI_CHECK(appendExtras(node.extras, extras));
 		appendExtrasMap(parentExtras, extras);
 
-		ImporterHashMap<CString, ImporterString>::Iterator it;
+		ImporterString extraValueStr;
+		Bool extraValueBool = false;
+		Vec3 extraValueVec3;
+		F32 extraValuef = 0.0f;
+		Bool extraFound = false;
 
-		if((it = extras.find("particles")) != extras.getEnd())
+		ANKI_CHECK(getExtra(extras, "particles", extraValueStr, extraFound));
+		if(extraFound)
 		{
-			const ImporterString& fname = *it;
-
 			Bool gpuParticles = false;
-			if((it = extras.find("gpu_particles")) != extras.getEnd() && *it == "true")
+			ANKI_CHECK(getExtra(extras, "particles", extraValueBool, extraFound));
+			if(extraFound)
 			{
-				gpuParticles = true;
+				gpuParticles = extraValueBool;
 			}
 
 			if(!gpuParticles) // TODO Re-enable GPU particles
@@ -570,7 +677,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 				ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
 
 				ANKI_CHECK(m_sceneFile.writeTextf("comp = node:newParticleEmitterComponent()\n"));
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadParticleEmitterResource(\"%s\")\n", fname.cstr()));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadParticleEmitterResource(\"%s\")\n", extraValueStr.cstr()));
 
 				Transform localTrf;
 				ANKI_CHECK(getNodeTransform(node, localTrf));
@@ -578,78 +685,69 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			}
 		}
 		else if(stringsExist(extras, {"skybox_solid_color", "skybox_image", "fog_min_density", "fog_max_density", "fog_height_of_min_density",
-									  "fog_height_of_max_density"}))
+									  "fog_height_of_max_density", "fog_diffuse_color"}))
 		{
 			// Atmosphere
 
 			ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
 			ANKI_CHECK(m_sceneFile.writeText("comp = node:newSkyboxComponent()\n"));
 
-			if((it = extras.find("skybox_solid_color")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "skybox_solid_color", extraValueVec3, extraFound));
+			if(extraFound)
 			{
-				ImporterStringList tokens;
-				tokens.splitString(*it, ' ');
-				if(tokens.getSize() != 3)
-				{
-					ANKI_IMPORTER_LOGE("Error parsing \"skybox_solid_color\" of node %s", getNodeName(node).cstr());
-					return Error::kUserData;
-				}
+				ANKI_CHECK(
+					m_sceneFile.writeTextf("comp:setSolidColor(Vec3.new(%f, %f, %f))\n", extraValueVec3.x(), extraValueVec3.y(), extraValueVec3.z()));
+			}
 
-				U count = 0;
-				Vec3 solidColor(0.0f);
-				for(auto& it : tokens)
-				{
-					F32 f;
-					const Error err = it.toNumber(f);
-					if(err)
-					{
-						ANKI_IMPORTER_LOGE("Error parsing \"skybox_solid_color\" of node %s", getNodeName(node).cstr());
-						return Error::kUserData;
-					}
-
-					solidColor[count++] = f;
-				}
+			ANKI_CHECK(getExtra(extras, "skybox_image", extraValueStr, extraFound));
+			if(extraFound)
+			{
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadImageResource(\"%s\")\n", extraValueStr.cstr()));
+			}
 
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setSolidColor(Vec3.new(%f, %f, %f))\n", solidColor.x(), solidColor.y(), solidColor.z()));
+			ANKI_CHECK(getExtra(extras, "skybox_image_scale", extraValueVec3, extraFound));
+			if(extraFound)
+			{
+				ANKI_CHECK(
+					m_sceneFile.writeTextf("comp:setImageScale(Vec3.new(%f, %f, %f))\n", extraValueVec3.x(), extraValueVec3.y(), extraValueVec3.z()));
 			}
-			else if((it = extras.find("skybox_image")) != extras.getEnd())
+
+			ANKI_CHECK(getExtra(extras, "fog_min_density", extraValuef, extraFound));
+			if(extraFound)
 			{
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadImageResource(\"%s\")\n", it->cstr()));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setMinFogDensity(%f)\n", extraValuef));
 			}
 
-			if((it = extras.find("fog_min_density")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "fog_max_density", extraValuef, extraFound));
+			if(extraFound)
 			{
-				F32 val;
-				ANKI_CHECK(it->toNumber(val));
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setMinFogDensity(\"%f\")\n", val));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setMaxFogDensity(%f)\n", extraValuef));
 			}
 
-			if((it = extras.find("fog_max_density")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "fog_height_of_min_density", extraValuef, extraFound));
+			if(extraFound)
 			{
-				F32 val;
-				ANKI_CHECK(it->toNumber(val));
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setMaxFogDensity(\"%f\")\n", val));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setHeightOfMinFogDensity(%f)\n", extraValuef));
 			}
 
-			if((it = extras.find("fog_height_of_min_density")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "fog_height_of_max_density", extraValuef, extraFound));
+			if(extraFound)
 			{
-				F32 val;
-				ANKI_CHECK(it->toNumber(val));
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setHeightOfMinFogDensity(\"%f\")\n", val));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setHeightOfMaxFogDensity(%f)\n", extraValuef));
 			}
 
-			if((it = extras.find("fog_height_of_max_density")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "fog_diffuse_color", extraValueVec3, extraFound));
+			if(extraFound)
 			{
-				F32 val;
-				ANKI_CHECK(it->toNumber(val));
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setHeightOfMaxFogDensity(\"%f\")\n", val));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setFogDiffuseColor(Vec3.new(%f, %f, %f))\n", extraValueVec3.x(), extraValueVec3.y(),
+												  extraValueVec3.z()));
 			}
 
 			Transform localTrf;
 			ANKI_CHECK(getNodeTransform(node, localTrf));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
-		else if((it = extras.find("collision")) != extras.getEnd() && (*it == "true" || *it == "1"))
+		else if(stringsExist(extras, {"collision"}))
 		{
 			ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
 
@@ -661,7 +759,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			ANKI_CHECK(getNodeTransform(node, localTrf));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
-		else if((it = extras.find("reflection_probe")) != extras.getEnd() && (*it == "true" || *it == "1"))
+		else if(stringsExist(extras, {"reflection_probe"}))
 		{
 			Vec3 tsl;
 			Mat3 rot;
@@ -678,7 +776,7 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), 1.0f);
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
-		else if((it = extras.find("gi_probe")) != extras.getEnd() && (*it == "true" || *it == "1"))
+		else if(stringsExist(extras, {"gi_probe"}))
 		{
 			Vec3 tsl;
 			Mat3 rot;
@@ -687,84 +785,46 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 
 			const Vec3 boxSize = scale * 2.0f;
 
-			F32 fadeDistance = -1.0f;
-			if((it = extras.find("gi_probe_fade_distance")) != extras.getEnd())
-			{
-				ANKI_CHECK(it->toNumber(fadeDistance));
-			}
-
-			F32 cellSize = -1.0f;
-			if((it = extras.find("gi_probe_cell_size")) != extras.getEnd())
-			{
-				ANKI_CHECK(it->toNumber(cellSize));
-			}
-
 			ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
 			ANKI_CHECK(m_sceneFile.writeText("comp = node:newGlobalIlluminationProbeComponent()\n"));
 			ANKI_CHECK(m_sceneFile.writeTextf("comp:setBoxVolumeSize(Vec3.new(%f, %f, %f))\n", boxSize.x(), boxSize.y(), boxSize.z()));
 
-			if(fadeDistance > 0.0f)
+			ANKI_CHECK(getExtra(extras, "gi_probe_fade_distance", extraValuef, extraFound));
+			if(extraFound && extraValuef > 0.0f)
 			{
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setFadeDistance(%f)\n", fadeDistance));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setFadeDistance(%f)\n", extraValuef));
 			}
 
-			if(cellSize > 0.0f)
+			ANKI_CHECK(getExtra(extras, "gi_probe_cell_size", extraValuef, extraFound));
+			if(extraFound && extraValuef > 0.0f)
 			{
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:setCellSize(%f)\n", cellSize));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:setCellSize(%f)\n", extraValuef));
 			}
 
 			const Transform localTrf = Transform(tsl.xyz0(), Mat3x4(Vec3(0.0f), rot), 1.0f);
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
-		else if((it = extras.find("decal")) != extras.getEnd() && (*it == "true" || *it == "1"))
+		else if(stringsExist(extras, {"decal"}))
 		{
-			ImporterString diffuseAtlas;
-			if((it = extras.find("decal_diffuse_atlas")) != extras.getEnd())
-			{
-				diffuseAtlas = *it;
-			}
-
-			ImporterString diffuseSubtexture;
-			if((it = extras.find("decal_diffuse_sub_texture")) != extras.getEnd())
-			{
-				diffuseSubtexture = *it;
-			}
-
-			F32 diffuseFactor = -1.0f;
-			if((it = extras.find("decal_diffuse_factor")) != extras.getEnd())
-			{
-				ANKI_CHECK(it->toNumber(diffuseFactor));
-			}
+			ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
+			ANKI_CHECK(m_sceneFile.writeText("comp = node:newDecalComponent()\n"));
 
-			ImporterString specularRougnessMetallicAtlas;
-			if((it = extras.find("decal_specular_roughness_metallic_atlas")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "decal_diffuse_atlas", extraValueStr, extraFound));
+			if(extraFound)
 			{
-				specularRougnessMetallicAtlas = *it;
-			}
+				ANKI_CHECK(getExtra(extras, "decal_diffuse_factor", extraValuef, extraFound));
 
-			ImporterString specularRougnessMetallicSubtexture;
-			if((it = extras.find("decal_specular_roughness_metallic_sub_texture")) != extras.getEnd())
-			{
-				specularRougnessMetallicSubtexture = *it;
+				ANKI_CHECK(
+					m_sceneFile.writeTextf("comp:loadDiffuseImageResource(\"%s\", %f)\n", extraValueStr.cstr(), (extraFound) ? extraValuef : -1.0f));
 			}
 
-			F32 specularRougnessMetallicFactor = -1.0f;
-			if((it = extras.find("decal_specular_roughness_metallic_factor")) != extras.getEnd())
+			ANKI_CHECK(getExtra(extras, "decal_diffuse_sub_texture", extraValueStr, extraFound));
+			if(extraFound)
 			{
-				ANKI_CHECK(it->toNumber(specularRougnessMetallicFactor));
-			}
+				ANKI_CHECK(getExtra(extras, "decal_specular_roughness_metallic_factor", extraValuef, extraFound));
 
-			ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:newSceneNode(\"%s\")\n", getNodeName(node).cstr()));
-			ANKI_CHECK(m_sceneFile.writeText("comp = node:newDecalComponent()\n"));
-			if(diffuseAtlas)
-			{
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadDiffuseImageResource(\"%s\", %f)\n", diffuseAtlas.cstr(), diffuseFactor));
-			}
-
-			if(specularRougnessMetallicAtlas)
-			{
-				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadRoughnessMetallnessTexture(\"%s\", %f)\n", specularRougnessMetallicAtlas.cstr(),
-												  specularRougnessMetallicFactor));
+				ANKI_CHECK(m_sceneFile.writeTextf("comp:loadRoughnessMetallnessTexture(\"%s\", %f)\n", extraValueStr.cstr(),
+												  (extraFound) ? extraValuef : -1.0f));
 			}
 
 			Vec3 tsl;
@@ -778,7 +838,8 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 		{
 			// Model node
 
-			const Bool skipRt = (it = extras.find("no_rt")) != extras.getEnd() && (*it == "true" || *it == "1");
+			ANKI_CHECK(getExtra(extras, "no_rt", extraValueBool, extraFound));
+			const Bool skipRt = (extraFound) ? extraValueBool : false;
 
 			Transform localTrf;
 			const Error err = getNodeTransform(node, localTrf);

+ 1 - 1
AnKi/Importer/ImageImporter.cpp

@@ -1072,7 +1072,7 @@ Error importImage(const ImageImporterConfig& config)
 	const Error err = importImageInternal(config);
 	if(err)
 	{
-		ANKI_IMPORTER_LOGE("Image importing failed");
+		ANKI_IMPORTER_LOGE("Image importing failed: %s", config.m_inputFilenames[0].cstr());
 		return err;
 	}
 

+ 75 - 26
AnKi/Script/Scene.cpp

@@ -61,7 +61,7 @@ static EventManager* getEventManager(lua_State* l)
 using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-3628200144600318313, "LightComponentType", 0, nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-885021943768989307, "LightComponentType", 0, nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightComponentType>()
@@ -97,7 +97,7 @@ static inline void wrapLightComponentType(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	864549077786498962, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
+	-8864757075459251556, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArraySceneNodePtr>()
@@ -216,7 +216,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
-	2394494311240256603, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
+	-6416821202790667006, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArrayBodyComponentPtr>()
@@ -334,7 +334,7 @@ static inline void wrapWeakArrayBodyComponentPtr(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-9113026076318485279, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-1248882138008092218, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(), nullptr, nullptr};
 
 template<>
@@ -945,7 +945,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-6723919824281962116, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-7053311132600625275, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(), nullptr, nullptr};
 
 template<>
@@ -1117,7 +1117,7 @@ static inline void wrapDecalComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-902217144669261434, "LensFlareComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-6126765841561229872, "LensFlareComponent",
 															 LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(), nullptr, nullptr};
 
 template<>
@@ -1280,7 +1280,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-6509320180515493376, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-2675105803575253943, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(), nullptr, nullptr};
 
 template<>
@@ -1433,7 +1433,7 @@ static inline void wrapBodyComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {7265271290132140876, "TriggerComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {-7285899701541304050, "TriggerComponent",
 														   LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr, nullptr};
 
 template<>
@@ -1596,7 +1596,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {5672255065445474742, "FogDensityComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {-2750867585902730421, "FogDensityComponent",
 															  LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(), nullptr, nullptr};
 
 template<>
@@ -1799,7 +1799,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {-2496630439844899169, "CameraComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {5174533843768029813, "CameraComponent",
 														  LuaUserData::computeSizeForGarbageCollected<CameraComponent>(), nullptr, nullptr};
 
 template<>
@@ -1881,8 +1881,8 @@ static inline void wrapCameraComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	3385705463814019741, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr,
-	nullptr};
+	-1065384978556751245, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(),
+	nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<GlobalIlluminationProbeComponent>()
@@ -2128,7 +2128,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	7838020751769093992, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
+	2405181644341355052, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ReflectionProbeComponent>()
@@ -2243,7 +2243,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	-6812064200873386626, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
+	-253597322000071618, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ParticleEmitterComponent>()
@@ -2305,7 +2305,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {4751338525694906335, "ModelComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-4403902270999293821, "ModelComponent",
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(), nullptr, nullptr};
 
 template<>
@@ -2368,7 +2368,7 @@ static inline void wrapModelComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {4674705423629519447, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {8389361332600700112, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(), nullptr, nullptr};
 
 template<>
@@ -2431,7 +2431,7 @@ static inline void wrapSkinComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {1379691475560871879, "SkyboxComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {-8681371155253449152, "SkyboxComponent",
 														  LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr, nullptr};
 
 template<>
@@ -2719,6 +2719,55 @@ static int wrapSkyboxComponentsetHeightOfMaxFogDensity(lua_State* l)
 	return 0;
 }
 
+/// Pre-wrap method SkyboxComponent::setFogDiffuseColor.
+static inline int pwrapSkyboxComponentsetFogDiffuseColor(lua_State* l)
+{
+	[[maybe_unused]] LuaUserData* ud;
+	[[maybe_unused]] void* voidp;
+	[[maybe_unused]] PtrSize size;
+
+	if(LuaBinder::checkArgsCount(l, 2)) [[unlikely]]
+	{
+		return -1;
+	}
+
+	// Get "this" as "self"
+	if(LuaBinder::checkUserData(l, 1, luaUserDataTypeInfoSkyboxComponent, ud))
+	{
+		return -1;
+	}
+
+	SkyboxComponent* self = ud->getData<SkyboxComponent>();
+
+	// Pop arguments
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoVec3;
+	if(LuaBinder::checkUserData(l, 2, luaUserDataTypeInfoVec3, ud)) [[unlikely]]
+	{
+		return -1;
+	}
+
+	Vec3* iarg0 = ud->getData<Vec3>();
+	Vec3 arg0(*iarg0);
+
+	// Call the method
+	self->setFogDiffuseColor(arg0);
+
+	return 0;
+}
+
+/// Wrap method SkyboxComponent::setFogDiffuseColor.
+static int wrapSkyboxComponentsetFogDiffuseColor(lua_State* l)
+{
+	int res = pwrapSkyboxComponentsetFogDiffuseColor(l);
+	if(res >= 0)
+	{
+		return res;
+	}
+
+	lua_error(l);
+	return 0;
+}
+
 /// Pre-wrap method SkyboxComponent::setImageBias.
 static inline int pwrapSkyboxComponentsetImageBias(lua_State* l)
 {
@@ -2827,12 +2876,13 @@ static inline void wrapSkyboxComponent(lua_State* l)
 	LuaBinder::pushLuaCFuncMethod(l, "setMaxFogDensity", wrapSkyboxComponentsetMaxFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMinFogDensity", wrapSkyboxComponentsetHeightOfMinFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMaxFogDensity", wrapSkyboxComponentsetHeightOfMaxFogDensity);
+	LuaBinder::pushLuaCFuncMethod(l, "setFogDiffuseColor", wrapSkyboxComponentsetFogDiffuseColor);
 	LuaBinder::pushLuaCFuncMethod(l, "setImageBias", wrapSkyboxComponentsetImageBias);
 	LuaBinder::pushLuaCFuncMethod(l, "setImageScale", wrapSkyboxComponentsetImageScale);
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {4834914283414360327, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {-8010702667117825592, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
 													nullptr, nullptr};
 
 template<>
@@ -4662,7 +4712,7 @@ static inline void wrapSceneNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {1750729963331454656, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {-5322229350784875449, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
 													 nullptr, nullptr};
 
 template<>
@@ -4848,8 +4898,7 @@ static inline void wrapSceneGraph(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {-2493176062691731156, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr,
-												nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {1485192924185736197, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Event>()
@@ -4913,7 +4962,7 @@ static inline void wrapEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {6673207679244515586, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {-3564993186665272650, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
 													 nullptr, nullptr};
 
 template<>
@@ -5032,7 +5081,7 @@ static inline void wrapLightEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-1468565822630009987, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-8069052670469915022, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
 													  nullptr, nullptr};
 
 template<>
@@ -5048,7 +5097,7 @@ static inline void wrapScriptEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {6444353852918166909, "JitterMoveEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {7671805760892542220, "JitterMoveEvent",
 														  LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr, nullptr};
 
 template<>
@@ -5123,7 +5172,7 @@ static inline void wrapJitterMoveEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-3909535072828022928, "AnimationEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-1166819361716118098, "AnimationEvent",
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(), nullptr, nullptr};
 
 template<>
@@ -5139,7 +5188,7 @@ static inline void wrapAnimationEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-3644594881277320999, "EventManager",
+LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-481329727758819632, "EventManager",
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 
 template<>

+ 5 - 0
AnKi/Script/Scene.xml

@@ -367,6 +367,11 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 						<arg>F32</arg>
 					</args>
 				</method>
+				<method name="setFogDiffuseColor">
+					<args>
+						<arg>Vec3</arg>
+					</args>
+				</method>
 				<method name="setImageBias">
 					<args>
 						<arg>Vec3</arg>

+ 1 - 1
AnKi/Shaders/IrradianceDice.ankiprog

@@ -188,7 +188,7 @@ RVec3 sampleLightShadingTexture(const U32 face, UVec3 svGroupThreadId)
 
 #if DEBUG_MODE == 0
 		RVec3 irradiance = s_integrationResults[f][0];
-		const RVec3 toStoreValue = irradiance;
+		const RVec3 toStoreValue = irradiance / kPi;
 #elif DEBUG_MODE == 1
 		const RVec3 toStoreValue = colorPerCubeFace(f);
 #else