Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" GLBase="1" ClearScreenMode="1" CameraPosition="0 1 4" CameraRotation="0.02 0 0" FileVersion="2">
<OnLoaded>
<ZExternalLibrary ModuleName="opengl32">
<BeforeInitExp>
<![CDATA[//
if (ANDROID)
{
if(App.GLBase==0) this.ModuleName="libGLESv1_CM.so";
else this.ModuleName="libGLESv2.so";
}
else if (LINUX)
{
this.ModuleName = "libGL.so";
}
else
{
this.ModuleName = "opengl32";
}]]>
</BeforeInitExp>
<Source>
<![CDATA[const int GL_DEPTH_BUFFER_BIT = 0x0100;
const int GL_COLOR_BUFFER_BIT = 0x4000;
void glClear(int mode){}]]>
</Source>
</ZExternalLibrary>
<ZExpression>
<Expression>
<![CDATA[time = 0;
WaterColor[0][0,0] = 0.3;
WaterColor[0][0,1] = 0.3;
WaterColor[0][0,2] = 0.6;]]>
</Expression>
</ZExpression>
</OnLoaded>
<OnUpdate>
<ZExpression>
<Expression>
<![CDATA[glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Time += App.DeltaTime;
float t = App.Time;
LightPosition[0][0,0] = cos(t) * 50;
LightPosition[0][0,1] = 60 + cos(t*0.1)*10;
LightPosition[0][0,2] = 100;
LightColorAmbient[0][0,0] = 0.5+cos(t*2)*0.02;
LightColorAmbient[0][0,1] = 0.5+cos(t)*0.02;
LightColorAmbient[0][0,2] = 0.5+sin(t*3)*0.02;]]>
</Expression>
</ZExpression>
</OnUpdate>
<OnRender>
<UseMaterial Material="MaterialWater"/>
<RenderMesh Mesh="MeshWater"/>
</OnRender>
<Content>
<Variable Name="Time"/>
<Array Name="WaterColor" Type="5" SizeDim1="1"/>
<Array Name="LightPosition" Type="5" SizeDim1="1"/>
<Array Name="LightColorAmbient" Type="5" SizeDim1="1"/>
<Array Name="FogColor" Type="5" SizeDim1="1"/>
<Mesh Name="MeshWater">
<Producers>
<MeshBox Scale="10 10 1" XCount="32" YCount="32" Grid2DOnly="255"/>
<MeshTransform Rotation="-0.25 0 0"/>
</Producers>
</Mesh>
<Material Name="MaterialWater" Shading="1" Shader="ShaderWater"/>
<Shader Name="ShaderWater" UpdateVarsOnEachUse="255">
<VertexShaderSource>
<![CDATA[//
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#endif
attribute vec4 position; // Vertex position
attribute vec3 normal; // Vertex normal
uniform float time;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelViewMatrix; // For transforming normals
uniform mat3 normalMatrix; // To properly transform normals
varying vec3 v_position; // Position in view space
float generateOffset(float x, float y, float val1, float val2, float time) {
float amount = 0.2;
float speed = 0.4;
float radiansX = ((mod(x + y * x * val1, amount) / amount) + (time * speed) * mod(x * 0.8 + y, 1.5)) * 2.0 * 3.14159;
float radiansY = ((mod(val2 * (y * x + x * y), amount) / amount) + (time * speed) * 2.0 * mod(x, 2.0)) * 2.0 * 3.14159;
return amount * 0.5 * (sin(radiansY) * cos(radiansX));
}
vec3 applyDistortion(vec3 vertex, float time) {
float xd = generateOffset(vertex.x, vertex.z, 0.2, 0.1, time);
float yd = generateOffset(vertex.x, vertex.z, 0.1, 0.3, time);
float zd = generateOffset(vertex.x, vertex.z, 0.15, 0.2, time);
return vertex + vec3(xd, yd, zd);
}
void main() {
vec3 distortedPosition = applyDistortion(vec3(position.x, position.y, position.z), time * 0.1);
// Transform position and normal
v_position = vec3(modelViewMatrix * vec4(distortedPosition, 1.0)); // View-space position
// Transform the position into clip space
gl_Position = modelViewProjectionMatrix * vec4(distortedPosition, 1.0);
}]]>
</VertexShaderSource>
<FragmentShaderSource>
<![CDATA[#ifdef GL_ES
precision mediump float;
#endif
uniform mat4 waterColor; // Water color
//uniform float beer_factor;
uniform mat4 lightPosition; // Light position in view space
uniform mat4 lightColorAmbient; // Light color
uniform mat4 fogColor; // Ambient light color
varying vec3 v_position; // Interpolated position from the vertex shader
void main() {
vec3 dPosition_dx = dFdx(v_position);
vec3 dPosition_dy = dFdy(v_position);
vec3 recalculatedNormal = normalize(cross(dPosition_dx, dPosition_dy));
// Light position
vec3 LPosition = vec3(lightPosition[0][0], lightPosition[0][1], lightPosition[0][2]);
vec3 L = normalize(LPosition - v_position);
vec4 globalColor = vec4(waterColor[0][0], waterColor[0][1], waterColor[0][2], 1.0);
// calculate Diffuse Term
vec4 LAmbient = vec4(lightColorAmbient[0][0], lightColorAmbient[0][1], lightColorAmbient[0][2], 1.0);
vec4 LDiffuse = globalColor * LAmbient;
// clamp pour éviter les couleurs brulées sur android avec la distance de la lumière
vec4 Idiff = 3.0 * LDiffuse * max(dot(recalculatedNormal,L), 0.0);
// Fog
vec4 fog = vec4(fogColor[0][0], fogColor[0][1], fogColor[0][2], 1.0);
// Final color
vec4 color = Idiff;
gl_FragColor = mix(color, fog, clamp(-v_position.z / 500.0, 0.0, 1.0));
}]]>
</FragmentShaderSource>
<UniformVariables>
<ShaderVariable VariableName="time" VariableRef="Time"/>
<ShaderVariable VariableName="waterColor" ValueArrayRef="WaterColor" ArrayKind="1"/>
<ShaderVariable VariableName="lightColorAmbient" ValueArrayRef="LightColorAmbient" ArrayKind="1"/>
<ShaderVariable VariableName="lightPosition" ValueArrayRef="LightPosition" ArrayKind="1"/>
<ShaderVariable VariableName="fogColor" ValueArrayRef="FogColor" ArrayKind="1"/>
</UniformVariables>
</Shader>
</Content>
</ZApplication>
Everything I've found is about scrolling textures.