Example #1
0
        public unsafe void Execute(int i)
        {
            int j = vertexLookupData[i].x;
            int k = vertexLookupData[i].y;

            PerSkinJobData perSkinData = perSkinJobData[j];
            var            spriteSkin  = spriteSkinData[j];
            float3         srcVertex   = spriteSkin.vertices[k];
            float4         tangents    = spriteSkin.tangents[k];
            var            influence   = spriteSkin.boneWeights[k];

            int bone0 = influence.boneIndex0 + perSkinData.bindPosesIndex.x;
            int bone1 = influence.boneIndex1 + perSkinData.bindPosesIndex.x;
            int bone2 = influence.boneIndex2 + perSkinData.bindPosesIndex.x;
            int bone3 = influence.boneIndex3 + perSkinData.bindPosesIndex.x;

            byte *deformedPosOffset = (byte *)vertices.GetUnsafePtr();
            byte *deformedPosStart  = deformedPosOffset + spriteSkin.deformVerticesStartPos;
            NativeSlice <float3> deformableVerticesFloat3 = NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice <float3>(deformedPosStart, spriteSkin.spriteVertexStreamSize, spriteSkin.spriteVertexCount);

#if ENABLE_UNITY_COLLECTIONS_CHECKS
            NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref deformableVerticesFloat3, NativeSliceUnsafeUtility.GetAtomicSafetyHandle(vertices));
#endif
            if (spriteSkin.hasTangents)
            {
                byte *deformedTanOffset        = deformedPosStart + spriteSkin.tangentVertexOffset;
                var   deformableTangentsFloat4 = NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice <float4>(deformedTanOffset, spriteSkin.spriteVertexStreamSize, spriteSkin.spriteVertexCount);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
                NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref deformableTangentsFloat4, NativeSliceUnsafeUtility.GetAtomicSafetyHandle(vertices));
#endif
                var tangent = new float4(tangents.xyz, 0.0f);
                tangent =
                    math.mul(finalBoneTransforms[bone0], tangent) * influence.weight0 +
                    math.mul(finalBoneTransforms[bone1], tangent) * influence.weight1 +
                    math.mul(finalBoneTransforms[bone2], tangent) * influence.weight2 +
                    math.mul(finalBoneTransforms[bone3], tangent) * influence.weight3;
                deformableTangentsFloat4[k] = new float4(math.normalize(tangent.xyz), tangents.w);
            }

            deformableVerticesFloat3[k] =
                math.transform(finalBoneTransforms[bone0], srcVertex) * influence.weight0 +
                math.transform(finalBoneTransforms[bone1], srcVertex) * influence.weight1 +
                math.transform(finalBoneTransforms[bone2], srcVertex) * influence.weight2 +
                math.transform(finalBoneTransforms[bone3], srcVertex) * influence.weight3;
        }
        internal bool GetSpriteSkinBatchData(ref NativeArray <SpriteSkinData> data, ref SpriteSkinBatchProcessData batchProcessData, ref PerSkinJobData perskinJobData, ref int vertexBufferSize, int index, int spriteSkinIndex)
        {
            if (m_CurrentDeformSprite != sprite)
            {
                DeactivateSkinning();
                m_CurrentDeformSprite = sprite;
                UpdateSpriteDeform();
                CacheValidFlag();
            }
            if (m_IsValid)
            {
                Profiler.BeginSample("SpriteSkinData");
                data[index] = new SpriteSkinData()
                {
                    vertices               = m_SpriteVertices,
                    boneWeights            = m_SpriteBoneWeights,
                    bindPoses              = m_SpriteBindPoses,
                    tangents               = m_SpriteTangents,
                    hasTangents            = m_SpriteHasTangents,
                    spriteVertexStreamSize = m_SpriteVertexStreamSize,
                    spriteVertexCount      = m_SpriteVertexCount,
                    tangentVertexOffset    = m_SpriteTangentVertexOffset,
                    spriteSkinIndex        = spriteSkinIndex,
                    deformVerticesStartPos = vertexBufferSize,
                    rootBoneTransformId    = m_RootBoneTransformId,
                    transformId            = m_TransformId,
                    boneTransformId        = m_BoneTransformIdNativeSlice
                };
                Profiler.EndSample();
                Profiler.BeginSample("BatchProcessData");
                batchProcessData.rootBoneTransformId[index] = m_RootBoneTransformId;
                batchProcessData.rootTransformId[index]     = m_TransformId;
                batchProcessData.spriteBound[index]         = bounds;
                Profiler.EndSample();

                Profiler.BeginSample("PerskinJobData");
                perskinJobData.verticesIndex.x = perskinJobData.verticesIndex.y;
                perskinJobData.verticesIndex.y = perskinJobData.verticesIndex.x + m_SpriteVertexCount;
                vertexBufferSize += m_SpriteVertexCount * m_SpriteVertexStreamSize;
                perskinJobData.bindPosesIndex.x = perskinJobData.bindPosesIndex.y;
                perskinJobData.bindPosesIndex.y = perskinJobData.bindPosesIndex.x + m_SpriteBindPoses.Length;
                Profiler.EndSample();
                return(true);
            }
            return(false);
        }
        internal bool GetSpriteSkinBatchData(ref NativeArray <SpriteSkinData> data, ref SpriteSkinBatchProcessData batchProcessData, ref PerSkinJobData perskinJobData, ref int vertexBufferSize, int dataIndex, int spriteSkinIndex)
        {
            CacheBoneTransformIds();
            CacheCurrentSprite();
            if (m_IsValid && (alwaysUpdate || spriteRenderer.isVisible) && spriteRenderer.enabled)
            {
                Profiler.BeginSample("SpriteSkinData");
                m_DataIndex = dataIndex;
                m_CurrentDeformVerticesLength = m_SpriteVertexCount * m_SpriteVertexStreamSize;
                data[dataIndex] = new SpriteSkinData()
                {
                    vertices               = m_SpriteVertices,
                    boneWeights            = m_SpriteBoneWeights,
                    bindPoses              = m_SpriteBindPoses,
                    tangents               = m_SpriteTangents,
                    hasTangents            = m_SpriteHasTangents,
                    spriteVertexStreamSize = m_SpriteVertexStreamSize,
                    spriteVertexCount      = m_SpriteVertexCount,
                    tangentVertexOffset    = m_SpriteTangentVertexOffset,
                    spriteSkinIndex        = spriteSkinIndex,
                    deformVerticesStartPos = vertexBufferSize,
                    rootBoneTransformId    = m_RootBoneTransformId,
                    transformId            = m_TransformId,
                    boneTransformId        = m_BoneTransformIdNativeSlice
                };
                Profiler.EndSample();
                Profiler.BeginSample("BatchProcessData");
                batchProcessData.rootBoneTransformId[dataIndex] = m_RootBoneTransformId;
                batchProcessData.rootTransformId[dataIndex]     = m_TransformId;
                batchProcessData.spriteBound[dataIndex]         = bounds;
                Profiler.EndSample();

                Profiler.BeginSample("PerskinJobData");
                perskinJobData.verticesIndex.x = perskinJobData.verticesIndex.y;
                perskinJobData.verticesIndex.y = perskinJobData.verticesIndex.x + m_SpriteVertexCount;
                vertexBufferSize += m_CurrentDeformVerticesLength;
                perskinJobData.bindPosesIndex.x = perskinJobData.bindPosesIndex.y;
                perskinJobData.bindPosesIndex.y = perskinJobData.bindPosesIndex.x + m_SpriteBindPoses.Length;
                Profiler.EndSample();
                return(true);
            }
            m_DataIndex = -1;
            return(false);
        }