Browse Source

First version of skybox

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
8e3cdf6add

+ 1 - 1
AnKi/Gr/CommandBuffer.h

@@ -182,7 +182,7 @@ public:
 	/// always.
 	/// always.
 	void setDepthWrite(Bool enable);
 	void setDepthWrite(Bool enable);
 
 
-	/// Set depth compare operation.
+	/// Set depth compare operation. By default it's less.
 	void setDepthCompareOperation(CompareOperation op);
 	void setDepthCompareOperation(CompareOperation op);
 
 
 	/// Enable/disable alpha to coverage.
 	/// Enable/disable alpha to coverage.

+ 39 - 3
AnKi/Importer/GltfImporter.cpp

@@ -456,6 +456,40 @@ Error GltfImporter::visitNode(const cgltf_node& node, const Transform& parentTrf
 			ANKI_CHECK(getNodeTransform(node, localTrf));
 			ANKI_CHECK(getNodeTransform(node, localTrf));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
 		}
 		}
+		else if((it = extras.find("skybox_solid_color")) != extras.getEnd())
+		{
+			StringListAuto tokens(m_alloc);
+			tokens.splitString(*it, ' ');
+			if(tokens.getSize() != 3)
+			{
+				ANKI_IMPORTER_LOGE("Error parsing \"skybox_solid_color\" of node %s", getNodeName(node).cstr());
+				return Error::USER_DATA;
+			}
+
+			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::USER_DATA;
+				}
+
+				solidColor[count++] = f;
+			}
+
+			ANKI_CHECK(m_sceneFile.writeText("\nnode = scene:newSkyboxNode(\"%s\")\n", getNodeName(node).cstr()));
+			ANKI_CHECK(m_sceneFile.writeText("comp = node:getSceneNodeBase():getSkyboxComponent()\n"));
+			ANKI_CHECK(m_sceneFile.writeText("comp:setSolidColor(Vec3.new(%f, %f, %f))\n", solidColor.x(),
+											 solidColor.y(), solidColor.z()));
+
+			Transform localTrf;
+			ANKI_CHECK(getNodeTransform(node, localTrf));
+			ANKI_CHECK(writeTransform(parentTrf.combineTransformations(localTrf)));
+		}
 		else if((it = extras.find("collision")) != extras.getEnd() && *it == "true")
 		else if((it = extras.find("collision")) != extras.getEnd() && *it == "true")
 		{
 		{
 			ANKI_CHECK(
 			ANKI_CHECK(
@@ -759,7 +793,9 @@ Error GltfImporter::writeModel(const cgltf_mesh& mesh)
 	ANKI_CHECK(getExtras(mesh.extras, extras));
 	ANKI_CHECK(getExtras(mesh.extras, extras));
 
 
 	File file;
 	File file;
-	ANKI_CHECK(file.open(modelFname.toCString(), FileOpenFlag::WRITE));
+	StringAuto modelFullFname(m_alloc);
+	modelFullFname.sprintf("%s/%s", m_outDir.cstr(), modelFname.cstr());
+	ANKI_CHECK(file.open(modelFullFname, FileOpenFlag::WRITE));
 
 
 	ANKI_CHECK(file.writeText("<model>\n"));
 	ANKI_CHECK(file.writeText("<model>\n"));
 	ANKI_CHECK(file.writeText("\t<modelPatches>\n"));
 	ANKI_CHECK(file.writeText("\t<modelPatches>\n"));
@@ -1356,8 +1392,8 @@ Error GltfImporter::writeModelNode(const cgltf_node& node, const HashMapAuto<CSt
 	const StringAuto modelFname = computeModelResourceFilename(*node.mesh);
 	const StringAuto modelFname = computeModelResourceFilename(*node.mesh);
 
 
 	ANKI_CHECK(m_sceneFile.writeText("\nnode = scene:newModelNode(\"%s\")\n", getNodeName(node).cstr()));
 	ANKI_CHECK(m_sceneFile.writeText("\nnode = scene:newModelNode(\"%s\")\n", getNodeName(node).cstr()));
-	ANKI_CHECK(m_sceneFile.writeText("node:getSceneNodeBase():getModelComponent():loadModelResource(\"%s\")\n",
-									 modelFname.cstr()));
+	ANKI_CHECK(m_sceneFile.writeText("node:getSceneNodeBase():getModelComponent():loadModelResource(\"%s%s\")\n",
+									 m_rpath.cstr(), modelFname.cstr()));
 
 
 	if(node.skin)
 	if(node.skin)
 	{
 	{

+ 1 - 1
AnKi/Importer/GltfImporter.h

@@ -132,7 +132,7 @@ private:
 	{
 	{
 		StringListAuto list(m_alloc);
 		StringListAuto list(m_alloc);
 
 
-		list.pushBackSprintf("%s%s", m_rpath.cstr(), mesh.name);
+		list.pushBack(mesh.name);
 
 
 		for(U i = 0; i < mesh.primitives_count; ++i)
 		for(U i = 0; i < mesh.primitives_count; ++i)
 		{
 		{

+ 35 - 0
AnKi/Renderer/LightShading.cpp

@@ -36,6 +36,11 @@ Error LightShading::init()
 
 
 	Error err = initLightShading();
 	Error err = initLightShading();
 
 
+	if(!err)
+	{
+		err = initSkybox();
+	}
+
 	if(!err)
 	if(!err)
 	{
 	{
 		err = initApplyFog();
 		err = initApplyFog();
@@ -97,6 +102,20 @@ Error LightShading::initLightShading()
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 
+Error LightShading::initSkybox()
+{
+	ANKI_CHECK(getResourceManager().loadResource("Shaders/LightShadingSkybox.ankiprog", m_skybox.m_prog));
+
+	ShaderProgramResourceVariantInitInfo variantInitInfo(m_skybox.m_prog);
+	variantInitInfo.addMutation("METHOD", 0);
+	const ShaderProgramResourceVariant* variant;
+	m_skybox.m_prog->getOrCreateVariant(variantInitInfo, variant);
+
+	m_skybox.m_grProg = variant->getProgram();
+
+	return Error::NONE;
+}
+
 Error LightShading::initApplyFog()
 Error LightShading::initApplyFog()
 {
 {
 	// Load shaders and programs
 	// Load shaders and programs
@@ -204,6 +223,22 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 		cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
 		cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
 	}
 	}
 
 
+	// Skybox
+	if(rgraphCtx.m_currentSecondLevelCommandBufferIndex == 0)
+	{
+		cmdb->setDepthCompareOperation(CompareOperation::EQUAL);
+
+		cmdb->bindShaderProgram(m_skybox.m_grProg);
+
+		const Vec4 color(ctx.m_renderQueue->m_skybox.m_solidColor, 0.0);
+		cmdb->setPushConstants(&color, sizeof(color));
+
+		drawQuad(cmdb);
+
+		// Restore state
+		cmdb->setDepthCompareOperation(CompareOperation::LESS);
+	}
+
 	// Do the fog apply
 	// Do the fog apply
 	if(rgraphCtx.m_currentSecondLevelCommandBufferIndex == rgraphCtx.m_secondLevelCommandBufferCount - 1u)
 	if(rgraphCtx.m_currentSecondLevelCommandBufferIndex == rgraphCtx.m_secondLevelCommandBufferCount - 1u)
 	{
 	{

+ 8 - 0
AnKi/Renderer/LightShading.h

@@ -42,6 +42,13 @@ private:
 		Array<ShaderProgramPtr, 2> m_grProg;
 		Array<ShaderProgramPtr, 2> m_grProg;
 	} m_lightShading;
 	} m_lightShading;
 
 
+	class
+	{
+	public:
+		ShaderProgramResourcePtr m_prog;
+		ShaderProgramPtr m_grProg;
+	} m_skybox;
+
 	class
 	class
 	{
 	{
 	public:
 	public:
@@ -63,6 +70,7 @@ private:
 	} m_runCtx; ///< Run context.
 	} m_runCtx; ///< Run context.
 
 
 	ANKI_USE_RESULT Error initLightShading();
 	ANKI_USE_RESULT Error initLightShading();
+	ANKI_USE_RESULT Error initSkybox();
 	ANKI_USE_RESULT Error initApplyFog();
 	ANKI_USE_RESULT Error initApplyFog();
 	ANKI_USE_RESULT Error initApplyIndirect();
 	ANKI_USE_RESULT Error initApplyIndirect();
 
 

+ 12 - 0
AnKi/Renderer/RenderQueue.h

@@ -371,6 +371,16 @@ public:
 static_assert(std::is_trivially_destructible<RayTracingInstanceQueueElement>::value == true,
 static_assert(std::is_trivially_destructible<RayTracingInstanceQueueElement>::value == true,
 			  "Should be trivially destructible");
 			  "Should be trivially destructible");
 
 
+/// Skybox info.
+class SkyboxQueueElement final
+{
+public:
+	const TextureView* m_skyboxTexture;
+	Vec3 m_solidColor;
+};
+
+static_assert(std::is_trivially_destructible<SkyboxQueueElement>::value == true, "Should be trivially destructible");
+
 /// The render queue. This is what the renderer is fed to render.
 /// The render queue. This is what the renderer is fed to render.
 class RenderQueue : public RenderingMatrices
 class RenderQueue : public RenderingMatrices
 {
 {
@@ -394,6 +404,8 @@ public:
 	/// bugs.
 	/// bugs.
 	RenderQueue* m_rayTracingQueue = nullptr;
 	RenderQueue* m_rayTracingQueue = nullptr;
 
 
+	SkyboxQueueElement m_skybox = {};
+
 	/// Applies only if the RenderQueue holds shadow casters. It's the max timesamp of all shadow casters
 	/// Applies only if the RenderQueue holds shadow casters. It's the max timesamp of all shadow casters
 	Timestamp m_shadowRenderablesLastUpdateTimestamp = 0;
 	Timestamp m_shadowRenderablesLastUpdateTimestamp = 0;
 
 

+ 1 - 1
AnKi/Scene/CameraNode.cpp

@@ -68,7 +68,7 @@ void CameraNode::initCommon(FrustumType frustumType)
 		| FrustumComponentVisibilityTestFlag::GLOBAL_ILLUMINATION_PROBES | FrustumComponentVisibilityTestFlag::EARLY_Z
 		| FrustumComponentVisibilityTestFlag::GLOBAL_ILLUMINATION_PROBES | FrustumComponentVisibilityTestFlag::EARLY_Z
 		| FrustumComponentVisibilityTestFlag::ALL_SHADOWS_ENABLED
 		| FrustumComponentVisibilityTestFlag::ALL_SHADOWS_ENABLED
 		| FrustumComponentVisibilityTestFlag::GENERIC_COMPUTE_JOB_COMPONENTS
 		| FrustumComponentVisibilityTestFlag::GENERIC_COMPUTE_JOB_COMPONENTS
-		| FrustumComponentVisibilityTestFlag::UI_COMPONENTS;
+		| FrustumComponentVisibilityTestFlag::UI_COMPONENTS | FrustumComponentVisibilityTestFlag::SKYBOX;
 	frc->setEnabledVisibilityTests(visibilityFlags);
 	frc->setEnabledVisibilityTests(visibilityFlags);
 	frc->setLodDistance(0, getConfig().getLod0MaxDistance());
 	frc->setLodDistance(0, getConfig().getLod0MaxDistance());
 	frc->setLodDistance(1, getConfig().getLod1MaxDistance());
 	frc->setLodDistance(1, getConfig().getLod1MaxDistance());

+ 2 - 1
AnKi/Scene/Components/FrustumComponent.h

@@ -44,12 +44,13 @@ enum class FrustumComponentVisibilityTestFlag : U32
 	RAY_TRACING_REFLECTIONS = 1 << 18,
 	RAY_TRACING_REFLECTIONS = 1 << 18,
 	RAY_TRACING_PATH_TRACING = 1 << 19,
 	RAY_TRACING_PATH_TRACING = 1 << 19,
 	UI_COMPONENTS = 1 << 20,
 	UI_COMPONENTS = 1 << 20,
+	SKYBOX = 1 << 21,
 
 
 	ALL = RENDER_COMPONENTS | LIGHT_COMPONENTS | LENS_FLARE_COMPONENTS | SHADOW_CASTERS | POINT_LIGHT_SHADOWS_ENABLED
 	ALL = RENDER_COMPONENTS | LIGHT_COMPONENTS | LENS_FLARE_COMPONENTS | SHADOW_CASTERS | POINT_LIGHT_SHADOWS_ENABLED
 		  | SPOT_LIGHT_SHADOWS_ENABLED | DIRECTIONAL_LIGHT_SHADOWS_ALL_CASCADES | DIRECTIONAL_LIGHT_SHADOWS_1_CASCADE
 		  | SPOT_LIGHT_SHADOWS_ENABLED | DIRECTIONAL_LIGHT_SHADOWS_ALL_CASCADES | DIRECTIONAL_LIGHT_SHADOWS_1_CASCADE
 		  | REFLECTION_PROBES | REFLECTION_PROXIES | OCCLUDERS | DECALS | FOG_DENSITY_COMPONENTS
 		  | REFLECTION_PROBES | REFLECTION_PROXIES | OCCLUDERS | DECALS | FOG_DENSITY_COMPONENTS
 		  | GLOBAL_ILLUMINATION_PROBES | EARLY_Z | GENERIC_COMPUTE_JOB_COMPONENTS | RAY_TRACING_SHADOWS | RAY_TRACING_GI
 		  | GLOBAL_ILLUMINATION_PROBES | EARLY_Z | GENERIC_COMPUTE_JOB_COMPONENTS | RAY_TRACING_SHADOWS | RAY_TRACING_GI
-		  | RAY_TRACING_REFLECTIONS | RAY_TRACING_PATH_TRACING | UI_COMPONENTS,
+		  | RAY_TRACING_REFLECTIONS | RAY_TRACING_PATH_TRACING | UI_COMPONENTS | SKYBOX,
 
 
 	ALL_SHADOWS_ENABLED =
 	ALL_SHADOWS_ENABLED =
 		POINT_LIGHT_SHADOWS_ENABLED | SPOT_LIGHT_SHADOWS_ENABLED | DIRECTIONAL_LIGHT_SHADOWS_ALL_CASCADES,
 		POINT_LIGHT_SHADOWS_ENABLED | SPOT_LIGHT_SHADOWS_ENABLED | DIRECTIONAL_LIGHT_SHADOWS_ALL_CASCADES,

+ 14 - 0
AnKi/Scene/Components/SkyboxComponent.cpp

@@ -8,6 +8,7 @@
 #include <AnKi/Scene/SceneGraph.h>
 #include <AnKi/Scene/SceneGraph.h>
 #include <AnKi/Resource/ImageResource.h>
 #include <AnKi/Resource/ImageResource.h>
 #include <AnKi/Resource/ResourceManager.h>
 #include <AnKi/Resource/ResourceManager.h>
+#include <AnKi/Renderer/RenderQueue.h>
 
 
 namespace anki {
 namespace anki {
 
 
@@ -36,4 +37,17 @@ void SkyboxComponent::setImage(CString filename)
 	}
 	}
 }
 }
 
 
+void SkyboxComponent::setupSkyboxQueueElement(SkyboxQueueElement& queueElement) const
+{
+	if(m_type == SkyboxType::IMAGE_2D)
+	{
+		queueElement.m_skyboxTexture = m_image->getTextureView().get();
+	}
+	else
+	{
+		queueElement.m_skyboxTexture = nullptr;
+		queueElement.m_solidColor = m_color;
+	}
+}
+
 } // end namespace anki
 } // end namespace anki

+ 5 - 0
AnKi/Scene/Components/SkyboxComponent.h

@@ -11,6 +11,9 @@
 
 
 namespace anki {
 namespace anki {
 
 
+// Forward
+class SkyboxQueueElement;
+
 /// @addtogroup scene
 /// @addtogroup scene
 /// @{
 /// @{
 
 
@@ -39,6 +42,8 @@ public:
 
 
 	void setImage(CString filename);
 	void setImage(CString filename);
 
 
+	void setupSkyboxQueueElement(SkyboxQueueElement& queueElement) const;
+
 private:
 private:
 	SceneNode* m_node;
 	SceneNode* m_node;
 	SkyboxType m_type = SkyboxType::SOLID_COLOR;
 	SkyboxType m_type = SkyboxType::SOLID_COLOR;

+ 4 - 0
AnKi/Scene/SkyboxNode.cpp

@@ -10,6 +10,10 @@
 
 
 namespace anki {
 namespace anki {
 
 
+SkyboxNode::~SkyboxNode()
+{
+}
+
 SkyboxNode::SkyboxNode(SceneGraph* scene, CString name)
 SkyboxNode::SkyboxNode(SceneGraph* scene, CString name)
 	: SceneNode(scene, name)
 	: SceneNode(scene, name)
 {
 {

+ 16 - 0
AnKi/Scene/Visibility.cpp

@@ -17,6 +17,7 @@
 #include <AnKi/Scene/Components/GlobalIlluminationProbeComponent.h>
 #include <AnKi/Scene/Components/GlobalIlluminationProbeComponent.h>
 #include <AnKi/Scene/Components/GenericGpuComputeJobComponent.h>
 #include <AnKi/Scene/Components/GenericGpuComputeJobComponent.h>
 #include <AnKi/Scene/Components/UiComponent.h>
 #include <AnKi/Scene/Components/UiComponent.h>
+#include <AnKi/Scene/Components/SkyboxComponent.h>
 #include <AnKi/Renderer/MainRenderer.h>
 #include <AnKi/Renderer/MainRenderer.h>
 #include <AnKi/Util/Logger.h>
 #include <AnKi/Util/Logger.h>
 #include <AnKi/Util/ThreadHive.h>
 #include <AnKi/Util/ThreadHive.h>
@@ -330,6 +331,10 @@ void VisibilityTestTask::test(ThreadHive& hive, U32 taskId)
 		wantNode |= !!(enabledVisibilityTests & FrustumComponentVisibilityTestFlag::UI_COMPONENTS)
 		wantNode |= !!(enabledVisibilityTests & FrustumComponentVisibilityTestFlag::UI_COMPONENTS)
 					&& (uic = node.tryGetFirstComponentOfType<UiComponent>());
 					&& (uic = node.tryGetFirstComponentOfType<UiComponent>());
 
 
+		SkyboxComponent* skyboxc = nullptr;
+		wantNode |= !!(enabledVisibilityTests & FrustumComponentVisibilityTestFlag::SKYBOX)
+					&& (skyboxc = node.tryGetFirstComponentOfType<SkyboxComponent>());
+
 		if(ANKI_UNLIKELY(!wantNode))
 		if(ANKI_UNLIKELY(!wantNode))
 		{
 		{
 			// Skip node
 			// Skip node
@@ -598,6 +603,12 @@ void VisibilityTestTask::test(ThreadHive& hive, U32 taskId)
 			uic->setupUiQueueElement(*el);
 			uic->setupUiQueueElement(*el);
 		}
 		}
 
 
+		if(skyboxc)
+		{
+			skyboxc->setupSkyboxQueueElement(result.m_skybox);
+			result.m_skyboxSet = true;
+		}
+
 		// Add more frustums to the list
 		// Add more frustums to the list
 		if(nextQueues.getSize() > 0)
 		if(nextQueues.getSize() > 0)
 		{
 		{
@@ -671,6 +682,11 @@ void CombineResultsTask::combine()
 		{
 		{
 			results.m_directionalLight = m_frcCtx->m_queueViews[i].m_directionalLight;
 			results.m_directionalLight = m_frcCtx->m_queueViews[i].m_directionalLight;
 		}
 		}
+
+		if(m_frcCtx->m_queueViews[i].m_skyboxSet)
+		{
+			results.m_skybox = m_frcCtx->m_queueViews[i].m_skybox;
+		}
 	}
 	}
 
 
 #undef ANKI_VIS_COMBINE
 #undef ANKI_VIS_COMBINE

+ 3 - 0
AnKi/Scene/VisibilityInternal.h

@@ -105,12 +105,15 @@ public:
 	TRenderQueueElementStorage<GenericGpuComputeJobQueueElement> m_genericGpuComputeJobs;
 	TRenderQueueElementStorage<GenericGpuComputeJobQueueElement> m_genericGpuComputeJobs;
 	TRenderQueueElementStorage<RayTracingInstanceQueueElement> m_rayTracingInstances;
 	TRenderQueueElementStorage<RayTracingInstanceQueueElement> m_rayTracingInstances;
 	TRenderQueueElementStorage<UiQueueElement> m_uis;
 	TRenderQueueElementStorage<UiQueueElement> m_uis;
+	SkyboxQueueElement m_skybox;
+	Bool m_skyboxSet = false;
 
 
 	Timestamp m_timestamp = 0;
 	Timestamp m_timestamp = 0;
 
 
 	RenderQueueView()
 	RenderQueueView()
 	{
 	{
 		zeroMemory(m_directionalLight);
 		zeroMemory(m_directionalLight);
+		zeroMemory(m_skybox);
 	}
 	}
 };
 };
 
 

+ 99 - 36
AnKi/Script/Scene.cpp

@@ -62,7 +62,7 @@ using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	-996735317031947328, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(),
+	5809609439055747671, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -188,7 +188,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
-	4764216013478878689, "WeakArrayBodyComponentPtr",
+	-1302287398877025658, "WeakArrayBodyComponentPtr",
 	LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -313,7 +313,7 @@ static inline void wrapWeakArrayBodyComponentPtr(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMoveComponent = {-7433331716611609442, "MoveComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoMoveComponent = {-5580144793264375722, "MoveComponent",
 														LuaUserData::computeSizeForGarbageCollected<MoveComponent>(),
 														LuaUserData::computeSizeForGarbageCollected<MoveComponent>(),
 														nullptr, nullptr};
 														nullptr, nullptr};
 
 
@@ -735,7 +735,7 @@ static inline void wrapMoveComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-6285276257763478951, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {4175312591147666241, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(),
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(),
 														 nullptr, nullptr};
 														 nullptr, nullptr};
 
 
@@ -1335,7 +1335,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-7902593901977442893, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {5797483157062716608, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(),
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(),
 														 nullptr, nullptr};
 														 nullptr, nullptr};
 
 
@@ -1548,7 +1548,7 @@ static inline void wrapDecalComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {
-	-2964765487389060096, "LensFlareComponent", LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(),
+	8291782139168759161, "LensFlareComponent", LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1729,7 +1729,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-1724392864175160850, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-1677508886981088311, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(),
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(),
 														nullptr, nullptr};
 														nullptr, nullptr};
 
 
@@ -1911,7 +1911,7 @@ static inline void wrapBodyComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {
-	-3671038518833647248, "TriggerComponent", LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr,
+	-9171498885335792114, "TriggerComponent", LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr,
 	nullptr};
 	nullptr};
 
 
 template<>
 template<>
@@ -2084,7 +2084,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {
-	237152163097464968, "FogDensityComponent", LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(),
+	5928776937533851267, "FogDensityComponent", LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2300,7 +2300,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoFrustumComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoFrustumComponent = {
-	1228602197192742908, "FrustumComponent", LuaUserData::computeSizeForGarbageCollected<FrustumComponent>(), nullptr,
+	8015481865942255503, "FrustumComponent", LuaUserData::computeSizeForGarbageCollected<FrustumComponent>(), nullptr,
 	nullptr};
 	nullptr};
 
 
 template<>
 template<>
@@ -2486,7 +2486,7 @@ static inline void wrapFrustumComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	-3191501719887227604, "GlobalIlluminationProbeComponent",
+	-3844726379578612797, "GlobalIlluminationProbeComponent",
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2748,7 +2748,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	-33128549919181107, "ReflectionProbeComponent",
+	6046202958999409161, "ReflectionProbeComponent",
 	LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2870,7 +2870,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	-5783108489755870558, "ParticleEmitterComponent",
+	-8328014367866362919, "ParticleEmitterComponent",
 	LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2947,7 +2947,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterComponent = {
-	1281034800529543047, "GpuParticleEmitterComponent",
+	3218466719653579577, "GpuParticleEmitterComponent",
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterComponent>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -3023,7 +3023,7 @@ static inline void wrapGpuParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-8599045577937220039, "ModelComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-2378722133865985395, "ModelComponent",
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(),
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(),
 														 nullptr, nullptr};
 														 nullptr, nullptr};
 
 
@@ -3099,7 +3099,7 @@ static inline void wrapModelComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {560822477706961601, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {-521841775230543159, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(),
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(),
 														nullptr, nullptr};
 														nullptr, nullptr};
 
 
@@ -3176,7 +3176,7 @@ static inline void wrapSkinComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {
-	-5698052727824177864, "SkyboxComponent", LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr,
+	-2277626995161381444, "SkyboxComponent", LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr,
 	nullptr};
 	nullptr};
 
 
 template<>
 template<>
@@ -3296,7 +3296,7 @@ static inline void wrapSkyboxComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {
-	-5235994028967522721, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(), nullptr, nullptr};
+	-2144620823698428177, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneNode>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneNode>()
@@ -4295,7 +4295,7 @@ static inline void wrapSceneNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoModelNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoModelNode = {
-	8117560334510527625, "ModelNode", LuaUserData::computeSizeForGarbageCollected<ModelNode>(), nullptr, nullptr};
+	1774496801925125084, "ModelNode", LuaUserData::computeSizeForGarbageCollected<ModelNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ModelNode>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ModelNode>()
@@ -4361,7 +4361,7 @@ static inline void wrapModelNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoPerspectiveCameraNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoPerspectiveCameraNode = {
-	4623048839275355229, "PerspectiveCameraNode", LuaUserData::computeSizeForGarbageCollected<PerspectiveCameraNode>(),
+	7105894622742243507, "PerspectiveCameraNode", LuaUserData::computeSizeForGarbageCollected<PerspectiveCameraNode>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4427,7 +4427,7 @@ static inline void wrapPerspectiveCameraNode(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoPointLightNode = {3695782909595525304, "PointLightNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoPointLightNode = {4218115462400439550, "PointLightNode",
 														 LuaUserData::computeSizeForGarbageCollected<PointLightNode>(),
 														 LuaUserData::computeSizeForGarbageCollected<PointLightNode>(),
 														 nullptr, nullptr};
 														 nullptr, nullptr};
 
 
@@ -4494,7 +4494,7 @@ static inline void wrapPointLightNode(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSpotLightNode = {-8682755857383772264, "SpotLightNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoSpotLightNode = {-2091793083632766288, "SpotLightNode",
 														LuaUserData::computeSizeForGarbageCollected<SpotLightNode>(),
 														LuaUserData::computeSizeForGarbageCollected<SpotLightNode>(),
 														nullptr, nullptr};
 														nullptr, nullptr};
 
 
@@ -4562,7 +4562,7 @@ static inline void wrapSpotLightNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoDirectionalLightNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoDirectionalLightNode = {
-	8330538125658450482, "DirectionalLightNode", LuaUserData::computeSizeForGarbageCollected<DirectionalLightNode>(),
+	-6501285280031403439, "DirectionalLightNode", LuaUserData::computeSizeForGarbageCollected<DirectionalLightNode>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4629,7 +4629,7 @@ static inline void wrapDirectionalLightNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoStaticCollisionNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoStaticCollisionNode = {
-	5700711051125552486, "StaticCollisionNode", LuaUserData::computeSizeForGarbageCollected<StaticCollisionNode>(),
+	-7265536825047312096, "StaticCollisionNode", LuaUserData::computeSizeForGarbageCollected<StaticCollisionNode>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4696,7 +4696,7 @@ static inline void wrapStaticCollisionNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterNode = {
-	6158282614068256391, "ParticleEmitterNode", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterNode>(),
+	2973919878633574234, "ParticleEmitterNode", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterNode>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4763,7 +4763,7 @@ static inline void wrapParticleEmitterNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoGpuParticleEmitterNode = {
-	6196169059955750371, "GpuParticleEmitterNode",
+	6956159109755782816, "GpuParticleEmitterNode",
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterNode>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<GpuParticleEmitterNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4830,7 +4830,7 @@ static inline void wrapGpuParticleEmitterNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeNode = {
-	-1364507711789264034, "ReflectionProbeNode", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeNode>(),
+	419937439133921472, "ReflectionProbeNode", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeNode>(),
 	nullptr, nullptr};
 	nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4897,7 +4897,7 @@ static inline void wrapReflectionProbeNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoDecalNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoDecalNode = {
-	-2963295014072251930, "DecalNode", LuaUserData::computeSizeForGarbageCollected<DecalNode>(), nullptr, nullptr};
+	3441301994380797745, "DecalNode", LuaUserData::computeSizeForGarbageCollected<DecalNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<DecalNode>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<DecalNode>()
@@ -4963,7 +4963,7 @@ static inline void wrapDecalNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoTriggerNode = {
-	7036771575352563697, "TriggerNode", LuaUserData::computeSizeForGarbageCollected<TriggerNode>(), nullptr, nullptr};
+	6802202778981369878, "TriggerNode", LuaUserData::computeSizeForGarbageCollected<TriggerNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<TriggerNode>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<TriggerNode>()
@@ -5028,7 +5028,7 @@ static inline void wrapTriggerNode(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityNode = {-4052070833038919255, "FogDensityNode",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityNode = {-386589015556072926, "FogDensityNode",
 														 LuaUserData::computeSizeForGarbageCollected<FogDensityNode>(),
 														 LuaUserData::computeSizeForGarbageCollected<FogDensityNode>(),
 														 nullptr, nullptr};
 														 nullptr, nullptr};
 
 
@@ -5096,7 +5096,7 @@ static inline void wrapFogDensityNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeNode = {
-	-1090112498031519184, "GlobalIlluminationProbeNode",
+	1732740056305938491, "GlobalIlluminationProbeNode",
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeNode>(), nullptr, nullptr};
 	LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -5163,7 +5163,7 @@ static inline void wrapGlobalIlluminationProbeNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxNode = {
 LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxNode = {
-	-7359943347570616684, "SkyboxNode", LuaUserData::computeSizeForGarbageCollected<SkyboxNode>(), nullptr, nullptr};
+	-2304987273644644341, "SkyboxNode", LuaUserData::computeSizeForGarbageCollected<SkyboxNode>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SkyboxNode>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SkyboxNode>()
@@ -5229,7 +5229,7 @@ static inline void wrapSkyboxNode(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {
 LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {
-	1471383559326122488, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(), nullptr, nullptr};
+	8108006252110358060, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneGraph>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<SceneGraph>()
@@ -5981,6 +5981,68 @@ static int wrapSceneGraphnewGlobalIlluminationProbeNode(lua_State* l)
 	return 0;
 	return 0;
 }
 }
 
 
+/// Pre-wrap method SceneGraph::newSkyboxNode.
+static inline int pwrapSceneGraphnewSkyboxNode(lua_State* l)
+{
+	LuaUserData* ud;
+	(void)ud;
+	void* voidp;
+	(void)voidp;
+	PtrSize size;
+	(void)size;
+
+	if(ANKI_UNLIKELY(LuaBinder::checkArgsCount(l, 2)))
+	{
+		return -1;
+	}
+
+	// Get "this" as "self"
+	if(LuaBinder::checkUserData(l, 1, luaUserDataTypeInfoSceneGraph, ud))
+	{
+		return -1;
+	}
+
+	SceneGraph* self = ud->getData<SceneGraph>();
+
+	// Pop arguments
+	const char* arg0;
+	if(ANKI_UNLIKELY(LuaBinder::checkString(l, 2, arg0)))
+	{
+		return -1;
+	}
+
+	// Call the method
+	SkyboxNode* ret = newSceneNode<SkyboxNode>(self, arg0);
+
+	// Push return value
+	if(ANKI_UNLIKELY(ret == nullptr))
+	{
+		lua_pushstring(l, "Glue code returned nullptr");
+		return -1;
+	}
+
+	voidp = lua_newuserdata(l, sizeof(LuaUserData));
+	ud = static_cast<LuaUserData*>(voidp);
+	luaL_setmetatable(l, "SkyboxNode");
+	extern LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxNode;
+	ud->initPointed(&luaUserDataTypeInfoSkyboxNode, ret);
+
+	return 1;
+}
+
+/// Wrap method SceneGraph::newSkyboxNode.
+static int wrapSceneGraphnewSkyboxNode(lua_State* l)
+{
+	int res = pwrapSceneGraphnewSkyboxNode(l);
+	if(res >= 0)
+	{
+		return res;
+	}
+
+	lua_error(l);
+	return 0;
+}
+
 /// Pre-wrap method SceneGraph::setActiveCameraNode.
 /// Pre-wrap method SceneGraph::setActiveCameraNode.
 static inline int pwrapSceneGraphsetActiveCameraNode(lua_State* l)
 static inline int pwrapSceneGraphsetActiveCameraNode(lua_State* l)
 {
 {
@@ -6049,11 +6111,12 @@ static inline void wrapSceneGraph(lua_State* l)
 	LuaBinder::pushLuaCFuncMethod(l, "newDecalNode", wrapSceneGraphnewDecalNode);
 	LuaBinder::pushLuaCFuncMethod(l, "newDecalNode", wrapSceneGraphnewDecalNode);
 	LuaBinder::pushLuaCFuncMethod(l, "newTriggerNode", wrapSceneGraphnewTriggerNode);
 	LuaBinder::pushLuaCFuncMethod(l, "newTriggerNode", wrapSceneGraphnewTriggerNode);
 	LuaBinder::pushLuaCFuncMethod(l, "newGlobalIlluminationProbeNode", wrapSceneGraphnewGlobalIlluminationProbeNode);
 	LuaBinder::pushLuaCFuncMethod(l, "newGlobalIlluminationProbeNode", wrapSceneGraphnewGlobalIlluminationProbeNode);
+	LuaBinder::pushLuaCFuncMethod(l, "newSkyboxNode", wrapSceneGraphnewSkyboxNode);
 	LuaBinder::pushLuaCFuncMethod(l, "setActiveCameraNode", wrapSceneGraphsetActiveCameraNode);
 	LuaBinder::pushLuaCFuncMethod(l, "setActiveCameraNode", wrapSceneGraphsetActiveCameraNode);
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {4776350111101506313, "Event",
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {273791316102449211, "Event",
 												LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
 												LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -6122,7 +6185,7 @@ static inline void wrapEvent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {
-	7439941417849441949, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(), nullptr, nullptr};
+	1694734869694099565, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightEvent>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightEvent>()
@@ -6246,7 +6309,7 @@ static inline void wrapLightEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-5767665324053515254, "EventManager",
+LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-5376406320197242602, "EventManager",
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(),
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(),
 													   nullptr, nullptr};
 													   nullptr, nullptr};
 
 

+ 7 - 0
AnKi/Script/Scene.xml

@@ -663,6 +663,13 @@ using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 					</args>
 					</args>
 					<return>GlobalIlluminationProbeNode*</return>
 					<return>GlobalIlluminationProbeNode*</return>
 				</method>
 				</method>
+				<method name="newSkyboxNode">
+					<overrideCall><![CDATA[SkyboxNode* ret = newSceneNode<SkyboxNode>(self, arg0);]]></overrideCall>
+					<args>
+						<arg>CString</arg>
+					</args>
+					<return>SkyboxNode*</return>
+				</method>
 				<method name="setActiveCameraNode">
 				<method name="setActiveCameraNode">
 					<args>
 					<args>
 						<arg>SceneNode*</arg>
 						<arg>SceneNode*</arg>

+ 40 - 0
AnKi/Shaders/LightShadingSkybox.ankiprog

@@ -0,0 +1,40 @@
+// Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma anki mutator METHOD 0 1 // 0: solid colod, 1: 2D image
+
+#pragma anki start vert
+
+layout(location = 0) out Vec2 out_uv;
+
+void main()
+{
+	out_uv = Vec2(gl_VertexID & 1, gl_VertexID >> 1) * 2.0;
+	const Vec2 pos = out_uv * 2.0 - 1.0;
+
+	gl_Position = Vec4(pos, 1.0, 1.0);
+}
+
+#pragma anki end
+
+#pragma anki start frag
+
+#include <AnKi/Shaders/Functions.glsl>
+
+layout(location = 0) in Vec2 in_uv;
+layout(location = 0) out ANKI_RP Vec3 out_color;
+
+layout(push_constant, scalar) uniform b_pc
+{
+	ANKI_RP Vec3 u_solidColor;
+	F32 u_padding;
+};
+
+void main()
+{
+	out_color = u_solidColor;
+}
+
+#pragma anki end

+ 10 - 2
Samples/Sponza/Assets/sky.ankimtl → Samples/Sponza/Assets/16___Default.ankimtl

@@ -14,13 +14,21 @@
 	<inputs>
 	<inputs>
 		
 		
 
 
-		<input shaderVar="m_diffColor" value="0.352369 0.517735 0.800000"/>
+		<input shaderVar="m_diffColor" value="0.588000 0.588000 0.588000"/>
 		<input shaderVar="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input shaderVar="m_specColor" value="0.040000 0.040000 0.040000"/>
 		<input shaderVar="m_roughness" value="0.500000"/>
 		<input shaderVar="m_roughness" value="0.500000"/>
 		<input shaderVar="m_metallic" value="0.000000"/>
 		<input shaderVar="m_metallic" value="0.000000"/>
 		
 		
-		<input shaderVar="m_emission" value="1.000000 1.000000 1.000000"/>
+		<input shaderVar="m_emission" value="0.000000 0.000000 0.000000"/>
 		<input shaderVar="m_subsurface" value="0.000000"/>
 		<input shaderVar="m_subsurface" value="0.000000"/>
 		
 		
 	</inputs>
 	</inputs>
 </material>
 </material>
+
+<rtMaterial>
+	<rayType type="shadows" shaderProgram="AnKi/Shaders/RtShadowsHit.ankiprog">
+		<mutation>
+			<mutator name="ALPHA_TEXTURE" value="0"/>
+		</mutation>
+	</rayType>
+</rtMaterial>

BIN
Samples/Sponza/Assets/Cube.003.ankimesh


+ 14 - 13
Samples/Sponza/Assets/Scene.lua

@@ -1,12 +1,23 @@
--- Generated by: /home/godlike/src/anki/buildd/Bin/GltfImporter sponza_crytek_7_pbr_2.8.gltf /home/godlike/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.01
+-- Generated by: /home/godlike/src/anki/buildd/Bin/GltfImporter sponza_crytek_7_pbr.gltf /home/godlike/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.01
 local scene = getSceneGraph()
 local scene = getSceneGraph()
 local events = getEventManager()
 local events = getEventManager()
 
 
+node = scene:newSkyboxNode("Cube.017")
+comp = node:getSceneNodeBase():getSkyboxComponent()
+comp:setSolidColor(Vec3.new(0.000000, 0.000000, 10.000000))
+trf = Transform.new()
+trf:setOrigin(Vec4.new(0.000000, 28.856024, 24.232458, 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:newGlobalIlluminationProbeNode("Cube.011")
 node = scene:newGlobalIlluminationProbeNode("Cube.011")
 comp = node:getSceneNodeBase():getGlobalIlluminationProbeComponent()
 comp = node:getSceneNodeBase():getGlobalIlluminationProbeComponent()
-comp:setBoxVolumeSize(Vec3.new(49.589451, 25.940620, 23.239899))
+comp:setBoxVolumeSize(Vec3.new(48.303688, 25.505352, 21.646244))
 trf = Transform.new()
 trf = Transform.new()
-trf:setOrigin(Vec4.new(-1.084898, 12.311603, -0.533417, 0))
+trf:setOrigin(Vec4.new(-1.008493, 12.464414, -0.581032, 0))
 rot = Mat3x4.new()
 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)
 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:setRotation(rot)
@@ -90,16 +101,6 @@ trf:setRotation(rot)
 trf:setScale(1.000000)
 trf:setScale(1.000000)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
 
 
-node = scene:newModelNode("sky")
-node:getSceneNodeBase():getModelComponent():loadModelResource("Assets/sky_sky.ankimdl")
-trf = Transform.new()
-trf:setOrigin(Vec4.new(0.000000, 10.451169, 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(42.438332)
-node:getSceneNodeBase():getMoveComponent():setLocalTransform(trf)
-
 node = scene:newPerspectiveCameraNode("Camera.001_Orientation")
 node = scene:newPerspectiveCameraNode("Camera.001_Orientation")
 scene:setActiveCameraNode(node:getSceneNodeBase())
 scene:setActiveCameraNode(node:getSceneNodeBase())
 frustumc = node:getSceneNodeBase():getFrustumComponent()
 frustumc = node:getSceneNodeBase():getFrustumComponent()

BIN
Samples/Sponza/Assets/carpet.ankimesh


BIN
Samples/Sponza/Assets/carpet_lod1.ankimesh


BIN
Samples/Sponza/Assets/sky.ankimesh


+ 0 - 8
Samples/Sponza/Assets/sky_sky.ankimdl

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

BIN
Samples/Sponza/Assets/skybox.ankimesh


+ 8 - 0
Samples/Sponza/Assets/skybox_16___Default.ankimdl

@@ -0,0 +1,8 @@
+<model>
+	<modelPatches>
+		<modelPatch>
+			<mesh>Assets/skybox.ankimesh</mesh>
+			<material>Assets/16___Default.ankimtl</material>
+		</modelPatch>
+	</modelPatches>
+</model>