-- ********************
-- * Developper notes *
-- ********************
-- * 
-- * - Increment major version when changing the parameters structure, comment your new attributes 
-- *     to tell they have been added since version x. Backup the old script file to keep old file format.
-- * - Increment minor version when changing the code or UI
-- * - Manage new field initialisation when changing the parameters structure in the update method
-- * - In your changes, keep in mind the discreet note:
-- *     Parameter blocks that were per-instance cannot be made per-class and vice versa. 
-- *     Parameters cannot change type across redefinitions. 
-- *     Parameters cannot not move from one parameter block to another across redefinitions 
-- *
-- ********************

-- *** Some constant

-- Blend mode

BlendOne = 1
BlendZero = 2
BlendSrcAlpha = 3
BlendInvSrcAlpha = 4
BlendSrcRGB = 5
BlendInvSrcRGB = 6
BlendDestAlpha = 7
BlendInvDestAlpha = 8
BlendDestRGB = 9
BlendInvDestRGB = 10

-- Stage operator

OptorReplace = 1
OptorModulate = 2
OptorAdd = 3
OptorAddSigned = 4
OptorBlend = 5

-- Stage source

SrcBlendTexture = 1
SrcBlendPrevious = 2
SrcBlendDiffuse = 3
SrcBlendConstant = 4

Src0Texture = 1
Src0Previous = 2
Src0Diffuse = 3
Src0Constant = 4

Src1Previous = 1
Src1Diffuse = 2
Src1Constant = 3

-- Stage source operand

OprdRGB = 1
OprdInvRGB = 2
OprdAlpha = 3
OprdInvAlpha = 4

-- Stage operand

OprandSrcRGB = 1
OprandInvSrcRGB = 2
OprandSrcAlpha = 3
OprandInvSrcAlpha = 4

-- Texture Shader

TextureShaderDisable = 1

-- Normal Shader

ShaderSingleTexture = 1
ShaderAddTwoTextures = 2
ShaderMulTwoTextures = 3
ShaderBlendTwoTextures = 4
ShaderBlendMask = 5
ShaderMixTwoTextures = 6

-- Shader Type

ShaderNormal = 1
ShaderBump = 2
ShaderUserColor = 3
ShaderLightmap = 4
ShaderSpecular = 5
ShaderWater = 6

-- Nel Material properties
plugin material NelMaterial
    name:"NeL Material"
    classID:#(0x64c75fec, 0x222b9eb9)
    extends:standard 
	replaceUI:false 
	version:5.0
(
	local loadShader
	local globalUpdateUI
	local updateTextureName

	local updateToVersion4 = false

    parameters main rollout:NelParams
    (
		-- 3d part of the material
		bLightMap type:#boolean default:false
		bUnlighted type:#boolean default:false ui:cbUnlighted
		bStainedGlassWindow type:#boolean default:false ui:cbStainedGlassWindow

		bAlphaTest 		type:#boolean default:false ui:cbAlphaTest
		bForceZWrite 	type:#boolean default:false ui:cbForceZWrite
		bForceNoZWrite 	type:#boolean default:false ui:cbForceNoZWrite
		bWater         	type:#boolean default:false

		fBumpUScale     type:#float default: 0.01 ui:cfBumpUScale
		fBumpVScale     type:#float default: 0.01 ui:cfBumpVScale	
		fBumpUSpeed     type:#float default: 0.01 ui:cfBumpUSpeed
		fBumpVSpeed     type:#float default: 0.01 ui:cfBumpVSpeed

		fDisplaceMapUScale     type:#float default: 0.005 ui:cfDisplaceMapUScale
		fDisplaceMapVScale     type:#float default: 0.005 ui:cfDisplaceMapVScale	
		fDisplaceMapUSpeed     type:#float default: 0.005 ui:cfDisplaceMapUSpeed
		fDisplaceMapVSpeed     type:#float default: 0.005 ui:cfDisplaceMapVSpeed
		
		fWaterHeightFactor	   type:#float default: 1.0   ui:cfWaterHeightFactor
		iWaterPoolID		   type:#integer default: 0   ui:ciWaterPoolID
	
		-- New in version 3
		bColorVertex	type:#boolean default:false ui:cbColorVertex
		bAlphaVertex	type:#boolean default:false ui:cbAlphaVertex
		iAlphaVertexChannel		type:#integer default:0 ui:ciAlphaVertexChannel
	
		-- New in version 4
		bAlphaBlend		type:#boolean default:false ui:cbAlphaBlend
		iBlendSrcFunc	type:#integer default:1
		iBlendDestFunc	type:#integer default:1
		iShader			type:#integer default:1
		fZBias			type:#float default:0 ui:cfZBias
		iLightMapChannel type:#integer default:2 ui:ciLightMapChannel
		iShaderType		type:#integer default:1
		bUserColor		type:#boolean
		bSpecular		type:#boolean
		bNormalShader	type:#boolean
		cUserColor		type:#color default:[255,0,255] ui:cpUserColor
		
		-- New in version 5		
		bExportTextureMatrix    type:#boolean default:false	ui:cbExportTextureMatrix
	)

    parameters textures rollout:NelTexture
    (
		bEnableSlot_1			type:#boolean default:false ui:cbEnableSlot_1
		bEnableSlot_2			type:#boolean default:false ui:cbEnableSlot_2
		bEnableSlot_3			type:#boolean default:false ui:cbEnableSlot_3
		bEnableSlot_4			type:#boolean default:false ui:cbEnableSlot_4
		bEnableSlot_5			type:#boolean default:false ui:cbEnableSlot_5
		bEnableSlot_6			type:#boolean default:false ui:cbEnableSlot_6
		bEnableSlot_7			type:#boolean default:false ui:cbEnableSlot_7
		bEnableSlot_8			type:#boolean default:false ui:cbEnableSlot_8
		bTexGen_1				type:#boolean default:false ui:cbTexGen_1
		bTexGen_2				type:#boolean default:false ui:cbTexGen_2
		bTexGen_3				type:#boolean default:false ui:cbTexGen_3
		bTexGen_4				type:#boolean default:false ui:cbTexGen_4
		bTexGen_5				type:#boolean default:false ui:cbTexGen_5
		bTexGen_6				type:#boolean default:false ui:cbTexGen_6
		bTexGen_7				type:#boolean default:false ui:cbTexGen_7
		bTexGen_8				type:#boolean default:false ui:cbTexGen_8
		tTexture_1				type:#texturemap ui:mbTexture_1
		tTexture_2				type:#texturemap ui:mbTexture_2
		tTexture_3				type:#texturemap ui:mbTexture_3
		tTexture_4				type:#texturemap ui:mbTexture_4
		tTexture_5				type:#texturemap ui:mbTexture_5
		tTexture_6				type:#texturemap ui:mbTexture_6
		tTexture_7				type:#texturemap ui:mbTexture_7
		tTexture_8				type:#texturemap ui:mbTexture_8
	)

    parameters slot1 rollout:NelMultitextureSlot1
    (
		-- New in version 4
		cConstant_1				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_1			type:#integer default:1
		iRgbBlendSource_1		type:#integer default:1
		iRgbArg0_1				type:#integer default:1
		iRgbArg1_1				type:#integer default:1
		iRgbArg0Operand_1		type:#integer default:1
		iRgbArg1Operand_1		type:#integer default:1
		iAlphaOperation_1		type:#integer default:1
		iAlphaBlendSource_1		type:#integer default:1
		iAlphaArg0_1			type:#integer default:1
		iAlphaArg1_1			type:#integer default:1
		iAlphaArg0Operand_1		type:#integer default:3
		iAlphaArg1Operand_1		type:#integer default:3
		iTextureShader_1		type:#integer default:1
		iConstantAlpha_1		type:#integer default:255 ui:sdConstantAlpha
	)

    parameters slot2 rollout:NelMultitextureSlot2
    (
		-- New in version 4
		cConstant_2				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_2			type:#integer default:1
		iRgbBlendSource_2		type:#integer default:1
		iRgbArg0_2				type:#integer default:1
		iRgbArg1_2				type:#integer default:1
		iRgbArg0Operand_2		type:#integer default:1
		iRgbArg1Operand_2		type:#integer default:1
		iAlphaOperation_2		type:#integer default:1
		iAlphaBlendSource_2		type:#integer default:1
		iAlphaArg0_2			type:#integer default:1
		iAlphaArg1_2			type:#integer default:1
		iAlphaArg0Operand_2		type:#integer default:3
		iAlphaArg1Operand_2		type:#integer default:3
		iTextureShader_2		type:#integer default:1
		iConstantAlpha_2		type:#integer default:255 ui:sdConstantAlpha
	)

    parameters slot3 rollout:NelMultitextureSlot3
    (
		-- New in version 4
		cConstant_3				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_3			type:#integer default:1
		iRgbBlendSource_3		type:#integer default:1
		iRgbArg0_3				type:#integer default:1
		iRgbArg1_3				type:#integer default:1
		iRgbArg0Operand_3		type:#integer default:1
		iRgbArg1Operand_3		type:#integer default:1
		iAlphaOperation_3		type:#integer default:1
		iAlphaBlendSource_3		type:#integer default:1
		iAlphaArg0_3			type:#integer default:1
		iAlphaArg1_3			type:#integer default:1
		iAlphaArg0Operand_3		type:#integer default:3
		iAlphaArg1Operand_3		type:#integer default:3
		iTextureShader_3		type:#integer default:1
		iConstantAlpha_3		type:#integer default:255 ui:sdConstantAlpha
	)

    parameters slot4 rollout:NelMultitextureSlot4
    (
		-- New in version 4
		cConstant_4				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_4			type:#integer default:1
		iRgbBlendSource_4		type:#integer default:1
		iRgbArg0_4				type:#integer default:1
		iRgbArg1_4				type:#integer default:1
		iRgbArg0Operand_4		type:#integer default:1
		iRgbArg1Operand_4		type:#integer default:1
		iAlphaOperation_4		type:#integer default:1
		iAlphaBlendSource_4		type:#integer default:1
		iAlphaArg0_4			type:#integer default:1
		iAlphaArg1_4			type:#integer default:1
		iAlphaArg0Operand_4		type:#integer default:3
		iAlphaArg1Operand_4		type:#integer default:3
		iTextureShader_4		type:#integer default:1
		iConstantAlpha_4		type:#integer default:255 ui:sdConstantAlpha
	)

    parameters slot5 rollout:NelMultitextureSlot5
    (
		-- New in version 4
		cConstant_5				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_5			type:#integer default:1
		iRgbBlendSource_5		type:#integer default:1
		iRgbArg0_5				type:#integer default:1
		iRgbArg1_5				type:#integer default:1
		iRgbArg0Operand_5		type:#integer default:1
		iRgbArg1Operand_5		type:#integer default:1
		iAlphaOperation_5		type:#integer default:1
		iAlphaBlendSource_5		type:#integer default:1
		iAlphaArg0_5			type:#integer default:1
		iAlphaArg1_5			type:#integer default:1
		iAlphaArg0Operand_5		type:#integer default:3
		iAlphaArg1Operand_5		type:#integer default:3
		iTextureShader_5		type:#integer default:1
		iConstantAlpha_5		type:#integer default:255 ui:sdConstantAlpha
	)

    parameters slot6 rollout:NelMultitextureSlot6
    (
		-- New in version 4
		cConstant_6				type:#color default:[255,255,255] ui:cpConstant
		iRgbOperation_6			type:#integer default:1
		iRgbBlendSource_6		type:#integer default:1
		iRgbArg0_6				type:#integer default:1
		iRgbArg1_6				type:#integer default:1
		iRgbArg0Operand_6		type:#integer default:1
		iRgbArg1Operand_6		type:#integer default:1
		iAlphaOperation_6		type:#integer default:1
		iAlphaBlendSource_6		type:#integer default:1
		iAlphaArg0_6			type:#integer default:1
		iAlphaArg1_6			type:#integer default:1
		iAlphaArg0Operand_6		type:#integer default:3
		iAlphaArg1Operand_6		type:#integer default:3
		iTextureShader_6		type:#integer default:1
		iConstantAlpha_6		type:#integer default:255 ui:sdConstantAlpha
	)

    rollout NelParams "Nel Material" rolledUp:true
    (
		-- UI update timer
		timer pWatch interval:450
		local activeMaterial = undefined

		dropdownlist dlShaderType "Shaders Type" items:#( "Normal", "Disable", "UserColor", "LightMap", "Specular", "Water" )
		group "Light"
		(
			CheckBox cbUnlighted "Unlighted"
			Label lLightMapChannel "Lightmap Texture Channel" align:#left across:2
			Spinner   ciLightMapChannel ""  range:[0,99,0] type:#integer scale:1 align:#left width:50
			CheckBox cbStainedGlassWindow "Lightmap stained glass window"
			CheckBox cbColorVertex "Color Vertex"
		)
		group "Alpha"
		(
			CheckBox cbAlphaBlend "Alpha Blend"
			Button btSetBlend "Setup Blend" align:#left across:3
			Button btSetAdd "Setup Additive" align:#left
			Button btSetAlphaAdd "Setup Alpha Additive" align:#left
			dropdownlist dlBlendSrcFunc "Blend Source" items:#( "One", "Zero", "Source Alpha", "Inverse Source Alpha", "Source RGBA", "Inverse Source RGB", "Destination Alpha", "Inverse Destination Alpha", "Destination RGB", "Inverse Destination RGB" ) across:2
			dropdownlist dlBlendDestFunc "Blend Destination" items:#( "One", "Zero", "Source Alpha", "Inverse Source Alpha", "Source RGBA", "Inverse Source RGB", "Destination Alpha", "Inverse Destination Alpha", "Destination RGB", "Inverse Destination RGB" ) 
			CheckBox cbAlphaTest "Alpha Test"
			CheckBox cbAlphaVertex "Alpha Vertex"
			Label lAlphaVertexChanelLabel "Alpha Vertex Channel" align:#left across:2
			Spinner   ciAlphaVertexChannel ""  range:[0,99,0] type:#integer scale:1 align:#left width:50
		)
		group "Z buffer"
		(
			Label	cfZBiasLabel "ZBias :"  align:#left across:2
			Spinner	cfZBias "" range:[-100,100,0] type:#float scale:0.001 align:#left width:70
			CheckBox cbForceZWrite "Force ZWrite"
			CheckBox cbForceNoZWrite "Force No ZWrite"
		)
		group "Water"
		(
			Label	lbWaterPoolID "Water pool ID :"  align:#left across:2
			Spinner	ciWaterPoolID     "" range:[0,3,1] type:#integer align:#left width:70
			Label	 lbWaterHeightFactor "Water height factor :" align:#left across:2
			Spinner	cfWaterHeightFactor   "" range:[0,1000,1] type:#integer align:#left width:70

			
			Label	cfBumpUScaleLabel "BumpMap U Scale :"  align:#left across:2
			Spinner	cfBumpUScale      "" range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
			Label	cfBumpVScaleLabel "BumpMap V Scale :" align:#left across:2 
			Spinner	cfBumpVScale      "" range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
			Label	cfBumpUSpeedLabel "BumpMap U Speed :" align:#left across:2 
			Spinner	cfBumpUSpeed      "" range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
			Label	cfBumpVSpeedLabel "BumpMap V Speed :" align:#left across:2 
			Spinner	cfBumpVSpeed      "" range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
			
		
			Label	lbDisplaceMapUScale "DisplaceMap U Scale :" align:#left across:2
			Spinner   cfDisplaceMapUScale      ""  range:[-10,10,0.005] type:#float scale:0.001 align:#left width:70
			Label	lbDisplaceMapVScale "DisplaceMap V Scale :" align:#left across:2
			Spinner   cfDisplaceMapVScale      ""  range:[-10,10,0.005] type:#float scale:0.001 align:#left width:70
			Label	lbDisplaceMapUSpeed "DisplaceMap U Speed :" align:#left across:2
			Spinner   cfDisplaceMapUSpeed      ""  range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
			Label	lbDisplaceMapVSpeed "DisplaceMap V Speed :" align:#left across:2
			Spinner   cfDisplaceMapVSpeed      ""  range:[-10,10,0.01] type:#float scale:0.001 align:#left width:70
		)
		group "Extended"
		(
			dropdownlist dlVertexProgram "Vertex Program" items:#( "Disable" ) across:2
			ColorPicker cpUserColor "User Color" color:[255,0,0] align:#right height:40
			CheckBox cbExportTextureMatrix "Export texture matrix"
		)
		
		Fn updateUI update =
		(
			if (version >= 4) then
			(
				if update == true then
				(
					dlBlendSrcFunc.selection = iBlendSrcFunc
					dlBlendDestFunc.selection = iBlendDestFunc
					dlShaderType.selection = iShaderType
				)
				else
				(
					iBlendSrcFunc = dlBlendSrcFunc.selection
					iBlendDestFunc = dlBlendDestFunc.selection
					iShaderType = dlShaderType.selection
				)

				-- Setup boolean value
				bNormalShader = false
				bUserColor = false
				bLightmap = false
				bSpecular = false
				bWater = false
				if iShaderType == ShaderNormal then
					bNormalShader = true
				else if iShaderType == ShaderUserColor then
					bUserColor = true
				else if iShaderType == ShaderLightmap then
					bLightmap = true
				else if iShaderType == ShaderSpecular then
					bSpecular = true
				else if iShaderType == ShaderWater then
					bWater = true

				dlVertexProgram.enabled = (not bWater) and (not bLightmap)

				cbUnlighted.enabled = (not bWater) and (not bLightmap)
				lLightMapChannel.enabled = (not bWater) and bLightmap
				ciLightMapChannel.enabled = (not bWater) and bLightmap
				cbStainedGlassWindow.enabled = not bWater

				cbAlphaBlend.enabled = ((not bWater) and (not bLightmap)) and (not bAlphaTest)
				btSetBlend.enabled = ((not bWater) and (not bLightmap)) and bAlphaBlend and (not bAlphaTest)
				btSetAdd.enabled = ((not bWater) and (not bLightmap)) and bAlphaBlend and (not bAlphaTest)
				btSetAlphaAdd.enabled = ((not bWater) and (not bLightmap)) and bAlphaBlend and (not bAlphaTest)
				dlBlendSrcFunc.enabled = ((not bWater) and (not bLightmap)) and bAlphaBlend and (not bAlphaTest)
				dlBlendDestFunc.enabled = ((not bWater) and (not bLightmap)) and bAlphaBlend and (not bAlphaTest)
				cbAlphaTest.enabled = (not bWater) and (not bAlphaBlend)

				cbForceZWrite.enabled = (not bWater) and (not bLightmap) and bAlphaBlend
				cbForceNoZWrite.enabled = (not bWater) and (not bLightmap)  and (not bAlphaBlend)
				cbAlphaVertex.enabled = (not bWater) and (not bLightmap) and (not bLightMap)
				ciAlphaVertexChannel.enabled = (not bWater) and bAlphaVertex and (not bLightMap)
				cbColorVertex.enabled = not bWater
				
				cfBumpUScale.enabled = bWater and (not bLightMap)
				cfBumpVScale.enabled = bWater and (not bLightMap)
				cfBumpUSpeed.enabled = bWater and (not bLightMap)
				cfBumpVSpeed.enabled = bWater and (not bLightMap)
			
				cfDisplaceMapUScale.enabled = bWater and (not bLightMap)
				cfDisplaceMapVScale.enabled = bWater and (not bLightMap)
				cfDisplaceMapUSpeed.enabled = bWater and (not bLightMap)
				cfDisplaceMapVSpeed.enabled = bWater and (not bLightMap)				
				ciWaterPoolID.enabled = bWater and (not bLightMap)
				cfWaterHeightFactor.enabled = bWater and (not bLightMap)

				if (bWater == true) then
				(
					cbUnlighted.checked = false 
					cbStainedGlassWindow.checked = false
					cbAlphaTest.checked = false
					cbForceZWrite.checked = false
					cbForceNoZWrite.checked = false
				)			
			)
		)

		on NelParams reload do
		(
		)

		on NelParams open do 
		(
			updateUI true
		)

		on NelParams close do 
		(
		)

		-- Update ui

		on dlShaderType selected newState do
		(
			globalUpdateUI false
		)

		on cbUnlighted changed bNewState do
		(
			updateUI false
		)

		on cbAlphaBlend changed bNewState do
        (
			if bAlphaBlend == true then
				bAlphaTest = false
			updateUI false
        )

		on cbAlphaTest changed bNewState do
        (
			if bAlphaTest == true then
				bAlphaBlend = false
			updateUI false
        )

		on cbAlphaVertex changed bNewState do
        (
			updateUI false
        )

		on cbAlphaVertex changed bNewState do
        (
			updateUI false
        )

		on btSetBlend pressed do
		(
			dlBlendSrcFunc.selection = 3
			dlBlendDestFunc.selection = 4
			updateUI false
		)

		on btSetAdd pressed do
		(
			dlBlendSrcFunc.selection = 1
			dlBlendDestFunc.selection = 1
			updateUI false
		)

		on btSetAlphaAdd pressed do
		(
			dlBlendSrcFunc.selection = 3
			dlBlendDestFunc.selection = 1
			updateUI false
		)

		on pWatch tick do
		(
			if (activeMaterial != this) then
			(
				activeMaterial = this
				globalUpdateUI true
			)
		)
	)

    rollout NelTexture "Nel Textures" rolledUp:true
    (
		group "Textures"
		(
			CheckBox cbEnableSlot_1 "" width:110 align:#left across:2
			MapButton mbTexture_1 "" toolTips:"Select the texture 1" width:180 align:#right
			CheckBox cbEnableSlot_2 "Texture 2...................." width:110 align:#left across:2
			MapButton mbTexture_2 "" toolTips:"Select the texture 2" width:180 align:#right
			CheckBox cbEnableSlot_3 "Texture 3...................." width:110 align:#left across:2
			MapButton mbTexture_3 "" toolTips:"Select the texture 3" width:180 align:#right
			CheckBox cbEnableSlot_4 "Texture 4...................." width:110 align:#left across:2
			MapButton mbTexture_4 "" toolTips:"Select the texture 4" width:180 align:#right
			CheckBox cbEnableSlot_5 "Texture 5...................." width:110 align:#left across:2
			MapButton mbTexture_5 "" toolTips:"Select the texture 5" width:180 align:#right
			CheckBox cbEnableSlot_6 "Texture 6...................." width:110 align:#left across:2
			MapButton mbTexture_6 "" toolTips:"Select the texture 6" width:180 align:#right
			CheckBox cbEnableSlot_7 "Texture 7...................." width:110 align:#left across:2
			MapButton mbTexture_7 "" toolTips:"Select the texture 7" width:180 align:#right
			CheckBox cbEnableSlot_8 "Texture 8...................." width:110 align:#left across:2
			MapButton mbTexture_8 "" toolTips:"Select the texture 8" width:180 align:#right
		)
		group "Envmap"
		(
			CheckBox cbTexGen_1 "Texture 1 EnvMap" width:110 align:#left
			CheckBox cbTexGen_2 "Texture 2 EnvMap" width:110 align:#left
			CheckBox cbTexGen_3 "Texture 3 EnvMap" width:110 align:#left
			CheckBox cbTexGen_4 "Texture 4 EnvMap" width:110 align:#left
			CheckBox cbTexGen_5 "Texture 5 EnvMap" width:110 align:#left
			CheckBox cbTexGen_6 "Texture 6 EnvMap" width:110 align:#left
			CheckBox cbTexGen_7 "Texture 7 EnvMap" width:110 align:#left
			CheckBox cbTexGen_8 "Texture 8 EnvMap" width:110 align:#left
		)

		group "Setup Stage"
		(
			dropdownlist dlShader	"Normal Shader" items:#( "Single Texture (RGBA1) (A1)", "Addition Two Textures (RGB1+RGB2) (A2)", "Multiply Two Textures (RGB1*RGB2) (A2)", "Blend Two Textures (RGB1*(1-A1)+RGB2*A1) (A2)", "Blend Texture (RGB1)(A2)", "Mix Two Textures (RGB1*0.5+RGB2*0.5) (A1*0.5+A2*0.5)" ) 
			Button btLoadShader "Load Normal Shader" align:#left
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				cbEnableSlot_1.enabled = true
				cbEnableSlot_2.enabled = (not bLightmap)
				cbEnableSlot_3.enabled = (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbEnableSlot_4.enabled = (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbEnableSlot_5.enabled = (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbEnableSlot_6.enabled = (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbEnableSlot_7.enabled = (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbEnableSlot_8.enabled = (not bWater) and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)

				mbTexture_1.enabled = bEnableSlot_1
				mbTexture_2.enabled = bEnableSlot_2 and (not bLightmap) and (not bUserColor)
				mbTexture_3.enabled = bEnableSlot_3 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				mbTexture_4.enabled = bEnableSlot_4 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				mbTexture_5.enabled = bEnableSlot_5 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				mbTexture_6.enabled = bEnableSlot_6 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				mbTexture_7.enabled = bEnableSlot_7 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				mbTexture_8.enabled = bEnableSlot_8 and (not bWater) and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)

				cbTexGen_1.enabled = bNormalShader and bEnableSlot_1
				cbTexGen_2.enabled = bNormalShader and bEnableSlot_2 and (not bLightmap) and (not bUserColor)
				cbTexGen_3.enabled = bNormalShader and bEnableSlot_3 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbTexGen_4.enabled = bNormalShader and bEnableSlot_4 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbTexGen_5.enabled = bNormalShader and bEnableSlot_5 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbTexGen_6.enabled = bNormalShader and bEnableSlot_6 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbTexGen_7.enabled = bNormalShader and bEnableSlot_7 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)
				cbTexGen_8.enabled = bNormalShader and bEnableSlot_8 and (not bLightmap) and (not bSpecular) and (not bUserColor) and (not bNormalShader)

				btLoadShader.enabled = bNormalShader
				dlShader.enabled = bNormalShader

				if bWater == true then
				(
					cbEnableSlot_1.text = "EnvDay......................."
					cbEnableSlot_2.text = "EnvNight (opt)..............."
					cbEnableSlot_3.text = "EnvDayUnder (opt)............"
					cbEnableSlot_4.text = "EnvNightUnder (opt).........."
					cbEnableSlot_5.text = "Bump........................."
					cbEnableSlot_6.text = "Displace....................."
					cbEnableSlot_7.text = "ColorAlpha (opt)............."
					cbEnableSlot_8.text = "Unused......................."
				)
				else
				(
					if bLightmap == true then
					(
						cbEnableSlot_1.text = "Diffuse......................"
						cbEnableSlot_2.text = "Unused......................."
						cbEnableSlot_3.text = "Unused......................."
						cbEnableSlot_4.text = "Unused......................."
						cbEnableSlot_5.text = "Unused......................."
						cbEnableSlot_6.text = "Unused......................."
						cbEnableSlot_7.text = "Unused......................."
						cbEnableSlot_8.text = "Unused......................."
					)
					else
					(
						if bUserColor == true then
						(
							cbEnableSlot_1.text = "Diffuse......................"
							cbEnableSlot_2.text = "UsercolorMask................"
							cbEnableSlot_3.text = "Unused......................."
							cbEnableSlot_4.text = "Unused......................."
							cbEnableSlot_5.text = "Unused......................."
							cbEnableSlot_6.text = "Unused......................."
							cbEnableSlot_7.text = "Unused......................."
							cbEnableSlot_8.text = "Unused......................."
						)
						else
						(
							if bSpecular == true then
							(
								cbEnableSlot_1.text = "Diffuse......................"
								cbEnableSlot_2.text = "SpecularMap.................."
								cbEnableSlot_3.text = "Unused......................."
								cbEnableSlot_4.text = "Unused......................."
								cbEnableSlot_5.text = "Unused......................."
								cbEnableSlot_6.text = "Unused......................."
								cbEnableSlot_7.text = "Unused......................."
								cbEnableSlot_8.text = "Unused......................."
							)
							else
							(
								cbEnableSlot_1.text = "Texture 1...................."
								cbEnableSlot_2.text = "Texture 2...................."
								cbEnableSlot_3.text = "Texture 3...................."
								cbEnableSlot_4.text = "Texture 4...................."
								cbEnableSlot_5.text = "Texture 5...................."
								cbEnableSlot_6.text = "Texture 6...................."
								cbEnableSlot_7.text = "Texture 7...................."
								cbEnableSlot_8.text = "Texture 8...................."
							)
						)
					)
				)

				if (update == true) then
				(
					dlShader.selection = iShader
				)
				else
				(
					iShader = dlShader.selection
				)

				-- Update texture name
				updateTextureName ()
			)
		)

		on NelTexture open do
		(
			updateUI false
		)

		on NelTexture close do 
		(
		)

		on cbEnableSlot_1 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_2 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_3 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_4 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_5 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_6 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_7 changed newState do
		(
			globalUpdateUI false
		)

		on cbEnableSlot_8 changed newState do
		(
			globalUpdateUI false
		)

		on dlShader selected newState do
		(
			updateUI false
		)

		on btLoadShader pressed do
		(
			loadShader dlShader.selection
		)
	)

    rollout NelMultitextureSlot1 "Nel Slot 1" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_1
					dlRgbBlendSource.selection = iRgbBlendSource_1
					dlRgbArg0.selection = iRgbArg0_1
					dlRgbArg1.selection = iRgbArg1_1
					dlRgbArg0Operand.selection = iRgbArg0Operand_1
					dlRgbArg1Operand.selection = iRgbArg1Operand_1
					dlAlphaOperation.selection = iAlphaOperation_1
					dlAlphaBlendSource.selection = iAlphaBlendSource_1
					dlAlphaArg0.selection = iAlphaArg0_1 
					dlAlphaArg1.selection = iAlphaArg1_1 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_1
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_1
					dlTextureShader.selection = iTextureShader_1 
				)
				else
				(
					iRgbOperation_1 = dlRgbOperation.selection
					iRgbBlendSource_1 = dlRgbBlendSource.selection
					iRgbArg0_1 = dlRgbArg0.selection
					iRgbArg1_1 = dlRgbArg1.selection
					iRgbArg0Operand_1 = dlRgbArg0Operand.selection
					iRgbArg1Operand_1 = dlRgbArg1Operand.selection
					iAlphaOperation_1 = dlAlphaOperation.selection
					iAlphaBlendSource_1 = dlAlphaBlendSource.selection
					iAlphaArg0_1 = dlAlphaArg0.selection
					iAlphaArg1_1 = dlAlphaArg1.selection
					iAlphaArg0Operand_1 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_1 = dlAlphaArg1Operand.selection
					iTextureShader_1 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_1 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_1 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_1 == true) and (iRgbOperation_1 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_1 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_1 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_1 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_1 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_1 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_1 == true) and (iAlphaBlendSource_1 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_1 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_1 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_1 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_1 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_1 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_1 and bNormalShader
			)
		)

		on NelMultitextureSlot1 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)
    
	rollout NelMultitextureSlot2 "Nel Slot 2" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_2
					dlRgbBlendSource.selection = iRgbBlendSource_2
					dlRgbArg0.selection = iRgbArg0_2
					dlRgbArg1.selection = iRgbArg1_2
					dlRgbArg0Operand.selection = iRgbArg0Operand_2
					dlRgbArg1Operand.selection = iRgbArg1Operand_2
					dlAlphaOperation.selection = iAlphaOperation_2
					dlAlphaBlendSource.selection = iAlphaBlendSource_2
					dlAlphaArg0.selection = iAlphaArg0_2 
					dlAlphaArg1.selection = iAlphaArg1_2 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_2
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_2
					dlTextureShader.selection = iTextureShader_2 
				)
				else
				(
					iRgbOperation_2 = dlRgbOperation.selection
					iRgbBlendSource_2 = dlRgbBlendSource.selection
					iRgbArg0_2 = dlRgbArg0.selection
					iRgbArg1_2 = dlRgbArg1.selection
					iRgbArg0Operand_2 = dlRgbArg0Operand.selection
					iRgbArg1Operand_2 = dlRgbArg1Operand.selection
					iAlphaOperation_2 = dlAlphaOperation.selection
					iAlphaBlendSource_2 = dlAlphaBlendSource.selection
					iAlphaArg0_2 = dlAlphaArg0.selection
					iAlphaArg1_2 = dlAlphaArg1.selection
					iAlphaArg0Operand_2 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_2 = dlAlphaArg1Operand.selection
					iTextureShader_2 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_2 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_2 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_2 == true) and (iRgbOperation_2 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_2 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_2 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_2 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_2 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_2 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_2 == true) and (iAlphaBlendSource_2 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_2 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_2 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_2 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_2 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_2 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_2 and bNormalShader
			)
		)

		on NelMultitextureSlot2 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)
    
	rollout NelMultitextureSlot3 "Nel Slot 3" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_3
					dlRgbBlendSource.selection = iRgbBlendSource_3
					dlRgbArg0.selection = iRgbArg0_3
					dlRgbArg1.selection = iRgbArg1_3
					dlRgbArg0Operand.selection = iRgbArg0Operand_3
					dlRgbArg1Operand.selection = iRgbArg1Operand_3
					dlAlphaOperation.selection = iAlphaOperation_3
					dlAlphaBlendSource.selection = iAlphaBlendSource_3
					dlAlphaArg0.selection = iAlphaArg0_3 
					dlAlphaArg1.selection = iAlphaArg1_3 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_3
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_3
					dlTextureShader.selection = iTextureShader_3 
				)
				else
				(
					iRgbOperation_3 = dlRgbOperation.selection
					iRgbBlendSource_3 = dlRgbBlendSource.selection
					iRgbArg0_3 = dlRgbArg0.selection
					iRgbArg1_3 = dlRgbArg1.selection
					iRgbArg0Operand_3 = dlRgbArg0Operand.selection
					iRgbArg1Operand_3 = dlRgbArg1Operand.selection
					iAlphaOperation_3 = dlAlphaOperation.selection
					iAlphaBlendSource_3 = dlAlphaBlendSource.selection
					iAlphaArg0_3 = dlAlphaArg0.selection
					iAlphaArg1_3 = dlAlphaArg1.selection
					iAlphaArg0Operand_3 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_3 = dlAlphaArg1Operand.selection
					iTextureShader_3 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_3 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_3 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_3 == true) and (iRgbOperation_3 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_3 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_3 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_3 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_3 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_3 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_3 == true) and (iAlphaBlendSource_3 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_3 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_3 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_3 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_3 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_3 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_3 and bNormalShader
			)
		)

		on NelMultitextureSlot3 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)
    
	rollout NelMultitextureSlot4 "Nel Slot 4" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_4
					dlRgbBlendSource.selection = iRgbBlendSource_4
					dlRgbArg0.selection = iRgbArg0_4
					dlRgbArg1.selection = iRgbArg1_4
					dlRgbArg0Operand.selection = iRgbArg0Operand_4
					dlRgbArg1Operand.selection = iRgbArg1Operand_4
					dlAlphaOperation.selection = iAlphaOperation_4
					dlAlphaBlendSource.selection = iAlphaBlendSource_4
					dlAlphaArg0.selection = iAlphaArg0_4 
					dlAlphaArg1.selection = iAlphaArg1_4 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_4
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_4
					dlTextureShader.selection = iTextureShader_4 
				)
				else
				(
					iRgbOperation_4 = dlRgbOperation.selection
					iRgbBlendSource_4 = dlRgbBlendSource.selection
					iRgbArg0_4 = dlRgbArg0.selection
					iRgbArg1_4 = dlRgbArg1.selection
					iRgbArg0Operand_4 = dlRgbArg0Operand.selection
					iRgbArg1Operand_4 = dlRgbArg1Operand.selection
					iAlphaOperation_4 = dlAlphaOperation.selection
					iAlphaBlendSource_4 = dlAlphaBlendSource.selection
					iAlphaArg0_4 = dlAlphaArg0.selection
					iAlphaArg1_4 = dlAlphaArg1.selection
					iAlphaArg0Operand_4 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_4 = dlAlphaArg1Operand.selection
					iTextureShader_4 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_4 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_4 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_4 == true) and (iRgbOperation_4 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_4 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_4 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_4 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_4 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_4 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_4 == true) and (iAlphaBlendSource_4 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_4 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_4 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_4 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_4 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_4 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_4 and bNormalShader
			)
		)

		on NelMultitextureSlot4 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)
    
	rollout NelMultitextureSlot5 "Nel Slot 5" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_5
					dlRgbBlendSource.selection = iRgbBlendSource_5
					dlRgbArg0.selection = iRgbArg0_5
					dlRgbArg1.selection = iRgbArg1_5
					dlRgbArg0Operand.selection = iRgbArg0Operand_5
					dlRgbArg1Operand.selection = iRgbArg1Operand_5
					dlAlphaOperation.selection = iAlphaOperation_5
					dlAlphaBlendSource.selection = iAlphaBlendSource_5
					dlAlphaArg0.selection = iAlphaArg0_5 
					dlAlphaArg1.selection = iAlphaArg1_5 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_5
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_5
					dlTextureShader.selection = iTextureShader_5 
				)
				else
				(
					iRgbOperation_5 = dlRgbOperation.selection
					iRgbBlendSource_5 = dlRgbBlendSource.selection
					iRgbArg0_5 = dlRgbArg0.selection
					iRgbArg1_5 = dlRgbArg1.selection
					iRgbArg0Operand_5 = dlRgbArg0Operand.selection
					iRgbArg1Operand_5 = dlRgbArg1Operand.selection
					iAlphaOperation_5 = dlAlphaOperation.selection
					iAlphaBlendSource_5 = dlAlphaBlendSource.selection
					iAlphaArg0_5 = dlAlphaArg0.selection
					iAlphaArg1_5 = dlAlphaArg1.selection
					iAlphaArg0Operand_5 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_5 = dlAlphaArg1Operand.selection
					iTextureShader_5 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_5 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_5 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_5 == true) and (iRgbOperation_5 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_5 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_5 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_5 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_5 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_5 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_5 == true) and (iAlphaBlendSource_5 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_5 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_5 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_5 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_5 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_5 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_5 and bNormalShader
			)
		)

		on NelMultitextureSlot5 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)
    
	rollout NelMultitextureSlot6 "Nel Slot 6" rolledUp:true
    (
		group "RGB"
		(
			dropdownlist dlRgbOperation		"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlRgbBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg0			"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlRgbArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlRgbArg1			"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlRgbArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Alpha"
		(
			dropdownlist dlAlphaOperation	"Operation" items:#( "Arg0", "Arg0*Arg1", "Arg0+Arg1", "Arg0+Arg1-0.5", "Alpha Blend" ) across:2
			dropdownlist dlAlphaBlendSource	"Blend Source" items:#( "Texture", "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg0		"Arg0" items:#( "Texture", "Previous", "Diffuse", "Constant" ) across:4
			dropdownlist dlAlphaArg0Operand	"Arg0 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
			dropdownlist dlAlphaArg1		"Arg1" items:#( "Previous", "Diffuse", "Constant" )
			dropdownlist dlAlphaArg1Operand	"Arg1 Operand" items:#( "RGB", "Inv RGB", "Alpha", "Inv Alpha" )
		)
		group "Extended"
		(
			dropdownlist dlTextureShader "Texture Shader" items:#( "Disable", "TextureOff", "FetchTexture", "PassThrough", "CullFragment", "OffsetTexture", "OffsetTextureScale", "DependentARTexture", "DependentGBTexture", "DP3", "DP3Texture2D", "DP3CubeMap", "DP3ReflectCubeMap", "DP3ConstEyeReflectCubeMap", "DP3DiffuseCubeMap", "DP3DepthReplace" ) width:100 across:2
			ColorPicker cpConstant "Constant Color" align:#right height:40
			Label		ldConstantAlpha "Constant Alpha" align:#left across:2
			Spinner		 sdConstantAlpha ""  range:[0,255,255] type:#integer scale:1 align:#left width:50
		)

		fn updateUI update =
		(
			if (version >= 4) then
			(
				-- update droplist
				if update == true then
				(
					dlRgbOperation.selection = iRgbOperation_6
					dlRgbBlendSource.selection = iRgbBlendSource_6
					dlRgbArg0.selection = iRgbArg0_6
					dlRgbArg1.selection = iRgbArg1_6
					dlRgbArg0Operand.selection = iRgbArg0Operand_6
					dlRgbArg1Operand.selection = iRgbArg1Operand_6
					dlAlphaOperation.selection = iAlphaOperation_6
					dlAlphaBlendSource.selection = iAlphaBlendSource_6
					dlAlphaArg0.selection = iAlphaArg0_6 
					dlAlphaArg1.selection = iAlphaArg1_6 
					dlAlphaArg0Operand.selection = iAlphaArg0Operand_6
					dlAlphaArg1Operand.selection = iAlphaArg1Operand_6
					dlTextureShader.selection = iTextureShader_6 
				)
				else
				(
					iRgbOperation_6 = dlRgbOperation.selection
					iRgbBlendSource_6 = dlRgbBlendSource.selection
					iRgbArg0_6 = dlRgbArg0.selection
					iRgbArg1_6 = dlRgbArg1.selection
					iRgbArg0Operand_6 = dlRgbArg0Operand.selection
					iRgbArg1Operand_6 = dlRgbArg1Operand.selection
					iAlphaOperation_6 = dlAlphaOperation.selection
					iAlphaBlendSource_6 = dlAlphaBlendSource.selection
					iAlphaArg0_6 = dlAlphaArg0.selection
					iAlphaArg1_6 = dlAlphaArg1.selection
					iAlphaArg0Operand_6 = dlAlphaArg0Operand.selection
					iAlphaArg1Operand_6 = dlAlphaArg1Operand.selection
					iTextureShader_6 = dlTextureShader.selection
				)

				cpConstant.enabled = bEnableSlot_6 and bNormalShader
				dlRgbOperation.enabled = bEnableSlot_6 and bNormalShader
				dlRgbBlendSource.enabled = (bEnableSlot_6 == true) and (iRgbOperation_6 == 5) and bNormalShader
				dlRgbArg0.enabled = bEnableSlot_6 and bNormalShader
				dlRgbArg1.enabled = bEnableSlot_6 and bNormalShader
				dlRgbArg0Operand.enabled = bEnableSlot_6 and bNormalShader
				dlRgbArg1Operand.enabled = bEnableSlot_6 and bNormalShader
				dlAlphaOperation.enabled = bEnableSlot_6 and bNormalShader
				dlAlphaBlendSource.enabled = (bEnableSlot_6 == true) and (iAlphaBlendSource_6 == 5) and bNormalShader
				dlAlphaArg0.enabled = bEnableSlot_6 and bNormalShader
				dlAlphaArg1.enabled = bEnableSlot_6 and bNormalShader
				dlAlphaArg0Operand.enabled = bEnableSlot_6 and bNormalShader
				dlAlphaArg1Operand.enabled = bEnableSlot_6 and bNormalShader
				dlTextureShader.enabled = bEnableSlot_6 and bNormalShader
				sdConstantAlpha.enabled = bEnableSlot_6 and bNormalShader
			)
		)

		on NelMultitextureSlot6 open do
		(
			updateUI true
		)

		on dlRgbOperation selected newState do
		(
			updateUI false
		)

		on dlAlphaOperation selected newState do
		(
			updateUI false
		)

		on dlRgbArg0Operand selected newState do
		(
			updateUI false
		)

		on dlRgbArg1Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0Operand selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1Operand selected newState do
		(
			updateUI false
		)

		on dlMappingCoordinates selected newState do
		(
			updateUI false
		)

		on dlTextureShader selected newState do
		(
			updateUI false
		)

		on dlRgbBlendSource selected newState do
		(
			updateUI false
		)

		on dlRgbArg0 selected newState do
		(
			updateUI false
		)

		on dlRgbArg1 selected newState do
		(
			updateUI false
		)

		on dlAlphaBlendSource selected newState do
		(
			updateUI false
		)

		on dlAlphaArg0 selected newState do
		(
			updateUI false
		)

		on dlAlphaArg1 selected newState do
		(
			updateUI false
		)
	)

	fn loadShader shader =
	(
		-- Disable all slot
		bEnableSlot_1 = false
		bEnableSlot_2 = false
		bEnableSlot_3 = false
		bEnableSlot_4 = false
		bEnableSlot_5 = false
		bEnableSlot_6 = false
		bEnableSlot_7 = false
		bEnableSlot_8 = false

		if shader == ShaderSingleTexture then
		(
			-- Single texture
			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorModulate
			iAlphaArg0_1 = Src0Texture
			iAlphaArg1_1 = Src1Diffuse
			iAlphaArg0Operand_1	= OprdAlpha
			iAlphaArg1Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable
		)
		else if shader == ShaderAddTwoTextures then
		(
			-- Two texture texture

			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorModulate
			iAlphaArg0_1 = Src0Texture
			iAlphaArg1_1 = Src1Diffuse
			iAlphaArg0Operand_1	= OprdAlpha
			iAlphaArg1Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable

			bEnableSlot_2 = true
			iRgbOperation_2	= OptorAdd
			iRgbArg0_2	= Src0Texture
			iRgbArg1_2	= Src1Previous
			iRgbArg0Operand_2	= OprdRGB
			iRgbArg1Operand_2	= OprdRGB
			iAlphaOperation_2 = OptorModulate
			iAlphaArg0_2 = Src0Texture
			iAlphaArg1_2 = Src1Diffuse
			iAlphaArg0Operand_2	= OprdAlpha
			iAlphaArg1Operand_2	= OprdAlpha
			iTextureShader_2 = TextureShaderDisable
		)
		else if shader == ShaderMulTwoTextures then
		(
			-- Two texture texture

			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorModulate
			iAlphaArg0_1 = Src0Texture
			iAlphaArg1_1 = Src1Diffuse
			iAlphaArg0Operand_1	= OprdAlpha
			iAlphaArg1Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable

			bEnableSlot_2 = true
			iRgbOperation_2	= OptorModulate
			iRgbArg0_2	= Src0Texture
			iRgbArg1_2	= Src1Previous
			iRgbArg0Operand_2	= OprdRGB
			iRgbArg1Operand_2	= OprdRGB
			iAlphaOperation_2 = OptorModulate
			iAlphaArg0_2 = Src0Texture
			iAlphaArg1_2 = Src1Diffuse
			iAlphaArg0Operand_2	= OprdInvAlpha
			iAlphaArg1Operand_2	= OprdAlpha
			iTextureShader_2 = TextureShaderDisable
		)
		else if shader == ShaderBlendTwoTextures then
		(
			-- Two texture texture

			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorModulate
			iAlphaArg0_1 = Src0Texture
			iAlphaArg1_1 = Src1Diffuse
			iAlphaArg0Operand_1	= OprdAlpha
			iAlphaArg1Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable

			bEnableSlot_2 = true
			iRgbOperation_2	= OptorBlend
			iRgbBlendSource_2 = SrcBlendPrevious
			iRgbArg0_2	= Src0Texture
			iRgbArg1_2	= Src1Previous
			iRgbArg0Operand_2	= OprdRGB
			iRgbArg1Operand_2	= OprdRGB
			iAlphaOperation_2 = OptorReplace
			iAlphaArg0_2 = Src0Texture
			iAlphaArg1_2 = Src1Diffuse
			iAlphaArg0Operand_2	= OprdAlpha
			iAlphaArg1Operand_2	= OprdAlpha
			iTextureShader_2 = TextureShaderDisable
		)
		else if shader == ShaderBlendMask then
		(
			-- Two texture texture

			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorReplace
			iAlphaArg0_1 = Src0Texture
			iAlphaArg0Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable

			bEnableSlot_2 = true
			iRgbOperation_2	= OptorReplace
			iRgbArg0_1	= Src1Previous
			iRgbArg0Operand_2	= OprdRGB
			iAlphaOperation_2 = OptorModulate
			iAlphaArg0_2 = Src0Texture
			iAlphaArg1_2 = Src1Diffuse
			iAlphaArg0Operand_2	= OprdAlpha
			iAlphaArg1Operand_2	= OprdAlpha
			iTextureShader_2 = TextureShaderDisable
		)
		else if shader == ShaderMixTwoTextures then
		(
			-- Two texture texture

			bEnableSlot_1 = true
			iRgbOperation_1	= OptorModulate
			iRgbArg0_1	= Src0Texture
			iRgbArg1_1	= Src1Diffuse
			iRgbArg0Operand_1	= OprdRGB
			iRgbArg1Operand_1	= OprdRGB
			iAlphaOperation_1 = OptorModulate
			iAlphaArg0_1 = Src0Texture
			iAlphaArg0_2 = Src1Diffuse
			iAlphaArg0Operand_1	= OprdAlpha
			iAlphaArg1Operand_1	= OprdAlpha
			iTextureShader_1 = TextureShaderDisable

			bEnableSlot_2 = true
			iRgbOperation_2	= OptorBlend
			iRgbBlendSource_2 = SrcBlendConstant
			iRgbArg0_2	= Src0Texture
			iRgbArg1_2	= Src1Previous
			iRgbArg0Operand_2	= OprdRGB
			iAlphaOperation_2	= OptorBlend
			iAlphaBlendSource_2 = SrcBlendConstant
			iAlphaArg0_2 = Src0Texture
			iAlphaArg1_2 = Src1Previous
			iAlphaArg0Operand_2	= OprdAlpha
			iAlphaArg1Operand_2	= OprdAlpha
			iTextureShader_2 = TextureShaderDisable
			iConstantAlpha_2 = 127
		)

		-- Update the user interface
		globalUpdateUI true
	)

	on load do 
	( 
		-- Update to version 4 ?
		if updateToVersion4 == true then
		(

			-- Water
			if bWater == true then
			(
				-- Shader Type
				iShaderType = ShaderWater

				tTexture_1 = delegate.ReflectionMap
				tTexture_2 = delegate.RefractionMap
				tTexture_3 = delegate.OpacityMap
				tTexture_4 = delegate.FilterMap
				tTexture_5 = delegate.BumpMap
				tTexture_6 = delegate.DisplacementMap
				tTexture_7 = delegate.DiffuseMap

				bEnableSlot_1 = delegate.ReflectionMapEnable
				bEnableSlot_2 = delegate.RefractionMapEnable
				bEnableSlot_3 = delegate.OpacityMapEnable
				bEnableSlot_4 = delegate.FilterMapEnable
				bEnableSlot_5 = delegate.BumpMapEnable
				bEnableSlot_6 = delegate.DisplacementMapEnable
				bEnableSlot_7 = delegate.DiffuseMapEnable
			)
			else
			(
				-- Simple texture mode
				tTexture_1 = delegate.DiffuseMap
				bEnableSlot_1 = delegate.DiffuseMapEnable

				-- Lightmap ?
				if bLightmap == true then
				(
					-- Shader Type
					iShaderType = ShaderLightmap
				)
				else
				(
					if ((delegate.SpecularMapEnable == true) and (delegate.SpecularMap != undefined)) then
					(
						-- Shader specular
						iShaderType = ShaderSpecular

						-- Specular map
						tTexture_2 = delegate.SpecularMap
						bEnableSlot_2 = true
					)
					else
					(
						-- Shader Type
						iShaderType = ShaderNormal
						loadShader ShaderSingleTexture
					)

					-- Alpha blend ?
					bAlphaBlend = (bAlphaTest == false) and ((delegate.opacity < 100) or (delegate.OpacityMap != undefined) or bAlphaVertex)
					
					-- Alpha operator
					if (delegate.opacityType == 0) then
					(
						-- Blend
						iBlendSrcFunc = BlendSrcAlpha
						iBlendDestFunc = BlendInvSrcAlpha
					)
					else if (delegate.opacityType == 2) then
					(
						-- Additive
						iBlendSrcFunc = BlendOne
						iBlendDestFunc = BlendOne
					)
				)
			)
		)

		updateToVersion4 = false
	)

	on create do 
	( 
		-- Single shader
		loadShader ShaderSingleTexture
	)

	on update do 
	( 
		-- Initialise V3 fields.
		if (version < 3) and (version >= 2) then
		(
			-- No color vertex
			bColorVertex = false

			if bLightMap == true then
				bColorVertex = true
			if bUnlighted == true then
				bColorVertex = true
			
			-- No alpha vertex
			bAlphaVertex = false
			iAlphaVertexChannel	= 0
		)

		-- Initialise V4 fields.
		if (version < 4) and (version >= 2) then
		(
			updateToVersion4 = true
		)
	) 

	fn globalUpdateUI update =
	(
		NelParams.updateUI update
		NelTexture.updateUI update
		NelMultitextureSlot1.updateUI update
		NelMultitextureSlot2.updateUI update
		NelMultitextureSlot3.updateUI update
		NelMultitextureSlot4.updateUI update
		NelMultitextureSlot5.updateUI update
		NelMultitextureSlot6.updateUI update
	)

	fn updateTextureName =
	(
		-- Set the name
		if (tTexture_1 != undefined) then
		(
			if (classof tTexture_1) == Bitmaptexture then
			(
				NelTexture.mbTexture_1.text = (tTexture_1.name+" ("+(filenameFromPath (tTexture_1.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_1.text = (tTexture_1.name+" ("+((classof tTexture_1) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_1.text = "None"
		)
		if (tTexture_2 != undefined) then
		(
			if (classof tTexture_2) == Bitmaptexture then
			(
				NelTexture.mbTexture_2.text = (tTexture_2.name+" ("+(filenameFromPath (tTexture_2.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_2.text = (tTexture_2.name+" ("+((classof tTexture_2) as string)+")")
			)
		)
		else
		(
			if (iShaderType == ShaderUserColor) and (tTexture_1 != undefined) and ((classof tTexture_1) == Bitmaptexture) then
			(
				NelTexture.mbTexture_2.text = (getFilenameFile (filenameFromPath (tTexture_1.filename))) + "_usercolor" + (getFilenameType (filenameFromPath (tTexture_1.filename)))
			)
			else
			(
				NelTexture.mbTexture_2.text = "None"
			)
		)
		if (tTexture_3 != undefined) then
		(
			if (classof tTexture_3) == Bitmaptexture then
			(
				NelTexture.mbTexture_3.text = (tTexture_3.name+" ("+(filenameFromPath (tTexture_3.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_3.text = (tTexture_3.name+" ("+((classof tTexture_3) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_3.text = "None"
		)
		if (tTexture_4 != undefined) then
		(
			if (classof tTexture_4) == Bitmaptexture then
			(
				NelTexture.mbTexture_4.text = (tTexture_4.name+" ("+(filenameFromPath (tTexture_4.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_4.text = (tTexture_4.name+" ("+((classof tTexture_4) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_4.text = "None"
		)
		if (tTexture_5 != undefined) then
		(
			if (classof tTexture_5) == Bitmaptexture then
			(
				NelTexture.mbTexture_5.text = (tTexture_5.name+" ("+(filenameFromPath (tTexture_5.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_5.text = (tTexture_5.name+" ("+((classof tTexture_5) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_5.text = "None"
		)
		if (tTexture_6 != undefined) then
		(
			if (classof tTexture_6) == Bitmaptexture then
			(
				NelTexture.mbTexture_6.text = (tTexture_6.name+" ("+(filenameFromPath (tTexture_6.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_6.text = (tTexture_6.name+" ("+((classof tTexture_6) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_6.text = "None"
		)
		if (tTexture_7 != undefined) then
		(
			if (classof tTexture_7) == Bitmaptexture then
			(
				NelTexture.mbTexture_7.text = (tTexture_7.name+" ("+(filenameFromPath (tTexture_7.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_7.text = (tTexture_7.name+" ("+((classof tTexture_7) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_7.text = "None"
		)
		if (tTexture_8 != undefined) then
		(
			if (classof tTexture_8) == Bitmaptexture then
			(
				NelTexture.mbTexture_8.text = (tTexture_8.name+" ("+(filenameFromPath (tTexture_8.filename))+")")
			)
			else
			(
				NelTexture.mbTexture_8.text = (tTexture_8.name+" ("+((classof tTexture_8) as string)+")")
			)
		)
		else
		(
			NelTexture.mbTexture_8.text = "None"
		)
	)
)
