コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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();
        }
コード例 #4
0
 public void SetBlendWeightData(NativeArray <float> blendWeights)
 {
     Debug.Assert(blendWeights.Length <= m_BlendWeights.BufferSize);
     m_BlendWeights.SetData(blendWeights, 0, 0, blendWeights.Length);
 }
コード例 #5
0
 public void SetSkinMatrixData(NativeArray <float3x4> skinMatrices)
 {
     Debug.Assert(skinMatrices.Length <= m_SkinMatrices.BufferSize);
     m_SkinMatrices.SetData(skinMatrices, 0, 0, skinMatrices.Length);
 }