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); }