97 lines
2.9 KiB
Plaintext
97 lines
2.9 KiB
Plaintext
-- glslfx version 0.1
|
|
|
|
-- configuration
|
|
{
|
|
"techniques": {
|
|
"default": {
|
|
"skinPointsLBSKernel": {
|
|
"source": [ "Compute.SkinPointsLBS" ]
|
|
},
|
|
"skinPointsSimpleKernel": {
|
|
"source": [ "Compute.SkinPointsSimple" ]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
-- glsl Compute.SkinPointsLBS
|
|
|
|
const float EPS = 1e-5;
|
|
|
|
void compute(int index)
|
|
{
|
|
// model space -> bind space
|
|
mat4 geomBindXform = HdGet_geomBindXform();
|
|
|
|
vec3 restP = HdGet_restPoints(index);
|
|
|
|
// apply blend shapes
|
|
int numBlendShapeOffsetRanges = HdGet_numBlendShapeOffsetRanges();
|
|
if (index < numBlendShapeOffsetRanges) {
|
|
ivec2 blendShapeOffsetRange = HdGet_blendShapeOffsetRanges(index);
|
|
for (int i = blendShapeOffsetRange.x; i < blendShapeOffsetRange.y; ++i) {
|
|
vec4 offset = HdGet_blendShapeOffsets(i);
|
|
int shapeIndex = int(offset.w);
|
|
float weight = HdGet_blendShapeWeights(shapeIndex);
|
|
restP += offset.xyz * weight;
|
|
}
|
|
}
|
|
vec4 initP = geomBindXform * vec4(restP, 1);
|
|
|
|
int numInfluencesPerComponent = HdGet_numInfluencesPerComponent();
|
|
vec3 p;
|
|
if (numInfluencesPerComponent > 0) {
|
|
p = vec3(0,0,0);
|
|
|
|
bool constantPointInfluence = HdGet_hasConstantInfluences();
|
|
int offset = constantPointInfluence? 0 : numInfluencesPerComponent*index;
|
|
|
|
for (int i = 0; i < numInfluencesPerComponent; i++) {
|
|
vec2 influence = HdGet_influences(offset + i);
|
|
float jointWeight = influence.y;
|
|
|
|
if (jointWeight > EPS) {
|
|
int jointIdx = int( influence.x );
|
|
mat4 skinningXform = HdGet_skinningXforms(jointIdx);
|
|
|
|
p += ((skinningXform * initP) * jointWeight).xyz;
|
|
}
|
|
}
|
|
} else {
|
|
p = initP.xyz;
|
|
}
|
|
|
|
// skel space -> world space -> model space
|
|
// XXX: Casts to mat4 below are necessary because the matrices passed
|
|
// down use doubles and not floats.
|
|
mat4 skelToPrimLocal = mat4( HdGet_primWorldToLocal() ) *
|
|
mat4( HdGet_skelLocalToWorld() );
|
|
p = (skelToPrimLocal * vec4(p,1)).xyz;
|
|
|
|
HdSet_skinnedPoints(index, p);
|
|
}
|
|
|
|
|
|
-- glsl Compute.SkinPointsSimple
|
|
|
|
void compute(int index)
|
|
{
|
|
// This is simple joint-constraint skinning model.
|
|
|
|
mat4 geomBindXform = HdGet_geomBindXform();
|
|
int jointIndex = int( HdGet_influences(index).x );
|
|
mat4 skinningXform = HdGet_skinningXforms(jointIndex);
|
|
|
|
// model space -> bind space -> skel space
|
|
vec4 p = skinningXform * geomBindXform * vec4(HdGet_restPoints(index), 1);
|
|
|
|
// skel space -> world space -> model space
|
|
// XXX: Casts to mat4 below are necessary because the matrices passed
|
|
// down use doubles and not floats.
|
|
mat4 skelToPrimLocal = mat4( HdGet_primWorldToLocal() ) *
|
|
mat4( HdGet_skelLocalToWorld() );
|
|
p = skelToPrimLocal * p;
|
|
|
|
HdSet_skinnedPoints(index, p.xyz);
|
|
}
|