public void FetchMeshData(Mesh mesh, int meshOffset, int boneInfluenceOffset) { var weights = mesh.GetAllBoneWeights(); var bonesPerVertex = mesh.GetBonesPerVertex(); var vertexCount = bonesPerVertex.Length; var boneWeights = new NativeArray <BoneWeight>(weights.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory); var indexOffsets = new NativeArray <uint2>(vertexCount, Allocator.Temp, NativeArrayOptions.UninitializedMemory); int meshBoneOffset = 0; for (int vertexIndex = 0; vertexIndex < vertexCount; ++vertexIndex) { var boneInfluenceCount = bonesPerVertex[vertexIndex]; for (int boneIndex = 0; boneIndex < boneInfluenceCount; ++boneIndex) { int weightIndex = meshBoneOffset + boneIndex; boneWeights[weightIndex] = new BoneWeight { Weight = weights[weightIndex].weight, Index = (uint)weights[weightIndex].boneIndex }; } indexOffsets[vertexIndex] = new uint2((uint)boneInfluenceOffset + (uint)meshBoneOffset, boneInfluenceCount); meshBoneOffset += boneInfluenceCount; } m_SharedBoneWeightsBuffer.SetData(boneWeights, 0, boneInfluenceOffset, boneWeights.Length); m_InfluenceOffsetBuffer.SetData(indexOffsets, 0, meshOffset, indexOffsets.Length); boneWeights.Dispose(); indexOffsets.Dispose(); }
public void FetchMeshData(Mesh mesh, int index) { var positions = mesh.vertices; var normals = mesh.normals; var tangents = mesh.tangents; var vertices = new NativeArray <VertexData>(mesh.vertexCount, Allocator.Temp); for (int i = 0; i < mesh.vertexCount; i++) { var tan4 = tangents[i]; vertices[i] = new VertexData { Position = positions[i], Normal = normals[i], Tangent = new Vector3(tan4.x, tan4.y, tan4.z) }; } m_SharedMeshBuffer.SetData(vertices, 0, index, vertices.Length); vertices.Dispose(); }
public void FetchMeshData(Mesh mesh, int meshIndex, int blendShapeIndex) { var vertexCount = mesh.vertexCount; var blendShapeCount = mesh.blendShapeCount; var blendShapePositions = new Vector3[blendShapeCount][]; var blendShapeNormals = new Vector3[blendShapeCount][]; var blendShapeTangents = new Vector3[blendShapeCount][]; int blendShapeVertexCount = 0; for (int i = 0; i < blendShapeCount; i++) { var positions = new Vector3[vertexCount]; var normals = new Vector3[vertexCount]; var tangents = new Vector3[vertexCount]; mesh.GetBlendShapeFrameVertices(i, 0, positions, normals, tangents); blendShapePositions[i] = positions; blendShapeNormals[i] = normals; blendShapeTangents[i] = tangents; for (int j = 0; j < vertexCount; j++) { if (!Mathf.Equals(positions[j], Vector3.zero) || !Mathf.Equals(normals[j], Vector3.zero) || !Mathf.Equals(tangents[j], Vector3.zero)) { blendShapeVertexCount++; } } } var blendShapeVertexDeltas = new NativeArray <BlendShapeVertexDelta>(blendShapeVertexCount, Allocator.Temp, NativeArrayOptions.UninitializedMemory); var blendShapeOffset = new NativeArray <uint2>(vertexCount, Allocator.Temp, NativeArrayOptions.UninitializedMemory); var sparseBlendShapeVertexCount = 0; for (int i = 0; i < vertexCount; i++) { var vertexInfluenceCount = 0; for (int j = 0; j < blendShapeCount; j++) { if (!Mathf.Equals(blendShapePositions[j][i], Vector3.zero) || !Mathf.Equals(blendShapeNormals[j][i], Vector3.zero) || !Mathf.Equals(blendShapeTangents[j][i], Vector3.zero)) { var vertexDelta = new BlendShapeVertexDelta { BlendShapeIndex = j, Position = blendShapePositions[j][i], Normal = blendShapeNormals[j][i], Tangent = blendShapeTangents[j][i], }; blendShapeVertexDeltas[sparseBlendShapeVertexCount + vertexInfluenceCount] = vertexDelta; vertexInfluenceCount++; } } blendShapeOffset[i] = new uint2((uint)sparseBlendShapeVertexCount, (uint)vertexInfluenceCount); sparseBlendShapeVertexCount += vertexInfluenceCount; } m_BlendShapeVertexBuffer.SetData(blendShapeVertexDeltas, 0, blendShapeIndex, blendShapeVertexDeltas.Length); m_BlendShapeOffsetBuffer.SetData(blendShapeOffset, 0, meshIndex, blendShapeOffset.Length); blendShapeVertexDeltas.Dispose(); }
public void SetBlendWeightData(NativeArray <float> blendWeights) { Debug.Assert(blendWeights.Length <= m_BlendWeights.BufferSize); m_BlendWeights.SetData(blendWeights, 0, 0, blendWeights.Length); }
public void SetSkinMatrixData(NativeArray <float3x4> skinMatrices) { Debug.Assert(skinMatrices.Length <= m_SkinMatrices.BufferSize); m_SkinMatrices.SetData(skinMatrices, 0, 0, skinMatrices.Length); }