Browse Source

Remove parallax from GBufferGeneric

Panagiotis Christopoulos Charitos 1 month ago
parent
commit
07f941fc0f
48 changed files with 480 additions and 273 deletions
  1. 4 1
      AnKi/Importer/GltfImporterAnimation.cpp
  2. 0 23
      AnKi/Importer/GltfImporterMaterial.cpp
  3. 11 2
      AnKi/Script/LuaGlueGen.py
  4. 55 55
      AnKi/Script/Scene.cpp
  5. 15 15
      AnKi/Script/Scene.xml
  6. 41 11
      AnKi/ShaderCompiler/ShaderParser.cpp
  7. 24 49
      AnKi/Shaders/GBufferGeneric.ankiprog
  8. BIN
      Samples/PhysicsPlayground/Assets/MESH_grenade_818651700502e14b.ankimesh
  9. 0 3
      Samples/PhysicsPlayground/Assets/MTL_grenade_4346150e31bdb957.ankimtl
  10. 1 1
      Samples/PhysicsPlayground/Assets/Scene.lua
  11. 0 3
      Samples/PhysicsPlayground/Assets/arms_3a4232ebbd425e7a.ankimtl
  12. 0 3
      Samples/PhysicsPlayground/Assets/boomstick_89a614a521ace7fd.ankimtl
  13. 0 3
      Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl
  14. 0 3
      Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl
  15. 0 3
      Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl
  16. 0 3
      Samples/Sponza/Assets/ChainMail_e54428975578d25.ankimtl
  17. 0 3
      Samples/Sponza/Assets/Leather_d5d86863309c9f2b.ankimtl
  18. 0 3
      Samples/Sponza/Assets/MTL_Candle_33551c344b101f46.ankimtl
  19. 0 3
      Samples/Sponza/Assets/MTL_Flame_35971c3f216651ba.ankimtl
  20. 0 3
      Samples/Sponza/Assets/MTL_monkey_381dce880f246211.ankimtl
  21. 0 3
      Samples/Sponza/Assets/Metal_74980e5c889a1a43.ankimtl
  22. 329 2
      Samples/Sponza/Assets/Scene.lua
  23. 0 3
      Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl
  24. 0 3
      Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl
  25. 0 3
      Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl
  26. 0 3
      Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl
  27. 0 3
      Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl
  28. 0 3
      Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl
  29. 0 3
      Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl
  30. 0 3
      Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl
  31. 0 3
      Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl
  32. 0 3
      Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl
  33. 0 3
      Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl
  34. 0 3
      Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl
  35. 0 3
      Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl
  36. 0 3
      Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl
  37. 0 3
      Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl
  38. 0 3
      Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl
  39. 0 3
      Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl
  40. 0 3
      Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl
  41. 0 3
      Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl
  42. 0 3
      Samples/Sponza/Assets/material_cf698120548b7e7c.ankimtl
  43. 0 3
      Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl
  44. 0 3
      Samples/Sponza/Assets/skinFace_37e531adb0394fda.ankimtl
  45. 0 3
      Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl
  46. 0 3
      Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl
  47. 0 3
      Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl
  48. 0 3
      Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl

+ 4 - 1
AnKi/Importer/GltfImporterAnimation.cpp

@@ -366,9 +366,12 @@ Error GltfImporter::writeAnimation(const cgltf_animation& anim)
 			continue;
 		}
 
+		// No idea how to distinguise the bone nodes so wrap it in an if
 		ANKI_CHECK(m_sceneFile.writeTextf("\nnode = scene:tryFindSceneNode(\"%s\")\n", node.name));
+		ANKI_CHECK(m_sceneFile.writeText("if node ~= nil then\n"));
 		ANKI_CHECK(
-			m_sceneFile.writeTextf("getEventManager():newAnimationEvent(\"%s%s\", \"%s\", node)\n", m_rpath.cstr(), animFname.cstr(), node.name));
+			m_sceneFile.writeTextf("\tgetEventManager():newAnimationEvent(\"%s%s\", \"%s\", node)\n", m_rpath.cstr(), animFname.cstr(), node.name));
+		ANKI_CHECK(m_sceneFile.writeText("end\n"));
 	}
 
 	return Error::kNone;

+ 0 - 23
AnKi/Importer/GltfImporterMaterial.cpp

@@ -20,21 +20,18 @@ inline constexpr const Char* kMaterialTemplate = R"(<!-- This file is auto gener
 			<mutator name="SPECULAR_TEX" value="%specTexMutator%"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="%roughnessMetalnessTexMutator%"/>
 			<mutator name="NORMAL_TEX" value="%normalTexMutator%"/>
-			<mutator name="PARALLAX" value="%parallaxMutator%"/>
 			<mutator name="EMISSIVE_TEX" value="%emissiveTexMutator%"/>
 			<mutator name="ALPHA_TEST" value="%alphaTestMutator%"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		%parallaxInput%
 		%diff%
 		%spec%
 		%roughnessMetalness%
 		%normal%
 		%emission%
 		%subsurface%
-		%height%
 	</inputs>
 </material>
 )";
@@ -401,26 +398,6 @@ Error GltfImporter::writeMaterialInternal(const cgltf_material& mtl, Bool writeR
 		xml.replaceAll("%subsurface%", ImporterString().sprintf("<input name=\"m_subsurface\" value=\"%f\"/>", subsurface));
 	}
 
-	// Height texture
-	auto it = extras.find("height_map");
-	if(it != extras.getEnd())
-	{
-		ImporterString uri;
-		uri.sprintf("%s%s", m_texrpath.cstr(), it->cstr());
-
-		xml.replaceAll("%height%", ImporterString().sprintf("<input name=\"m_heightTex\" value=\"%s\" \"/>\n"
-															"\t\t<input name=\"m_heightmapScale\" value=\"0.05\"/>",
-															uri.cstr()));
-
-		xml.replaceAll("%parallaxMutator%", "1");
-	}
-	else
-	{
-		xml.replaceAll("%height%", "");
-		xml.replaceAll("%parallaxInput%", "");
-		xml.replaceAll("%parallaxMutator%", "0");
-	}
-
 	// Replace texture extensions with .anki
 	fixImageUri(xml);
 

+ 11 - 2
AnKi/Script/LuaGlueGen.py

@@ -124,11 +124,20 @@ def ret(ret_el):
     (type, is_ref, is_ptr, is_const) = parse_type_decl(type_txt)
 
     if is_ptr:
+        if ret_el.get("canBeNullptr") is not None and ret_el.get("canBeNullptr") == "1":
+            can_be_nullptr = True
+        else:
+            can_be_nullptr = False
+
         wglue("if(ret == nullptr) [[unlikely]]")
         wglue("{")
         ident(1)
-        wglue("lua_pushstring(l, \"Glue code returned nullptr\");")
-        wglue("return -1;")
+        if can_be_nullptr:
+            wglue("lua_pushnil(l);")
+            wglue("return 1;")
+        else:
+            wglue("lua_pushstring(l, \"Glue code returned nullptr\");")
+            wglue("return -1;")
         ident(-1)
         wglue("}")
         wglue("")

+ 55 - 55
AnKi/Script/Scene.cpp

@@ -40,7 +40,7 @@ static EventManager* getEventManager(lua_State* l)
 
 using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-3456526791875692793, "LightComponentType", 0, nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponentType = {-2951794755732251303, "LightComponentType", 0, nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<LightComponentType>()
@@ -75,7 +75,7 @@ static inline void wrapLightComponentType(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponentCollisionShapeType = {-2481956995252598710, "BodyComponentCollisionShapeType", 0, nullptr,
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponentCollisionShapeType = {-6864884499475175570, "BodyComponentCollisionShapeType", 0, nullptr,
 																		  nullptr};
 
 template<>
@@ -120,7 +120,7 @@ static inline void wrapBodyComponentCollisionShapeType(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoWeakArraySceneNodePtr = {
-	-5105683965807077746, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
+	-5469396036412472725, "WeakArraySceneNodePtr", LuaUserData::computeSizeForGarbageCollected<WeakArraySceneNodePtr>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<WeakArraySceneNodePtr>()
@@ -238,7 +238,7 @@ static inline void wrapWeakArraySceneNodePtr(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {-1619723790941641410, "LightComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLightComponent = {6041296386102173028, "LightComponent",
 														 LuaUserData::computeSizeForGarbageCollected<LightComponent>(), nullptr, nullptr};
 
 template<>
@@ -849,7 +849,7 @@ static inline void wrapLightComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {-5039454701243542060, "DecalComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoDecalComponent = {2523080055074928449, "DecalComponent",
 														 LuaUserData::computeSizeForGarbageCollected<DecalComponent>(), nullptr, nullptr};
 
 template<>
@@ -971,7 +971,7 @@ static inline void wrapDecalComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-8198380418068746713, "LensFlareComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoLensFlareComponent = {-6241385799886522065, "LensFlareComponent",
 															 LuaUserData::computeSizeForGarbageCollected<LensFlareComponent>(), nullptr, nullptr};
 
 template<>
@@ -1134,7 +1134,7 @@ static inline void wrapLensFlareComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {1686832003982752925, "BodyComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoBodyComponent = {7524539473625590228, "BodyComponent",
 														LuaUserData::computeSizeForGarbageCollected<BodyComponent>(), nullptr, nullptr};
 
 template<>
@@ -1444,7 +1444,7 @@ static inline void wrapBodyComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {3243022653427387261, "TriggerComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoTriggerComponent = {4035948449472538454, "TriggerComponent",
 														   LuaUserData::computeSizeForGarbageCollected<TriggerComponent>(), nullptr, nullptr};
 
 template<>
@@ -1558,7 +1558,7 @@ static inline void wrapTriggerComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {-6388867116345771249, "FogDensityComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoFogDensityComponent = {1395825200860635555, "FogDensityComponent",
 															  LuaUserData::computeSizeForGarbageCollected<FogDensityComponent>(), nullptr, nullptr};
 
 template<>
@@ -1664,7 +1664,7 @@ static inline void wrapFogDensityComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {-9123171918287668028, "CameraComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoCameraComponent = {9108568743456198726, "CameraComponent",
 														  LuaUserData::computeSizeForGarbageCollected<CameraComponent>(), nullptr, nullptr};
 
 template<>
@@ -1746,7 +1746,7 @@ static inline void wrapCameraComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoGlobalIlluminationProbeComponent = {
-	-2685775957509103389, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(),
+	-5604598972940179785, "GlobalIlluminationProbeComponent", LuaUserData::computeSizeForGarbageCollected<GlobalIlluminationProbeComponent>(),
 	nullptr, nullptr};
 
 template<>
@@ -1943,7 +1943,7 @@ static inline void wrapGlobalIlluminationProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoReflectionProbeComponent = {
-	4010089375456464018, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
+	-4547449432121939351, "ReflectionProbeComponent", LuaUserData::computeSizeForGarbageCollected<ReflectionProbeComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ReflectionProbeComponent>()
@@ -1959,7 +1959,7 @@ static inline void wrapReflectionProbeComponent(lua_State* l)
 }
 
 LuaUserDataTypeInfo luaUserDataTypeInfoParticleEmitterComponent = {
-	-1558542243117367050, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
+	6051910453055776199, "ParticleEmitterComponent", LuaUserData::computeSizeForGarbageCollected<ParticleEmitterComponent>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<ParticleEmitterComponent>()
@@ -2021,7 +2021,7 @@ static inline void wrapParticleEmitterComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMeshComponent = {-1595897034300335391, "MeshComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoMeshComponent = {-6827757659918705226, "MeshComponent",
 														LuaUserData::computeSizeForGarbageCollected<MeshComponent>(), nullptr, nullptr};
 
 template<>
@@ -2091,7 +2091,7 @@ static inline void wrapMeshComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoMaterialComponent = {-3502769337275950489, "MaterialComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoMaterialComponent = {-8802698896140404851, "MaterialComponent",
 															LuaUserData::computeSizeForGarbageCollected<MaterialComponent>(), nullptr, nullptr};
 
 template<>
@@ -2215,7 +2215,7 @@ static inline void wrapMaterialComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {7952306814580316146, "SkinComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkinComponent = {2686223507940594141, "SkinComponent",
 														LuaUserData::computeSizeForGarbageCollected<SkinComponent>(), nullptr, nullptr};
 
 template<>
@@ -2285,7 +2285,7 @@ static inline void wrapSkinComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {-6295607888881293128, "SkyboxComponent",
+LuaUserDataTypeInfo luaUserDataTypeInfoSkyboxComponent = {-1425098219244461343, "SkyboxComponent",
 														  LuaUserData::computeSizeForGarbageCollected<SkyboxComponent>(), nullptr, nullptr};
 
 template<>
@@ -2776,7 +2776,7 @@ static inline void wrapSkyboxComponent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {8987550344071655576, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneNode = {-7823926706575247859, "SceneNode", LuaUserData::computeSizeForGarbageCollected<SceneNode>(),
 													nullptr, nullptr};
 
 template<>
@@ -3327,8 +3327,8 @@ static inline int pwrapSceneNodenewLightComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3379,8 +3379,8 @@ static inline int pwrapSceneNodenewLensFlareComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3431,8 +3431,8 @@ static inline int pwrapSceneNodenewDecalComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3483,8 +3483,8 @@ static inline int pwrapSceneNodenewTriggerComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3535,8 +3535,8 @@ static inline int pwrapSceneNodenewFogDensityComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3587,8 +3587,8 @@ static inline int pwrapSceneNodenewCameraComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3639,8 +3639,8 @@ static inline int pwrapSceneNodenewGlobalIlluminationProbeComponent(lua_State* l
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3691,8 +3691,8 @@ static inline int pwrapSceneNodenewReflectionProbeComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3743,8 +3743,8 @@ static inline int pwrapSceneNodenewBodyComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3795,8 +3795,8 @@ static inline int pwrapSceneNodenewParticleEmitterComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3847,8 +3847,8 @@ static inline int pwrapSceneNodenewMeshComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3899,8 +3899,8 @@ static inline int pwrapSceneNodenewMaterialComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -3951,8 +3951,8 @@ static inline int pwrapSceneNodenewSkinComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -4003,8 +4003,8 @@ static inline int pwrapSceneNodenewSkyboxComponent(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -4719,7 +4719,7 @@ static inline void wrapSceneNode(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {-1128652299998428278, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoSceneGraph = {7810393597373974580, "SceneGraph", LuaUserData::computeSizeForGarbageCollected<SceneGraph>(),
 													 nullptr, nullptr};
 
 template<>
@@ -4869,8 +4869,8 @@ static inline int pwrapSceneGraphtryFindSceneNode(lua_State* l)
 	// Push return value
 	if(ret == nullptr) [[unlikely]]
 	{
-		lua_pushstring(l, "Glue code returned nullptr");
-		return -1;
+		lua_pushnil(l);
+		return 1;
 	}
 
 	voidp = lua_newuserdata(l, sizeof(LuaUserData));
@@ -4905,7 +4905,7 @@ static inline void wrapSceneGraph(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {7262393731536988307, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
+LuaUserDataTypeInfo luaUserDataTypeInfoEvent = {4569210637627820318, "Event", LuaUserData::computeSizeForGarbageCollected<Event>(), nullptr, nullptr};
 
 template<>
 const LuaUserDataTypeInfo& LuaUserData::getDataTypeInfoFor<Event>()
@@ -4969,7 +4969,7 @@ static inline void wrapEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {5816769151368279229, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoLightEvent = {-5286067675171532061, "LightEvent", LuaUserData::computeSizeForGarbageCollected<LightEvent>(),
 													 nullptr, nullptr};
 
 template<>
@@ -5088,7 +5088,7 @@ static inline void wrapLightEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {-6019583226200593985, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
+LuaUserDataTypeInfo luaUserDataTypeInfoScriptEvent = {8130715654628414614, "ScriptEvent", LuaUserData::computeSizeForGarbageCollected<ScriptEvent>(),
 													  nullptr, nullptr};
 
 template<>
@@ -5104,7 +5104,7 @@ static inline void wrapScriptEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {-2923517370362474757, "JitterMoveEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoJitterMoveEvent = {-5033873042475895544, "JitterMoveEvent",
 														  LuaUserData::computeSizeForGarbageCollected<JitterMoveEvent>(), nullptr, nullptr};
 
 template<>
@@ -5179,7 +5179,7 @@ static inline void wrapJitterMoveEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-2689049813794196232, "AnimationEvent",
+LuaUserDataTypeInfo luaUserDataTypeInfoAnimationEvent = {-5400237786198614756, "AnimationEvent",
 														 LuaUserData::computeSizeForGarbageCollected<AnimationEvent>(), nullptr, nullptr};
 
 template<>
@@ -5195,7 +5195,7 @@ static inline void wrapAnimationEvent(lua_State* l)
 	lua_settop(l, 0);
 }
 
-LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {5747718790548721909, "EventManager",
+LuaUserDataTypeInfo luaUserDataTypeInfoEventManager = {-3399940732869818580, "EventManager",
 													   LuaUserData::computeSizeForGarbageCollected<EventManager>(), nullptr, nullptr};
 
 template<>

+ 15 - 15
AnKi/Script/Scene.xml

@@ -411,46 +411,46 @@ using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 				</method>
 
 				<method name="newComponent&lt;LightComponent&gt;" alias="newLightComponent">
-					<return>LightComponent*</return>
+					<return canBeNullptr="1">LightComponent*</return>
 				</method>
 				<method name="newComponent&lt;LensFlareComponent&gt;" alias="newLensFlareComponent">
-					<return>LensFlareComponent*</return>
+					<return canBeNullptr="1">LensFlareComponent*</return>
 				</method>
 				<method name="newComponent&lt;DecalComponent&gt;" alias="newDecalComponent">
-					<return>DecalComponent*</return>
+					<return canBeNullptr="1">DecalComponent*</return>
 				</method>
 				<method name="newComponent&lt;TriggerComponent&gt;" alias="newTriggerComponent">
-					<return>TriggerComponent*</return>
+					<return canBeNullptr="1">TriggerComponent*</return>
 				</method>
 				<method name="newComponent&lt;FogDensityComponent&gt;" alias="newFogDensityComponent">
-					<return>FogDensityComponent*</return>
+					<return canBeNullptr="1">FogDensityComponent*</return>
 				</method>
 				<method name="newComponent&lt;CameraComponent&gt;" alias="newCameraComponent">
-					<return>CameraComponent*</return>
+					<return canBeNullptr="1">CameraComponent*</return>
 				</method>
 				<method name="newComponent&lt;GlobalIlluminationProbeComponent&gt;" alias="newGlobalIlluminationProbeComponent">
-					<return>GlobalIlluminationProbeComponent*</return>
+					<return canBeNullptr="1">GlobalIlluminationProbeComponent*</return>
 				</method>
 				<method name="newComponent&lt;ReflectionProbeComponent&gt;" alias="newReflectionProbeComponent">
-					<return>ReflectionProbeComponent*</return>
+					<return canBeNullptr="1">ReflectionProbeComponent*</return>
 				</method>
 				<method name="newComponent&lt;BodyComponent&gt;" alias="newBodyComponent">
-					<return>BodyComponent*</return>
+					<return canBeNullptr="1">BodyComponent*</return>
 				</method>
 				<method name="newComponent&lt;ParticleEmitterComponent&gt;" alias="newParticleEmitterComponent">
-					<return>ParticleEmitterComponent*</return>
+					<return canBeNullptr="1">ParticleEmitterComponent*</return>
 				</method>
 				<method name="newComponent&lt;MeshComponent&gt;" alias="newMeshComponent">
-					<return>MeshComponent*</return>
+					<return canBeNullptr="1">MeshComponent*</return>
 				</method>
 				<method name="newComponent&lt;MaterialComponent&gt;" alias="newMaterialComponent">
-					<return>MaterialComponent*</return>
+					<return canBeNullptr="1">MaterialComponent*</return>
 				</method>
 				<method name="newComponent&lt;SkinComponent&gt;" alias="newSkinComponent">
-					<return>SkinComponent*</return>
+					<return canBeNullptr="1">SkinComponent*</return>
 				</method>
 				<method name="newComponent&lt;SkyboxComponent&gt;" alias="newSkyboxComponent">
-					<return>SkyboxComponent*</return>
+					<return canBeNullptr="1">SkyboxComponent*</return>
 				</method>
 
 				<method name="getFirstComponentOfType&lt;LightComponent&gt;" alias="getFirstLightComponent">
@@ -515,7 +515,7 @@ using WeakArraySceneNodePtr = WeakArray<SceneNode*>;
 					<args>
 						<arg>CString</arg>
 					</args>
-					<return>SceneNode*</return>
+					<return canBeNullptr="1">SceneNode*</return>
 				</method>
 			</methods>
 		</class>

+ 41 - 11
AnKi/ShaderCompiler/ShaderParser.cpp

@@ -182,21 +182,51 @@ Error ShaderParser::parsePragmaTechnique(const ShaderCompilerString* begin, cons
 
 		while(begin != end)
 		{
-			// Find mutator
-			U32 count = 0;
-			for(const Mutator& mutator : m_mutators)
+			if(*begin == "*")
 			{
-				if(mutator.m_name == *begin)
+				// Enable all mutators
+
+				activeMutators = kMaxU64;
+			}
+			else
+			{
+				CString mutatorName = *begin;
+				Bool exclude = false;
+				if(mutatorName.find("!") == 0)
 				{
-					activeMutators |= 1_U64 << U64(count);
-					break;
+					// Starts with !, exclude this mutator
+
+					if(mutatorName.getLength() < 2)
+					{
+						ANKI_PP_ERROR_MALFORMED_MSG("Found a ! alone");
+					}
+
+					mutatorName = &mutatorName[1];
+					exclude = true;
 				}
-				++count;
-			}
 
-			if(count == m_mutators.getSize())
-			{
-				ANKI_PP_ERROR_MALFORMED_MSG("Mutator not found");
+				U32 count = 0;
+				for(const Mutator& mutator : m_mutators)
+				{
+					if(mutator.m_name == mutatorName)
+					{
+						if(!exclude)
+						{
+							activeMutators |= 1_U64 << U64(count);
+						}
+						else
+						{
+							activeMutators &= ~(1_U64 << U64(count));
+						}
+						break;
+					}
+					++count;
+				}
+
+				if(count == m_mutators.getSize())
+				{
+					ANKI_PP_ERROR_MALFORMED_MSG("Mutator not found");
+				}
 			}
 
 			++begin;

+ 24 - 49
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -11,28 +11,27 @@
 #pragma anki mutator SPECULAR_TEX 0 1
 #pragma anki mutator ROUGHNESS_METALNESS_TEX 0 1
 #pragma anki mutator NORMAL_TEX 0 1
-#pragma anki mutator PARALLAX 0 1
 #pragma anki mutator EMISSIVE_TEX 0 1
 #pragma anki mutator ALPHA_TEST 0 1
 
 #pragma anki skip_mutation ALPHA_TEST 1 DIFFUSE_TEX 0
 
-#pragma anki technique GBufferLegacy vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferLegacy vert mutators ANKI_VELOCITY ANKI_BONES NORMAL_TEX
 #pragma anki technique GBufferLegacy pixel
 
-#pragma anki technique ShadowsLegacy vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsLegacy vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX ALPHA_TEST
 #pragma anki technique ShadowsLegacy pixel
 
-#pragma anki technique GBufferSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES NORMAL_TEX
 #pragma anki technique GBufferSwMeshletRendering pixel
 
-#pragma anki technique ShadowsSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsSwMeshletRendering vert mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX
 #pragma anki technique ShadowsSwMeshletRendering pixel
 
-#pragma anki technique GBufferMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX PARALLAX ALPHA_TEST
+#pragma anki technique GBufferMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX NORMAL_TEX ALPHA_TEST
 #pragma anki technique GBufferMeshShaders pixel
 
-#pragma anki technique ShadowsMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX PARALLAX ALPHA_TEST
+#pragma anki technique ShadowsMeshShaders mesh mutators ANKI_VELOCITY ANKI_BONES DIFFUSE_TEX ALPHA_TEST
 #pragma anki technique ShadowsMeshShaders pixel
 
 #pragma anki technique RtShadows ahit mutators ALPHA_TEST DIFFUSE_TEX
@@ -49,32 +48,20 @@
 #include <AnKi/Shaders/RtMaterialFetch.hlsl>
 
 // Define a few things to avoid compilation errors
-#if ANKI_TECHNIQUE_RtShadows && ANKI_CLOSEST_HIT_SHADER
+#if !defined(ALPHA_TEST)
 #	define ALPHA_TEST 0
-#	define DIFFUSE_TEX 0
-#	define ANKI_VELOCITY 0
-#	define ANKI_BONES 0
-#	define PARALLAX 0
 #endif
 
-#if ANKI_TECHNIQUE_RtShadows && ANKI_ANY_HIT_SHADER
-#	define ANKI_VELOCITY 0
-#	define ANKI_BONES 0
-#	define PARALLAX 0
+#if !defined(DIFFUSE_TEX)
+#	define DIFFUSE_TEX 0
 #endif
 
-#if ANKI_TECHNIQUE_RtMaterialFetch
+#if !defined(ANKI_VELOCITY)
 #	define ANKI_VELOCITY 0
-#	define ANKI_BONES 0
-#	define PARALLAX 0
 #endif
 
-#if ANKI_AMPLIFICATION_SHADER
-#	define ALPHA_TEST 0
-#	define DIFFUSE_TEX 0
-#	define ANKI_VELOCITY 0
+#if !defined(ANKI_BONES)
 #	define ANKI_BONES 0
-#	define PARALLAX 0
 #endif
 
 // General defines
@@ -82,12 +69,7 @@
 #define REALLY_ALPHA_TEST (ALPHA_TEST && DIFFUSE_TEX)
 #define UVS (GBUFFER || REALLY_ALPHA_TEST)
 #define REALLY_VELOCITY ((ANKI_VELOCITY || ANKI_BONES) && GBUFFER)
-#define REALLY_USING_PARALLAX (PARALLAX == 1 && GBUFFER && ALPHA_TEST == 0)
-#if GBUFFER
-#	define NORMAL_MAPPING (NORMAL_TEX == 1)
-#else
-#	define NORMAL_MAPPING 0
-#endif
+#define NORMAL_MAPPING (GBUFFER && NORMAL_TEX)
 #define SW_MESHLETS (ANKI_TECHNIQUE_GBufferSwMeshletRendering || ANKI_TECHNIQUE_ShadowsSwMeshletRendering)
 
 #define VISUALIZE_MESHLETS (0 && GBUFFER)
@@ -97,20 +79,18 @@
 
 #pragma anki struct AnKiLocalConstants
 
-#pragma anki member U32 m_diffuseTex
-#pragma anki member U32 m_normalTex
-#pragma anki member U32 m_roughnessMetalnessTex
-#pragma anki member U32 m_specularTex
-#pragma anki member U32 m_emissiveTex
-#pragma anki member U32 m_heightTex
-
-#pragma anki member Vec4 m_diffuseScale
-#pragma anki member F32 m_roughnessScale
-#pragma anki member F32 m_metalnessScale
-#pragma anki member Vec3 m_specularScale
-#pragma anki member Vec3 m_emissionScale
-#pragma anki member F32 m_heightmapScale
-#pragma anki member F32 m_subsurface
+#pragma anki member U32 m_diffuseTex 0
+#pragma anki member U32 m_normalTex 0
+#pragma anki member U32 m_roughnessMetalnessTex 0
+#pragma anki member U32 m_specularTex 0
+#pragma anki member U32 m_emissiveTex 0
+
+#pragma anki member Vec4 m_diffuseScale 1.0 1.0 1.0 1.0
+#pragma anki member F32 m_roughnessScale 1.0
+#pragma anki member F32 m_metalnessScale 1.0
+#pragma anki member Vec3 m_specularScale 1.0 1.0 1.0
+#pragma anki member Vec3 m_emissionScale 1.0 1.0 1.0
+#pragma anki member F32 m_subsurface 0.0
 
 #pragma anki struct_end
 
@@ -512,12 +492,7 @@ GBufferPixelOut main(
 
 	const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, constantsOffset);
 
-#		if REALLY_USING_PARALLAX
-	// TODO
-	const Vec2 uv = vertInput.m_uv;
-#		else
 	const Vec2 uv = vertInput.m_uv;
-#		endif
 	ANKI_MAYBE_UNUSED(uv);
 
 #		if DIFFUSE_TEX

BIN
Samples/PhysicsPlayground/Assets/MESH_grenade_818651700502e14b.ankimesh


+ 0 - 3
Samples/PhysicsPlayground/Assets/MTL_grenade_4346150e31bdb957.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/M61_model_M61_grenade_BaseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 1 - 1
Samples/PhysicsPlayground/Assets/Scene.lua

@@ -1,4 +1,4 @@
--- Generated by: /home/godlike/src/anki/build_rel/Binaries/GltfImporter PhysicsPlayground.gltf /home/godlike/src/anki/Samples/PhysicsPlayground/Assets/ -rpath Assets -texrpath Assets -v -light-scale 0.00116 -import-textures 0
+-- Generated by: C:\src\anki\build_rel_vk\Binaries\GltfImporter.exe PhysicsPlayground.gltf C:/src/anki/Samples/PhysicsPlayground/Assets/ -rpath Assets -texrpath Assets -v -light-scale 0.00116 -import-textures 0
 local scene = getSceneGraph()
 local events = getEventManager()
 

+ 0 - 3
Samples/PhysicsPlayground/Assets/arms_3a4232ebbd425e7a.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/armColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/armNormal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/PhysicsPlayground/Assets/boomstick_89a614a521ace7fd.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/boomstickColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/boomstickNormal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/PhysicsPlayground/Assets/dynamic_f238b379a41079ff.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseScale" value="0.097887 0.273263 0.800000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
 		<input name="m_roughnessScale" value="0.000000"/>
@@ -22,6 +20,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/PhysicsPlayground/Assets/walls.001_2469a4d42c8d129c.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/Stone_Wall_007_COLOR_png.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Stone_Wall_007_NORM_png.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/PhysicsPlayground/Assets/walls_9619132fa258d22d.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/Asphalt_004_COLOR_png.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Asphalt_004_NRM_png.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/ChainMail_e54428975578d25.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/ChainMail_baseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/ChainMail_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/Leather_d5d86863309c9f2b.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/Leather_baseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Leather_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/MTL_Candle_33551c344b101f46.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseScale" value="0.799103 0.485215 0.282108 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
 		<input name="m_roughnessScale" value="0.600000"/>
@@ -22,6 +20,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/MTL_Flame_35971c3f216651ba.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseScale" value="1.000000 0.602239 0.378572 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
 		<input name="m_roughnessScale" value="1.000000"/>
@@ -22,6 +20,5 @@
 		
 		<input name="m_emissionScale" value="20.000000 17.277977 17.396593"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/MTL_monkey_381dce880f246211.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/test.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -23,6 +21,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/Metal_74980e5c889a1a43.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/Metal_baseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Metal_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

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

@@ -1,4 +1,4 @@
--- Generated by: C:\src\anki\out\build\x64-Release-VK\Binaries\GltfImporter.exe sponza_crytek_7_pbr_3.0.gltf C:/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.0001839 -import-textures 1 -v
+-- Generated by: C:\src\anki\build_rel_vk\Binaries\GltfImporter.exe sponza_crytek_7_pbr_3.0.gltf C:/src/anki/Samples/Sponza/Assets/ -rpath Assets -texrpath Assets -lod-count 2 -light-scale 0.0001839 -import-textures 0 -v
 local scene = getSceneGraph()
 local events = getEventManager()
 
@@ -3249,5 +3249,332 @@ trf:setRotation(rot)
 trf:setScale(Vec3.new(0.664928, 1.646613, 0.265592))
 node:setLocalTransform(trf)
 
+node = scene:tryFindSceneNode("mixamorig:RightArm")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightArm", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandRing2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandRing2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandRing4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandRing4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandThumb2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandThumb2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightUpLeg")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightUpLeg", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandThumb1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandThumb1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightLeg")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightLeg", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightShoulder")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightShoulder", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftFoot")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftFoot", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandIndex1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandIndex1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandPinky1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandPinky1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandIndex2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandIndex2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandRing4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandRing4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandPinky4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandPinky4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandThumb3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandThumb3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandIndex3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandIndex3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandRing1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandRing1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Head")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Head", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightForeArm")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightForeArm", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHand")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHand", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandIndex4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandIndex4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandMiddle2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandMiddle2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandRing3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandRing3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightToe_End")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightToe_End", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandPinky2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandPinky2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandMiddle4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandMiddle4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Spine1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Spine1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandPinky3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandPinky3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandThumb3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandThumb3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandPinky2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandPinky2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightFoot")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightFoot", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandMiddle1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandMiddle1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Neck")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Neck", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftShoulder")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftShoulder", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandThumb1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandThumb1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandRing3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandRing3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Spine")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Spine", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandRing2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandRing2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandMiddle4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandMiddle4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandThumb2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandThumb2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftForeArm")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftForeArm", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandIndex4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandIndex4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandPinky3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandPinky3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightToeBase")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightToeBase", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandThumb4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandThumb4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftArm")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftArm", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:HeadTop_End")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:HeadTop_End", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandMiddle2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandMiddle2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandThumb4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandThumb4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandIndex3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandIndex3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandRing1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandRing1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftToe_End")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftToe_End", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandIndex1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandIndex1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandPinky4")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandPinky4", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftToeBase")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftToeBase", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandMiddle3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandMiddle3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandPinky1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandPinky1", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Hips")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Hips", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftLeg")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftLeg", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandMiddle3")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandMiddle3", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHandIndex2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHandIndex2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:Spine2")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:Spine2", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:RightHand")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:RightHand", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftUpLeg")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftUpLeg", node)
+end
+
+node = scene:tryFindSceneNode("mixamorig:LeftHandMiddle1")
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/Armature|mixamo.com|Layer0_2ff0b9b4a30af3d0.ankianim", "mixamorig:LeftHandMiddle1", node)
+end
+
 node = scene:tryFindSceneNode("Suzanne")
-getEventManager():newAnimationEvent("Assets/SuzanneAction_a8e545711d9aeca3.ankianim", "Suzanne", node)
+if node ~= nil then
+	getEventManager():newAnimationEvent("Assets/SuzanneAction_a8e545711d9aeca3.ankianim", "Suzanne", node)
+end

+ 0 - 3
Samples/Sponza/Assets/arch.001_efebbb2a6f84fff0.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_arch_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_arch_ddn.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/arch_e0c8c7e29c806284.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_arch_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_arch_ddn.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/bricks_8bd6f24aa0ad3654.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_bricks_a_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_bricks_a_ddn.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/ceiling_3fd94cde277a48e1.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_ceiling_a_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/chain_33ef478b87fe7c15.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="0"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/chain_texture.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -23,6 +21,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/column_a_1e1bacae3460b88.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_column_a_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_column_a_ddn.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/column_b_c9391d56bff59fc3.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_column_b_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_column_b_ddn.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/column_c_43f866fc7b9f0169.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_column_c_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_column_c_ddn.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/details_4242afc5fc479920.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_details_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Details_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/fabric_a_945c29fc221550fb.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_fabric_blue_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/fabric_c_c8bf70dee411d1bd.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/fabric_d_8ff4aebb25bf20b0.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_fabric_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/fabric_e_d1c5a44841c48230.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_fabric_green_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/fabric_f_d54bbaca38ed4391.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_curtain_green_diff.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Curtain_Red_normal.ankitex.001.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/flagpole_6c7e0eb8dd33b39e.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_flagpole_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_FlagPole_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/floor_71cbd2644e53ab8c.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_floor_a_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Floor_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/leaf_3a245efd17475037.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="1"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_thorn_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/sponza_thorn_ddn.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.100000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/lion_c45d3035db3bc17b.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/lion.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/lion_ddn.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/lion_stand_ab5e3642131ad971.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/background.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/background_ddn.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/material_cf698120548b7e7c.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="0"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/material_baseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/roof_4359bd4e3b26845.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/sponza_roof_diff.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/Sponza_Roof_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/skinFace_37e531adb0394fda.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/skinFace_baseColor.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/skinFace_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/vase_45c3983f6cc9c489.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/vase_dif.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/vase_ddn.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/vase_fl_580cea687de3d758.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="1"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/vase_plant.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/VasePlant_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.250000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/vase_hanging_c2d2b40b27cacd7d.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/vase_hanging.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/VaseHanging_normal.ankitex.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>

+ 0 - 3
Samples/Sponza/Assets/vase_round_71af81a1ac0a7c3e.ankimtl

@@ -7,14 +7,12 @@
 			<mutator name="SPECULAR_TEX" value="0"/>
 			<mutator name="ROUGHNESS_METALNESS_TEX" value="1"/>
 			<mutator name="NORMAL_TEX" value="1"/>
-			<mutator name="PARALLAX" value="0"/>
 			<mutator name="EMISSIVE_TEX" value="0"/>
 			<mutator name="ALPHA_TEST" value="0"/>
 		</mutation>
 	</shaderProgram>
 
 	<inputs>
-		
 		<input name="m_diffuseTex" value="Assets/vase_round.ankitex.ankitex"/>
 		<input name="m_diffuseScale" value="1.000000 1.000000 1.000000 1.000000"/>
 		<input name="m_specularScale" value="0.040000 0.040000 0.040000"/>
@@ -24,6 +22,5 @@
 		<input name="m_normalTex" value="Assets/VaseRound_normal.ankitex"/>
 		<input name="m_emissionScale" value="0.000000 0.000000 0.000000"/>
 		<input name="m_subsurface" value="0.000000"/>
-		
 	</inputs>
 </material>