30 #include <OgreString.h>
36 #define _def_Water_Material_Name "_Hydrax_Water_Material"
37 #define _def_Water_Shader_VP_Name "_Hydrax_Water_VP"
38 #define _def_Water_Shader_FP_Name "_Hydrax_Water_FP"
40 #define _def_Depth_Material_Name "_Hydrax_Depth_Material"
41 #define _def_Depth_Shader_VP_Name "_Hydrax_Depth_VP"
42 #define _def_Depth_Shader_FP_Name "_Hydrax_Depth_FP"
44 #define _def_DepthTexture_Shader_VP_Name "_Hydrax_DepthTexture_VP"
45 #define _def_DepthTexture_Shader_FP_Name "_Hydrax_DepthTexture_FP"
47 #define _def_Underwater_Material_Name "_Hydrax_Underwater_Material"
48 #define _def_Underwater_Shader_VP_Name "_Hydrax_Underwater_Shader_VP"
49 #define _def_Underwater_Shader_FP_Name "_Hydrax_Underwater_Shader_FP"
51 #define _def_Underwater_Compositor_Material_Name "_Hydrax_Underwater_Compositor_Material"
52 #define _def_Underwater_Compositor_Shader_VP_Name "_Hydrax_Underwater_Compositor_Shader_VP"
53 #define _def_Underwater_Compositor_Shader_FP_Name "_Hydrax_Underwater_Compositor_Shader_FP"
55 #define _def_Underwater_Compositor_Name "_Hydrax_Underwater_Compositor_Name"
57 #define _def_Simple_Red_Material_Name "_Hydrax_Simple_Red_Material"
58 #define _def_Simple_Black_Material_Name "_Hydrax_Simple_Black_Material"
67 for (
int k = 0; k < 6; k++)
72 for (
int k = 0; k < 1; k++)
128 Ogre::String AlphaChannels[] = {
"x",
"y",
"z",
"w",
131 for (
int k = 0; k<8; k++)
187 HydraxLOG(
"Creating underwater material...");
200 HydraxLOG(
"Underwater material created.");
207 std::vector<Ogre::Technique*>::iterator TechIt;
218 bool isTextureDepthTechnique =
219 ((*TechIt)->getName() ==
"_Hydrax_Depth_Technique") ?
false :
true;
221 if (isTextureDepthTechnique)
223 Ogre::String DepthTextureName =
224 ((*TechIt)->getPass(0)->getTextureUnitState(0)->getName() ==
"_DetphTexture_Hydrax") ?
225 (*TechIt)->getPass(0)->getTextureUnitState(0)->getTextureName() : (*TechIt)->getPass(0)->getTextureUnitState(1)->getTextureName();
240 const Ogre::String GpuProgramNames[2],
242 const Ogre::String EntryPoints[2],
243 const Ogre::String Data[2])
247 for (
int k = 0; k < 2; k++)
249 if (!
createGpuProgram(GpuProgramNames[k], SM, GpuPrograms[k], EntryPoints[k], Data[k]))
255 Pass->setVertexProgram(GpuProgramNames[0]);
256 Pass->setFragmentProgram(GpuProgramNames[1]);
264 const Ogre::String& EntryPoint,
265 const Ogre::String& Data)
267 if (Ogre::HighLevelGpuProgramManager::getSingleton().resourceExists(Name))
269 HydraxLOG(
"Error in bool MaterialManager::createGpuProgram(): "+ Name +
" exists.");
273 Ogre::String ShaderModesStr[3] = {
"hlsl",
"cg",
"glsl"};
274 Ogre::String Profiles[2];
280 Profiles[0] =
"target";
284 Profiles[1] =
"vs_1_1";
288 Profiles[1] =
"ps_2_0";
295 Profiles[0] =
"profiles";
299 Profiles[1] =
"vs_1_1 arbvp1";
303 Profiles[1] =
"ps_2_0 arbfp1 fp20";
323 Ogre::GpuProgramType GpuPType;
327 GpuPType = Ogre::GPT_VERTEX_PROGRAM;
331 GpuPType = Ogre::GPT_FRAGMENT_PROGRAM;
334 Ogre::HighLevelGpuProgramPtr HLGpuProgram =
335 Ogre::HighLevelGpuProgramManager::getSingleton().
337 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
341 HLGpuProgram->setSource(Data);
342 HLGpuProgram->setParameter(
"entry_point", EntryPoint);
343 HLGpuProgram->setParameter(Profiles[0], Profiles[1]);
344 HLGpuProgram->load();
357 Ogre::String VertexProgramData, FragmentProgramData;
373 "float4 iPosition : POSITION,\n" +
374 "float2 iUv : TEXCOORD0,\n" +
376 "out float4 oPosition : POSITION,\n" +
377 "out float4 oPosition_ : TEXCOORD0,\n" +
378 "out float2 oUvNoise : TEXCOORD1,\n" +
379 "out float4 oUvProjection : TEXCOORD2,\n";
383 VertexProgramData += Ogre::String(
384 "out float4 oWorldPosition : TEXCOORD3,\n") +
385 "uniform float4x4 uWorld,\n";
387 VertexProgramData += Ogre::String(
388 "uniform float4x4 uWorldViewProj)\n") +
390 "oPosition_ = iPosition;\n";
393 VertexProgramData +=
"oWorldPosition = mul(uWorld, iPosition);\n";
397 "oPosition = mul(uWorldViewProj, iPosition);\n") +
399 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
403 "oUvProjection = mul(scalemat, oPosition);\n" +
404 "oUvNoise = iUv;\n" +
411 VertexProgramData += Ogre::String(
"\n");
415 VertexProgramData +=
"uniform mat4 uWorld;\n";
419 VertexProgramData += Ogre::String(
420 "varying vec4 Position_;\n") +
421 "varying vec4 UVProjection;\n";
424 VertexProgramData +=
"varying vec4 WorldPosition;\n";
427 VertexProgramData += Ogre::String(
430 "Position_ = gl_Vertex;\n";
433 VertexProgramData +=
"WorldPosition = uWorld * gl_Vertex;\n";
435 VertexProgramData += Ogre::String(
436 "gl_Position = ftransform();\n") +
437 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
438 " 0.0, -1.0, 0.0, 0.0,\n" +
439 " 0.0, 0.0, 1.0, 0.0,\n" +
440 " 0.0, 0.0, 0.0, 1.0);\n" +
441 "UVProjection = scalemat * gl_Position;\n" +
442 "gl_TexCoord[0] = gl_MultiTexCoord0;\n" +
460 "float4 iPosition : POSITION,\n" +
461 "float3 iNormal : NORMAL,\n"+
463 "out float4 oPosition : POSITION,\n" +
464 "out float4 oPosition_ : TEXCOORD0,\n" +
465 "out float4 oUvProjection : TEXCOORD1,\n" +
466 "out float3 oNormal : TEXCOORD2,\n";
469 VertexProgramData +=
"out float4 oWorldPosition : TEXCOORD3,\n uniform float4x4 uWorld,\n";
474 "uniform float4x4 uWorldViewProj)\n") +
476 "oPosition_ = iPosition;\n";
479 VertexProgramData +=
"oWorldPosition = mul(uWorld, iPosition);\n";
483 "oPosition = mul(uWorldViewProj, iPosition);\n") +
485 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
489 "oUvProjection = mul(scalemat, oPosition);\n" +
490 "oNormal = normalize(iNormal);\n"+
497 VertexProgramData += Ogre::String(
"\n");
501 VertexProgramData +=
"uniform mat4 uWorld;\n";
505 VertexProgramData += Ogre::String(
506 "varying vec4 Position_;\n") +
507 "varying vec4 UVProjection;\n" +
508 "varying vec3 Normal;\n";
511 VertexProgramData +=
"varying vec4 WorldPosition;\n";
514 VertexProgramData += Ogre::String(
517 "Position_ = gl_Vertex;\n";
520 VertexProgramData +=
"WorldPosition = uWorld * gl_Vertex;\n";
522 VertexProgramData += Ogre::String(
523 "gl_Position = ftransform();\n") +
524 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
525 " 0.0, -1.0, 0.0, 0.0,\n" +
526 " 0.0, 0.0, 1.0, 0.0,\n" +
527 " 0.0, 0.0, 0.0, 1.0);\n" +
528 "UVProjection = scalemat * gl_Position;\n" +
529 "Normal = normalize(gl_Normal);\n" +
547 "float4 iPosition : POSITION,\n" +
549 "out float4 oPosition : POSITION,\n" +
550 "out float4 oPosition_ : TEXCOORD0,\n" +
551 "out float4 oUvProjection : TEXCOORD1,\n";
554 VertexProgramData +=
"out float4 oWorldPosition : TEXCOORD2,\n uniform float4x4 uWorld,\n";
559 "uniform float4x4 uWorldViewProj)\n") +
561 "oPosition_ = iPosition;\n";
564 VertexProgramData +=
"oWorldPosition = mul(uWorld, iPosition);\n";
568 "oPosition = mul(uWorldViewProj, iPosition);\n") +
570 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
574 "oUvProjection = mul(scalemat, oPosition);\n" +
581 VertexProgramData += Ogre::String(
"\n");
585 VertexProgramData +=
"uniform mat4 uWorld;\n";
589 VertexProgramData += Ogre::String(
590 "varying vec4 Position_;\n") +
591 "varying vec4 UVProjection;\n";
594 VertexProgramData +=
"varying vec4 WorldPosition;\n";
597 VertexProgramData +=Ogre::String(
600 "Position_ = gl_Vertex;\n";
603 VertexProgramData +=
"WorldPosition = uWorld * gl_Vertex;\n";
605 VertexProgramData += Ogre::String(
606 "gl_Position = ftransform();\n") +
607 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
608 " 0.0, -1.0, 0.0, 0.0,\n" +
609 " 0.0, 0.0, 1.0, 0.0,\n" +
610 " 0.0, 0.0, 0.0, 1.0);\n" +
611 "UVProjection = scalemat * gl_Position;\n" +
631 FragmentProgramData +=
632 Ogre::String(
"float3 expand(float3 v)\n") +
634 "return (v - 0.5) * 2;\n" +
639 "float4 iPosition : TEXCOORD0,\n";
643 FragmentProgramData +=
644 "float2 iUvNoise : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
647 FragmentProgramData +=
648 "float4 iUvProjection : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
652 FragmentProgramData +=
653 "float4 iNormal : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
658 FragmentProgramData +=
659 "float4 iWorldPosition : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
661 FragmentProgramData +=
664 "out float4 oColor : COLOR,\n") +
666 "uniform float3 uEyePosition,\n" +
667 "uniform float uFullReflectionDistance,\n" +
668 "uniform float uGlobalTransparency,\n" +
669 "uniform float uNormalDistortion,\n";
673 FragmentProgramData +=
674 "uniform float3 uWaterColor,\n";
678 FragmentProgramData +=
679 "uniform float uSmoothPower,\n";
683 FragmentProgramData += Ogre::String(
684 "uniform float3 uSunPosition,\n") +
685 "uniform float uSunStrength,\n" +
686 "uniform float uSunArea,\n" +
687 "uniform float3 uSunColor,\n";
691 FragmentProgramData += Ogre::String(
692 "uniform float uFoamRange,\n") +
693 "uniform float uFoamMaxDistance,\n" +
694 "uniform float uFoamScale,\n" +
695 "uniform float uFoamStart,\n" +
696 "uniform float uFoamTransparency,\n";
700 FragmentProgramData +=
701 "uniform float uCausticsPower,\n";
708 FragmentProgramData +=
709 "uniform sampler2D uNormalMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
713 FragmentProgramData +=
715 "uniform sampler2D uReflectionMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n") +
716 "uniform sampler2D uRefractionMap : register(s" + Ogre::StringConverter::toString(TexNum+1) +
"),\n";
722 FragmentProgramData +=
723 "uniform sampler2D uDepthMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
727 FragmentProgramData +=
728 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
729 "uniform sampler1D uFresnelMap : register(s" + Ogre::StringConverter::toString(TexNum) +
")";
731 "uniform sampler2D uFresnelMap : register(s" + Ogre::StringConverter::toString(TexNum) +
")";
737 FragmentProgramData += Ogre::String(
738 ",\nuniform sampler2D uFoamMap : register(s" + Ogre::StringConverter::toString(TexNum) +
")\n");
741 FragmentProgramData +=
742 Ogre::String(
")\n") +
744 "float2 ProjectionCoord = iUvProjection.xy / iUvProjection.w;\n" +
745 "float3 camToSurface = iPosition.xyz - uEyePosition;\n" +
746 "float additionalReflection=camToSurface.x*camToSurface.x+camToSurface.z*camToSurface.z;\n";
751 FragmentProgramData +=
752 "float foamVisibility=1.0f-saturate(additionalReflection/uFoamMaxDistance);\n";
755 FragmentProgramData +=
757 "additionalReflection/=uFullReflectionDistance;\n") +
758 "camToSurface=normalize(-camToSurface);\n";
761 FragmentProgramData += Ogre::String(
762 "float3 pixelNormal = tex2D(uNormalMap,iUvNoise);\n") +
764 "pixelNormal.yz=pixelNormal.zy;\n" +
766 "pixelNormal.xyz=expand(pixelNormal.xyz);\n";
770 FragmentProgramData +=
771 "float3 pixelNormal = iNormal;\n";
775 FragmentProgramData +=
776 "float3 pixelNormal = 2.0*tex2D(uNormalMap, ProjectionCoord.xy) - 1.0;\n";
778 FragmentProgramData +=
779 "float2 pixelNormalModified = uNormalDistortion*pixelNormal.zx;\n";
782 FragmentProgramData +=
783 "float dotProduct=dot(camToSurface,pixelNormal);\n";
787 FragmentProgramData +=
788 "float dotProduct=dot(-camToSurface,pixelNormal);\n";
790 FragmentProgramData +=
792 "dotProduct=saturate(dotProduct);\n") +
793 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
794 "float fresnel = tex1D(uFresnelMap,dotProduct);\n" +
796 "float fresnel = tex2D(uFresnelMap,float2(dotProduct,dotProduct));\n" +
799 "fresnel+=additionalReflection;\n" +
800 "fresnel=saturate(fresnel);\n" +
802 "fresnel-=uGlobalTransparency;\n" +
803 "fresnel=saturate(fresnel);\n" +
804 #if OGRE_PLATFORM != OGRE_PLATFORM_WIN32
806 "if(uEyePosition.y < 0.0)\n" +
808 "ProjectionCoord.y = 1.0 - ProjectionCoord.y;\n" +
812 "float3 reflection=tex2D(uReflectionMap,ProjectionCoord.xy+pixelNormalModified);\n" +
813 "float3 refraction=tex2D(uRefractionMap,ProjectionCoord.xy-pixelNormalModified);\n";
819 FragmentProgramData += Ogre::String(
820 "float2 depth = tex2D(uDepthMap,ProjectionCoord.xy-pixelNormalModified).rg;\n") +
821 "refraction *= 1+depth.y*uCausticsPower;\n" +
822 "refraction = lerp(uWaterColor,refraction,depth.x);\n";
826 FragmentProgramData += Ogre::String(
827 "float depth = tex2D(uDepthMap,ProjectionCoord.xy-pixelNormalModified).r;\n") +
828 "refraction = lerp(uWaterColor,refraction,depth);\n";
832 FragmentProgramData +=
833 "oColor = float4(lerp(refraction,reflection,fresnel),1);\n";
837 FragmentProgramData += Ogre::String(
838 "float3 relfectedVector = normalize(reflect(-camToSurface,pixelNormal.xyz));\n") +
839 "float3 surfaceToSun=normalize(uSunPosition-iPosition.xyz);\n" +
840 "float3 sunlight = uSunStrength*pow(saturate(dot(relfectedVector,surfaceToSun)),uSunArea)*uSunColor;\n" +
841 "oColor.xyz+=sunlight;\n";
846 FragmentProgramData += Ogre::String(
847 "float hmap = iPosition.y/uFoamRange*foamVisibility;\n") +
848 "float2 foamTex=iWorldPosition.xz*uFoamScale+pixelNormalModified;\n" +
849 "float foam=tex2D(uFoamMap,foamTex).r;\n" +
850 "float foamTransparency=saturate(hmap-uFoamStart)*uFoamTransparency;\n" +
851 "oColor.xyz=lerp(oColor.xyz,1,foamTransparency*foam);\n";
856 FragmentProgramData +=
857 "oColor.xyz = lerp(tex2D(uRefractionMap,ProjectionCoord.xy).xyz,oColor.xyz,saturate((1-tex2D(uDepthMap,ProjectionCoord.xy).r)*uSmoothPower));\n";
860 FragmentProgramData +=
866 FragmentProgramData += Ogre::String(
"\n") +
868 "uniform vec3 uEyePosition;\n" +
869 "uniform float uFullReflectionDistance;\n" +
870 "uniform float uGlobalTransparency;\n" +
871 "uniform float uNormalDistortion;\n" +
872 "uniform vec3 uWaterColor;\n";
876 FragmentProgramData +=
877 "uniform float uSmoothPower;\n";
881 FragmentProgramData += Ogre::String(
882 "uniform vec3 uSunPosition;\n") +
883 "uniform float uSunStrength;\n" +
884 "uniform float uSunArea;\n" +
885 "uniform vec3 uSunColor;\n";
889 FragmentProgramData += Ogre::String(
890 "uniform float uFoamRange;\n") +
891 "uniform float uFoamMaxDistance;\n" +
892 "uniform float uFoamScale;\n" +
893 "uniform float uFoamStart;\n" +
894 "uniform float uFoamTransparency;\n";
898 FragmentProgramData +=
899 "uniform float uCausticsPower;\n";
905 FragmentProgramData +=
906 "uniform sampler2D uNormalMap;\n";
910 FragmentProgramData += Ogre::String(
911 "uniform sampler2D uReflectionMap;\n") +
912 "uniform sampler2D uRefractionMap;\n";
917 FragmentProgramData +=
918 "uniform sampler2D uDepthMap;\n";
922 FragmentProgramData +=
923 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
924 "uniform sampler1D uFresnelMap;\n";
926 "uniform sampler2D uFresnelMap;\n";
932 FragmentProgramData +=
933 "uniform sampler2D uFoamMap;\n";
936 FragmentProgramData +=
937 "varying vec4 Position_;\n";
943 FragmentProgramData +=
944 "varying vec4 UVProjection;\n";
948 FragmentProgramData +=
949 "varying vec3 Normal;\n";
954 FragmentProgramData +=
955 "varying vec4 WorldPosition;\n";
958 FragmentProgramData += Ogre::String(
959 "vec3 expand(vec3 v)\n") +
961 "return (v - 0.5) * 2.0;\n" +
966 "vec2 ProjectionCoord = UVProjection.xy / UVProjection.w;\n" +
967 "ProjectionCoord += 1.0;\n" +
968 "ProjectionCoord *= 0.5;\n" +
969 "vec3 camToSurface = Position_.xyz - uEyePosition;\n" +
970 "float additionalReflection=camToSurface.x*camToSurface.x+camToSurface.z*camToSurface.z;\n";
974 FragmentProgramData +=
975 "float foamVisibility=1.0-clamp(additionalReflection/uFoamMaxDistance, 0.0, 1.0);\n";
977 FragmentProgramData += Ogre::String(
978 "additionalReflection/=uFullReflectionDistance;\n") +
979 "camToSurface=normalize(-camToSurface);\n";
982 FragmentProgramData += Ogre::String(
983 "vec3 pixelNormal = texture2D(uNormalMap,gl_TexCoord[0].xy).xyz;\n") +
985 "pixelNormal.yz=pixelNormal.zy;\n" +
987 "pixelNormal.xyz=expand(pixelNormal.xyz);\n";
991 FragmentProgramData +=
992 "vec3 pixelNormal = Normal;\n";
996 FragmentProgramData +=
997 "vec3 pixelNormal = 2.0*texture2D(uNormalMap, ProjectionCoord.xy).xyz - 1.0;\n";
999 FragmentProgramData +=
1000 "vec2 pixelNormalModified = uNormalDistortion*pixelNormal.zx;\n";
1003 FragmentProgramData +=
1004 "float dotProduct=dot(camToSurface,pixelNormal);\n";
1008 FragmentProgramData +=
1009 "float dotProduct=dot(-camToSurface,pixelNormal);\n";
1011 FragmentProgramData += Ogre::String(
1012 "dotProduct=clamp(dotProduct, 0.0, 1.0);\n") +
1013 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
1014 "float fresnel = texture1D(uFresnelMap,dotProduct).x;\n" +
1016 "float fresnel = texture2D(uFresnelMap,vec2(dotProduct,dotProduct)).x;\n" +
1019 "fresnel +=additionalReflection;\n" +
1020 "fresnel = clamp(fresnel, 0.0, 1.0);\n" +
1022 "fresnel -= uGlobalTransparency;\n" +
1023 "fresnel = clamp(fresnel*fresnel, 0.0, 1.0);\n" +
1025 "vec3 reflection=texture2D(uReflectionMap,ProjectionCoord.xy+pixelNormalModified).xyz;\n" +
1026 "vec3 refraction=texture2D(uRefractionMap,ProjectionCoord.xy-pixelNormalModified).xyz;\n";
1031 FragmentProgramData += Ogre::String(
1032 "vec2 depth = texture2D(uDepthMap,ProjectionCoord.xy-pixelNormalModified).xy;\n") +
1033 "refraction *= 1.0 + depth.y*uCausticsPower;\n" +
1034 "refraction = mix(uWaterColor,refraction,depth.x);\n";
1038 FragmentProgramData += Ogre::String(
1039 "float depth = texture2D(uDepthMap,ProjectionCoord.xy-pixelNormalModified).x;\n") +
1040 "refraction = mix(uWaterColor,refraction,depth);\n";
1043 FragmentProgramData += Ogre::String(
1044 "gl_FragColor = vec4(mix(refraction,reflection,fresnel),1.0);\n") +
1045 "gl_FragColor.xyz = mix(gl_FragColor.xyz, uWaterColor, uGlobalTransparency);\n";
1048 FragmentProgramData += Ogre::String(
1049 "vec3 relfectedVector = normalize(reflect(-camToSurface,pixelNormal.xyz));\n") +
1050 "vec3 surfaceToSun=normalize(uSunPosition-Position_.xyz);\n" +
1051 "vec3 sunlight = uSunStrength*pow(clamp(dot(relfectedVector,surfaceToSun),0.0,1.0),uSunArea)*uSunColor;\n" +
1052 "gl_FragColor.xyz+=sunlight;\n";
1056 FragmentProgramData += Ogre::String(
1057 "float hmap = Position_.y/uFoamRange*foamVisibility;\n") +
1058 "vec2 foamTex=WorldPosition.xz*uFoamScale+pixelNormalModified;\n" +
1059 "float foam=texture2D(uFoamMap,foamTex).x;\n" +
1060 "float foamTransparency=clamp(hmap-uFoamStart, 0.0, 1.0)*uFoamTransparency;\n" +
1061 "gl_FragColor.xyz=mix(gl_FragColor.xyz,vec3(1.0,1.0,1.0),foamTransparency*foam);\n";
1065 FragmentProgramData +=
1066 "gl_FragColor.xyz = mix(texture2D(uRefractionMap,ProjectionCoord.xy).xyz,gl_FragColor.xyz,clamp((1.0-texture2D(uDepthMap,ProjectionCoord.xy).x)*uSmoothPower, 0.0, 1.0));\n";
1068 FragmentProgramData +=
1078 WaterMaterial = Ogre::MaterialManager::getSingleton().
1080 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
1082 Ogre::Pass *WM_Technique0_Pass0 = WaterMaterial->getTechnique(0)->getPass(0);
1084 WM_Technique0_Pass0->setCullingMode(Ogre::CULL_NONE);
1085 WM_Technique0_Pass0->setDepthWriteEnabled(
true);
1087 Ogre::String GpuProgramsData[2] = {VertexProgramData, FragmentProgramData};
1089 Ogre::String EntryPoints[2];
1092 EntryPoints[0] = Ogre::String(
"main");
1093 EntryPoints[1] = Ogre::String(
"main");
1097 EntryPoints[0] = Ogre::String(
"main_vp");
1098 EntryPoints[1] = Ogre::String(
"main_fp");
1103 Ogre::GpuProgramParametersSharedPtr VP_Parameters = WM_Technique0_Pass0->getVertexProgramParameters();
1104 Ogre::GpuProgramParametersSharedPtr FP_Parameters = WM_Technique0_Pass0->getFragmentProgramParameters();
1108 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
1112 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
1114 FP_Parameters->setNamedAutoConstant(
"uEyePosition", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
1145 int GLSLTextUnit = 0;
1150 FP_Parameters->setNamedConstant(
"uNormalMap", GLSLTextUnit);
1153 WM_Technique0_Pass0->createTextureUnitState(
"HydraxNormalMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
1158 FP_Parameters->setNamedConstant(
"uReflectionMap", GLSLTextUnit);
1161 WM_Technique0_Pass0->createTextureUnitState(
"HydraxReflectionMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
1164 FP_Parameters->setNamedConstant(
"uRefractionMap", GLSLTextUnit);
1167 WM_Technique0_Pass0->createTextureUnitState(
"HydraxRefractionMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
1173 FP_Parameters->setNamedConstant(
"uDepthMap", GLSLTextUnit);
1176 WM_Technique0_Pass0->createTextureUnitState(
"HydraxDepthMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
1181 FP_Parameters->setNamedConstant(
"uFresnelMap", GLSLTextUnit);
1184 WM_Technique0_Pass0->createTextureUnitState(
"Fresnel.bmp")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
1190 FP_Parameters->setNamedConstant(
"uFoamMap", GLSLTextUnit);
1193 WM_Technique0_Pass0->createTextureUnitState(
"Foam.png")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
1196 WaterMaterial->setReceiveShadows(
false);
1197 WaterMaterial->load();
1206 Ogre::String VertexProgramData, FragmentProgramData;
1217 VertexProgramData +=
1219 "void main_vp(\n") +
1221 "float4 iPosition : POSITION,\n" +
1223 "out float4 oPosition : POSITION,\n" +
1224 "out float oPosition_ : TEXCOORD0,\n" +
1225 "out float2 oDistance : TEXCOORD1,\n" +
1227 "uniform float uPlaneYPos,\n" +
1228 "uniform float uPlanesError,\n" +
1229 "uniform float3 uCameraPos,\n" +
1230 "uniform float4x4 uWorld,\n" +
1231 "uniform float4x4 uWorldView,\n" +
1232 "uniform float4x4 uWorldViewProj)\n" +
1234 "oPosition = mul(uWorldViewProj, iPosition);\n" +
1235 "float3 wPos = mul(uWorld, iPosition).xyz;\n" +
1236 "float3 wCam = uCameraPos;\n" +
1237 "wPos.y -= uPlaneYPos;\n" +
1238 "wCam.y -= uPlaneYPos;\n" +
1239 "oPosition_ = wPos.y;\n" +
1241 "oDistance.x = distance(wPos, wCam);\n" +
1242 "oDistance.y = 1.0;\n" +
1244 "if(wCam.y > 0.0) {\n" +
1245 "oDistance.x *= 1.0 - wCam.y/(wCam.y + abs(wPos.y));\n" +
1247 "if(wPos.y > uPlanesError) {\n" +
1248 "oDistance.x *= abs(wCam.y)/(abs(wCam.y) + wPos.y);\n" +
1249 "oDistance.y = 0.0;\n" +
1255 VertexProgramData +=
1257 "void main_vp(\n") +
1259 "float4 iPosition : POSITION,\n" +
1261 "out float4 oPosition : POSITION,\n" +
1262 "out float oPosition_ : TEXCOORD0,\n" +
1263 "out float2 oDistance : TEXCOORD1,\n" +
1264 "out float2 oUvWorld : TEXCOORD2,\n" +
1266 "uniform float uPlaneYPos,\n" +
1267 "uniform float uPlanesError,\n" +
1268 "uniform float3 uCameraPos,\n" +
1269 "uniform float4x4 uWorld,\n" +
1270 "uniform float4x4 uWorldViewProj)\n" +
1272 "oPosition = mul(uWorldViewProj, iPosition);\n" +
1273 "float3 wPos = mul(uWorld, iPosition).xyz;\n" +
1274 "float3 wCam = uCameraPos;\n" +
1275 "wPos.y -= uPlaneYPos;\n" +
1276 "wCam.y -= uPlaneYPos;\n" +
1277 "oPosition_ = wPos.y;\n" +
1279 "oDistance.x = distance(wPos, wCam);\n" +
1280 "oDistance.y = 1.0;\n" +
1282 "if(wCam.y > 0.0) {\n" +
1283 "oDistance.x *= 1.0 - wCam.y/(wCam.y + abs(wPos.y));\n" +
1285 "if(wPos.y > uPlanesError) {\n" +
1286 "oDistance.x *= abs(wCam.y)/(abs(wCam.y) + wPos.y);\n" +
1287 "oDistance.y = 0.0;\n" +
1289 "oUvWorld = wPos.xz;\n" +
1299 VertexProgramData += Ogre::String(
"\n" ) +
1301 "uniform float uPlaneYPos;\n" +
1302 "uniform float uPlanesError;\n" +
1303 "uniform mat4 uWorld;\n" +
1306 "varying float Position_;\n" +
1307 "varying vec2 Distance_;\n" +
1312 "vec3 wPos = ( uWorld * gl_Vertex ).xyz;\n" +
1313 "vec3 wCam = ( uWorld * gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0) ).xyz;\n" +
1314 "wPos.y -= uPlaneYPos;\n" +
1315 "wCam.y -= uPlaneYPos;\n" +
1316 "Position_ = wPos.y;\n" +
1318 "vec4 mwPos = gl_ModelViewMatrix * gl_Vertex;\n" +
1319 "Distance_.x = abs(mwPos.z);\n" +
1320 "Distance_.y = 1.0;\n" +
1322 "if(wCam.y > 0.0) {\n" +
1323 "Distance_.x *= 1.0 - wCam.y/(wCam.y + abs(wPos.y));\n" +
1325 "if(wPos.y > uPlanesError) {\n" +
1326 "Distance_.x *= abs(wCam.y)/(abs(wCam.y) + wPos.y);\n" +
1327 "Distance_.y = 0.0;\n" +
1333 VertexProgramData += Ogre::String(
"\n" ) +
1335 "uniform float uPlaneYPos;\n" +
1336 "uniform float uPlanesError;\n" +
1337 "uniform mat4 uWorld;\n" +
1340 "varying float Position_;\n" +
1341 "varying vec2 Distance_;\n" +
1342 "varying vec2 UVWorld;\n" +
1346 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" +
1348 "vec3 wPos = ( uWorld * gl_Vertex ).xyz;\n" +
1349 "vec3 wCam = ( uWorld * gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0) ).xyz;\n" +
1350 "wPos.y -= uPlaneYPos;\n" +
1351 "wCam.y -= uPlaneYPos;\n" +
1352 "Position_ = wPos.y;\n" +
1354 "vec4 mwPos = gl_ModelViewMatrix * gl_Vertex;\n" +
1355 "Distance_.x = abs(mwPos.z);\n" +
1356 "Distance_.y = 1.0;\n" +
1358 "if(wCam.y > 0.0) {\n" +
1359 "Distance_.x *= 1.0 - wCam.y/(wCam.y + abs(wPos.y));\n" +
1361 "if(wPos.y > uPlanesError) {\n" +
1368 "Distance_.x *= abs(wCam.y)/(abs(wCam.y) + wPos.y);\n" +
1369 "Distance_.y = 0.0;\n" +
1371 "UVWorld = wPos.xz;\n" +
1385 FragmentProgramData +=
1387 "void main_fp(\n") +
1389 "float iPosition : TEXCOORD0,\n" +
1390 "float2 iDistance : TEXCOORD1,\n" +
1392 "out float4 oColor : COLOR,\n" +
1394 "uniform float uDepthLimit,\n" +
1395 "uniform float uDistLimit)\n" +
1397 "float pixelYDepth = saturate(iPosition*uDepthLimit + 1.0);\n" +
1398 "float pixelDepth = saturate(1.0 - iDistance.x*uDistLimit);\n" +
1399 "pixelDepth = min(pixelYDepth, pixelDepth);\n" +
1400 "oColor = float4(pixelDepth,0,0,0);\n" +
1405 FragmentProgramData +=
1407 "void main_fp(\n") +
1409 "float iPosition : TEXCOORD0,\n" +
1410 "float2 iDistance : TEXCOORD1,\n" +
1411 "float2 iUvWorld : TEXCOORD2,\n" +
1413 "out float4 oColor : COLOR,\n" +
1415 "uniform float uDepthLimit,\n" +
1416 "uniform float uDistLimit,\n" +
1417 "uniform float uCausticsScale,\n" +
1418 "uniform float uCausticsEnd,\n" +
1419 "uniform sampler2D uCaustics : register(s0))\n" +
1421 "float pixelYDepth = saturate(iPosition*uDepthLimit + 1.0);\n" +
1423 "float pixelDepth = saturate(1.0 - iDistance.x*uDistLimit);\n" +
1424 "pixelDepth = min(pixelYDepth, pixelDepth);\n" +
1425 "oColor = float4(pixelDepth,0.0,0.0,0.0);\n" +
1426 "oColor.g = iDistance.y*saturate((pixelYDepth-uCausticsEnd)/(1.0-uCausticsEnd))*tex2D(uCaustics, iUvWorld/uCausticsScale).x;\n" +
1436 FragmentProgramData += Ogre::String(
"\n" ) +
1438 "uniform float uDepthLimit;\n" +
1439 "uniform float uDistLimit;\n" +
1441 "varying float Position_;\n" +
1442 "varying float Distance_;\n" +
1447 "float pixelYDepth = clamp(1.0 + Position_*uDepthLimit, 0.0, 1.0);\n" +
1448 "float pixelDepth = clamp(1.0 - Distance_.x*uDistLimit, 0.0, 1.0);\n" +
1449 "pixelDepth = min(pixelYDepth,pixelDepth);\n" +
1450 "gl_FragColor = vec4(pixelDepth,0.0,0.0,1.0);\n" +
1455 FragmentProgramData += Ogre::String(
"\n" ) +
1457 "uniform float uDepthLimit;\n" +
1458 "uniform float uDistLimit;\n" +
1459 "uniform float uCausticsScale;\n" +
1460 "uniform float uCausticsEnd;\n" +
1461 "uniform sampler2D uCaustics;\n" +
1463 "varying float Position_;\n" +
1464 "varying vec2 Distance_;\n" +
1465 "varying vec2 UVWorld;\n" +
1470 "float pixelYDepth = clamp(1.0 + Position_*uDepthLimit, 0.0, 1.0);\n" +
1471 "float pixelDepth = clamp(1.0 - Distance_.x*uDistLimit, 0.0, 1.0);\n" +
1472 "pixelDepth = min(pixelYDepth,pixelDepth);\n" +
1473 "gl_FragColor = vec4(pixelDepth,0.0,0.0,1.0);\n" +
1474 "gl_FragColor.y = Distance_.y*clamp((pixelYDepth-uCausticsEnd)/(1.0-uCausticsEnd), 0.0, 1.0)*texture2D(uCaustics, UVWorld/uCausticsScale).x;\n" +
1482 DepthMaterial = Ogre::MaterialManager::getSingleton().
1484 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
1486 DepthMaterial->getTechnique(0)->setSchemeName(
"HydraxDepth");
1488 Ogre::Pass *DM_Technique0_Pass0 = DepthMaterial->getTechnique(0)->getPass(0);
1490 Ogre::String GpuProgramsData[2] = {VertexProgramData, FragmentProgramData};
1492 Ogre::String EntryPoints[2];
1495 EntryPoints[0] = Ogre::String(
"main");
1496 EntryPoints[1] = Ogre::String(
"main");
1500 EntryPoints[0] = Ogre::String(
"main_vp");
1501 EntryPoints[1] = Ogre::String(
"main_fp");
1506 Ogre::GpuProgramParametersSharedPtr VP_Parameters = DM_Technique0_Pass0->getVertexProgramParameters();
1507 Ogre::GpuProgramParametersSharedPtr FP_Parameters = DM_Technique0_Pass0->getFragmentProgramParameters();
1511 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
1513 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION);
1515 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
1529 FP_Parameters->setNamedConstant(
"uCaustics", 0);
1531 Ogre::TextureUnitState* TUS_Caustics = DM_Technique0_Pass0->createTextureUnitState(
"Caustics.bmp");
1532 TUS_Caustics->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
1534 TUS_Caustics->setAnimatedTextureName(
"Caustics.bmp", 32);
1538 DepthMaterial->setReceiveShadows(
false);
1539 DepthMaterial->load();
1573 Ogre::String VertexProgramData, FragmentProgramData;
1584 VertexProgramData +=
1586 "void main_vp(\n") +
1588 "float4 iPosition : POSITION,\n" +
1589 "float2 iUV : TEXCOORD0,\n" +
1591 "out float4 oPosition : POSITION,\n" +
1592 "out float3 oPosition_UV : TEXCOORD0,\n" +
1594 "uniform float uPlaneYPos,\n" +
1595 "uniform float4x4 uWorld,\n" +
1596 "uniform float4x4 uWorldViewProj)\n" +
1598 "oPosition = mul(uWorldViewProj, iPosition);\n" +
1599 "oPosition_UV.x = mul(uWorld, iPosition).y;\n" +
1600 "oPosition_UV.x-=uPlaneYPos;\n" +
1601 "oPosition_UV.yz = iUV;\n" +
1606 VertexProgramData +=
1608 "void main_vp(\n") +
1610 "float4 iPosition : POSITION,\n" +
1611 "float2 iUV : TEXCOORD0,\n" +
1613 "out float4 oPosition : POSITION,\n" +
1614 "out float3 oPosition_UV : TEXCOORD0,\n" +
1615 "out float2 oUvWorld : TEXCOORD1,\n" +
1617 "uniform float uPlaneYPos,\n" +
1618 "uniform float4x4 uWorld,\n" +
1619 "uniform float4x4 uWorldViewProj)\n" +
1621 "oPosition = mul(uWorldViewProj, iPosition);\n" +
1622 "float3 wPos = mul(uWorld, iPosition);\n" +
1623 "oPosition_UV.x = wPos.y;\n" +
1624 "oPosition_UV.x-=uPlaneYPos;\n" +
1625 "oPosition_UV.yz = iUV;\n" +
1626 "oUvWorld = wPos.xz;\n" +
1636 VertexProgramData += Ogre::String(
"\n" ) +
1638 "uniform float uPlaneYPos;\n" +
1639 "uniform mat4 uWorld;\n" +
1642 "varying vec3 Position_UV;\n" +
1646 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" +
1647 "Position_UV.x = (uWorld * gl_Vertex).y;\n" +
1648 "Position_UV.x -= uPlaneYPos;\n" +
1649 "Position_UV.yz = gl_MultiTexCoord0;\n" +
1654 VertexProgramData += Ogre::String(
"\n" ) +
1656 "uniform float uPlaneYPos;\n" +
1657 "uniform mat4 uWorld;\n" +
1660 "varying vec3 Position_UV;\n" +
1661 "varying vec2 UVWorld;\n" +
1665 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" +
1666 "vec3 wPos = uWorld * iPosition;\n" +
1667 "Position_UV.x = wPos.y;\n" +
1668 "Position_UV.x -= uPlaneYPos;\n" +
1669 "Position_UV.yz = gl_MultiTexCoord0;\n" +
1670 "UVWorld = wPos.xz;\n" +
1685 FragmentProgramData +=
1687 "void main_fp(\n") +
1689 "float3 iPosition_UV : TEXCOORD0,\n" +
1691 "out float4 oColor : COLOR,\n" +
1693 "uniform float uDepthLimit,\n" +
1694 "uniform sampler2D uAlphaTex : register(s0))\n" +
1696 "float pixelYDepth = (iPosition_UV.x*uDepthLimit+1);\n" +
1697 "pixelYDepth = saturate(pixelYDepth);\n" +
1698 "oColor = float4(pixelYDepth,0,0,0);\n" +
1699 "oColor.a = tex2D(uAlphaTex, iPosition_UV.yz)."+AlphaChannel+
";" +
1704 FragmentProgramData +=
1706 "void main_fp(\n") +
1708 "float3 iPosition_UV : TEXCOORD0,\n" +
1709 "float2 iUvWorld : TEXCOORD1,\n" +
1711 "out float4 oColor : COLOR,\n" +
1713 "uniform float uDepthLimit,\n" +
1714 "uniform float uCausticsScale,\n" +
1715 "uniform float uCausticsEnd,\n" +
1716 "uniform sampler2D uCaustics : register(s0),\n" +
1717 "uniform sampler2D uAlphaTex : register(s1))\n" +
1719 "float pixelYDepth = (iPosition_UV.x*uDepthLimit+1);\n" +
1720 "pixelYDepth = saturate(pixelYDepth);\n" +
1721 "oColor = float4(pixelYDepth,0,0,0);\n" +
1722 "oColor.g = saturate(uCausticsEnd-pixelYDepth)*tex2D(uCaustics, iUvWorld/uCausticsScale).r;\n" +
1723 "oColor.a = tex2D(uAlphaTex, iPosition_UV.yz)."+AlphaChannel+
";" +
1731 Ogre::String AlphaChannelGLSL = AlphaChannel;
1732 std::replace( AlphaChannelGLSL.begin(), AlphaChannelGLSL.end(),
'r',
'x' );
1733 std::replace( AlphaChannelGLSL.begin(), AlphaChannelGLSL.end(),
'g',
'y' );
1734 std::replace( AlphaChannelGLSL.begin(), AlphaChannelGLSL.end(),
'b',
'z' );
1735 std::replace( AlphaChannelGLSL.begin(), AlphaChannelGLSL.end(),
'a',
'w' );
1739 FragmentProgramData += Ogre::String(
"\n" ) +
1741 "uniform float uDepthLimit;\n" +
1742 "uniform float uDistLimit;\n" +
1743 "uniform sampler2D uAlphaTex;\n" +
1745 "variying vec3 Position_UV;\n" +
1750 "float pixelYDepth = clamp(Position_UV.x*uDepthLimit + 1.0, 0.0, 1.0);\n" +
1751 "gl_FragColor = vec4(pixelYDepth,0.0,0.0,0.0);\n" +
1752 "gl_FragColor.w = texture2D(uAlphaTex, iPosition_UV.yz)."+AlphaChannelGLSL+
";" +
1757 FragmentProgramData += Ogre::String(
"\n" ) +
1759 "uniform float uDistLimit;\n" +
1760 "uniform float uCausticsScale;\n" +
1761 "uniform float uCausticsEnd;\n" +
1762 "uniform sampler2D uCaustics;\n" +
1763 "uniform sampler2D uAlphaTex;\n" +
1765 "variying vec3 Position_UV;\n" +
1766 "variying vec2 UVWorld;\n" +
1771 "float pixelYDepth = clamp(Position_UV.x*uDepthLimit + 1.0, 0.0, 1.0);\n" +
1772 "gl_FragColor = vec4(pixelYDepth,0.0,0.0,0.0);\n" +
1773 "gl_FragColor.y = clamp(uCausticsEnd-pixelYDepth, 0.0, 1.0)*texture2D(uCaustics, UVWorld/uCausticsScale).x;\n" +
1774 "gl_FragColor.w = texture2D(uAlphaTex, iPosition_UV.yz)."+AlphaChannelGLSL+
";" +
1781 Ogre::String GpuProgramsData[2] = {VertexProgramData, FragmentProgramData};
1783 Ogre::String EntryPoints[2];
1786 EntryPoints[0] = Ogre::String(
"main");
1787 EntryPoints[1] = Ogre::String(
"main");
1791 EntryPoints[0] = Ogre::String(
"main_vp");
1792 EntryPoints[1] = Ogre::String(
"main_fp");
1797 for (
int k = 0; k < 2; k++)
1817 Ogre::String VertexProgramData, FragmentProgramData;
1829 VertexProgramData +=
1831 "void main_vp(\n") +
1833 "float4 iPosition : POSITION,\n" +
1834 "float2 iUv : TEXCOORD0,\n" +
1836 "out float4 oPosition : POSITION,\n" +
1837 "out float4 oPosition_ : TEXCOORD0,\n" +
1838 "out float2 oUvNoise : TEXCOORD1,\n" +
1839 "out float4 oUvProjection : TEXCOORD2,\n" +
1840 "out float2 oDistance : TEXCOORD3,\n";
1848 VertexProgramData += Ogre::String(
1850 "uniform float4x4 uWorldViewProj,\n") +
1851 "uniform float4x4 uWorldView,\n" +
1852 "uniform float4x4 uWorld,\n" +
1853 "uniform float3 uCameraPos)\n" +
1855 "oPosition_ = iPosition;\n";
1863 VertexProgramData += Ogre::String(
1864 "oPosition = mul(uWorldViewProj, iPosition);\n") +
1866 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
1870 "oUvProjection = mul(scalemat, oPosition);\n" +
1871 "oUvNoise = iUv;\n" +
1873 "float4 mwPos = mul(uWorldView, iPosition);\n" +
1874 "oDistance.x = abs(mwPos.z);\n" +
1875 "oDistance.y = -mul( uWorld, float4(uCameraPos, 1.0) ).y;\n" +
1882 VertexProgramData += Ogre::String(
"\n" );
1884 VertexProgramData +=
"uniform mat4 uWorld;\n";
1887 VertexProgramData += Ogre::String(
1888 "varying vec4 Position_;\n") +
1889 "varying vec4 UVProjection;\n" +
1890 "varying vec2 Distance_;\n";
1898 VertexProgramData += Ogre::String(
1901 "Position_ = gl_Vertex;\n";
1908 VertexProgramData += Ogre::String(
1910 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n") +
1911 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
1912 " 0.0, -1.0, 0.0, 0.0,\n" +
1913 " 0.0, 0.0, 1.0, 0.0,\n" +
1914 " 0.0, 0.0, 0.0, 1.0);\n" +
1915 "UVProjection = scalemat * gl_Position;\n" +
1916 "gl_TexCoord[0] = gl_MultiTexCoord0;\n" +
1918 "vec4 mwPos = gl_ModelViewMatrix * gl_Vertex;\n" +
1919 "Distance_.x = abs(mwPos.z);\n" +
1920 "Distance_.y = -( uWorld * gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0) ).y;\n" +
1934 VertexProgramData +=
1936 "void main_vp(\n") +
1938 "float4 iPosition : POSITION,\n" +
1939 "float3 iNormal : NORMAL,\n"+
1941 "out float4 oPosition : POSITION,\n" +
1942 "out float4 oPosition_ : TEXCOORD0,\n" +
1943 "out float4 oUvProjection : TEXCOORD1,\n" +
1944 "out float3 oNormal : TEXCOORD2,\n" +
1945 "out float2 oDistance : TEXCOORD3,\n";
1953 VertexProgramData += Ogre::String(
1955 "uniform float4x4 uWorldViewProj,\n") +
1956 "uniform float4x4 uWorldView,\n" +
1957 "uniform float4x4 uWorld,\n" +
1958 "uniform float3 uCameraPos)\n" +
1960 "oPosition_ = iPosition;\n";
1967 VertexProgramData += Ogre::String(
1968 "oPosition = mul(uWorldViewProj, iPosition);\n") +
1970 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
1974 "oUvProjection = mul(scalemat, oPosition);\n" +
1975 "oNormal = normalize(iNormal);\n"+
1977 "float4 mwPos = mul(uWorldView, iPosition);\n" +
1978 "oDistance.x = abs(mwPos.z);\n" +
1979 "oDistance.y = -mul( uWorld, float4(uCameraPos, 1.0) ).y;\n" +
1986 VertexProgramData += Ogre::String(
"\n");
1988 VertexProgramData +=
"uniform mat4 uWorld;\n";
1991 VertexProgramData += Ogre::String(
1992 "varying vec4 Position_;\n") +
1993 "varying vec4 UVProjection;\n" +
1994 "varying vec3 Normal;\n" +
1995 "varying vec2 Distance_;\n";
2003 VertexProgramData += Ogre::String(
2006 "Position_ = gl_Vertex;\n";
2013 VertexProgramData += Ogre::String(
2014 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n") +
2015 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
2016 " 0.0, -1.0, 0.0, 0.0,\n" +
2017 " 0.0, 0.0, 1.0, 0.0,\n" +
2018 " 0.0, 0.0, 0.0, 1.0);\n" +
2019 "UVProjection = scalemat * gl_Position;\n" +
2020 "Normal = normalize(gl_Normal);\n" +
2022 "vec4 mwPos = gl_ModelViewMatrix * gl_Vertex;\n" +
2023 "Distance_.x = abs(mwPos.z);\n" +
2024 "Distance_.y = -( uWorld * gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0) ).y;\n" +
2038 VertexProgramData +=
2040 "void main_vp(\n") +
2042 "float4 iPosition : POSITION,\n" +
2044 "out float4 oPosition : POSITION,\n" +
2045 "out float4 oPosition_ : TEXCOORD0,\n" +
2046 "out float4 oUvProjection : TEXCOORD1,\n" +
2047 "out float2 oDistance : TEXCOORD2,\n";
2055 VertexProgramData += Ogre::String(
2057 "uniform float4x4 uWorldViewProj,\n") +
2058 "uniform float4x4 uWorldView,\n" +
2059 "uniform float4x4 uWorld,\n" +
2060 "uniform float3 uCameraPos)\n" +
2062 "oPosition_ = iPosition;\n";
2069 VertexProgramData += Ogre::String(
2070 "oPosition = mul(uWorldViewProj, iPosition);\n") +
2072 "float4x4 scalemat = float4x4(0.5, 0, 0, 0.5,"+
2076 "oUvProjection = mul(scalemat, oPosition);\n" +
2078 "float4 mwPos = mul(uWorldView, iPosition);\n" +
2079 "oDistance.x = abs(mwPos.z);\n" +
2080 "oDistance.y = -mul( uWorld, float4(uCameraPos, 1.0) ).y;\n" +
2087 VertexProgramData += Ogre::String(
"\n");
2089 VertexProgramData +=
"uniform mat4 uWorld;\n";
2092 VertexProgramData += Ogre::String(
2093 "varying vec4 Position_;\n") +
2094 "varying vec4 UVProjection;\n" +
2095 "varying vec2 Distance_;\n";
2103 VertexProgramData +=Ogre::String(
2106 "Position_ = gl_Vertex;\n";
2113 VertexProgramData += Ogre::String(
2114 "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n") +
2115 "mat4 scalemat = mat4( 1.0, 0.0, 0.0, 0.0,\n" +
2116 " 0.0, -1.0, 0.0, 0.0,\n" +
2117 " 0.0, 0.0, 1.0, 0.0,\n" +
2118 " 0.0, 0.0, 0.0, 1.0);\n" +
2119 "UVProjection = scalemat * gl_Position;\n" +
2121 "vec4 mwPos = gl_ModelViewMatrix * gl_Vertex;\n" +
2122 "Distance_.x = abs(mwPos.z);\n" +
2123 "Distance_.y = -( uWorld * gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0) ).y;\n" +
2142 FragmentProgramData +=
2143 Ogre::String(
"float3 expand(float3 v)\n") +
2145 "return (v - 0.5) * 2;\n" +
2150 "float4 iPosition : TEXCOORD0,\n";
2151 int TEXCOORDNUM = 1;
2154 FragmentProgramData +=
2155 "float2 iUvNoise : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
2158 FragmentProgramData +=
2159 "float4 iUvProjection : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
2163 FragmentProgramData +=
2164 "float3 iNormal : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
2167 FragmentProgramData +=
2168 "float2 iDistance : TEXCOORD" + Ogre::StringConverter::toString(TEXCOORDNUM) +
",\n";
2178 FragmentProgramData += Ogre::String(
2180 "out float4 oColor : COLOR,\n") +
2182 "uniform float3 uEyePosition,\n" +
2183 "uniform float uFullReflectionDistance,\n" +
2184 "uniform float uGlobalTransparency,\n" +
2185 "uniform float uNormalDistortion,\n" +
2186 "uniform float uDistLimit,\n" +
2187 "uniform float3 uWaterColor,\n";
2190 FragmentProgramData += Ogre::String(
2191 "uniform float3 uSunPosition,\n") +
2192 "uniform float uSunStrength,\n" +
2193 "uniform float uSunArea,\n" +
2194 "uniform float3 uSunColor,\n" +
2195 "uniform float uDepthLimit,\n";
2208 if (cCaustics && cUReflections)
2210 FragmentProgramData +=
2211 "uniform float uCausticsPower,\n";
2218 FragmentProgramData +=
2219 "uniform sampler2D uNormalMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
2224 FragmentProgramData +=
2225 "uniform sampler2D uReflectionMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
2229 FragmentProgramData +=
2230 "uniform sampler2D uRefractionMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
2233 if (cDepth && cUReflections)
2235 FragmentProgramData +=
2236 "uniform sampler2D uDepthReflectionMap : register(s" + Ogre::StringConverter::toString(TexNum) +
"),\n";
2240 FragmentProgramData +=
2241 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
2242 "uniform sampler1D uFresnelMap : register(s" + Ogre::StringConverter::toString(TexNum) +
")";
2244 "uniform sampler2D uFresnelMap : register(s" + Ogre::StringConverter::toString(TexNum) +
")";
2255 FragmentProgramData += Ogre::String(
2258 "float2 ProjectionCoord = iUvProjection.xy / iUvProjection.w;\n" +
2259 "float3 camToSurface = iPosition.xyz - uEyePosition;\n" +
2260 "float additionalReflection=camToSurface.x*camToSurface.x+camToSurface.z*camToSurface.z;\n";
2271 FragmentProgramData += Ogre::String(
2272 "additionalReflection/=uFullReflectionDistance;\n") +
2273 "camToSurface=normalize(-camToSurface);\n";
2276 FragmentProgramData += Ogre::String(
2277 "float3 pixelNormal = tex2D(uNormalMap,iUvNoise).xyz;\n") +
2279 "pixelNormal.yz=pixelNormal.zy;\n" +
2281 "pixelNormal.xyz=-expand(pixelNormal.xyz);\n";
2285 FragmentProgramData +=
2286 "float3 pixelNormal = -iNormal;\n";
2290 FragmentProgramData +=
2291 "float3 pixelNormal = -(2.0*tex2D(uNormalMap, ProjectionCoord.xy).xyz - 1.0);\n";
2293 FragmentProgramData +=
2294 "float2 pixelNormalModified = uNormalDistortion*pixelNormal.zx;\n";
2298 FragmentProgramData +=
2299 "float dotProduct=dot(camToSurface,pixelNormal);\n";
2303 FragmentProgramData +=
2304 "float dotProduct=dot(-camToSurface,pixelNormal);\n";
2306 FragmentProgramData += Ogre::String(
2307 "dotProduct=saturate(dotProduct);\n") +
2308 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
2309 "float fresnel = tex1D(uFresnelMap,dotProduct);\n" +
2311 "float fresnel = tex2D(uFresnelMap,float2(dotProduct,dotProduct));\n" +
2314 "fresnel+=additionalReflection;\n" +
2315 "fresnel=saturate(fresnel);\n" +
2317 "fresnel-=uGlobalTransparency;\n" +
2318 "fresnel=saturate(fresnel);\n" +
2319 "float3 reflection;\n" +
2320 #if OGRE_PLATFORM != OGRE_PLATFORM_WIN32
2322 "if(uEyePosition.y < 0.0)\n" +
2324 "ProjectionCoord.y = 1.0 - ProjectionCoord.y;\n" +
2328 "float3 refraction=tex2D(uRefractionMap,ProjectionCoord.xy-pixelNormalModified).xyz;\n";
2331 FragmentProgramData +=
2332 "reflection=tex2D(uReflectionMap,ProjectionCoord.xy+pixelNormalModified).xyz;\n";
2336 FragmentProgramData +=
2337 "reflection=uWaterColor;\n";
2340 if (cDepth && cUReflections)
2344 FragmentProgramData += Ogre::String(
2345 "float2 depth = tex2D(uDepthReflectionMap,ProjectionCoord.xy+pixelNormalModified).rg;\n") +
2346 "reflection *= 1+depth.y*uCausticsPower;\n" +
2347 "reflection = lerp(uWaterColor,reflection,depth.x);\n";
2351 FragmentProgramData += Ogre::String(
2352 "float depth = tex2D(uDepthReflectionMap,ProjectionCoord.xy-pixelNormalModified).r;\n") +
2353 "reflection = lerp(uWaterColor,reflection,depth);\n";
2356 FragmentProgramData += Ogre::String(
2357 "float4 Color = float4(lerp(refraction,reflection,fresnel),1);\n" ) +
2358 "float Distance = saturate(1.0 - iDistance.x*uDistLimit);\n" +
2359 "Color.xyz = lerp(uWaterColor, Color.xyz, Distance);\n" +
2360 "Color.xyz = lerp(Color.xyz, uWaterColor, uGlobalTransparency);\n";
2364 FragmentProgramData += Ogre::String(
2365 "float3 refractedVector = normalize(reflect(camToSurface, pixelNormal.xyz));\n") +
2366 "float3 surfaceToSun=normalize(uSunPosition-iPosition.xyz);\n" +
2368 "surfaceToSun.xz = -surfaceToSun.xz;" +
2369 "float3 sunlight = uSunStrength*pow(saturate(dot(refractedVector,surfaceToSun)),uSunArea)*uSunColor;\n" +
2370 "Distance = saturate(1.0 - iDistance.y*uDepthLimit);\n" +
2371 "Color.xyz+=Distance*sunlight*saturate(1.0-additionalReflection);\n";
2385 FragmentProgramData += Ogre::String(
2386 "oColor = Color;\n") +
2392 FragmentProgramData += Ogre::String(
"\n") +
2394 "uniform vec3 uEyePosition;\n" +
2395 "uniform float uFullReflectionDistance;\n" +
2396 "uniform float uGlobalTransparency;\n" +
2397 "uniform float uNormalDistortion;\n" +
2398 "uniform float uDistLimit;\n" +
2399 "uniform vec3 uWaterColor;\n";
2403 FragmentProgramData += Ogre::String(
2404 "uniform vec3 uSunPosition;\n") +
2405 "uniform float uSunStrength;\n" +
2406 "uniform float uSunArea;\n" +
2407 "uniform vec3 uSunColor;\n" +
2408 "uniform float uDepthLimit;\n";
2421 if (cCaustics && cUReflections)
2423 FragmentProgramData +=
2424 "uniform float uCausticsPower;\n";
2430 FragmentProgramData +=
2431 "uniform sampler2D uNormalMap;\n";
2437 FragmentProgramData += Ogre::String(
2438 "uniform sampler2D uReflectionMap;\n");
2441 FragmentProgramData += Ogre::String(
2442 "uniform sampler2D uRefractionMap;\n");
2445 if (cDepth && cUReflections)
2447 FragmentProgramData +=
2448 "uniform sampler2D uDepthReflectionMap;\n";
2452 FragmentProgramData +=
2453 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
2454 "uniform sampler1D uFresnelMap;\n";
2456 "uniform sampler2D uFresnelMap;\n";
2468 FragmentProgramData +=
2469 "varying vec4 Position_;\n";
2470 int TEXCOORDNUM = 1;
2475 FragmentProgramData +=
2476 "varying vec4 UVProjection;\n";
2480 FragmentProgramData +=
2481 "varying vec3 Normal;\n";
2491 FragmentProgramData +=
2492 "varying vec2 Distance_;\n";
2494 FragmentProgramData += Ogre::String(
2495 "vec3 expand(vec3 v)\n") +
2497 "return (v - 0.5) * 2.0;\n" +
2502 "vec2 ProjectionCoord = UVProjection.xy / UVProjection.w;\n" +
2503 "ProjectionCoord += 1.0;\n" +
2504 "ProjectionCoord *= 0.5;\n" +
2505 "vec3 camToSurface = Position_.xyz - uEyePosition;\n" +
2506 "float additionalReflection=camToSurface.x*camToSurface.x+camToSurface.z*camToSurface.z;\n";
2515 FragmentProgramData += Ogre::String(
2516 "additionalReflection/=uFullReflectionDistance;\n") +
2517 "camToSurface=normalize(-camToSurface);\n";
2520 FragmentProgramData += Ogre::String(
2521 "vec3 pixelNormal = texture2D(uNormalMap,gl_TexCoord[0].xy).xyz;\n") +
2523 "pixelNormal.yz=pixelNormal.zy;\n" +
2525 "pixelNormal.xyz=-expand(pixelNormal.xyz);\n";
2529 FragmentProgramData +=
2530 "vec3 pixelNormal = -Normal;\n";
2534 FragmentProgramData +=
2535 "vec3 pixelNormal = -2.0*texture2D(uNormalMap, ProjectionCoord.xy).xyz - 1.0;\n";
2537 FragmentProgramData +=
2538 "vec2 pixelNormalModified = uNormalDistortion*pixelNormal.zx;\n";
2541 FragmentProgramData +=
2542 "float dotProduct=dot(camToSurface,pixelNormal);\n";
2546 FragmentProgramData +=
2547 "float dotProduct=dot(-camToSurface,pixelNormal);\n";
2549 FragmentProgramData += Ogre::String(
2550 "dotProduct=clamp(dotProduct, 0.0, 1.0);\n") +
2551 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
2552 "float fresnel = texture1D(uFresnelMap,dotProduct).x;\n" +
2554 "float fresnel = texture2D(uFresnelMap,vec2(dotProduct,dotProduct)).x;\n" +
2557 "fresnel +=additionalReflection;\n" +
2558 "fresnel = clamp(fresnel, 0.0, 1.0);\n" +
2560 "fresnel -= uGlobalTransparency;\n" +
2561 "fresnel = clamp(fresnel, 0.0, 1.0);\n" +
2563 "vec3 reflection;\n" +
2564 #if OGRE_PLATFORM != OGRE_PLATFORM_WIN32
2566 "if(uEyePosition.y < 0.0)\n" +
2568 "ProjectionCoord.y = 1.0 - ProjectionCoord.y;\n" +
2571 "vec3 refraction=texture2D(uRefractionMap,ProjectionCoord.xy-pixelNormalModified).xyz;\n";
2574 FragmentProgramData +=
2575 "reflection=texture2D(uReflectionMap,ProjectionCoord.xy+pixelNormalModified).xyz;\n";
2579 FragmentProgramData +=
2580 "reflection=uWaterColor;\n";
2582 if (cDepth && cUReflections)
2586 FragmentProgramData += Ogre::String(
2587 "vec2 depth = texture2D(uDepthReflectionMap,ProjectionCoord.xy+pixelNormalModified).xy;\n") +
2588 "reflection *= 1.0 + depth.y*uCausticsPower;\n" +
2589 "reflection = mix(uWaterColor,reflection,depth.x);\n";
2593 FragmentProgramData += Ogre::String(
2594 "float depth = texture2D(uDepthReflectionMap,ProjectionCoord.xy+pixelNormalModified).x;\n") +
2595 "reflection = mix(uWaterColor,reflection,depth);\n";
2598 FragmentProgramData += Ogre::String(
2599 "gl_FragColor = vec4(mix(refraction,reflection,fresnel),1.0);\n") +
2600 "float Distance = clamp(1.0 - Distance_.x*uDistLimit, 0.0, 1.0);\n" +
2601 "gl_FragColor.xyz = mix(uWaterColor, gl_FragColor.xyz, Distance);\n" +
2602 "gl_FragColor.xyz = mix(gl_FragColor.xyz, uWaterColor, uGlobalTransparency);\n";
2605 FragmentProgramData += Ogre::String(
2606 "vec3 refractedVector = normalize(reflect(-camToSurface,pixelNormal.xyz));\n") +
2607 "vec3 surfaceToSun=normalize(uSunPosition-Position_.xyz);\n" +
2609 "surfaceToSun.xz = -surfaceToSun.xz;" +
2610 "vec3 sunlight = uSunStrength*pow(clamp(dot(refractedVector,surfaceToSun),0.0,1.0),uSunArea)*uSunColor;\n" +
2611 "Distance = clamp(1.0 - Distance_.y*uDepthLimit, 0.0, 1.0);\n";
2612 "gl_FragColor.xyz+=Distance*sunlight*clamp(1.0 - additionalReflection, 0.0, 1.0);\n";
2625 FragmentProgramData +=
2635 UnderwaterMaterial = Ogre::MaterialManager::getSingleton().
2637 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
2639 Ogre::Pass *UM_Technique0_Pass0 = UnderwaterMaterial->getTechnique(0)->getPass(0);
2641 UM_Technique0_Pass0->setDepthWriteEnabled(
true);
2642 UM_Technique0_Pass0->setCullingMode(Ogre::CULL_NONE);
2644 Ogre::String GpuProgramsData[2] = {VertexProgramData, FragmentProgramData};
2646 Ogre::String EntryPoints[2];
2649 EntryPoints[0] = Ogre::String(
"main");
2650 EntryPoints[1] = Ogre::String(
"main");
2654 EntryPoints[0] = Ogre::String(
"main_vp");
2655 EntryPoints[1] = Ogre::String(
"main_fp");
2660 Ogre::GpuProgramParametersSharedPtr VP_Parameters = UM_Technique0_Pass0->getVertexProgramParameters();
2661 Ogre::GpuProgramParametersSharedPtr FP_Parameters = UM_Technique0_Pass0->getFragmentProgramParameters();
2665 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
2666 VP_Parameters->setNamedAutoConstant(
"uWorldView", Ogre::GpuProgramParameters::ACT_WORLDVIEW_MATRIX);
2667 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
2669 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
2670 FP_Parameters->setNamedAutoConstant(
"uEyePosition", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
2699 if (cCaustics && cDepth && cUReflections)
2704 int GLSLTextUnit = 0;
2710 FP_Parameters->setNamedConstant(
"uNormalMap", GLSLTextUnit);
2713 UM_Technique0_Pass0->createTextureUnitState(
"HydraxNormalMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
2720 FP_Parameters->setNamedConstant(
"uReflectionMap", GLSLTextUnit);
2723 UM_Technique0_Pass0->createTextureUnitState(
"HydraxReflectionMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
2727 FP_Parameters->setNamedConstant(
"uRefractionMap", GLSLTextUnit);
2730 UM_Technique0_Pass0->createTextureUnitState(
"HydraxRefractionMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
2732 if (cDepth && cUReflections)
2736 FP_Parameters->setNamedConstant(
"uDepthReflectionMap", GLSLTextUnit);
2739 UM_Technique0_Pass0->createTextureUnitState()->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
2744 FP_Parameters->setNamedConstant(
"uFresnelMap", GLSLTextUnit);
2747 UM_Technique0_Pass0->createTextureUnitState(
"Fresnel.bmp")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
2761 UnderwaterMaterial->setReceiveShadows(
false);
2762 UnderwaterMaterial->load();
2773 Ogre::String VertexProgramData, FragmentProgramData;
2780 VertexProgramData +=
2782 "void main_vp(\n") +
2784 "float4 iPosition : POSITION,\n" +
2786 "out float4 oPosition : POSITION,\n" +
2787 "out float3 oPosition_ : TEXCOORD0,\n" +
2788 "out float2 oUV : TEXCOORD1,\n";
2792 VertexProgramData +=
2794 "uniform float3 uCorner0,\n") +
2795 "uniform float3 uCorner01,\n" +
2796 "uniform float3 uCorner02,\n";
2798 VertexProgramData +=
2800 "uniform float4x4 uWorldViewProj)\n") +
2802 "oPosition = mul(uWorldViewProj, iPosition);\n"+
2803 "iPosition.xy = sign(iPosition.xy);\n"+
2804 "oUV = (float2(iPosition.x, -iPosition.y) + 1.0f) * 0.5f;";
2807 VertexProgramData += Ogre::String(
2808 "uCorner01 *= oUV.x;\n")+
2809 "uCorner02 *= oUV.y;\n"+
2810 "oPosition_ = uCorner0+uCorner01+uCorner02;";
2812 VertexProgramData +=
2819 VertexProgramData += Ogre::String(
"\n" );
2823 VertexProgramData += Ogre::String(
2824 "uniform vec3 uCorner0;\n") +
2825 "uniform vec3 uCorner01;\n" +
2826 "uniform vec3 uCorner02;\n";
2830 VertexProgramData += Ogre::String(
2831 "varying vec3 Position_;\n") +
2832 "varying vec2 UV;\n" +
2836 "gl_Position = ftransform();\n" +
2837 "vec2 iPosition = sign(gl_Vertex.xy);\n"+
2838 "UV = (vec2(iPosition.x, -iPosition.y) + 1.0) * 0.5;\n";
2841 VertexProgramData += Ogre::String(
2842 "vec3 vCorner01 = uCorner01 * UV.x;\n")+
2843 "vec3 vCorner02 = uCorner02 * UV.y;\n"+
2844 "Position_ = uCorner0+vCorner01+vCorner02;\n";
2846 VertexProgramData +=
2857 FragmentProgramData +=
2859 "void main_fp(\n") +
2861 "float3 iPosition : TEXCOORD0,\n" +
2862 "float2 iUV : TEXCOORD1,\n" +
2864 "out float4 oColor : COLOR,\n";
2868 FragmentProgramData +=
2869 "uniform float uCausticsPower,\n";
2873 FragmentProgramData += Ogre::String(
2874 "uniform float3 uSunColor,\n") +
2875 "uniform float3 uLightDirection,\n"+
2876 "uniform float uIntensity,\n"+
2877 "uniform float3 uHGg,\n"+
2878 "uniform float3 uCameraPos,\n";
2880 FragmentProgramData += Ogre::String(
2881 "uniform float uTime,\n") +
2882 "uniform float3 uWaterColor,\n" +
2883 "uniform sampler2D uOriginalMap : register(s0),\n" +
2884 "uniform sampler2D uDistortMap : register(s1)\n";
2887 FragmentProgramData +=
2888 ",\nuniform sampler2D uDepthMap : register(s2)";
2890 FragmentProgramData += Ogre::String(
2893 "float2 distortUV = (tex2D(uDistortMap, float2(iUV.x + uTime, iUV.y + uTime)).xy - 0.5)/50.0;\n";
2896 FragmentProgramData += Ogre::String(
2897 "float2 depth = tex2D(uDepthMap, iUV+distortUV).xy;\n") +
2898 "float4 Color = float4(lerp(uWaterColor,tex2D(uOriginalMap, iUV+distortUV)*(1.0+depth.y*uCausticsPower), depth.x),1.0);\n";
2901 FragmentProgramData += Ogre::String(
2902 "float3 view_vector = normalize(iPosition-uCameraPos);\n") +
2903 "float dot_product = dot(view_vector, -uLightDirection);\n"+
2904 "float num = uHGg.x;\n"+
2905 "float den = (uHGg.y - uHGg.z*dot_product);\n"+
2906 "den = rsqrt(den);\n"+
2907 "float phase = num * (den*den*den);\n" +
2908 "Color.xyz += (0.15 + uIntensity*tex2D(uDepthMap, iUV).z)*phase*uSunColor;\n";
2913 FragmentProgramData +=
2914 "float4 Color = float4(lerp(uWaterColor,tex2D(uOriginalMap, iUV+distortUV).xyz,tex2D(uDepthMap, iUV+distortUV).r),1.0);\n";
2917 FragmentProgramData += Ogre::String(
2918 "float3 view_vector = normalize(iPosition-uCameraPos);") +
2919 "float dot_product = dot(view_vector, -uLightDirection);"+
2920 "float num = uHGg.x;"+
2921 "float den = (uHGg.y - uHGg.z*dot_product); "+
2922 "den = rsqrt(den); "+
2923 "float phase = num * (den*den*den);"+
2924 "Color.xyz += (0.15 + uIntensity*tex2D(uDepthMap, iUV).y)*phase*uSunColor;";
2929 FragmentProgramData +=
2930 "float4 Color = tex2D(uOriginalMap, iUV+distortUV);";
2932 FragmentProgramData += Ogre::String(
2933 "oColor = Color;\n") +
2940 FragmentProgramData += Ogre::String(
"\n" );
2944 FragmentProgramData +=
2945 "uniform float uCausticsPower;\n";
2949 FragmentProgramData += Ogre::String(
2950 "uniform vec3 uSunColor;\n") +
2951 "uniform vec3 uLightDirection;\n"+
2952 "uniform float uIntensity;\n"+
2953 "uniform vec3 uHGg;\n"+
2954 "uniform vec3 uCameraPos;\n";
2956 FragmentProgramData += Ogre::String(
2957 "uniform float uTime;\n") +
2958 "uniform float uGlobalTransparency;\n" +
2959 "uniform vec3 uWaterColor;\n" +
2960 "uniform sampler2D uOriginalMap;\n" +
2961 "uniform sampler2D uDistortMap;\n";
2964 FragmentProgramData +=
2965 "uniform sampler2D uDepthMap;\n";
2968 FragmentProgramData += Ogre::String(
2969 "varying vec3 Position_;\n") +
2970 "varying vec2 UV;\n" +
2975 "vec2 distortUV = (texture2D(uDistortMap, vec2(UV.x + uTime, UV.y + uTime)).xy - 0.5)*0.02;\n";
2979 FragmentProgramData += Ogre::String(
2980 "vec2 depth = texture2D(uDepthMap, UV+distortUV).xy;\n") +
2981 "gl_FragColor = vec4(mix(uWaterColor,texture2D(uOriginalMap, UV+distortUV).xyz*(1.0+depth.y*uCausticsPower), depth.x),1.0);\n";
2984 FragmentProgramData += Ogre::String(
2985 "vec3 view_vector = normalize(Position_-uCameraPos);\n") +
2986 "float dot_product = dot(view_vector, -uLightDirection);\n"+
2987 "float num = uHGg.x;\n"+
2988 "float den = (uHGg.y - uHGg.z*dot_product);\n"+
2989 "den = inversesqrt(den);\n"+
2990 "float phase = num * pow(den, 3.0);\n"+
2991 "gl_FragColor.xyz += (0.15 + uIntensity*texture2D(uDepthMap, UV).z)*phase*uSunColor;";
2996 FragmentProgramData +=
2997 "gl_FragColor = vec4(mix(uWaterColor,texture2D(uOriginalMap, UV+distortUV).xyz,texture2D(uDepthMap, UV+distortUV).r),1.0);\n";
3000 FragmentProgramData += Ogre::String(
3001 "vec3 view_vector = normalize(Position_-uCameraPos);\n") +
3002 "float dot_product = dot(view_vector, -uLightDirection);\n"+
3003 "float num = uHGg.x;\n"+
3004 "float den = (uHGg.y - uHGg.z*dot_product);\n"+
3005 "den = inversesqrt(den);\n"+
3006 "float phase = num * pow(den, 3.0);\n"+
3007 "gl_FragColor.xyz += (0.15 + uIntensity*texture2D(uDepthMap, UV).z)*phase*uSunColor;\n";
3012 FragmentProgramData +=
3013 "gl_FragColor = texture2D(uOriginalMap, UV+distortUV);\n";
3015 FragmentProgramData +=
3023 UnderwaterCompositorMaterial = Ogre::MaterialManager::getSingleton().
3025 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
3027 Ogre::Pass *DM_Technique0_Pass0 = UnderwaterCompositorMaterial->getTechnique(0)->getPass(0);
3029 DM_Technique0_Pass0->setCullingMode(Ogre::CULL_NONE);
3030 DM_Technique0_Pass0->setDepthFunction(Ogre::CMPF_ALWAYS_PASS);
3032 Ogre::String GpuProgramsData[2] = {VertexProgramData, FragmentProgramData};
3034 Ogre::String EntryPoints[2];
3037 EntryPoints[0] = Ogre::String(
"main");
3038 EntryPoints[1] = Ogre::String(
"main");
3042 EntryPoints[0] = Ogre::String(
"main_vp");
3043 EntryPoints[1] = Ogre::String(
"main_fp");
3048 Ogre::GpuProgramParametersSharedPtr VP_Parameters = DM_Technique0_Pass0->getVertexProgramParameters();
3049 Ogre::GpuProgramParametersSharedPtr FP_Parameters = DM_Technique0_Pass0->getFragmentProgramParameters();
3053 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3056 FP_Parameters->setNamedConstantFromTime(
"uTime", 0.1f);
3067 FP_Parameters->setNamedConstant(
"uLightDirection",
3073 FP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION);
3077 int GLSLTextUnit = 0;
3080 FP_Parameters->setNamedConstant(
"uOriginalMap", GLSLTextUnit);
3083 DM_Technique0_Pass0->createTextureUnitState()->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
3086 FP_Parameters->setNamedConstant(
"uDistortMap", GLSLTextUnit);
3089 DM_Technique0_Pass0->createTextureUnitState(
"UnderwaterDistortion.jpg")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
3094 FP_Parameters->setNamedConstant(
"uDepthMap", GLSLTextUnit);
3097 DM_Technique0_Pass0->createTextureUnitState(
"HydraxDepthMap")->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
3101 UnderwaterCompositorMaterial->setReceiveShadows(
false);
3102 UnderwaterCompositorMaterial->load();
3105 UnderwaterCompositor = Ogre::CompositorManager::getSingleton().
3108 Ogre::CompositionTechnique* UnderWaterComp_Technique = UnderwaterCompositor->createTechnique();
3111 Ogre::CompositionTechnique::TextureDefinition* TDef = UnderWaterComp_Technique->createTextureDefinition(
"OriginalScene");
3114 Ogre::PixelFormatList l;
3115 l.push_back(Ogre::PF_A8R8G8B8);
3116 TDef->formatList = l;
3119 Ogre::CompositionTargetPass* CTPass = UnderWaterComp_Technique->createTargetPass();
3120 CTPass->setInputMode(Ogre::CompositionTargetPass::IM_NONE);
3121 CTPass->setOutputName(
"OriginalScene");
3122 Ogre::CompositionPass* CPassClear = CTPass->createPass();
3123 CPassClear->setType(Ogre::CompositionPass::PT_CLEAR);
3126 CPassClear->setClearColour(Ogre::ColourValue(WC.x, WC.y, WC.z));
3128 Ogre::CompositionPass* CPass = CTPass->createPass();
3129 CPass->setType(Ogre::CompositionPass::PT_RENDERSCENE);
3130 CPass->setFirstRenderQueue(Ogre::RENDER_QUEUE_SKIES_EARLY+1);
3133 Ogre::CompositionTargetPass* CTOutputPass = UnderWaterComp_Technique->getOutputTargetPass();
3134 CTOutputPass->setInputMode(Ogre::CompositionTargetPass::IM_NONE);
3137 Ogre::CompositionPass* COutputPass = CTOutputPass->createPass();
3138 COutputPass->setType(Ogre::CompositionPass::PT_RENDERQUAD);
3140 COutputPass->setInput(0,
"OriginalScene");
3141 COutputPass->setLastRenderQueue(0);
3143 Ogre::CompositorManager::getSingleton().
3152 Ogre::MaterialPtr &SimpleColorMaterial =
getMaterial(MT);
3153 SimpleColorMaterial = Ogre::MaterialManager::getSingleton().
3155 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
3157 Ogre::Pass *SCM_T0_Pass0 = SimpleColorMaterial->getTechnique(0)->getPass(0);
3158 SCM_T0_Pass0->setLightingEnabled(
false);
3159 SCM_T0_Pass0->setDepthCheckEnabled(DepthCheck);
3160 SCM_T0_Pass0->setDepthWriteEnabled(DepthWrite);
3161 SCM_T0_Pass0->setCullingMode(Ogre::CULL_NONE);
3162 SCM_T0_Pass0->createTextureUnitState()->setColourOperationEx(Ogre::LBX_MODULATE,Ogre::LBS_MANUAL,Ogre::LBS_CURRENT, Color);
3164 SimpleColorMaterial->setReceiveShadows(
false);
3165 SimpleColorMaterial->load();
3192 Ogre::Pass *M_Technique0_Pass0 = Mat->getTechnique(0)->getPass(0);
3198 M_Technique0_Pass0->getTextureUnitState(0)->setTextureName(
"HydraxNormalMap");
3199 M_Technique0_Pass0->getTextureUnitState(1)->setTextureName(
"HydraxReflectionMap");
3200 M_Technique0_Pass0->getTextureUnitState(2)->setTextureName(
"HydraxRefractionMap");
3203 M_Technique0_Pass0->getTextureUnitState(3)->setTextureName(
"HydraxDepthMap");
3210 M_Technique0_Pass0->getTextureUnitState(0)->setTextureName(
"HydraxReflectionMap");
3211 M_Technique0_Pass0->getTextureUnitState(1)->setTextureName(
"HydraxRefractionMap");
3214 M_Technique0_Pass0->getTextureUnitState(2)->setTextureName(
"HydraxDepthMap");
3220 Ogre::GpuProgramParametersSharedPtr VP_Parameters = M_Technique0_Pass0->getVertexProgramParameters();
3221 Ogre::GpuProgramParametersSharedPtr FP_Parameters = M_Technique0_Pass0->getFragmentProgramParameters();
3225 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3229 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
3231 FP_Parameters->setNamedAutoConstant(
"uEyePosition", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
3266 Ogre::Pass *M_Technique0_Pass0 = Mat->getTechnique(0)->getPass(0);
3268 Ogre::GpuProgramParametersSharedPtr VP_Parameters = M_Technique0_Pass0->getVertexProgramParameters();
3269 Ogre::GpuProgramParametersSharedPtr FP_Parameters = M_Technique0_Pass0->getFragmentProgramParameters();
3273 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3275 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION);
3277 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
3294 Ogre::Pass *M_Technique0_Pass0 = Mat->getTechnique(0)->getPass(0);
3300 M_Technique0_Pass0->getTextureUnitState(0)->setTextureName(
"HydraxNormalMap");
3304 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxReflectionMap");
3307 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxRefractionMap");
3309 if (cDepth && cUReflections)
3311 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxDepthReflectionMap");
3321 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxReflectionMap");
3324 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxRefractionMap");
3326 if (cDepth && cUReflections)
3328 M_Technique0_Pass0->getTextureUnitState(Index)->setTextureName(
"HydraxDepthReflectionMap");
3334 Ogre::GpuProgramParametersSharedPtr VP_Parameters = M_Technique0_Pass0->getVertexProgramParameters();
3335 Ogre::GpuProgramParametersSharedPtr FP_Parameters = M_Technique0_Pass0->getFragmentProgramParameters();
3339 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3340 VP_Parameters->setNamedAutoConstant(
"uWorldView", Ogre::GpuProgramParameters::ACT_WORLDVIEW_MATRIX);
3341 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
3343 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
3344 FP_Parameters->setNamedAutoConstant(
"uEyePosition", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
3351 if ((cDepth && cUReflections) || (!cUReflections))
3374 if (cCaustics && cDepth && cUReflections)
3405 Technique->removeAllPasses();
3406 Technique->createPass();
3407 Technique->setName(
"_Hydrax_Depth_Technique");
3408 Technique->setSchemeName(
"HydraxDepth");
3410 Ogre::Pass *DM_Technique_Pass0 = Technique->getPass(0);
3415 Ogre::GpuProgramParametersSharedPtr VP_Parameters = DM_Technique_Pass0->getVertexProgramParameters();
3416 Ogre::GpuProgramParametersSharedPtr FP_Parameters = DM_Technique_Pass0->getFragmentProgramParameters();
3420 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3421 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION);
3423 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
3437 FP_Parameters->setNamedConstant(
"uCaustics", 0);
3439 Ogre::TextureUnitState* TUS_Caustics = DM_Technique_Pass0->createTextureUnitState(
"Caustics.bmp");
3440 TUS_Caustics->setName(
"Caustics");
3441 TUS_Caustics->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
3443 TUS_Caustics->setAnimatedTextureName(
"Caustics.bmp", 32);
3460 Technique->removeAllPasses();
3461 Technique->createPass();
3462 Technique->setName(
"_Hydrax_DepthTexture_Technique");
3463 Technique->setSchemeName(
"HydraxDepth");
3465 Ogre::Pass *DM_Technique_Pass0 = Technique->getPass(0);
3468 DM_Technique_Pass0->setName(AlphaChannel);
3473 DM_Technique_Pass0->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
3474 DM_Technique_Pass0->setDepthCheckEnabled(
true);
3475 DM_Technique_Pass0->setDepthWriteEnabled(
false);
3477 Ogre::GpuProgramParametersSharedPtr VP_Parameters = DM_Technique_Pass0->getVertexProgramParameters();
3478 Ogre::GpuProgramParametersSharedPtr FP_Parameters = DM_Technique_Pass0->getFragmentProgramParameters();
3482 VP_Parameters->setNamedAutoConstant(
"uWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
3483 VP_Parameters->setNamedAutoConstant(
"uCameraPos", Ogre::GpuProgramParameters::ACT_CAMERA_POSITION);
3485 VP_Parameters->setNamedAutoConstant(
"uWorld", Ogre::GpuProgramParameters::ACT_WORLD_MATRIX);
3499 FP_Parameters->setNamedConstant(
"uCaustics", 0);
3501 Ogre::TextureUnitState *TUS_Caustics = DM_Technique_Pass0->createTextureUnitState(
"Caustics.bmp");
3502 TUS_Caustics->setName(
"Caustics");
3503 TUS_Caustics->setTextureAddressingMode(Ogre::TextureUnitState::TAM_WRAP);
3505 TUS_Caustics->setAnimatedTextureName(
"Caustics.bmp", 32);
3511 FP_Parameters->setNamedConstant(
"uAlphaTex", 0);
3513 Ogre::TextureUnitState *TUS_AlphaTex = DM_Technique_Pass0->createTextureUnitState(TextureName);
3514 TUS_AlphaTex->setName(
"_DetphTexture_Hydrax");
3515 TUS_AlphaTex->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);
3525 Ogre::CompositorPtr &Comp =
mCompositors[
static_cast<int>(Compositor)];
3532 Ogre::CompositorManager::getSingleton().
3565 Ogre::GpuProgramParametersSharedPtr Parameters;
3571 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getVertexProgramParameters();
3577 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
3582 Parameters->setNamedConstant(Name, Value);
3586 std::vector<Ogre::Technique*>::iterator TechIt;
3600 Parameters = (*TechIt)->getPass(0)->getVertexProgramParameters();
3606 Parameters = (*TechIt)->getPass(0)->getFragmentProgramParameters();
3611 Parameters->setNamedConstant(Name, Value);
3623 Ogre::GpuProgramParametersSharedPtr Parameters;
3629 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getVertexProgramParameters();
3635 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
3640 float Value_[2] = {Value.x, Value.y};
3644 std::vector<Ogre::Technique*>::iterator TechIt;
3658 Parameters = (*TechIt)->getPass(0)->getVertexProgramParameters();
3664 Parameters = (*TechIt)->getPass(0)->getFragmentProgramParameters();
3669 Parameters->setNamedConstant(Name, Value_, 1, 2);
3681 Ogre::GpuProgramParametersSharedPtr Parameters;
3687 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getVertexProgramParameters();
3693 Parameters =
getMaterial(MType)->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
3698 Parameters->setNamedConstant(Name, Value);
3702 std::vector<Ogre::Technique*>::iterator TechIt;
3716 Parameters = (*TechIt)->getPass(0)->getVertexProgramParameters();
3722 Parameters = (*TechIt)->getPass(0)->getFragmentProgramParameters();
3727 Parameters->setNamedConstant(Name, Value);
3736 Ogre::Pass* DM_Technique0_Pass0 = mat->getTechnique(0)->getPass(0);
3737 DM_Technique0_Pass0->getTextureUnitState(2)->setTextureName(
"HydraxDepthMap");
3743 const Ogre::Vector3& WC = mMaterialManager->mHydrax->getWaterColor();
3744 Ogre::CompositorPtr &UnderwaterCompositor = mMaterialManager->getCompositor(
COMP_UNDERWATER);
3745 UnderwaterCompositor->getTechnique(0)->getTargetPass(0)->getPass(0)->setClearColour(Ogre::ColourValue(WC.x, WC.y, WC.z));
3747 Ogre::GpuProgramParametersSharedPtr FP_Parameters = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
3752 setNamedConstant(
"uWaterColor", mMaterialManager->mHydrax->getWaterColor());
3758 setNamedConstant(
"uCausticsPower", mMaterialManager->mHydrax->getCausticsPower());
3764 setNamedConstant(
"uSunColor", mMaterialManager->mHydrax->getSunColor());
3766 FP_Parameters->setNamedConstant(
"uLightDirection",
3767 (mMaterialManager->mHydrax->getMesh()->getObjectSpacePosition(mMaterialManager->mHydrax->getCamera()->getPosition()) -
3768 mMaterialManager->mHydrax->getMesh()->getObjectSpacePosition(mMaterialManager->mHydrax->getSunPosition()))
3771 FP_Parameters->setNamedConstant(
"uIntensity", mMaterialManager->mHydrax->getGodRaysIntensity());
3772 FP_Parameters->setNamedConstant(
"uHGg", mMaterialManager->mHydrax->getGodRaysExposure());
3774 Ogre::GpuProgramParametersSharedPtr VP_Parameters = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters();
3778 setNamedConstant(
"uCorner0", mMaterialManager->mHydrax->getCamera()->getWorldSpaceCorners()[5] );
3781 setNamedConstant(
"uCorner01", mMaterialManager->mHydrax->getCamera()->getWorldSpaceCorners()[4] - mMaterialManager->mHydrax->getCamera()->getWorldSpaceCorners()[5]);
3784 setNamedConstant(
"uCorner02", mMaterialManager->mHydrax->getCamera()->getWorldSpaceCorners()[6] - mMaterialManager->mHydrax->getCamera()->getWorldSpaceCorners()[5]);
3798 Ogre::Pass* DM_Technique0_Pass0 = mat->getTechnique(0)->getPass(0);
3799 DM_Technique0_Pass0->getTextureUnitState(2)->setTextureName(
"HydraxDepthMap");
3802 mMaterialManager->mCompositorsNeedToBeReloaded[
COMP_UNDERWATER] =
false;