public void Run()
 {
     foreach (var i in _filter)
     {
         UMeshData     offset = _filter.Get2[i];
         URenderMatrix matrix = _filter.Get1[i];
         Positioning.Components.Position pos = _filter.Get3[i];
         for (int j = 0; j < offset.Offset.Length; j++)
         {
             matrix.Matrix[j] = Matrix4x4.TRS(pos.Point + offset.Offset[j], offset.RotationOffset[j], offset.Scale[j]);
         }
     }
 }
Exemplo n.º 2
0
        public void ParseMeshData(UMeshData data, URenderMatrix uRenderMatrix)
        {
            List <Mesh>       mesh  = new List <Mesh>();
            List <Vector3>    pos   = new List <Vector3>();
            List <Quaternion> rot   = new List <Quaternion>();
            List <Material>   mat   = new List <Material>();
            List <Vector3>    scale = new List <Vector3>();

            GetRendererInfo(ref mesh, ref pos, ref rot, ref scale, ref mat, transform);
            data.Offset         = pos.ToArray();
            data.RotationOffset = rot.ToArray();
            data.Scale          = scale.ToArray();

            uRenderMatrix.Meshes    = mesh.ToArray();
            uRenderMatrix.Materials = mat.ToArray();
            uRenderMatrix.Matrix    = new Matrix4x4[mesh.Count];
        }
Exemplo n.º 3
0
        private unsafe void CreateLitMeshData(Entity entity, Mesh uMesh)
        {
            using (var allocator = new BlobBuilder(Allocator.Temp))
            {
                ref var root = ref allocator.ConstructRoot <LitMeshData>();
                root.Bounds.Center  = uMesh.bounds.center;
                root.Bounds.Extents = uMesh.bounds.extents;

                UMeshData data = GetMeshData(uMesh);

                int nVertices = data.positions.Length;

                var vertices = allocator.Allocate(ref root.Vertices, nVertices);

                int   offset = 0;
                byte *dest   = (byte *)vertices.GetUnsafePtr();

                if (data.positions.Length != 0)
                {
                    fixed(void *uPositions = data.positions)
                    {
                        UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), uPositions, sizeof(float3), sizeof(float3), nVertices);
                    }
                }
                offset += sizeof(float3);
                if (data.uvs.Length != 0)
                {
                    fixed(void *uUvs = data.uvs)
                    {
                        UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), uUvs, sizeof(float2), sizeof(float2), nVertices);
                    }
                }
                offset += sizeof(float2);
                if (data.normals.Length != 0)
                {
                    fixed(void *uNormals = data.normals)
                    {
                        UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), uNormals, sizeof(float3), sizeof(float3), nVertices);
                    }
                }
                offset += sizeof(float3);
                if (data.tangents.Length != 0)
                {
                    fixed(void *uTangents = data.tangents)
                    {
                        UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), uTangents, sizeof(float3), sizeof(float3), nVertices);
                    }
                }
                offset += sizeof(float3);
                if (data.biTangents.Length != 0)
                {
                    fixed(void *uBitangents = data.biTangents)
                    {
                        UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), uBitangents, sizeof(float3), sizeof(float3), nVertices);
                    }
                }
                offset += sizeof(float3);

                //Vertex color is not supported in URP lit shader, override to white for now
                float4 albedo = new float4(1);
                UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), &albedo, 0, sizeof(float4), nVertices);
                offset += sizeof(float4);

                //Vertex metal smoothness are not present in UnityEngine.Mesh
                float2 metal = new float2(1);
                UnsafeUtility.MemCpyStride(dest + offset, sizeof(LitVertex), &metal, 0, sizeof(float2), nVertices);

                int indexCount = 0;
                for (int i = 0; i < data.subMeshCount; i++)
                {
                    indexCount += (int)uMesh.GetIndexCount(i);
                }

                var indices = allocator.Allocate(ref root.Indices, indexCount);
                offset = 0;
                for (int i = 0; i < data.subMeshCount; i++)
                {
                    int[] uIndices = uMesh.GetIndices(i);
                    for (int j = 0; j < uIndices.Length; j++)
                    {
                        indices[offset + j] = Convert.ToUInt16(uIndices[j]);
                    }
                    offset += uIndices.Length;
                }

                var mesh = allocator.CreateBlobAssetReference <LitMeshData>(Allocator.Persistent);
                DstEntityManager.AddComponentData(entity, new LitMeshRenderData()
                {
                    Mesh = mesh
                });
            }