֦D 94&+ 9 9 WaZݰRXΰ> Hx/}.?vN#S'>{Aspσ7|\r$(-x@YH9cهAyCV|B1q $iSC(L'bݗ3EdMZxY{j9wCP/rɠwYLrVm; Uf'U';Cfw#dUzsa_3bp2FjXBJh [Z#q\/af.6﬚vÉ'"%XA10|U=ҙu ]~{#"G(sʔkYծ" _ EOp~, 0L̗S( 3n"eQ]9e1ɮ -$Hlyf&ǮgM ]{D4SVϊrgtWAy7b1L=:@>>J=RWsA;3?;3 cj6@@???֦D 9 209 9 Wa+ܷrvC{*QV XY}>ѐ2H^no杤e 1$)ϵ<~׽7£>M߹"\:al YaRP!,y(yRQ=d,;3{jb|j꺧"nN#T)lɟ<7 rbd :γ/.`\r$J3Qo6Uƛ>eur,<>ܤz4QE;q ϷO]qn{ؗ4x8!bLM):k]`|2ӗَlUqӉ6 0xćwC=':s-hO6vQś1~R&p~;qҙbg]`ξUAAr(\9 0:N,XP j TՎ^gF|$̅ɭl ਯldKƱe@q_e=+FG܉\$.:Wzl6֙@hmE,k  o:D۬ZI|omCɳb-}+>xC䥼*wa%&#suo!Lf{qzśl?QڸԞG>LC0W-Md]x#}İM2vz~zzgnXfdG*@Pu>3226ɻYz3 7?#KvtJzBy`EL% trMQBnhlÚb;Nh-\YM:D8,zaAbU,`yVnlA????֦D 9 . 5.79 9 Wa͞/r.-*\ 2~y/`Gu : ;U ޵ZxY=ATrN2`}y{_xlwU*szv_V! (X&oW,,\STp\*tl"kͺMI 1d=b^BA1=W">0'\#כw@tK՜UM!P;Λ){KrUvDYFYG}*V?ݞjn>H<:22ۯ/ƝF_x')]*&ӕi(>rp9VnL1}+SD|*5l~lZKQ8#-U4bOPYm34=L,G?(ܹiX2q'qukXj4!} ҅8WWJS`b?~\GtY=uS# ; :bF][}~DIINbGe%ZPCӳJR)u梅N2Jeƫmi>ݒϽ'tX@saq&1DRTڲr_m<>4B-XG{IxWϭʤYkbkI珧xb/]JpJΠyo-jJ/"#~r5b$-8F\~{'pwlA;$sO۾jݨv<.jv u.)~_IKɚ'x?El5UȮQߊS)w;,!-ZAjcT"̼&Uc2s^.%ɯhcKo TLntc(JXywu:[n`%vt;M[wB/@9C8VʙJ7b&XhIc\8h TE ^>T7O5yU^>>=dHC????֦D 9 -%< 09 9 Wa)m}7U'P| ߝߊzs^`ڳn}0 +({>I(UPtk!/?  >.-n r8͑ ߽5/Ybr4쨑2X; R'[Q`R tzE} l'}m5  UA0ޱ按t3hѲypimF6ϣ^b\)Lo<@(E,+?`.İ#6 $'8]D%<(ՋƆdz4p|Adk2i^JhA{&ڴKJc']@Pjf%h12jN2S0&E’8,Fqv\x0Exz):ю{@v]5 ,S-Ct$.CAhP {t̐ޗG>\eOoxa80zTƃҀ1ܒJ%WfSjE#jj/A%o0#24 ̫3 "י*πQy#QG/"Db@S퀫,;*)8_6Dq!йF@収.qG#.Xi+ cMYӕ{ _ް@Q'BeoLA'U8fU^e\kpuZ<*w6 %㺇lcPԛA`UAxU)G"ן5QCl씪tBKTf[瑔uKvT[,PRt-]a_˯g>rI99E_S& :Rpͣ̀u ʥA/Pn2 5IeUC)H}hDN4mqٯ 3%U6xXH0e:,ȕA????֦D 9 58:09 9 Wa>VTU);.㍌BfHC®u ̚S!ʖMzEy z/Y8ТP8vN[>"7;mNoȟ[=]vHu:zvd!b⣘S3(d0E?Z&pkzHo]ϭ*4cO@>TU੾ =5䆞'Y{ ϳ!$ҟ sVPc$jbJ590qSPsƥ5}8c-D^J?d̬q#[@Æa̮'yX6Ֆ1 ҘֹHvlscece۞na:迒5aGݠx*{oQA(X-i늟3/dVCV@3h]>8Z]!xMUpxm=S)JU1}S&gJ e Z7?׌x|@@ހ7{sw?*+-!e\}B06ՄnSo c'#~Pzw ilNENVpRB˼B?و&e|p}מYhL7u̩Ex!R zCԳW9=_7~Cy>@6OjlP/M)rJ(͛{뉁핺Ņ꿣0r {|8У':xN }">vUh4nJAXz>I;x?yAA???֦D 9 .$ 13)59 9 WaO>R7IvCK¼ P}xۭSMENAi4WpMS>YDbܿ,[}UW+Q/5rP^ a\X/⣰O9ݘ\'קl ee4 V'b|t!Dv';_puS"Kr/ps=TNm$T'y"oj#!qhMNGy Jz= j:i Z)|_69{VfbSrw NPQ:SpDz^12XxEID$2=^n,se^}5)Nrir0n sr/suj:{$e.,EQ UD5̀_O>;W63zywK'5z|nuzimmKS0bՆ3tsrSKO N/GqB%}PgvW'q@§B2so ‚ŕ4hԵ6n}jytm]Sz\pq"d˚ *r^B3' [Xmbz) Wׇ%E8\XqdUUM(꟰Uz;>oi{BX7y%wVaNeir\]y]R<8`ڐ6odJbht&7j+/nj5S|َk&v\ՃD*F6B6nrAjZ!g TK0Kgv]emԃ%st/z3isS" iiRr>S @oϴ]-{Qf@*d?OzX*:zڝV+ԂJe _n y2u(28x[! SkZ+ h7g}0=n?>?$N>???֦D 9 .$( 79 9 WaY/\e!*' SO[Z+zW/"C#Z|*TϹ٭[&<7<U+7P-BK|I:"4H=cz'k 11G_nai{/R43f[RDu.|ELoh=t'y;=`$"CLrw"d\ f.TlUn#DM~ WqU:v?&6s,$pbVN9 /!>ɯJ9So9p`SJ=muGP+hEintLZQpRc̈5]v8+ZӇ/ 35jI>7Ҫ|_yf)Gy˸O${$NX(:o.#hwBkA٩ɬ536nVl6i)kEƶ)DȩXL'x0˗GIg1$&*N>Rņfg[ [OIv1}}!gtpvk$Qv~<|!`Z>YhշHOb*7_3qmV6z$pc*{)Gn8 ?.Mg,P*OxC?P-3W ITFH (kRzHn}$RhLi b 2dLg;:WOV} PGH h$-Q={S3G5`ЀIcQ?R0=n?>?=Q333?333??` Hx/}.?vN#S'>{Aspσ7|\r$(-x@YH9cهAyCV|B1q $iSC(L'bݗ3EdMZxY{j9wCP/rɠwYLrVm; Uf'U';Cfw#dUzsa_3bp2FjXBJh [Z#q\/af.6﬚vÉ'"%XA10|U=ҙu ]~{#"G(sʔkYծ" _ EOp~, 0L̗S( 3n"eQ]9e1ɮ -$Hlyf&ǮgM ]{D4SVϊrgtWAy7b1L=:;3?;3 cj6@@???@>>J=RWsA?>L=pB??@Ffff?`ѐ2H^no杤e 1$)ϵ<~׽7£>M߹"\:al YaRP!,y(yRQ=d,;3{jb|j꺧"nN#T)lɟ<7 rbd :γ/.`\r$J3Qo6Uƛ>eur,<>ܤz4QE;q ϷO]qn{ؗ4x8!bLM):k]`|2ӗَlUqӉ6 0xćwC=':s-hO6vQś1~R&p~;qҙbg]`ξUAAr(\9 0:N,XP j TՎ^gF|$̅ɭl ਯldKƱe@q_e=+FG܉\$.:Wzl6֙@hmE,k  o:D۬ZI|omCɳb-}+>xC䥼*wa%&#suo!Lf{qzśl?QڸԞG>LC0W-Md]x#}İM2vz~zzgnXfdG*@Pu>3226ɻYz3 7?#KvtJzBy`EL% trMQBnhlÚb;Nh-\YM:D8,zaAbU,`yVnlAxxSkinMesh : TorusKnotValuePrint : Transmittance            ?    T3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Applying "The CG Tutorial" examples to 3DRad HLSL shaders // http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter07.html // // The vertex program C7E3v_refraction needs to compute and output the refracted ray, rather than the reflected ray // as in C7E1v_reflection . // To calculate refraction, one of the key values you need is the ratio between the index of refraction of each // medium. For this example, the application needs to pass etaRatio , the ratio of indices of refraction of the two // media, to the vertex program. // // I've used the 3DRad default terrain environment map, and "torus.jpg" as the decal texture. // (see Skinmesh/data/TorusKnot) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*HLSLSTART C7E3v //The following data structures represent the vertex format //for animated (skinned) and static meshes respectively, //as it is passed by 3D Rad to the VS_Skinning(), VS_NoSkinning() //vertex shader functions (see below). This format cannot be changed. struct VS_INPUT { float4 Position : POSITION; float3 BlendWeights : BLENDWEIGHT; float4 BlendIndices : BLENDINDICES; float3 Normal : NORMAL; float2 TexCoord : TEXCOORD0; float3 T : TEXCOORD1; //in object space float3 B : TEXCOORD2; //in object space }; struct VS_INPUT_NOSKINNING { float4 Position : POSITION; //in object space float3 Normal : NORMAL; //in object space float2 TexCoord : TEXCOORD0; float3 T : TEXCOORD1; //in object space float3 B : TEXCOORD2; //in object space }; //The following data structure represents the vertex format //that the PS_Alpha() pixel shader function will receive from //the vertex shader functions. This format is user-definable. struct VS_OUTPUT { float4 Position : POSITION; //in projection space float2 TexCoord0 : TEXCOORD0; float2 TexCoord1 : TEXCOORD1; float3 Normal : TEXCOORD2; //in tangent space float3 LightVector : TEXCOORD3; //in tangent space }; //The following data structure represents the input/output data format //for the VS_Bones() function. struct VS_BONES_INPUT { float4 vPos; float3 vBlendWeights; float4 vBlendIndices; float3 vNor; float3 vT; float3 vB; }; struct VS_BONES_OUTPUT { float4 vPos; float3 vNor; float3 vT; float3 vB; }; //************************************** // Added for this example (C7E3v) //************************************** struct C7E3v_VS_OUTPUT { float4 oPosition : POSITION; float2 oTexCoord : TEXCOORD0; float3 T : TEXCOORD1; }; //************************************** //The following shader variables may be set automatically by 3D Rad, run-time, //depending on SkinMesh property dialog settings const int MATRIX_PALETTE_SIZE = MATRIX_PALETTE_SIZE_DEFAULT; float4x3 amPalette[MATRIX_PALETTE_SIZE_DEFAULT]; int boneCount = 2; float4x4 mxWorld : WORLD; float4x4 mxWorldIT : amPalette; float4x4 mxViewProj : VIEWPROJECTION; float4 lightDir : DIRECTION = {0.0f,0.0f,-1.0f,1.0f}; float4 lightColor : DIFFUSE = {1.0f,1.0f,1.0f,1.0f}; float4 lightAmbient : AMBIENT = {0.1f,0.1f,0.1f,1.0f}; float ambient; float4 materialDiffuse : DIFFUSE = {0.8f,0.8f,0.8f,1.0f}; float4 materialSpecular : SPECULAR = {1.0f,1.0f,1.0f,1.0f}; float materialSpecularPower : SPECULARPOWER = 30.0f; float3 worldEyePos; texture diffuseMap; //the mesh texture assigned to the currently processed vertex or pixel texture environmentMap; //the environment-map texture assigned to the currently processed vertex or pixel float environmentMapBlend; texture normalMap; //the bump-map texture assigned to the currently processed vertex or pixel float bumpScale; float4 pointLightPos01 = {0.0f,0.0f,-1.0f,1.0f}; float4 pointLightPos02 = {1.0f,0.0f,-1.0f,1.0f}; float4 pointLightPos03 = {-1.0f,0.0f,-1.0f,1.0f}; float4 pointLightPos04 = {-1.0f,0.0f,1.0f,1.0f}; float4 pointLightColor01 = {1.0f,1.0f,1.0f,1.0f}; float4 pointLightColor02 = {1.0f,0.0f,0.0f,1.0f}; float4 pointLightColor03 = {0.0f,1.0f,0.0f,1.0f}; float4 pointLightColor04 = {0.0f,0.0f,1.0f,1.0f}; float3 fogColor = {1.0f,1.0f,1.0f}; float fogStart = 1; float fogEnd = 25; //The following variable will be set by our script code (see Main() section, below) float fAlpha = 1.0f; //The following declarations specify how textures will be //read (sampled) by the pixel shader function. sampler DiffuseMapSampler = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; sampler NormalMapSampler = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; sampler EnvironmentMapSampler = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; //************************************** // Added for this example (C7E3v) //************************************** sampler2D DiffuseMapSampler2 = sampler_state { Texture = ; MinFilter = Linear; MipFilter = Linear; MagFilter = Linear; AddressU = Wrap; AddressV = Wrap; }; samplerCUBE CubeMapSampler = sampler_state { Texture = ; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = Clamp; AddressV =Clamp; }; //************************************** //The following is a user-defined function VS_BONES_OUTPUT VS_Bones( const VS_BONES_INPUT vInput, int iNumBones ) { //This function is called by VS_Skinning(), the main //vertex shader function for skinned meshes //It applies bone matrices to vertex coordinates, normals and tangents, //which also transforms from model-space to world space VS_BONES_OUTPUT vOutput = (VS_BONES_OUTPUT) 0; float fLastWeight = 1.0; float fWeight; float afBlendWeights[3] = (float[3])vInput.vBlendWeights; int aiIndices[4] = (int[4])D3DCOLORtoUBYTE4(vInput.vBlendIndices); for (int iBone=0;(iBone<3) && (iBone<(iNumBones-1));iBone++) { fWeight = afBlendWeights[iBone]; fLastWeight -= fWeight; vOutput.vPos.xyz += mul(vInput.vPos,amPalette[aiIndices[iBone]])*fWeight; vOutput.vNor += mul(vInput.vNor,amPalette[aiIndices[iBone]])*fWeight; vOutput.vT += mul(vInput.vT,amPalette[aiIndices[iBone]])*fWeight; vOutput.vB += mul(vInput.vB,amPalette[aiIndices[iBone]])*fWeight; } vOutput.vPos.xyz += mul(vInput.vPos,amPalette[aiIndices[iNumBones-1]])*fLastWeight; vOutput.vNor += mul(vInput.vNor,amPalette[aiIndices[iNumBones-1]])*fLastWeight; vOutput.vT += mul(vInput.vT,amPalette[aiIndices[iNumBones-1]])*fLastWeight; vOutput.vB += mul(vInput.vB,amPalette[aiIndices[iNumBones-1]])*fLastWeight; return vOutput; } //The following is the vertex shader function for bone-animated meshes (for example Andro) //This function is called for each vertex of the SkinMesh that is rendered. VS_OUTPUT VS_Skinning(VS_INPUT IN, uniform int iNumBones) { VS_OUTPUT OUT; OUT.TexCoord0 = IN.TexCoord.xy; OUT.TexCoord1 = IN.TexCoord.xy; VS_BONES_INPUT vsi = { IN.Position, IN.BlendWeights, IN.BlendIndices, IN.Normal, IN.T, -IN.B }; VS_BONES_OUTPUT vso = VS_Bones( vsi, iNumBones ); // Compute matrix which transforms to tangent space float3x3 objToTangentSpace; objToTangentSpace[0] = normalize(vso.vT); objToTangentSpace[1] = normalize(vso.vB); objToTangentSpace[2] = normalize(vso.vNor); // Output packed constant tangent-space normal. OUT.Normal = float3(0.5,0.5,1); // Transform light vector from object space to tangent space, and pack into [0..1] range OUT.LightVector = normalize(mul(objToTangentSpace, -lightDir.xyz)) * 0.5 + 0.5.xxx; OUT.Position = mul(float4(vso.vPos.xyz,1.0f),mxViewProj); return OUT; } //The following is the vertex shader function for static meshes (for example the default yellow fish) //This function is called for each vertex of the SkinMesh that is rendered. VS_OUTPUT VS_NoSkinning(VS_INPUT_NOSKINNING IN) { VS_OUTPUT OUT; OUT.TexCoord0 = IN.TexCoord.xy; OUT.TexCoord1 = IN.TexCoord.xy; // Compute matrix which transforms to tangent space float3x3 objToTangentSpace; objToTangentSpace[0] = mul(IN.T,mxWorldIT); objToTangentSpace[1] = mul(-IN.B,mxWorldIT); objToTangentSpace[2] = mul(IN.Normal,mxWorldIT); // Output packed constant tangent-space normal. OUT.Normal = float3(0.5,0.5,1); // Transform light vector from object space to tangent space, and pack into [0..1] range OUT.LightVector = normalize(mul(objToTangentSpace, -lightDir.xyz)) * 0.5 + 0.5.xxx; OUT.Position = mul(IN.Position, mxViewProj); return OUT; } //************************************** // Added for this example (C7E3v) //************************************** float etaRatio; //the ratio of the index of refraction in the medium containing the incident ray to that of the medium being entered. float transmittance; C7E3v_VS_OUTPUT C7E3v_refraction(VS_INPUT_NOSKINNING IN) { C7E3v_VS_OUTPUT OUT; OUT.oPosition = mul(IN.Position,mxViewProj); OUT.oTexCoord = IN.TexCoord; // Compute position and normal in world space float3 positionW = mul(IN.Position,mxWorld).xyz; float3 N = mul(IN.Normal,(float3x3)mxWorld); N = normalize(N); // Compute the incident and refracted vectors float3 I = normalize(positionW - worldEyePos); OUT.T = refract(I, N, etaRatio); return OUT; } //************************************** //The following is the pixel shader function. //This function is called for each pixel that is plotted on the screen, for the SkinMesh that is rendered. //************************************** // Added for this example (C7E3v) //************************************** float4 C7E4f_refraction(C7E3v_VS_OUTPUT IN) : COLOR { // Fetch refracted environment color float4 refractedColor = texCUBE(CubeMapSampler, IN.T); // Fetch the decal base color float4 decalColor = tex2D(DiffuseMapSampler2, IN.oTexCoord); float4 color = lerp(decalColor, refractedColor, transmittance); return color; } //************************************** //The following fills an user-defined array with compiled techniques. //Run-time the right technique will be picked based on the number of bones //to process. VertexShader vsArray[4] = { compile vs_2_0 VS_Skinning(1), compile vs_2_0 VS_Skinning(2), compile vs_2_0 VS_Skinning(3), compile vs_2_0 VS_Skinning(4) }; //The following declaration specifies the rendering technique for animated meshes //The technique name must be 'Skinning'. What is inside the code block is user-definable. technique Skinning { pass P0 { //VertexShader = (vsArray[boneCount]); //PixelShader = compile ps_2_0 C7E3v_PS(); } } //The following declaration specifies the rendering technique for static meshes //The technique name must be 'NoSkinning'. What is inside the code block is user-definable. technique NoSkinning { pass P0 { VertexShader = compile vs_2_0 C7E3v_refraction(); PixelShader = compile ps_2_0 C7E4f_refraction(); } } HLSLEND*/ ////////////////////////////////////////////////////////////////////////////////// //The following is our regular script code which sets and manipulates the shader above bool keyUp = false; bool keyDown = false; float transmittance = 0.5; // etaRatio is the ratio of the index of refraction in the medium containing the incident ray // to that of the medium being entered. // e.g. air-to-water = 1.0003/1.3333 = 0.7502 // air-to-glass = 1.0003/1.5 = 0.6669 // air-to-diamond = 1.0003/2.417 = 0.4139 float etaRatio = 0.6669;//(glass) void Main() { if (iInitializing()) { iShaderSet(OBJ_0,"C7E3v"); } //Monitor key presses and debounce if ((iKeyDown(iKeyCode("DIK_UP")))&&(!keyUp)) { transmittance +=0.1; keyUp = true; if (transmittance>1) transmittance = 1.0; } if ((iKeyDown(iKeyCode("DIK_DOWN")))&&(!keyDown)) { transmittance -=0.1; keyDown = true; if (transmittance<0) transmittance = 0; } if (!iKeyDown(iKeyCode("DIK_UP"))) { keyUp = false; } if (!iKeyDown(iKeyCode("DIK_DOWN"))) { keyDown = false; } iShaderFloatSet(OBJ_0,"transmittance",transmittance); iShaderFloatSet(OBJ_0,"etaRatio",etaRatio); OUT_22 = transmittance; } `> 00001Terrain֦D 9 . 5.79 9 Wa͞/r.-*\ 2~y/`Gu : ;U ޵ZxY=ATrN2`}y{_xlwU*szv_V! (X&oW,,\STp\*tl"kͺMI 1d=b^BA1=W">0'\#כw@tK՜UM!P;Λ){KrUvDYFYG}*V?ݞjn>H<:22ۯ/ƝF_x')]*&ӕi(>rp9VnL1}+SD|*5l~lZKQ8#-U4bOPYm34=L,G?(ܹiX2q'qukXj4!} ҅8WWJS`b?~\GtY=uS# ; :bF][}~DIINbGe%ZPCӳJR)u梅N2Jeƫmi>ݒϽ'tX@saq&1DRTڲr_m<>4B-XG{IxWϭʤYkbkI珧xb/]JpJΠyo-jJ/"#~r5b$-8F\~{'pwlA;$sO۾jݨv<.jv u.)~_IKɚ'x?El5UȮQߊS)w;,!-ZAjcT"̼&Uc2s^.%ɯhcKo TLntc(JXywu:[n`%vt;M[wB/@9C8VʙJ7b&XhIc\8h TE ^>T7O5yU ?HB????^>>=dHC?~~terrain0100`>S00000SkyBox֦D 9 -%< 09 9 Wa)m}7U'P| ߝߊzs^`ڳn}0 +({>I(UPtk!/?  >.-n r8͑ ߽5/Ybr4쨑2X; R'[Q`R tzE} l'}m5  UA0ޱ按t3hѲypimF6ϣ^b\)Lo<@(E,+?`.İ#6 $'8]D%<(ՋƆdz4p|Adk2i^JhA{&ڴKJc']@Pjf%h12jN2S0&E’8,Fqv\x0Exz):ю{@v]5 ,S-Ct$.CAhP {t̐ޗG>\eOoxa80zTƃҀ1ܒJ%WfSjE#jj/A%o0#24 ̫3 "י*πQy#QG/"Db@S퀫,;*)8_6Dq!йF@収.qG#.Xi+ cMYӕ{ _ް@Q'BeoLA'U8fU^e\kpuZ<*w6 %㺇lcPԛA`UAxU)G"ן5QCl씪tBKTf[瑔uKvT[,PRt-]a_˯g>rI99E_S& :Rpͣ̀u ʥA/Pn2 5IeUC)H}hDN4mqٯ 3%U6xXH0e:,ȕAskybox`>X00003SunLight֦D 9 58:09 9 Wa>VTU);.㍌BfHC®u ̚S!ʖMzEy z/Y8ТP8vN[>"7;mNoȟ[=]vHu:zvd!b⣘S3(d0E?Z&pkzHo]ϭ*4cO@>TU੾ =5䆞'Y{ ϳ!$ҟ sVPc$jbJ590qSPsƥ5}8c-D^J?d̬q#[@Æa̮'yX6Ֆ1 ҘֹHvlscece۞na:迒5aGݠx*{oQA(X-i늟3/dVCV@3h]>8Z]!xMUpxm=S)JU1}S&gJ e Z7?׌x|@@ހ7{sw?*+-!e\}B06ՄnSo c'#~Pzw ilNENVpRB˼B?و&e|p}מYhL7u̩Ex!R zCԳW9=_7~Cy>@6OjlP/M)rJ(͛{뉁핺Ņ꿣0r {|8У':xN Xz>I;x?yAA???}">vUh4nJA?XX???33>@?@?@??`<]00006ValuePrint : Transmittance֦D 9 .$ 13)59 9 WaO>R7IvCK¼ P}xۭSMENAi4WpMS>YDbܿ,[}UW+Q/5rP^ a\X/⣰O9ݘ\'קl ee4 V'b|t!Dv';_puS"Kr/ps=TNm$T'y"oj#!qhMNGy Jz= j:i Z)|_69{VfbSrw NPQ:SpDz^12XxEID$2=^n,se^}5)Nrir0n sr/suj:{$e.,EQ UD5̀_O>;W63zywK'5z|nuzimmKS0bՆ3tsrSKO N/GqB%}PgvW'q@§B2so ‚ŕ4hԵ6n}jytm]Sz\pq"d˚ *r^B3' [Xmbz) Wׇ%E8\XqdUUM(꟰Uz;>oi{BX7y%wVaNeir\]y]R<8`ڐ6odJbht&7j+/nj5S|َk&v\ՃD*F6B6nrAjZ!g TK0Kgv]emԃ%st/z3isS" iiRr>S @oϴ]-{Qf@*d?OzX*:zڝV+ԂJe _n y2u(28x[! SkZ+ h7g}?$N>???0=n?>|Script: shader code??Transmittance = %1.1f???default`<00007TextPrint : Instructions֦D 9 .$( 79 9 WaY/\e!*' SO[Z+zW/"C#Z|*TϹ٭[&<7<U+7P-BK|I:"4H=cz'k 11G_nai{/R43f[RDu.|ELoh=t'y;=`$"CLrw"d\ f.TlUn#DM~ WqU:v?&6s,$pbVN9 /!>ɯJ9So9p`SJ=muGP+hEintLZQpRc̈5]v8+ZӇ/ 35jI>7Ҫ|_yf)Gy˸O${$NX(:o.#hwBkA٩ɬ536nVl6i)kEƶ)DȩXL'x0˗GIg1$&*N>Rņfg[ [OIv1}}!gtpvk$Qv~<|!`Z>YhշHOb*7_3qmV6z$pc*{)Gn8 ?.Mg,P*OxC?P-3W ITFH (kRzHn}$RhLi b 2dLg;:WOV} PGH h$-Q={S3G5`ЀIcQ?R?=Q333?333??0=n?>????L=̌?8Use [Up]/ [Down] keys to change Transmittance (0 to 1) default??????????,????-?? ??.???????????????????? ?? ?? ??;??<??=??>?????@??A??B??C????