Hardware Skinning Support

- Supports GL, D3D9 & D3D11
- Extends vertex formats & shadergen to support blend indices and weights
- Adds basic support for using 4x3 matrices for shader constants
- Supports software fallback
This commit is contained in:
James Urquhart 2015-01-10 19:41:25 +00:00
parent 507c239a87
commit 3496c549b5
72 changed files with 2533 additions and 1327 deletions

View file

@ -245,6 +245,12 @@ void RenderGlowMgr::render( SceneRenderState *state )
matrixSet.setProjection(*passRI->projection);
glowMat->setTransforms(matrixSet, state);
// Setup HW skinning transforms if applicable
if (glowMat->usesHardwareSkinning())
{
glowMat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount);
}
glowMat->setSceneInfo(state, sgData);
glowMat->setBuffers(passRI->vertBuff, passRI->primBuff);

View file

@ -176,6 +176,12 @@ void RenderMeshMgr::render(SceneRenderState * state)
matrixSet.setProjection(*passRI->projection);
mat->setTransforms(matrixSet, state);
// Setup HW skinning transforms if applicable
if (mat->usesHardwareSkinning())
{
mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount);
}
setupSGData( passRI, sgData );
mat->setSceneInfo( state, sgData );

View file

@ -371,6 +371,17 @@ struct MeshRenderInst : public RenderInst
GFXTextureObject *accuTex;
GFXCubemap *cubemap;
/// @name Hardware Skinning
/// {
MatrixF *mNodeTransforms;
U32 mNodeTransformCount;
/// }
#ifdef TORQUE_ENABLE_GFXDEBUGEVENTS
const char *meshName;
const char *objectName;
#endif
void clear();
};

View file

@ -430,6 +430,12 @@ void RenderPrePassMgr::render( SceneRenderState *state )
matrixSet.setProjection(*passRI->projection);
mat->setTransforms(matrixSet, state);
// Setup HW skinning transforms if applicable
if (mat->usesHardwareSkinning())
{
mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount);
}
// If we're instanced then don't render yet.
if ( mat->isInstanced() )
{

View file

@ -243,6 +243,12 @@ void RenderTranslucentMgr::render( SceneRenderState *state )
matrixSet.setProjection(*passRI->projection);
mat->setTransforms(matrixSet, state);
// Setup HW skinning transforms if applicable
if (mat->usesHardwareSkinning())
{
mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount);
}
// If we're instanced then don't render yet.
if ( mat->isInstanced() )
{