| 1212 | //----------------------------------------------------- |
| 1213 | |
| 1214 | void TSSkinMesh::updateSkinBuffer( const Vector<MatrixF> &transforms, U8* buffer ) |
| 1215 | { |
| 1216 | PROFILE_SCOPE(TSSkinMesh_UpdateSkinBuffer); |
| 1217 | |
| 1218 | AssertFatal(batchData.initialized, "Batch data not initialized. Call createSkinBatchData() before any skin update is called."); |
| 1219 | |
| 1220 | if (TSShape::smUseHardwareSkinning || mNumVerts == 0) |
| 1221 | return; |
| 1222 | |
| 1223 | const MatrixF *matrices = NULL; |
| 1224 | |
| 1225 | static Vector<MatrixF> sBoneTransforms; |
| 1226 | sBoneTransforms.setSize(batchData.nodeIndex.size()); |
| 1227 | |
| 1228 | // set up bone transforms |
| 1229 | PROFILE_START(TSSkinMesh_UpdateTransforms); |
| 1230 | for (S32 i = 0; i < batchData.nodeIndex.size(); i++) |
| 1231 | { |
| 1232 | S32 node = batchData.nodeIndex[i]; |
| 1233 | sBoneTransforms[i].mul(transforms[node], batchData.initialTransforms[i]); |
| 1234 | } |
| 1235 | |
| 1236 | matrices = &sBoneTransforms[0]; |
| 1237 | PROFILE_END(); |
| 1238 | |
| 1239 | const Point3F *inVerts = batchData.initialVerts.address(); |
| 1240 | const Point3F *inNorms = batchData.initialNorms.address(); |
| 1241 | |
| 1242 | AssertFatal(inVerts, "Something went wrong, verts should be valid"); |
| 1243 | |
| 1244 | U8 *dest = buffer + mVertOffset; |
| 1245 | if (!dest) |
| 1246 | return; |
| 1247 | |
| 1248 | Point3F srcVtx, srcNrm; |
| 1249 | |
| 1250 | AssertFatal(batchData.vertexBatchOperations.size() == batchData.initialVerts.size(), "Assumption failed!"); |
| 1251 | |
| 1252 | Point3F skinnedVert; |
| 1253 | Point3F skinnedNorm; |
| 1254 | |
| 1255 | for (Vector<BatchData::BatchedVertex>::const_iterator itr = batchData.vertexBatchOperations.begin(); |
| 1256 | itr != batchData.vertexBatchOperations.end(); itr++) |
| 1257 | { |
| 1258 | const BatchData::BatchedVertex &curVert = *itr; |
| 1259 | |
| 1260 | skinnedVert.zero(); |
| 1261 | skinnedNorm.zero(); |
| 1262 | |
| 1263 | for (S32 tOp = 0; tOp < curVert.transformCount; tOp++) |
| 1264 | { |
| 1265 | const BatchData::TransformOp &transformOp = curVert.transform[tOp]; |
| 1266 | |
| 1267 | const MatrixF& deltaTransform = matrices[transformOp.transformIndex]; |
| 1268 | |
| 1269 | deltaTransform.mulP(inVerts[curVert.vertexIndex], &srcVtx); |
| 1270 | skinnedVert += (srcVtx * transformOp.weight); |
| 1271 | |