From 8c01dbfd5b178a529c2df5c9f9a34b64b9fca731 Mon Sep 17 00:00:00 2001
From: D-AIRY <admin@ds-servers.com>
Date: Tue, 21 Apr 2020 23:40:30 +0300
Subject: [PATCH] Shader switches counter; Terrain shader (beta); Some
 improvements

---
 build/engine/shaders/default/terrain.ps       | 131 +++++++++++++++++
 .../engine/shaders/lighting/lighting_blend.ps |   6 +-
 build/engine/shaders/ppgensm/ppgensm_pssm.ps  |   3 +-
 build/engine/shaders/sky/sky_box.ps           |   6 +-
 sdks/graphix                                  |   2 +-
 source/game/GameData.cpp                      |   2 +
 source/render/RenderPipeline.cpp              | 135 +++++++++++++++++-
 7 files changed, 276 insertions(+), 9 deletions(-)
 create mode 100644 build/engine/shaders/default/terrain.ps

diff --git a/build/engine/shaders/default/terrain.ps b/build/engine/shaders/default/terrain.ps
new file mode 100644
index 000000000..9a3f57755
--- /dev/null
+++ b/build/engine/shaders/default/terrain.ps
@@ -0,0 +1,131 @@
+#ifdef COMPILE_MainGBuffer
+XMaterial MainGBuffer(PSI_XMaterial IN)
+{
+	XMaterial OUT = XMATERIAL_LOAD_DEFAULTS();
+	
+	float2 vDetailUV = IN.vTexUV * g_xMaterialConstants.terrain_detail_scale;
+	float2 vBaseUV = IN.vTexUV * g_xMaterialConstants.terrain_base_scale;
+	float2 vMaskUV = IN.vTexUV * g_xMaterialConstants.terrain_mask_scale;
+	
+	float4 vMask = g_txMask.Sample(g_sScene, vMaskUV);
+	
+	float4 vBaseColor = g_txBase.Sample(g_sScene, vBaseUV);
+	
+	float4 vColor = g_txDetail0.Sample(g_sScene, vDetailUV) * vMask.x;
+	vColor += g_txDetail1.Sample(g_sScene, vDetailUV) * vMask.y;
+	vColor += g_txDetail2.Sample(g_sScene, vDetailUV) * vMask.z;
+	vColor += g_txDetail3.Sample(g_sScene, vDetailUV) * vMask.w;
+
+
+	float4 vParams = (float4)0;	
+#ifdef HAS_PARAMMAP_0
+	vParams += g_txParameters0.Sample(g_sScene, vDetailUV) * vMask.x;
+#else
+	vParams += float4(g_xMaterialConstants.pbr_roughness_0, g_xMaterialConstants.pbr_metallic_0, g_xMaterialConstants.pbr_thickness_0, g_xMaterialConstants.pbr_ao_0) * vMask.x;
+#endif
+	
+#ifdef HAS_PARAMMAP_1
+	vParams += g_txParameters1.Sample(g_sScene, vDetailUV) * vMask.y;
+#else
+	vParams += float4(g_xMaterialConstants.pbr_roughness_1, g_xMaterialConstants.pbr_metallic_1, g_xMaterialConstants.pbr_thickness_1, g_xMaterialConstants.pbr_ao_1) * vMask.y;
+#endif
+	
+#ifdef HAS_PARAMMAP_2
+	vParams += g_txParameters2.Sample(g_sScene, vDetailUV) * vMask.z;
+#else
+	vParams += float4(g_xMaterialConstants.pbr_roughness_2, g_xMaterialConstants.pbr_metallic_2, g_xMaterialConstants.pbr_thickness_2, g_xMaterialConstants.pbr_ao_2) * vMask.z;
+#endif
+		
+#ifdef HAS_PARAMMAP_3
+	vParams += g_txParameters3.Sample(g_sScene, vDetailUV) * vMask.w;
+#else
+	vParams += float4(g_xMaterialConstants.pbr_roughness_3, g_xMaterialConstants.pbr_metallic_3, g_xMaterialConstants.pbr_thickness_3, g_xMaterialConstants.pbr_ao_3) * vMask.w;
+#endif
+	
+	
+	
+	float3 vNormal = (float3)0;
+#ifdef HAS_NORMALMAP_0
+	vNormal += Color2Normal(g_txNormals0.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_0 * vMask.x;
+#endif
+
+#ifdef HAS_NORMALMAP_1
+	vNormal += Color2Normal(g_txNormals1.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_1 * vMask.y;
+#endif
+
+#ifdef HAS_NORMALMAP_2
+	vNormal += Color2Normal(g_txNormals2.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_2 * vMask.z;
+#endif
+	
+#ifdef HAS_NORMALMAP_3
+	vNormal += Color2Normal(g_txNormals3.Sample(g_sScene, vDetailUV).xyz) * g_xMaterialConstants.nm_weight_3 * vMask.w;
+#endif
+	
+	// float fMixFactor = min(1.0f, length(vMask));
+	float fMixFactor = min(1.0f, vMask.x + vMask.y + vMask.z + vMask.w);
+		
+	OUT.vBaseColor = lerp(vBaseColor.xyz, vColor.xyz, fMixFactor);
+
+#ifdef HAS_PARAMMAP
+	float4 vBaseParams = g_txParameters.Sample(g_sScene, vBaseUV) * vMask.x;
+#else
+	float4 vBaseParams = float4(g_xMaterialConstants.pbr_roughness, g_xMaterialConstants.pbr_metallic, g_xMaterialConstants.pbr_thickness, g_xMaterialConstants.pbr_ao);
+#endif
+	
+	vParams = lerp(vBaseParams, vParams, fMixFactor);
+	
+	OUT.fRoughness = vParams.x;
+	OUT.fMetallic = vParams.y;
+	OUT.fThickness = vParams.z;
+	OUT.fAO = vParams.w;
+	
+	OUT.vNormal = MixNormalMicro(IN.vNormal, vNormal);
+	
+	OUT.f0 = 0.004;
+	
+	return(OUT);
+}
+#endif
+
+#ifdef COMPILE_MainShadow
+XMaterial MainShadow(PSI_XMaterial IN)
+{
+	XMaterial OUT = XMATERIAL_LOAD_DEFAULTS();
+	
+	float2 vDetailUV = IN.vTexUV * g_xMaterialConstants.terrain_detail_scale;
+	float2 vBaseUV = IN.vTexUV * g_xMaterialConstants.terrain_base_scale;
+	float2 vMaskUV = IN.vTexUV * g_xMaterialConstants.terrain_mask_scale;
+	
+	float4 vBaseColor = g_txBase.Sample(g_sScene, vBaseUV);
+	
+	// float4 vMask = g_txMask.Sample(g_sScene, vMaskUV);
+	
+	
+	// float4 vColor = g_txDetail0.Sample(g_sScene, vDetailUV) * vMask.x;
+	// vColor += g_txDetail1.Sample(g_sScene, vDetailUV) * vMask.y;
+	// vColor += g_txDetail2.Sample(g_sScene, vDetailUV) * vMask.z;
+	// vColor += g_txDetail3.Sample(g_sScene, vDetailUV) * vMask.w;
+
+	
+	// OUT.vBaseColor = lerp(vBaseColor.xyz, vColor.xyz, min(1.0f, vMask.x + vMask.y + vMask.z + vMask.w));
+	OUT.vBaseColor = vBaseColor;
+	OUT.vNormal = IN.vNormal;
+	
+	return(OUT);
+}
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/engine/shaders/lighting/lighting_blend.ps b/build/engine/shaders/lighting/lighting_blend.ps
index 3996df695..bf183071e 100644
--- a/build/engine/shaders/lighting/lighting_blend.ps
+++ b/build/engine/shaders/lighting/lighting_blend.ps
@@ -101,11 +101,13 @@ float4 main(VSO_ResPos IN):COLOR0
 	float4 vNormals = g_txNormals.Sample(g_sPointClamp, IN.vTexUV);
 	float4 vParams = g_txParameters.Sample(g_sPointClamp, IN.vTexUV);
 	
+	float fF0 = vNormals.w;
+	
 	float4 vPosition = float4(g_vPosCam.xyz + IN.vWorldRay * fDepth, 1.0);
 	float3 vNormalPixel = normalize(NormalDecode(vNormals.xyz).xyz);
 	
-	vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float)1.0f, vAlbedo, vParams.y) * vAlbedo.w * 0.1f;
-	// vColor.rgb += /* (1.0f - vParams.x) * /GetReflection(vPosition.xyz, vNormalPixel) * lerp((float)1.0f, vAlbedo, vParams.y) * vAlbedo.w * 0.1f;
+	// vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float3)(0.1f * fF0), vAlbedo, vParams.y) * vAlbedo.w;
+	vColor.rgb += (1.0f - vParams.x) * GetReflection(vPosition.xyz, vNormalPixel) * lerp((float3)fF0, vAlbedo, vParams.y) * vAlbedo.w;
 	
 	
 	float fAdaptedLum = 0.2f;
diff --git a/build/engine/shaders/ppgensm/ppgensm_pssm.ps b/build/engine/shaders/ppgensm/ppgensm_pssm.ps
index f6d5ad9de..02fc59417 100644
--- a/build/engine/shaders/ppgensm/ppgensm_pssm.ps
+++ b/build/engine/shaders/ppgensm/ppgensm_pssm.ps
@@ -115,7 +115,8 @@ float4 main(VSO_ResPos IN): COLOR0
 				
 				// float constantBias = 0.000001f;
 				float fDoubledInversedViewWidth = g_mMatrixTextureV[split][0][0];
-				float constantBias = delta * 0.0007f/*  * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth;
+				// float constantBias = delta * 0.0007f/*  * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth;
+				float constantBias = delta * 0.007f/*  * pow(2, split) */ /* * pow(1.0 / fDoubledInversedViewWidth, 1.0f + (float)split) */ / fDoubledInversedViewWidth;
 				
 				
 				/** Compute Adaptive Epsilon **/
diff --git a/build/engine/shaders/sky/sky_box.ps b/build/engine/shaders/sky/sky_box.ps
index f0d4c324d..a1450118a 100644
--- a/build/engine/shaders/sky/sky_box.ps
+++ b/build/engine/shaders/sky/sky_box.ps
@@ -4,9 +4,9 @@ sky_box.ps
 Рендер SkyBox
 */
 
-#include "../struct.h"
-#include "../mtrl.h"
-#include "../const.h"
+#include <struct.h>
+#include <mtrl.h>
+#include <const.h>
 
 //##########################################################################
 
diff --git a/sdks/graphix b/sdks/graphix
index fd27b5863..f51cd7c4f 160000
--- a/sdks/graphix
+++ b/sdks/graphix
@@ -1 +1 @@
-Subproject commit fd27b586381e6272686558c5fc8376e93b913fef
+Subproject commit f51cd7c4f4192ef34d0f567cf742d73b34a447e8
diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp
index 21759e2f2..54a1292b7 100644
--- a/source/game/GameData.cpp
+++ b/source/game/GameData.cpp
@@ -1274,6 +1274,7 @@ void GameData::render()
 				L"Total memory: %uMB\n"
 				L"Used memory: %.3fMB; (T: %.3fMB; RT: %.3fMB; VB: %.3fMB, IB: %.3fMB, SC: %.3fKB)\n"
 				L"Uploaded bytes: %u; (T: %u; VB: %u, IB: %u, SC: %u)\n"
+				L"Shader switches: %u\n"
 				L"Count poly: %u\n"
 				L"Count DIP: %u\n"
 				, g_uFPS,
@@ -1294,6 +1295,7 @@ void GameData::render()
 				pFrameStats->uUploadedBuffersIndices,
 				pFrameStats->uUploadedBuffersShaderConst,
 
+				pFrameStats->uShaderSwitches,
 				pFrameStats->uPolyCount,
 				pFrameStats->uDIPcount
 				);
diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp
index 5aebe0cdd..414d05601 100644
--- a/source/render/RenderPipeline.cpp
+++ b/source/render/RenderPipeline.cpp
@@ -246,7 +246,7 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice):
 			// parameter name, define_if_supplied
 			XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"),
 			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"),
-				XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", 1.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f),
 			XMATERIAL_PARAM_GROUP_END(),
 			// parameter name, material parameter name, define_if_set
 			XMATERIAL_PARAM_FLAG("Use param texture", "has_parameter_texture", "HAS_PARAMMAP"),
@@ -272,6 +272,137 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice):
 		m_pMaterialSystem->registerMaterialShader("Default", pVertexFormatSceneGeneric, pPasses, pGenericProperties);
 	}
 
+	{
+		XMaterialShaderSampler pSamplers[] = {
+			{"sDefault", GXSamplerDesc()},
+			XMATERIAL_SHADER_SAMPLER_LIST_END()
+		};
+
+		XMaterialShaderPass pPasses[] = {
+			{m_pRenderPassGBuffer, "default/terrain.ps", "MainGBuffer", NULL, pSamplers, NULL},
+			{m_pRenderPassShadow, "default/terrain.ps", "MainShadow", NULL, NULL, NULL},
+			XMATERIAL_SHADER_PASS_LIST_END()
+		};
+
+		XMaterialProperty pGenericProperties[] = {
+			// parameter name, texture name
+			XMATERIAL_PARAM_TEXTURE("Base texture", "txBase"),
+
+			XMATERIAL_PARAM_TEXTURE("Mask texture", "txMask"),
+			XMATERIAL_PARAM_TEXTURE("Detail texture 0", "txDetail0"),
+			XMATERIAL_PARAM_TEXTURE("Detail texture 1", "txDetail1"),
+			XMATERIAL_PARAM_TEXTURE("Detail texture 2", "txDetail2"),
+			XMATERIAL_PARAM_TEXTURE("Detail texture 3", "txDetail3"),
+
+			XMATERIAL_PARAM_RANGE("Base scale", "terrain_base_scale", 0.0f, 100.0f, 2.0f),
+			XMATERIAL_PARAM_RANGE("Detail scale", "terrain_detail_scale", 0.0f, 100.0f, 10.0f),
+			XMATERIAL_PARAM_RANGE("Mask scale", "terrain_mask_scale", 0.0f, 100.0f, 1.0f),
+
+			//XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"),
+			//XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"),
+			//	XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f),
+			//XMATERIAL_PARAM_GROUP_END(),
+
+		//	XMATERIAL_PARAM_FLAG("Use param texture", "has_parameter_texture", "HAS_PARAMMAP"),
+		//	// group name (optional), condition (define)
+		//	XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP"),
+		//		XMATERIAL_PARAM_TEXTURE("Param texture", "txParameters"),
+		//	XMATERIAL_PARAM_GROUP_END(),
+		//	XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP"),
+				// name, min, max, material parameter name
+				XMATERIAL_PARAM_RANGE("Roughness", "pbr_roughness", 0.0f, 1.0f, 0.9f),
+				XMATERIAL_PARAM_RANGE("Metallic", "pbr_metallic", 0.0f, 1.0f, 0.0f),
+				XMATERIAL_PARAM_RANGE("Thickness", "pbr_thickness", 0.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("AO", "pbr_ao", 0.0f, 1.0f, 1.0f),
+		//	XMATERIAL_PARAM_GROUP_END(),
+
+
+			XMATERIAL_PARAM_TEXTURE_OPT("Normal map 0", "txNormals0", "HAS_NORMALMAP_0"),
+			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_0"),
+				XMATERIAL_PARAM_RANGE("Normalmap 0 weight", "nm_weight_0", -1.0f, 1.0f, 1.0f),
+			XMATERIAL_PARAM_GROUP_END(),
+
+			// parameter name, material parameter name, define_if_set
+		//	XMATERIAL_PARAM_FLAG("Use param texture 0", "has_parameter_texture_0", "HAS_PARAMMAP_0"),
+		//	// group name (optional), condition (define)
+		//	XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_0"),
+		//		XMATERIAL_PARAM_TEXTURE("Param texture 0", "txParameters0"),
+		//	XMATERIAL_PARAM_GROUP_END(),
+		//	XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_0"),
+				// name, min, max, material parameter name
+				XMATERIAL_PARAM_RANGE("Roughness 0", "pbr_roughness_0", 0.0f, 1.0f, 0.9f),
+				XMATERIAL_PARAM_RANGE("Metallic 0", "pbr_metallic_0", 0.0f, 1.0f, 0.0f),
+				XMATERIAL_PARAM_RANGE("Thickness 0", "pbr_thickness_0", 0.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("AO 0", "pbr_ao_0", 0.0f, 1.0f, 1.0f),
+		//	XMATERIAL_PARAM_GROUP_END(),
+
+
+			XMATERIAL_PARAM_TEXTURE_OPT("Normal map 1", "txNormals1", "HAS_NORMALMAP_1"),
+			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_1"),
+				XMATERIAL_PARAM_RANGE("Normalmap 1 weight", "nm_weight_1", -1.0f, 1.0f, 1.0f),
+			XMATERIAL_PARAM_GROUP_END(),
+
+			// parameter name, material parameter name, define_if_set
+		//	XMATERIAL_PARAM_FLAG("Use param texture 1", "has_parameter_texture_1", "HAS_PARAMMAP_1"),
+		//	// group name (optional), condition (define)
+		//	XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_1"),
+		//		XMATERIAL_PARAM_TEXTURE("Param texture 1", "txParameters1"),
+		//	XMATERIAL_PARAM_GROUP_END(),
+		//	XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_1"),
+				// name, min, max, material parameter name
+				XMATERIAL_PARAM_RANGE("Roughness 1", "pbr_roughness_1", 0.0f, 1.0f, 0.9f),
+				XMATERIAL_PARAM_RANGE("Metallic 1", "pbr_metallic_1", 0.0f, 1.0f, 0.0f),
+				XMATERIAL_PARAM_RANGE("Thickness 1", "pbr_thickness_1", 0.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("AO 1", "pbr_ao_1", 0.0f, 1.0f, 1.0f),
+		//	XMATERIAL_PARAM_GROUP_END(),
+
+
+
+			XMATERIAL_PARAM_TEXTURE_OPT("Normal map 2", "txNormals2", "HAS_NORMALMAP_2"),
+			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_2"),
+				XMATERIAL_PARAM_RANGE("Normalmap 2 weight", "nm_weight_2", -1.0f, 1.0f, 1.0f),
+			XMATERIAL_PARAM_GROUP_END(),
+			
+			// parameter name, material parameter name, define_if_set
+		//	XMATERIAL_PARAM_FLAG("Use param texture 2", "has_parameter_texture_2", "HAS_PARAMMAP_2"),
+		//	// group name (optional), condition (define)
+		//	XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_2"),
+		//		XMATERIAL_PARAM_TEXTURE("Param texture 2", "txParameters2"),
+		//	XMATERIAL_PARAM_GROUP_END(),
+		//	XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_2"),
+				// name, min, max, material parameter name
+				XMATERIAL_PARAM_RANGE("Roughness 2", "pbr_roughness_2", 0.0f, 1.0f, 0.9f),
+				XMATERIAL_PARAM_RANGE("Metallic 2", "pbr_metallic_2", 0.0f, 1.0f, 0.0f),
+				XMATERIAL_PARAM_RANGE("Thickness 2", "pbr_thickness_2", 0.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("AO 2", "pbr_ao_2", 0.0f, 1.0f, 1.0f),
+		//	XMATERIAL_PARAM_GROUP_END(),
+			
+
+			XMATERIAL_PARAM_TEXTURE_OPT("Normal map 3", "txNormals3", "HAS_NORMALMAP_3"),
+			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP_3"),
+				XMATERIAL_PARAM_RANGE("Normalmap 3 weight", "nm_weight_3", -1.0f, 1.0f, 1.0f),
+			XMATERIAL_PARAM_GROUP_END(),
+			
+			// parameter name, material parameter name, define_if_set
+		//	XMATERIAL_PARAM_FLAG("Use param texture 3", "has_parameter_texture_3", "HAS_PARAMMAP_3"),
+		//	// group name (optional), condition (define)
+		//	XMATERIAL_PARAM_GROUP(NULL, "HAS_PARAMMAP_3"),
+		//		XMATERIAL_PARAM_TEXTURE("Param texture 3", "txParameters3"),
+		//	XMATERIAL_PARAM_GROUP_END(),
+		//	XMATERIAL_PARAM_GROUP(NULL, "!HAS_PARAMMAP_3"),
+				// name, min, max, material parameter name
+				XMATERIAL_PARAM_RANGE("Roughness 3", "pbr_roughness_3", 0.0f, 1.0f, 0.9f),
+				XMATERIAL_PARAM_RANGE("Metallic 3", "pbr_metallic_3", 0.0f, 1.0f, 0.0f),
+				XMATERIAL_PARAM_RANGE("Thickness 3", "pbr_thickness_3", 0.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("AO 3", "pbr_ao_3", 0.0f, 1.0f, 1.0f),
+		//	XMATERIAL_PARAM_GROUP_END(),
+
+			XMATERIAL_PROPERTY_LIST_END()
+		};
+
+		m_pMaterialSystem->registerMaterialShader("Terrain", pVertexFormatSceneGeneric, pPasses, pGenericProperties);
+	}
+
 	{
 		GXMacro pMacro[] = {
 			{"WANT_WRITE_DEPTH", "1"},
@@ -309,7 +440,7 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice):
 			// parameter name, define_if_supplied
 			XMATERIAL_PARAM_TEXTURE_OPT("Normal map", "txNormals", "HAS_NORMALMAP"),
 			XMATERIAL_PARAM_GROUP(NULL, "HAS_NORMALMAP"),
-				XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", 1.0f, 1.0f, 1.0f),
+				XMATERIAL_PARAM_RANGE("Normalmap weight", "nm_weight", -1.0f, 1.0f, 1.0f),
 			XMATERIAL_PARAM_GROUP_END(),
 			// parameter name, material parameter name, define_if_set
 			XMATERIAL_PARAM_FLAG("Refraction", "refractive", "HAS_REFRACTION"),
-- 
GitLab