Skip to content

Commit

Permalink
Merge pull request #1290 from actnwit/fix/skinning
Browse files Browse the repository at this point in the history
fix: optimize skinning
  • Loading branch information
emadurandal authored Aug 19, 2023
2 parents 2e6dcfe + b93c006 commit c8642b7
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/foundation/materials/core/ShaderHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ export function _setupGlobalShaderDefinition(materialTypeName: string) {
definitions += '#define RN_IS_SUPPORTING_STANDARD_DERIVATIVES\n';
}
if (Config.boneDataType === BoneDataType.Mat43x1) {
definitions += '#define RN_BONE_DATA_TYPE_Mat44x1\n';
definitions += '#define RN_BONE_DATA_TYPE_Mat43x1\n';
} else if (Config.boneDataType === BoneDataType.Vec4x2) {
definitions += '#define RN_BONE_DATA_TYPE_VEC4X2\n';
} else if (Config.boneDataType === BoneDataType.Vec4x2Old) {
Expand Down
22 changes: 11 additions & 11 deletions src/webgl/shaderity_shaders/common/getSkinMatrix.glsl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

#ifdef RN_IS_SKINNING

highp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {
highp mat4x3 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {
highp vec4 q = quaternion;
highp vec3 t = translation;

Expand Down Expand Up @@ -29,7 +29,7 @@ highp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, hi
0.0, 0.0, 0.0, 1.0
);

return mat*uniformScaleMat;
return mat4x3(mat*uniformScaleMat);
}

highp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){
Expand Down Expand Up @@ -66,21 +66,21 @@ highp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria)
return vec4(r, g, b, a);
}

mat4 getSkinMatrix(float skeletalComponentSID) {
mat4x3 getSkinMatrix(float skeletalComponentSID) {

#ifdef RN_BONE_DATA_TYPE_Mat44x1
mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));
skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));
skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));
skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));
#ifdef RN_BONE_DATA_TYPE_Mat43x1
mat4x3 skinMat = a_weight.x * get_boneMatrix(skeletalComponentSID, int(a_joint.x));
skinMat += a_weight.y * get_boneMatrix(skeletalComponentSID, int(a_joint.y));
skinMat += a_weight.z * get_boneMatrix(skeletalComponentSID, int(a_joint.z));
skinMat += a_weight.w * get_boneMatrix(skeletalComponentSID, int(a_joint.w));

#elif defined(RN_BONE_DATA_TYPE_VEC4X2)
vec2 criteria = vec2(4096.0, 4096.0);

vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));
vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));
vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);
mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);
mat4x3 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);

vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));
vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));
Expand All @@ -99,7 +99,7 @@ mat4 getSkinMatrix(float skeletalComponentSID) {

#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)
vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));
mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(
mat4x3 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(
get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));
vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));
skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(
Expand All @@ -121,7 +121,7 @@ mat4 getSkinMatrix(float skeletalComponentSID) {
vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);

vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;
mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(
mat4x3 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(
unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));
vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;
skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ bool skinning(
out vec3 outNormal_inWorld
)
{
mat4 skinMat = getSkinMatrix(skeletalComponentSID);
mat4 skinMat = mat4(getSkinMatrix(skeletalComponentSID));
outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);
outNormalMatrix = toNormalMatrix(skinMat);
outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);
Expand Down

0 comments on commit c8642b7

Please sign in to comment.