Browse Source

Add scale and bias to the env maps in the component

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
2f61de994f

+ 9 - 0
AnKi/Renderer/LightShading.cpp

@@ -167,12 +167,21 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 			{
 			{
 			public:
 			public:
 				Mat4 m_invertedViewProjectionJitter;
 				Mat4 m_invertedViewProjectionJitter;
+
 				Vec3 m_cameraPos;
 				Vec3 m_cameraPos;
 				F32 m_padding = 0.0;
 				F32 m_padding = 0.0;
+
+				Vec3 m_scale;
+				F32 m_padding1;
+
+				Vec3 m_bias;
+				F32 m_padding2;
 			} pc;
 			} pc;
 
 
 			pc.m_invertedViewProjectionJitter = ctx.m_matrices.m_invertedViewProjectionJitter;
 			pc.m_invertedViewProjectionJitter = ctx.m_matrices.m_invertedViewProjectionJitter;
 			pc.m_cameraPos = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
 			pc.m_cameraPos = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
+			pc.m_scale = sky->getImageScale();
+			pc.m_bias = sky->getImageBias();
 
 
 			cmdb.setPushConstants(&pc, sizeof(pc));
 			cmdb.setPushConstants(&pc, sizeof(pc));
 
 

+ 2 - 0
AnKi/Renderer/Utils/TraditionalDeferredShading.cpp

@@ -73,6 +73,8 @@ void TraditionalDeferredLightShading::drawLights(TraditionalDeferredLightShading
 		unis.m_solidColor = (isSolidColor) ? skyc->getSolidColor() : Vec3(0.0f);
 		unis.m_solidColor = (isSolidColor) ? skyc->getSolidColor() : Vec3(0.0f);
 		unis.m_invertedViewProjectionMat = info.m_invViewProjectionMatrix;
 		unis.m_invertedViewProjectionMat = info.m_invViewProjectionMatrix;
 		unis.m_cameraPos = info.m_cameraPosWSpace.xyz();
 		unis.m_cameraPos = info.m_cameraPosWSpace.xyz();
+		unis.m_scale = skyc->getImageScale();
+		unis.m_bias = skyc->getImageBias();
 		cmdb.setPushConstants(&unis, sizeof(unis));
 		cmdb.setPushConstants(&unis, sizeof(unis));
 
 
 		drawQuad(cmdb);
 		drawQuad(cmdb);

+ 1 - 2
AnKi/Resource/ImageLoader.cpp

@@ -404,8 +404,7 @@ Error ImageLoader::loadAnkiImage(FileInterface& file, U32 maxImageSize, ImageBin
 		return Error::kUserData;
 		return Error::kUserData;
 	}
 	}
 
 
-	if(header.m_width == 0 || !isPowerOfTwo(header.m_width) || header.m_width > 4096 || header.m_height == 0 || !isPowerOfTwo(header.m_height)
-	   || header.m_height > 4096)
+	if(header.m_width == 0 || !isPowerOfTwo(header.m_width) || header.m_height == 0 || !isPowerOfTwo(header.m_height))
 	{
 	{
 		ANKI_RESOURCE_LOGE("Incorrect width/height value");
 		ANKI_RESOURCE_LOGE("Incorrect width/height value");
 		return Error::kUserData;
 		return Error::kUserData;

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

@@ -59,6 +59,26 @@ public:
 		return *m_image;
 		return *m_image;
 	}
 	}
 
 
+	void setImageScale(Vec3 s)
+	{
+		m_imageScale = s;
+	}
+
+	const Vec3& getImageScale() const
+	{
+		return m_imageScale;
+	}
+
+	void setImageBias(Vec3 s)
+	{
+		m_imageBias = s;
+	}
+
+	const Vec3& getImageBias() const
+	{
+		return m_imageBias;
+	}
+
 	void setMinFogDensity(F32 density)
 	void setMinFogDensity(F32 density)
 	{
 	{
 		m_fog.m_minDensity = clamp(density, 0.0f, 100.0f);
 		m_fog.m_minDensity = clamp(density, 0.0f, 100.0f);
@@ -135,6 +155,8 @@ private:
 	SkyboxType m_type = SkyboxType::kSolidColor;
 	SkyboxType m_type = SkyboxType::kSolidColor;
 	Vec3 m_color = Vec3(0.0f, 0.0f, 0.5f);
 	Vec3 m_color = Vec3(0.0f, 0.0f, 0.5f);
 	ImageResourcePtr m_image;
 	ImageResourcePtr m_image;
+	Vec3 m_imageScale = Vec3(1.0f);
+	Vec3 m_imageBias = Vec3(0.0f);
 
 
 	// Fog
 	// Fog
 	class
 	class

+ 125 - 24
AnKi/Script/Scene.cpp

@@ -61,7 +61,7 @@ static EventManager* getEventManager(lua_State* l)
 using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 using WeakArrayBodyComponentPtr = WeakArray<BodyComponent*>;
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-2186799208001048948, "LightComponentType", 0, nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-3628200144600318313, "LightComponentType", 0, nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightComponentType>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightComponentType>()
@@ -97,7 +97,7 @@ static inline void wrapLightComponentType(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	-5621841728276973443, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
+	864549077786498962, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArraySceneNodePtr>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArraySceneNodePtr>()
@@ -216,7 +216,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArrayBodyComponentPtr = {
-	-2450261177319875645, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
+	2394494311240256603, "WeakArrayBodyComponentPtr", LuaUserData::computeSizeForGarbageCollected<WeakArrayBodyComponentPtr>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArrayBodyComponentPtr>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArrayBodyComponentPtr>()
@@ -334,7 +334,7 @@ static inline void wrapWeakArrayBodyComponentPtr(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {4306214230380881007, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-9113026076318485279, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(), nullptr, nullptr};
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -945,7 +945,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-7936276591715536647, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-6723919824281962116, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(), nullptr, nullptr};
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1117,7 +1117,7 @@ static inline void wrapDecalComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-5086197872425382972, "LensFlareComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-902217144669261434, "LensFlareComponent",
 															 LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(), nullptr, nullptr};
 															 LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1280,7 +1280,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-805439343256183040, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {-6509320180515493376, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(), nullptr, nullptr};
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1433,7 +1433,7 @@ static inline void wrapBodyComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {-6666901323722894598, "TriggerComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {7265271290132140876, "TriggerComponent",
 														   LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr, nullptr};
 														   LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1596,7 +1596,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {-1581092310546501713, "FogDensityComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {5672255065445474742, "FogDensityComponent",
 															  LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(), nullptr, nullptr};
 															  LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1799,7 +1799,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {-7037015782425453738, "CameraComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {-2496630439844899169, "CameraComponent",
 														  LuaUserData::computeSizeForGarbageCollected<CameraComponent>(), nullptr, nullptr};
 														  LuaUserData::computeSizeForGarbageCollected<CameraComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -1881,7 +1881,7 @@ static inline void wrapCameraComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	662796720185408765, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr,
+	3385705463814019741, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(), nullptr,
 	nullptr};
 	nullptr};
 
 
 template<>
 template<>
@@ -2128,7 +2128,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	-1659222547184662609, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
+	7838020751769093992, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ReflectionProbeComponent>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ReflectionProbeComponent>()
@@ -2243,7 +2243,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 }
 
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	2968528361814203615, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
+	-6812064200873386626, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ParticleEmitterComponent>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ParticleEmitterComponent>()
@@ -2305,7 +2305,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {-5693197927073963652, "ModelComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoModelComponent = {4751338525694906335, "ModelComponent",
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(), nullptr, nullptr};
 														 LuaUserData::computeSizeForGarbageCollected<ModelComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2368,7 +2368,7 @@ static inline void wrapModelComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {2877959498374713604, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {4674705423629519447, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(), nullptr, nullptr};
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2431,7 +2431,7 @@ static inline void wrapSkinComponent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {7113661660511499239, "SkyboxComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {1379691475560871879, "SkyboxComponent",
 														  LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr, nullptr};
 														  LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -2719,6 +2719,104 @@ static int wrapSkyboxComponentsetHeightOfMaxFogDensity(lua_State* l)
 	return 0;
 	return 0;
 }
 }
 
 
+/// Pre-wrap method SkyboxComponent::setImageBias.
+static inline int pwrapSkyboxComponentsetImageBias(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->setImageBias(arg0);
+
+	return 0;
+}
+
+/// Wrap method SkyboxComponent::setImageBias.
+static int wrapSkyboxComponentsetImageBias(lua_State* l)
+{
+	int res = pwrapSkyboxComponentsetImageBias(l);
+	if(res >= 0)
+	{
+		return res;
+	}
+
+	lua_error(l);
+	return 0;
+}
+
+/// Pre-wrap method SkyboxComponent::setImageScale.
+static inline int pwrapSkyboxComponentsetImageScale(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->setImageScale(arg0);
+
+	return 0;
+}
+
+/// Wrap method SkyboxComponent::setImageScale.
+static int wrapSkyboxComponentsetImageScale(lua_State* l)
+{
+	int res = pwrapSkyboxComponentsetImageScale(l);
+	if(res >= 0)
+	{
+		return res;
+	}
+
+	lua_error(l);
+	return 0;
+}
+
 /// Wrap class SkyboxComponent.
 /// Wrap class SkyboxComponent.
 static inline void wrapSkyboxComponent(lua_State* l)
 static inline void wrapSkyboxComponent(lua_State* l)
 {
 {
@@ -2729,10 +2827,12 @@ static inline void wrapSkyboxComponent(lua_State* l)
 	LuaBinder::pushLuaCFuncMethod(l, "setMaxFogDensity", wrapSkyboxComponentsetMaxFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setMaxFogDensity", wrapSkyboxComponentsetMaxFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMinFogDensity", wrapSkyboxComponentsetHeightOfMinFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMinFogDensity", wrapSkyboxComponentsetHeightOfMinFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMaxFogDensity", wrapSkyboxComponentsetHeightOfMaxFogDensity);
 	LuaBinder::pushLuaCFuncMethod(l, "setHeightOfMaxFogDensity", wrapSkyboxComponentsetHeightOfMaxFogDensity);
+	LuaBinder::pushLuaCFuncMethod(l, "setImageBias", wrapSkyboxComponentsetImageBias);
+	LuaBinder::pushLuaCFuncMethod(l, "setImageScale", wrapSkyboxComponentsetImageScale);
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {1520931116948498871, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {4834914283414360327, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
 													nullptr, nullptr};
 													nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4562,7 +4662,7 @@ static inline void wrapSceneNode(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {-5095198754290276314, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {1750729963331454656, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
 													 nullptr, nullptr};
 													 nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4748,7 +4848,8 @@ static inline void wrapSceneGraph(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {963208982629256277, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {-2493176062691731156, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr,
+												nullptr};
 
 
 template<>
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Event>()
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Event>()
@@ -4812,7 +4913,7 @@ static inline void wrapEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {-8538774470743043372, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {6673207679244515586, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
 													 nullptr, nullptr};
 													 nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4931,7 +5032,7 @@ static inline void wrapLightEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {4297440921340497154, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-1468565822630009987, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
 													  nullptr, nullptr};
 													  nullptr, nullptr};
 
 
 template<>
 template<>
@@ -4947,7 +5048,7 @@ static inline void wrapScriptEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {2516494412036964791, "JitterMoveEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {6444353852918166909, "JitterMoveEvent",
 														  LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr, nullptr};
 														  LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -5022,7 +5123,7 @@ static inline void wrapJitterMoveEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {1905208628208424330, "AnimationEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-3909535072828022928, "AnimationEvent",
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(), nullptr, nullptr};
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(), nullptr, nullptr};
 
 
 template<>
 template<>
@@ -5038,7 +5139,7 @@ static inline void wrapAnimationEvent(lua_State* l)
 	lua_settop(l, 0);
 	lua_settop(l, 0);
 }
 }
 
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-824737091935505940, "EventManager",
+LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-3644594881277320999, "EventManager",
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 
 
 template<>
 template<>

+ 10 - 0
AnKi/Script/Scene.xml

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

+ 6 - 0
AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h

@@ -43,6 +43,12 @@ struct TraditionalDeferredSkyboxConstants
 
 
 	Vec3 m_cameraPos;
 	Vec3 m_cameraPos;
 	F32 m_padding2;
 	F32 m_padding2;
+
+	Vec3 m_scale;
+	F32 m_padding3;
+
+	Vec3 m_bias;
+	F32 m_padding4;
 };
 };
 
 
 ANKI_END_NAMESPACE
 ANKI_END_NAMESPACE

+ 8 - 1
AnKi/Shaders/LightShadingSkybox.ankiprog

@@ -46,8 +46,15 @@ struct Constants
 struct Constants
 struct Constants
 {
 {
 	Mat4 m_invertedViewProjectionJitterMat;
 	Mat4 m_invertedViewProjectionJitterMat;
+
 	Vec3 m_cameraPos;
 	Vec3 m_cameraPos;
 	F32 m_padding;
 	F32 m_padding;
+
+	Vec3 m_scale;
+	F32 m_padding1;
+
+	Vec3 m_bias;
+	F32 m_padding2;
 };
 };
 
 
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 [[vk::push_constant]] ConstantBuffer<Constants> g_consts;
@@ -76,7 +83,7 @@ RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 
 
 	const F32 bias = (maxD > 0.9) ? -100.0f : 0.0f;
 	const F32 bias = (maxD > 0.9) ? -100.0f : 0.0f;
 
 
-	return g_envMapTex.SampleBias(g_trilinearAnySampler, uv3, bias).rgb;
+	return g_envMapTex.SampleBias(g_trilinearAnySampler, uv3, bias).rgb * g_consts.m_scale + g_consts.m_bias;
 #endif
 #endif
 }
 }
 
 

+ 1 - 1
AnKi/Shaders/TraditionalDeferredShadingSkybox.ankiprog

@@ -44,7 +44,7 @@ RVec3 main(Vec2 uv : TEXCOORD) : SV_TARGET0
 	const Vec3 eyeToFrag = normalize(worldPos - g_consts.m_cameraPos);
 	const Vec3 eyeToFrag = normalize(worldPos - g_consts.m_cameraPos);
 
 
 	const Vec2 uv2 = equirectangularMapping(eyeToFrag);
 	const Vec2 uv2 = equirectangularMapping(eyeToFrag);
-	return g_envMapTex.Sample(g_trilinearAnySampler, uv2).rgb;
+	return g_envMapTex.Sample(g_trilinearAnySampler, uv2).rgb * g_consts.m_scale + g_consts.m_bias;
 #endif
 #endif
 }
 }