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