internal void SetAnimationBones(Matrix[] boneAbsoluteTransforms, IReadOnlyList <MyBoneDecalUpdate> boneDecals) { if (m_skeletonHierarchy == null) { return; } var skeletonCount = m_skeletonHierarchy.Length; for (int i = 0; i < skeletonCount; i++) { m_absoluteTransforms[i] = boneAbsoluteTransforms[i]; } int bonesCount = m_skeletonIndices.Length; for (int i = 0; i < bonesCount; i++) { m_skinTransforms[i] = Matrix.Transpose(m_skeletonHierarchy[m_skeletonIndices[i]].SkinTransform * m_absoluteTransforms[m_skeletonIndices[i]]); } m_decalUpdateCache.Clear(); for (int it = 0; it < boneDecals.Count; it++) { MyBoneDecalUpdate pair = boneDecals[it]; MyDecalTopoData data; bool found = MyScreenDecals.GetDecalTopoData(pair.DecalID, out data); if (!found) { continue; } Matrix skinningTrans = ComputeSkinning(data.BoneIndices, ref data.BoneWeights); Matrix transform = data.MatrixBinding * skinningTrans; m_decalUpdateCache.Add(new MyDecalPositionUpdate() { ID = pair.DecalID, Transform = transform }); } MyScreenDecals.UpdateDecals(m_decalUpdateCache); }
private static void UpdateDecalPositions(InstancingId id, List <MyCubeInstanceData> instanceData, List <MyCubeInstanceDecalData> decals) { m_tmpDecalsUpdate.Clear(); for (int it1 = 0; it1 < decals.Count; it1++) { MyCubeInstanceDecalData decal = decals[it1]; MyCubeInstanceData cubeData = instanceData[decal.InstanceIndex]; if (!cubeData.EnableSkinning) { break; } MyDecalTopoData decalTopo; bool found = MyScreenDecals.GetDecalTopoData(decal.DecalId, out decalTopo); if (!found) { continue; } Matrix localCubeMatrix; Matrix skinningMatrix = cubeData.ConstructDeformedCubeInstanceMatrix(ref decalTopo.BoneIndices, ref decalTopo.BoneWeights, out localCubeMatrix); Matrix localCubeMatrixInv; Matrix.Invert(ref localCubeMatrix, out localCubeMatrixInv); // TODO: Optimization: it would be cool if we keep original cube coordiates local intersection // and avoid matrix inversion here. Refer to MyCubeGrid.GetIntersectionWithLine(), MyCubeGridHitInfo Matrix invBinding = decalTopo.MatrixBinding * localCubeMatrixInv; Matrix transform = invBinding * skinningMatrix; m_tmpDecalsUpdate.Add(new MyDecalPositionUpdate() { ID = decal.DecalId, Transform = transform }); } MyScreenDecals.UpdateDecals(m_tmpDecalsUpdate); }