uniform mat4 g_WorldViewProjectionMatrix; | |
uniform mat4 g_WorldViewMatrix; | |
uniform mat3 g_NormalMatrix; | |
uniform mat4 g_ViewMatrix; | |
uniform vec4 g_LightColor; | |
uniform vec4 g_LightPosition; | |
uniform vec4 g_AmbientLightColor; | |
uniform float m_Shininess; | |
attribute vec3 inPosition; | |
attribute vec3 inNormal; | |
attribute vec2 inTexCoord; | |
attribute vec4 inTangent; | |
varying vec3 vNormal; | |
varying vec2 texCoord; | |
varying vec3 vPosition; | |
varying vec3 vnPosition; | |
varying vec3 vViewDir; | |
varying vec3 vnViewDir; | |
varying vec4 vLightDir; | |
varying vec4 vnLightDir; | |
varying vec3 lightVec; | |
varying vec4 AmbientSum; | |
varying vec4 DiffuseSum; | |
varying vec4 SpecularSum; | |
#ifdef TRI_PLANAR_MAPPING | |
varying vec4 wVertex; | |
varying vec3 wNormal; | |
#endif | |
// JME3 lights in world space | |
void lightComputeDir(in vec3 worldPos, in vec4 color, in vec4 position, out vec4 lightDir){ | |
float posLight = step(0.5, color.w); | |
vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight); | |
lightVec.xyz = tempVec; | |
float dist = length(tempVec); | |
lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0); | |
lightDir.xyz = tempVec / vec3(dist); | |
} | |
void main(){ | |
vec4 pos = vec4(inPosition, 1.0); | |
gl_Position = g_WorldViewProjectionMatrix * pos; | |
#ifdef TERRAIN_GRID | |
texCoord = inTexCoord * 2.0; | |
#else | |
texCoord = inTexCoord; | |
#endif | |
vec3 wvPosition = (g_WorldViewMatrix * pos).xyz; | |
vec3 wvNormal = normalize(g_NormalMatrix * inNormal); | |
vec3 viewDir = normalize(-wvPosition); | |
vec4 wvLightPos = (g_ViewMatrix * vec4(g_LightPosition.xyz,clamp(g_LightColor.w,0.0,1.0))); | |
wvLightPos.w = g_LightPosition.w; | |
vec4 lightColor = g_LightColor; | |
//-------------------------- | |
// specific to normal maps: | |
//-------------------------- | |
#if defined(NORMALMAP) || defined(NORMALMAP_1) || defined(NORMALMAP_2) || defined(NORMALMAP_3) || defined(NORMALMAP_4) || defined(NORMALMAP_5) || defined(NORMALMAP_6) || defined(NORMALMAP_7) || defined(NORMALMAP_8) || defined(NORMALMAP_9) || defined(NORMALMAP_10) || defined(NORMALMAP_11) | |
vec3 wvTangent = normalize(g_NormalMatrix * inTangent.xyz); | |
vec3 wvBinormal = cross(wvNormal, wvTangent); | |
mat3 tbnMat = mat3(wvTangent, wvBinormal * -inTangent.w,wvNormal); | |
vPosition = wvPosition * tbnMat; | |
vViewDir = viewDir * tbnMat; | |
lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir); | |
vLightDir.xyz = (vLightDir.xyz * tbnMat).xyz; | |
#else | |
//------------------------- | |
// general to all lighting | |
//------------------------- | |
vNormal = wvNormal; | |
vPosition = wvPosition; | |
vViewDir = viewDir; | |
lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir); | |
#endif | |
//computing spot direction in view space and unpacking spotlight cos | |
// spotVec=(g_ViewMatrix *vec4(g_LightDirection.xyz,0.0) ); | |
// spotVec.w=floor(g_LightDirection.w)*0.001; | |
// lightVec.w = fract(g_LightDirection.w); | |
AmbientSum = vec4(0.2, 0.2, 0.2, 1.0) * g_AmbientLightColor; // Default: ambient color is dark gray | |
DiffuseSum = lightColor; | |
SpecularSum = lightColor; | |
#ifdef TRI_PLANAR_MAPPING | |
wVertex = vec4(inPosition,0.0); | |
wNormal = inNormal; | |
#endif | |
} |