forked from LeenkxTeam/LNXSDK
83 lines
3.7 KiB
GLSL
83 lines
3.7 KiB
GLSL
uniform sampler2D morphDataPos;
|
|
uniform sampler2D morphDataNor;
|
|
uniform vec2 morphScaleOffset;
|
|
uniform vec2 morphDataDim;
|
|
uniform vec4 morphWeights[8];
|
|
|
|
void getMorphedVertex(vec2 uvCoord, inout vec3 A, vec4 imorph) {
|
|
vec3 morph = texture(morphDataPos, uvCoord).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
A += imorph.x * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, uvCoord.y - morphDataDim.y)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
A += imorph.y * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, uvCoord.y - 2.0 * morphDataDim.y)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
A += imorph.z * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, uvCoord.y - 3.0 * morphDataDim.y)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
A += imorph.w * morph;
|
|
}
|
|
|
|
void getMorphedNormal(vec2 uvCoord, vec3 oldNor, inout vec3 morphNor, vec4 imorph) {
|
|
vec3 norm = oldNor + imorph.x * (texture(morphDataNor, uvCoord).rgb * 2.0 - 1.0);
|
|
morphNor += norm;
|
|
|
|
norm = oldNor + imorph.y * (texture(morphDataNor, vec2(uvCoord.x, uvCoord.y - morphDataDim.y)).rgb * 2.0 - 1.0);
|
|
morphNor += norm;
|
|
|
|
norm = oldNor + imorph.z * (texture(morphDataNor, vec2(uvCoord.x, uvCoord.y - 2.0 * morphDataDim.y)).rgb * 2.0 - 1.0);
|
|
morphNor += norm;
|
|
|
|
norm = oldNor + imorph.w * (texture(morphDataNor, vec2(uvCoord.x, uvCoord.y - 3.0 * morphDataDim.y)).rgb * 2.0 - 1.0);
|
|
morphNor += norm;
|
|
|
|
morphNor = normalize(morphNor);
|
|
}
|
|
|
|
void getMorphedVertex(vec2 uvCoord, inout vec3 A){
|
|
vec3 totalDelta = vec3(0.0);
|
|
for(int i = 0; i<8; i++ )
|
|
{
|
|
vec4 tempCoordY = vec4( uvCoord.y - (i * 4) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 1) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 2) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 3) * morphDataDim.y);
|
|
|
|
vec3 morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.x)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
totalDelta += morphWeights[i].x * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.y)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
totalDelta += morphWeights[i].y * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.z)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
totalDelta += morphWeights[i].z * morph;
|
|
|
|
morph = texture(morphDataPos, vec2(uvCoord.x, tempCoordY.w)).rgb * morphScaleOffset.x + morphScaleOffset.y;
|
|
totalDelta += morphWeights[i].w * morph;
|
|
}
|
|
//float deltaLength = length(totalDelta);
|
|
//if (deltaLength > 5.0) {
|
|
// clamp corrupted data
|
|
//totalDelta = normalize(totalDelta) * 5.0;
|
|
//}
|
|
A += totalDelta;
|
|
}
|
|
|
|
void getMorphedNormal(vec2 uvCoord, vec3 oldNor, inout vec3 morphNor){
|
|
|
|
vec3 normalDelta = vec3(0.0);
|
|
for(int i = 0; i<8; i++ )
|
|
{
|
|
vec4 tempCoordY = vec4( uvCoord.y - (i * 4) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 1) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 2) * morphDataDim.y,
|
|
uvCoord.y - (i * 4 + 3) * morphDataDim.y);
|
|
|
|
normalDelta += morphWeights[i].x * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.x)).rgb * 2.0 - 1.0);
|
|
normalDelta += morphWeights[i].y * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.y)).rgb * 2.0 - 1.0);
|
|
normalDelta += morphWeights[i].z * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.z)).rgb * 2.0 - 1.0);
|
|
normalDelta += morphWeights[i].w * (texture(morphDataNor, vec2(uvCoord.x, tempCoordY.w)).rgb * 2.0 - 1.0);
|
|
}
|
|
|
|
morphNor = normalize(oldNor + normalDelta);
|
|
} |