Пример #1
0
        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);
        }
Пример #2
0
        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);
        }