| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- #ifdef COMPILEVS
- // Silence GLSL 150 deprecation warnings
- #ifdef GL3
- #define attribute in
- #define varying out
- #endif
- attribute vec4 iPos;
- attribute vec3 iNormal;
- attribute vec4 iColor;
- attribute vec2 iTexCoord;
- attribute vec2 iTexCoord1;
- attribute vec4 iTangent;
- attribute vec4 iBlendWeights;
- attribute vec4 iBlendIndices;
- attribute vec3 iCubeTexCoord;
- attribute vec4 iCubeTexCoord1;
- #ifdef INSTANCED
- attribute vec4 iTexCoord4;
- attribute vec4 iTexCoord5;
- attribute vec4 iTexCoord6;
- #endif
- attribute float iObjectIndex;
- #ifdef SKINNED
- mat4 GetSkinMatrix(vec4 blendWeights, vec4 blendIndices)
- {
- ivec4 idx = ivec4(blendIndices) * 3;
- const vec4 lastColumn = vec4(0.0, 0.0, 0.0, 1.0);
- return mat4(cSkinMatrices[idx.x], cSkinMatrices[idx.x + 1], cSkinMatrices[idx.x + 2], lastColumn) * blendWeights.x +
- mat4(cSkinMatrices[idx.y], cSkinMatrices[idx.y + 1], cSkinMatrices[idx.y + 2], lastColumn) * blendWeights.y +
- mat4(cSkinMatrices[idx.z], cSkinMatrices[idx.z + 1], cSkinMatrices[idx.z + 2], lastColumn) * blendWeights.z +
- mat4(cSkinMatrices[idx.w], cSkinMatrices[idx.w + 1], cSkinMatrices[idx.w + 2], lastColumn) * blendWeights.w;
- }
- #endif
- #ifdef INSTANCED
- mat4 GetInstanceMatrix()
- {
- const vec4 lastColumn = vec4(0.0, 0.0, 0.0, 1.0);
- return mat4(iTexCoord4, iTexCoord5, iTexCoord6, lastColumn);
- }
- #endif
- mat3 GetNormalMatrix(mat4 modelMatrix)
- {
- return mat3(modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz);
- }
- vec2 GetTexCoord(vec2 texCoord)
- {
- return vec2(dot(texCoord, cUOffset.xy) + cUOffset.w, dot(texCoord, cVOffset.xy) + cVOffset.w);
- }
- vec4 GetClipPos(vec3 worldPos)
- {
- vec4 ret = vec4(worldPos, 1.0) * cViewProj;
- // While getting the clip coordinate, also automatically set gl_ClipVertex for user clip planes
- #if !defined(GL_ES) && !defined(GL3)
- gl_ClipVertex = ret;
- #elif defined(GL3)
- gl_ClipDistance[0] = dot(cClipPlane, ret);
- #endif
- return ret;
- }
- float GetZonePos(vec3 worldPos)
- {
- return clamp((vec4(worldPos, 1.0) * cZone).z, 0.0, 1.0);
- }
- float GetDepth(vec4 clipPos)
- {
- return dot(clipPos.zw, cDepthMode.zw);
- }
- #ifdef BILLBOARD
- vec3 GetBillboardPos(vec4 iPos, vec2 iSize, mat4 modelMatrix)
- {
- return (iPos * modelMatrix).xyz + vec3(iSize.x, iSize.y, 0.0) * cBillboardRot;
- }
- vec3 GetBillboardNormal()
- {
- return vec3(-cBillboardRot[0][2], -cBillboardRot[1][2], -cBillboardRot[2][2]);
- }
- #endif
- #ifdef DIRBILLBOARD
- mat3 GetFaceCameraRotation(vec3 position, vec3 direction)
- {
- vec3 cameraDir = normalize(position - cCameraPos);
- vec3 front = normalize(direction);
- vec3 right = normalize(cross(front, cameraDir));
- vec3 up = normalize(cross(front, right));
- return mat3(
- right.x, up.x, front.x,
- right.y, up.y, front.y,
- right.z, up.z, front.z
- );
- }
- vec3 GetBillboardPos(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
- {
- vec3 worldPos = (iPos * modelMatrix).xyz;
- return worldPos + vec3(iTexCoord1.x, 0.0, iTexCoord1.y) * GetFaceCameraRotation(worldPos, iDirection);
- }
- vec3 GetBillboardNormal(vec4 iPos, vec3 iDirection, mat4 modelMatrix)
- {
- vec3 worldPos = (iPos * modelMatrix).xyz;
- return vec3(0.0, 1.0, 0.0) * GetFaceCameraRotation(worldPos, iDirection);
- }
- #endif
- #ifdef TRAILFACECAM
- vec3 GetTrailPos(vec4 iPos, vec3 iFront, float iScale, mat4 modelMatrix)
- {
- vec3 up = normalize(cCameraPos - iPos.xyz);
- vec3 right = normalize(cross(iFront, up));
- return (vec4((iPos.xyz + right * iScale), 1.0) * modelMatrix).xyz;
- }
- vec3 GetTrailNormal(vec4 iPos)
- {
- return normalize(cCameraPos - iPos.xyz);
- }
- #endif
- #ifdef TRAILBONE
- vec3 GetTrailPos(vec4 iPos, vec3 iParentPos, float iScale, mat4 modelMatrix)
- {
- vec3 right = iParentPos - iPos.xyz;
- return (vec4((iPos.xyz + right * iScale), 1.0) * modelMatrix).xyz;
- }
- vec3 GetTrailNormal(vec4 iPos, vec3 iParentPos, vec3 iForward)
- {
- vec3 left = normalize(iPos.xyz - iParentPos);
- vec3 up = normalize(cross(normalize(iForward), left));
- return up;
- }
- #endif
- #if defined(SKINNED)
- #define iModelMatrix GetSkinMatrix(iBlendWeights, iBlendIndices)
- #elif defined(INSTANCED)
- #define iModelMatrix GetInstanceMatrix()
- #else
- #define iModelMatrix cModel
- #endif
- vec3 GetWorldPos(mat4 modelMatrix)
- {
- #if defined(BILLBOARD)
- return GetBillboardPos(iPos, iTexCoord1, modelMatrix);
- #elif defined(DIRBILLBOARD)
- return GetBillboardPos(iPos, iNormal, modelMatrix);
- #elif defined(TRAILFACECAM)
- return GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix);
- #elif defined(TRAILBONE)
- return GetTrailPos(iPos, iTangent.xyz, iTangent.w, modelMatrix);
- #else
- return (iPos * modelMatrix).xyz;
- #endif
- }
- vec3 GetWorldNormal(mat4 modelMatrix)
- {
- #if defined(BILLBOARD)
- return GetBillboardNormal();
- #elif defined(DIRBILLBOARD)
- return GetBillboardNormal(iPos, iNormal, modelMatrix);
- #elif defined(TRAILFACECAM)
- return GetTrailNormal(iPos);
- #elif defined(TRAILBONE)
- return GetTrailNormal(iPos, iTangent.xyz, iNormal);
- #else
- return normalize(iNormal * GetNormalMatrix(modelMatrix));
- #endif
- }
- vec4 GetWorldTangent(mat4 modelMatrix)
- {
- #if defined(BILLBOARD)
- return vec4(normalize(vec3(1.0, 0.0, 0.0) * cBillboardRot), 1.0);
- #elif defined(DIRBILLBOARD)
- return vec4(normalize(vec3(1.0, 0.0, 0.0) * GetNormalMatrix(modelMatrix)), 1.0);
- #else
- return vec4(normalize(iTangent.xyz * GetNormalMatrix(modelMatrix)), iTangent.w);
- #endif
- }
- #else
- // Silence GLSL 150 deprecation warnings
- #ifdef GL3
- #define varying in
- #ifndef MRT_COUNT
- #if defined(DEFERRED)
- #define MRT_COUNT 4
- #elif defined(PREPASS)
- #define MRT_COUNT 2
- #else
- #define MRT_COUNT 1
- #endif
- #endif
- out vec4 fragData[MRT_COUNT];
- #define gl_FragColor fragData[0]
- #define gl_FragData fragData
- #endif
- #endif
|